mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-17 01:56:16 -08:00
Refactor subtitle loading function
This commit is contained in:
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;
|
||||
|
||||
Reference in new issue
Block a user