Refactor subtitle loading function

This commit is contained in:
Harvey Zack committed 2023-11-24 01:02:00 +08:00
1 parent 7ba3098212
commit d579e7e86d
3 files changed
+64 -12

No files matched your search

@@ -158,7 +158,7 @@ function unescape(str) {
const reg = new RegExp(`(${Object.keys(map).join("|")})`, "g");
return str.replace(reg, (tag)=>map[tag] || tag);
}
async function loadSubtitleAsVtt(option, art) {
async function loadVtt(option, art) {
const { getExt, srtToVtt, assToVtt } = art.constructor.utils;
const response = await fetch(option.url);
const buffer = await response.arrayBuffer();
@@ -193,14 +193,16 @@ function mergeTrees(trees, subtitles) {
}
return result;
}
const all = "_ALL_";
function artplayerPluginMultipleSubtitles({ subtitles, onMerge = ()=>null }) {
return async (art)=>{
const vtts = await Promise.all(subtitles.map((option)=>loadSubtitleAsVtt(option, art)));
const parser = new (0, _parser.WebVTTParser)();
const trees = vtts.map((vtt)=>parser.parse(vtt, "metadata"));
const seri = new (0, _parser.WebVTTSerializer)();
const vtts = await Promise.all(subtitles.map((option)=>loadVtt(option, art)));
const trees = vtts.map((vtt)=>parser.parse(vtt, "metadata"));
const tree = onMerge(trees, subtitles) || mergeTrees(trees, subtitles);
if (tree?.cues?.length) {
function setTree(tree) {
if (!tree?.cues) return;
const vtt = seri.serialize(tree.cues);
const url = URL.createObjectURL(new Blob([
vtt
@@ -214,12 +216,34 @@ function artplayerPluginMultipleSubtitles({ subtitles, onMerge = ()=>null }) {
type: "vtt",
onVttLoad: unescape
});
} else throw new Error("No subtitle found");
}
setTree(tree);
let _track = all;
return {
name: "multipleSubtitles",
get track () {
return _track;
},
set track (name){
if (name === all || name === "") {
_track = all;
setTree(tree);
} else {
const index = subtitles.findIndex((item)=>item.name === name);
if (index === -1) throw new Error(`The subtitle "${name}" is not found`);
else {
_track = name;
setTree(trees[index]);
}
}
}
};
};
}
artplayerPluginMultipleSubtitles.env = "development";
artplayerPluginMultipleSubtitles.version = "1.0.0";
artplayerPluginMultipleSubtitles.build = "2023-11-24 00:15:21";
artplayerPluginMultipleSubtitles.all = all;
artplayerPluginMultipleSubtitles.WebVTTParser = (0, _parser.WebVTTParser);
artplayerPluginMultipleSubtitles.WebVTTSerializer = (0, _parser.WebVTTSerializer);
if (typeof window !== "undefined") window["artplayerPluginMultipleSubtitles"] = artplayerPluginMultipleSubtitles;