mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-23 22:01:20 -08:00
Fix async issue in plugin addition
This commit is contained in:
1 parent
d579e7e86d
commit
21a735f86b
7 files changed
+165
-111
No files matched your search
@@ -147,19 +147,7 @@ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
|
||||
parcelHelpers.defineInteropFlag(exports);
|
||||
parcelHelpers.export(exports, "default", ()=>artplayerPluginMultipleSubtitles);
|
||||
var _parser = require("./parser");
|
||||
function unescape(str) {
|
||||
const map = {
|
||||
"&": "&",
|
||||
"<": "<",
|
||||
">": ">",
|
||||
"'": "'",
|
||||
""": '"'
|
||||
};
|
||||
const reg = new RegExp(`(${Object.keys(map).join("|")})`, "g");
|
||||
return str.replace(reg, (tag)=>map[tag] || tag);
|
||||
}
|
||||
async function loadVtt(option, art) {
|
||||
const { getExt, srtToVtt, assToVtt } = art.constructor.utils;
|
||||
async function loadVtt(option, { getExt, srtToVtt, assToVtt }) {
|
||||
const response = await fetch(option.url);
|
||||
const buffer = await response.arrayBuffer();
|
||||
const decoder = new TextDecoder(option.encoding || "utf-8");
|
||||
@@ -175,40 +163,69 @@ async function loadVtt(option, art) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
function mergeTrees(trees, subtitles) {
|
||||
function mergeTrees(trees) {
|
||||
const parser = new (0, _parser.WebVTTParser)();
|
||||
const result = parser.parse("", "metadata");
|
||||
for(let i = 0; i < trees.length; i++){
|
||||
const tree = trees[i];
|
||||
const option = subtitles[i];
|
||||
for(let j = 0; j < tree.cues.length; j++){
|
||||
const cue = tree.cues[j];
|
||||
for(let k = 0; k < cue.tree.children.length; k++){
|
||||
const children = cue.tree.children[k];
|
||||
children.value = `<div class="art-subtitle-${option.name}">${children.value}</div>`;
|
||||
if (!tree.updated) {
|
||||
tree.updated = true;
|
||||
for(let j = 0; j < tree.cues.length; j++){
|
||||
const cue = tree.cues[j];
|
||||
for(let k = 0; k < cue.tree.children.length; k++){
|
||||
const children = cue.tree.children[k];
|
||||
children.value = `<div class="art-subtitle-${tree.name}">${children.value}</div>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (result.cues.length === 0) result.cues = tree.cues;
|
||||
else for(let l = 0; l < result.cues.length; l++)result.cues[l].tree.children.push(...tree.cues[l]?.tree?.children || []);
|
||||
if (result.cues.length === 0) result.cues = [
|
||||
...tree.cues
|
||||
];
|
||||
else for(let l = 0; l < result.cues.length; l++){
|
||||
const a = result.cues[l].tree.children;
|
||||
const b = tree.cues[l]?.tree?.children;
|
||||
result.cues[l] = {
|
||||
...result.cues[l],
|
||||
tree: {
|
||||
children: [
|
||||
...a,
|
||||
...b
|
||||
]
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
const all = "_ALL_";
|
||||
function artplayerPluginMultipleSubtitles({ subtitles, onMerge = ()=>null }) {
|
||||
function artplayerPluginMultipleSubtitles({ subtitles = [] }) {
|
||||
return async (art)=>{
|
||||
const { unescape, getExt, srtToVtt, assToVtt } = art.constructor.utils;
|
||||
const parser = new (0, _parser.WebVTTParser)();
|
||||
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);
|
||||
function setTree(tree) {
|
||||
if (!tree?.cues) return;
|
||||
const vtts = await Promise.all(subtitles.map((option)=>{
|
||||
return loadVtt(option, {
|
||||
getExt,
|
||||
srtToVtt,
|
||||
assToVtt
|
||||
});
|
||||
}));
|
||||
const trees = vtts.map((vtt, index)=>{
|
||||
const tree = parser.parse(vtt, "metadata");
|
||||
tree.url = subtitles[index].url;
|
||||
tree.name = subtitles[index].name;
|
||||
return tree;
|
||||
});
|
||||
let lastUrl = "";
|
||||
function setTracks(trees = []) {
|
||||
const tree = mergeTrees(trees);
|
||||
const vtt = seri.serialize(tree.cues);
|
||||
URL.revokeObjectURL(lastUrl);
|
||||
const url = URL.createObjectURL(new Blob([
|
||||
vtt
|
||||
], {
|
||||
type: "text/vtt"
|
||||
}));
|
||||
lastUrl = url;
|
||||
art.option.subtitle.escape = false;
|
||||
art.subtitle.init({
|
||||
...art.option.subtitle,
|
||||
@@ -217,35 +234,21 @@ function artplayerPluginMultipleSubtitles({ subtitles, onMerge = ()=>null }) {
|
||||
onVttLoad: unescape
|
||||
});
|
||||
}
|
||||
setTree(tree);
|
||||
let _track = all;
|
||||
setTracks(trees);
|
||||
return {
|
||||
name: "multipleSubtitles",
|
||||
get track () {
|
||||
return _track;
|
||||
tracks (names = []) {
|
||||
return setTracks(names.map((name)=>trees.find((tree)=>tree.name === name)));
|
||||
},
|
||||
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]);
|
||||
}
|
||||
}
|
||||
reset () {
|
||||
return setTracks(trees);
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
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);
|
||||
artplayerPluginMultipleSubtitles.build = "2023-11-24 09:22:00";
|
||||
if (typeof window !== "undefined") window["artplayerPluginMultipleSubtitles"] = artplayerPluginMultipleSubtitles;
|
||||
|
||||
},{"./parser":"eko7u","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"eko7u":[function(require,module,exports) {
|
||||
|
||||
Reference in new issue
Block a user