@vot.js/core
Advanced tools
Comparing version 2.2.6 to 2.3.0
import type { ClientSession, SessionModule } from "@vot.js/shared/types/secure"; | ||
import type { RequestLang, ResponseLang } from "@vot.js/shared/types/data"; | ||
import type { VOTOpts, FetchFunction, VOTSessions, URLSchema, ClientResponse } from "./types/client.js"; | ||
import type { VideoTranslationOpts, VideoTranslationResponse, VideoSubtitlesOpts, StreamPingOptions, StreamTranslationOpts, StreamTranslationResponse, VideoTranslationFailAudioResponse, AudioBufferObject, PartialAudioObject } from "./types/yandex.js"; | ||
import type { VideoTranslationVOTOpts } from "./types/vot.js"; | ||
import type { VideoTranslationOpts, VideoTranslationResponse, VideoSubtitlesOpts, StreamPingOptions, StreamTranslationOpts, StreamTranslationResponse, VideoTranslationFailAudioResponse, AudioBufferObject, PartialAudioObject, GetSubtitlesResponse } from "./types/yandex.js"; | ||
import type { GetSubtitlesVOTOpts, VideoTranslationVOTOpts } from "./types/vot.js"; | ||
export declare class VOTJSError extends Error { | ||
@@ -58,3 +58,5 @@ data: unknown; | ||
translateVideo({ videoData, requestLang, responseLang, translationHelp, headers, extraOpts, shouldSendFailedAudio, }: VideoTranslationOpts): Promise<VideoTranslationResponse>; | ||
getSubtitles({ videoData, requestLang, headers, }: VideoSubtitlesOpts): Promise<import("@vot.js/shared/protos").SubtitlesResponse>; | ||
protected getSubtitlesYAImpl({ videoData, requestLang, headers, }: VideoSubtitlesOpts): Promise<GetSubtitlesResponse>; | ||
protected getSubtitlesVOTImpl({ url, videoId, service, headers, }: GetSubtitlesVOTOpts): Promise<GetSubtitlesResponse>; | ||
getSubtitles({ videoData, requestLang, headers, }: VideoSubtitlesOpts): Promise<GetSubtitlesResponse>; | ||
pingStream({ pingId, headers }: StreamPingOptions): Promise<boolean>; | ||
@@ -61,0 +63,0 @@ translateStream({ videoData, requestLang, responseLang, headers, }: StreamTranslationOpts): Promise<StreamTranslationResponse>; |
@@ -248,7 +248,10 @@ import config from "@vot.js/shared/config"; | ||
service: votData.service, | ||
videoId: votData.videoId, | ||
fromLang: requestLang, | ||
toLang: responseLang, | ||
rawVideo: url, | ||
}, headers); | ||
video_id: votData.videoId, | ||
from_lang: requestLang, | ||
to_lang: responseLang, | ||
raw_video: url, | ||
}, { | ||
"X-Use-Snake-Case": "Yes", | ||
...headers, | ||
}); | ||
if (!res.success) { | ||
@@ -262,3 +265,3 @@ throw new VOTJSError("Failed to request video translation", res); | ||
case "success": | ||
if (!translationData.translatedUrl) { | ||
if (!translationData.translated_url) { | ||
throw new VOTJSError("Audio link wasn't received from VOT response", translationData); | ||
@@ -269,3 +272,3 @@ } | ||
translated: true, | ||
url: translationData.translatedUrl, | ||
url: translationData.translated_url, | ||
status: 1, | ||
@@ -278,3 +281,3 @@ remainingTime: -1, | ||
translated: false, | ||
remainingTime: translationData.remainingTime, | ||
remainingTime: translationData.remaining_time, | ||
status: 2, | ||
@@ -329,7 +332,4 @@ message: translationData.message, | ||
} | ||
async getSubtitles({ videoData, requestLang = this.requestLang, headers = {}, }) { | ||
async getSubtitlesYAImpl({ videoData, requestLang = this.requestLang, headers = {}, }) { | ||
const { url } = videoData; | ||
if (this.isCustomLink(url)) { | ||
throw new VOTJSError("Unsupported video URL for getting subtitles"); | ||
} | ||
const session = await this.getSession("video-translation"); | ||
@@ -346,4 +346,64 @@ const body = YandexVOTProtobuf.encodeSubtitlesRequest(url, requestLang); | ||
} | ||
return YandexVOTProtobuf.decodeSubtitlesResponse(res.data); | ||
const subtitlesData = YandexVOTProtobuf.decodeSubtitlesResponse(res.data); | ||
const subtitles = subtitlesData.subtitles.map((subtitle) => { | ||
const { language, url, translatedLanguage, translatedUrl } = subtitle; | ||
return { | ||
language, | ||
url, | ||
translatedLanguage, | ||
translatedUrl, | ||
}; | ||
}); | ||
return { | ||
waiting: subtitlesData.waiting, | ||
subtitles, | ||
}; | ||
} | ||
async getSubtitlesVOTImpl({ url, videoId, service, headers = {}, }) { | ||
const votData = convertVOT(service, videoId, url); | ||
const res = await this.requestVOT(this.paths.videoSubtitles, { | ||
provider: "yandex", | ||
service: votData.service, | ||
video_id: votData.videoId, | ||
}, headers); | ||
if (!res.success) { | ||
throw new VOTJSError("Failed to request video subtitles", res); | ||
} | ||
const subtitlesData = res.data; | ||
const subtitles = subtitlesData.reduce((result, subtitle) => { | ||
if (!subtitle.lang_from) { | ||
return result; | ||
} | ||
const originalSubtitle = subtitlesData.find((sub) => sub.lang === subtitle.lang_from); | ||
if (!originalSubtitle) { | ||
return result; | ||
} | ||
result.push({ | ||
language: originalSubtitle.lang, | ||
url: originalSubtitle.subtitle_url, | ||
translatedLanguage: subtitle.lang, | ||
translatedUrl: subtitle.subtitle_url, | ||
}); | ||
return result; | ||
}, []); | ||
return { | ||
waiting: false, | ||
subtitles, | ||
}; | ||
} | ||
async getSubtitles({ videoData, requestLang = this.requestLang, headers = {}, }) { | ||
const { url, videoId, host } = videoData; | ||
return this.isCustomLink(url) | ||
? await this.getSubtitlesVOTImpl({ | ||
url, | ||
videoId, | ||
service: host, | ||
headers, | ||
}) | ||
: await this.getSubtitlesYAImpl({ | ||
videoData, | ||
requestLang, | ||
headers, | ||
}); | ||
} | ||
async pingStream({ pingId, headers = {} }) { | ||
@@ -350,0 +410,0 @@ const session = await this.getSession("video-translation"); |
@@ -12,3 +12,3 @@ import { StreamPingRequest, StreamTranslationRequest, StreamTranslationResponse, SubtitlesRequest, SubtitlesResponse, VideoTranslationAudioRequest, VideoTranslationAudioResponse, VideoTranslationRequest, VideoTranslationResponse, YandexSessionRequest, YandexSessionResponse, } from "@vot.js/shared/protos"; | ||
unknown1: 0, | ||
translationHelp: translationHelp ? translationHelp : [], | ||
translationHelp: translationHelp ?? [], | ||
responseLanguage: responseLang, | ||
@@ -15,0 +15,0 @@ wasStream, |
@@ -35,3 +35,3 @@ import type { | ||
status: Type.Literal("waiting"), | ||
remainingTime: Type.Number(), | ||
remaining_time: Type.Number(), | ||
message: Type.String() | ||
@@ -45,5 +45,5 @@ }) | ||
provider: TranslationProvider, | ||
translatedUrl: Type.String(), | ||
translated_url: Type.String(), | ||
message: Type.String(), | ||
createdAt: Type.String() | ||
created_at: Type.String() | ||
}) | ||
@@ -56,7 +56,15 @@ | ||
provider: TranslationProvider, | ||
translatedUrl: Type.Null(), | ||
translated_url: Type.Null(), | ||
message: Type.String(), | ||
createdAt: Type.String() | ||
created_at: Type.String() | ||
}) | ||
export type GetSubtitlesVOTOpts<T extends TSchema> = Static<ReturnType<typeof GetSubtitlesVOTOpts<T>>> | ||
export const GetSubtitlesVOTOpts = <T extends TSchema>(T: T) => Type.Object({ | ||
url: Type.String(), | ||
videoId: Type.String(), | ||
service: T, | ||
headers: Type.Optional(RequestHeaders) | ||
}) | ||
export type TranslationResponse = Static<typeof TranslationResponse> | ||
@@ -67,2 +75,23 @@ export const TranslationResponse = Type.Union([ | ||
TranslationFailedResponse | ||
]) | ||
]) | ||
export type SubtitleItem = Static<typeof SubtitleItem> | ||
export const SubtitleItem = Type.Object({ | ||
id: Type.Number(), | ||
service: Type.String(), | ||
video_id: Type.String(), | ||
provider: TranslationProvider, | ||
lang: Type.String(), | ||
lang_from: Type.Union([ | ||
Type.String(), | ||
Type.Null() | ||
]), | ||
subtitle_url: Type.String(), | ||
created_at: Type.String() | ||
}) | ||
export type SubtitlesResponse = Static<typeof SubtitlesResponse> | ||
export const SubtitlesResponse = Type.Object({ | ||
waiting: Type.Boolean(), | ||
subtitles: Type.Array(SubtitleItem) | ||
}) |
@@ -153,2 +153,16 @@ import type { | ||
status: Type.Number() | ||
}) | ||
export type SubtitleItem = Static<typeof SubtitleItem> | ||
export const SubtitleItem = Type.Object({ | ||
language: Type.String(), | ||
url: Type.String(), | ||
translatedLanguage: Type.String(), | ||
translatedUrl: Type.String() | ||
}) | ||
export type GetSubtitlesResponse = Static<typeof GetSubtitlesResponse> | ||
export const GetSubtitlesResponse = Type.Object({ | ||
waiting: Type.Boolean(), | ||
subtitles: Type.Array(SubtitleItem) | ||
}) |
@@ -15,3 +15,3 @@ import type { RequestLang, ResponseLang, RequestHeaders } from "@vot.js/shared/types/data"; | ||
status: "waiting"; | ||
remainingTime: number; | ||
remaining_time: number; | ||
message: string; | ||
@@ -23,5 +23,5 @@ }; | ||
provider: TranslationProvider; | ||
translatedUrl: string; | ||
translated_url: string; | ||
message: string; | ||
createdAt: string; | ||
created_at: string; | ||
}; | ||
@@ -32,7 +32,27 @@ export type TranslationFailedResponse = { | ||
provider: TranslationProvider; | ||
translatedUrl: null; | ||
translated_url: null; | ||
message: string; | ||
createdAt: string; | ||
created_at: string; | ||
}; | ||
export type GetSubtitlesVOTOpts<T = VideoService> = { | ||
url: string; | ||
videoId: string; | ||
service: T; | ||
headers?: RequestHeaders; | ||
}; | ||
export type TranslationResponse = TranslationWaitingResponse | TranslationSuccessResponse | TranslationFailedResponse; | ||
export type SubtitleItem = { | ||
id: number; | ||
service: string; | ||
video_id: string; | ||
provider: TranslationProvider; | ||
lang: string; | ||
lang_from: string | null; | ||
subtitle_url: string; | ||
created_at: string; | ||
}; | ||
export type SubtitlesResponse = { | ||
waiting: boolean; | ||
subtitles: SubtitleItem[]; | ||
}; | ||
//# sourceMappingURL=vot.d.ts.map |
@@ -105,2 +105,12 @@ import type { RequestLang, ResponseLang, RequestHeaders } from "@vot.js/shared/types/data"; | ||
}; | ||
export type SubtitleItem = { | ||
language: string; | ||
url: string; | ||
translatedLanguage: string; | ||
translatedUrl: string; | ||
}; | ||
export type GetSubtitlesResponse = { | ||
waiting: boolean; | ||
subtitles: SubtitleItem[]; | ||
}; | ||
//# sourceMappingURL=yandex.d.ts.map |
{ | ||
"name": "@vot.js/core", | ||
"description": "core package", | ||
"version": "2.2.6", | ||
"version": "2.3.0", | ||
"author": "Toil", | ||
@@ -84,3 +84,3 @@ "license": "MIT", | ||
"tsc-esm-fix": "^3.1.2", | ||
"typescript": "^5.6.3" | ||
"typescript": "^5.7.3" | ||
}, | ||
@@ -91,3 +91,3 @@ "peerDependencies": { | ||
"dependencies": { | ||
"@vot.js/shared": "^2.2.6" | ||
"@vot.js/shared": "^2.3.0" | ||
}, | ||
@@ -94,0 +94,0 @@ "scripts": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
76759
1452
Updated@vot.js/shared@^2.3.0