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 = {