1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import Mux from "npm:@mux/mux-node";
const SIEVE_API_KEY = Deno.env.get("SIEVE_API_KEY");
const SUPPORTED_LANGUAGES = [
{ "name": "English", "code": "en" },
{ "name": "Hindi", "code": "hi" },
{ "name": "Portuguese", "code": "pt" },
{ "name": "Mandarin (Chinese)", "code": "zh" },
{ "name": "Spanish", "code": "es" },
{ "name": "French", "code": "fr" },
{ "name": "German", "code": "de" },
{ "name": "Japanese", "code": "ja" },
{ "name": "Arabic", "code": "ar" },
{ "name": "Russian", "code": "ru" },
{ "name": "Korean", "code": "ko" },
{ "name": "Indonesian", "code": "id" },
{ "name": "Italian", "code": "it" },
{ "name": "Dutch", "code": "nl" },
{ "name": "Turkish", "code": "tr" },
{ "name": "Polish", "code": "pl" },
{ "name": "Swedish", "code": "sv" },
{ "name": "Tagalog (Filipino)", "code": "tl" },
{ "name": "Malay", "code": "ms" },
{ "name": "Romanian", "code": "ro" },
{ "name": "Ukrainian", "code": "uk" },
{ "name": "Greek", "code": "el" },
{ "name": "Czech", "code": "cs" },
{ "name": "Danish", "code": "da" },
{ "name": "Finnish", "code": "fi" },
{ "name": "Bulgarian", "code": "bg" },
{ "name": "Croatian", "code": "hr" },
{ "name": "Slovak", "code": "sk" },
{ "name": "Tamil", "code": "ta" },
];
const SUPPORTED_LANG_CODES = SUPPORTED_LANGUAGES.map(l => l.code);
const mux = new Mux({
tokenId: Deno.env.get("MUX_TOKEN_ID"),
tokenSecret: Deno.env.get("MUX_TOKEN_SECRET"),
});
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
async function verifyMuxAsset(assetId, langs) {
if (!assetId) {
throw "A Mux asset ID is required.";
}
let asset;
try {
asset = await mux.video.assets.retrieve(assetId);
console.log(asset);
} catch (err) {
throw "Error retrieving Mux Asset. Are you sure that's a valid asset ID?";
}
if (asset.tracks.filter(t => langs.includes(t.language_code)).length > 0) {
throw "Asset already has a track with at least one of the specified languages";
}
if (asset.status !== "ready") {
throw "Asset is not ready";
}
if (asset.static_renditions.status !== "ready") {
throw "Asset's static renditions are not ready";
}
if (asset.static_renditions.files.filter(file => file.ext === "m4a").length < 1) {
throw "Asset does not have an audio-only static rendition";
}
return asset;
}
function validateLanguages(langs: string[]) {
if (!langs) {
throw "At least one language is required";
}
if (!langs.every(l => SUPPORTED_LANG_CODES.includes(l))) {
throw `At least one of the supplied languages is not supported. Supported languages are: ${
SUPPORTED_LANG_CODES.join(", ")
}`;
}
return langs;
}
async function createDubbingJob(asset: Mux.Video.Asset, targetLanguages: string[]) {
const languageNames = targetLanguages.map(code => {
const languageObj = SUPPORTED_LANGUAGES.find(lang => lang.code === code);
if (languageObj) {
return languageObj.name;
}
});
const payload = {