Fix subtitle merging issue

This commit is contained in:
Harvey Zack committed 2023-11-24 00:37:37 +08:00
1 parent 780124d84b
commit 7ba3098212
5 files changed
+104 -82

No files matched your search

+4 -2
View File
@@ -12,12 +12,14 @@ var art = new Artplayer({
name: 'japanese', name: 'japanese',
url: '/assets/sample/subtitle.jp.srt', url: '/assets/sample/subtitle.jp.srt',
} }
] ],
onMerge(trees) {
console.log(trees)
}
}) })
] ]
}); });
// 自定义你自己的样式,请勿复制以下代码 // 自定义你自己的样式,请勿复制以下代码
// Customize your own style, please do not copy the following code // Customize your own style, please do not copy the following code
const style = ` const style = `
@@ -158,8 +158,8 @@ function unescape(str) {
const reg = new RegExp(`(${Object.keys(map).join("|")})`, "g"); const reg = new RegExp(`(${Object.keys(map).join("|")})`, "g");
return str.replace(reg, (tag)=>map[tag] || tag); return str.replace(reg, (tag)=>map[tag] || tag);
} }
async function loadSubtitleAsVtt(option) { async function loadSubtitleAsVtt(option, art) {
const { getExt, srtToVtt, assToVtt } = Artplayer.utils; const { getExt, srtToVtt, assToVtt } = art.constructor.utils;
const response = await fetch(option.url); const response = await fetch(option.url);
const buffer = await response.arrayBuffer(); const buffer = await response.arrayBuffer();
const decoder = new TextDecoder(option.encoding || "utf-8"); const decoder = new TextDecoder(option.encoding || "utf-8");
@@ -175,13 +175,12 @@ async function loadSubtitleAsVtt(option) {
return ""; return "";
} }
} }
function mergeVtts(vtts, subtitles) { function mergeTrees(trees, subtitles) {
const parser = new (0, _parser.WebVTTParser)(); const parser = new (0, _parser.WebVTTParser)();
const seri = new (0, _parser.WebVTTSerializer)();
const result = parser.parse("", "metadata"); const result = parser.parse("", "metadata");
for(let i = 0; i < vtts.length; i++){ for(let i = 0; i < trees.length; i++){
const tree = trees[i];
const option = subtitles[i]; const option = subtitles[i];
const tree = parser.parse(vtts[i], "metadata");
for(let j = 0; j < tree.cues.length; j++){ for(let j = 0; j < tree.cues.length; j++){
const cue = tree.cues[j]; const cue = tree.cues[j];
for(let k = 0; k < cue.tree.children.length; k++){ for(let k = 0; k < cue.tree.children.length; k++){
@@ -192,66 +191,44 @@ function mergeVtts(vtts, subtitles) {
if (result.cues.length === 0) result.cues = tree.cues; 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 || []); else for(let l = 0; l < result.cues.length; l++)result.cues[l].tree.children.push(...tree.cues[l]?.tree?.children || []);
} }
return seri.serialize(result.cues); return result;
} }
function artplayerPluginMultipleSubtitles({ subtitles }) { function artplayerPluginMultipleSubtitles({ subtitles, onMerge = ()=>null }) {
return async (art)=>{ return async (art)=>{
const vtts = await Promise.all(subtitles.map(loadSubtitleAsVtt)); const vtts = await Promise.all(subtitles.map((option)=>loadSubtitleAsVtt(option, art)));
const vtt = mergeVtts(vtts, subtitles); const parser = new (0, _parser.WebVTTParser)();
const url = URL.createObjectURL(new Blob([ const trees = vtts.map((vtt)=>parser.parse(vtt, "metadata"));
vtt const seri = new (0, _parser.WebVTTSerializer)();
], { const tree = onMerge(trees, subtitles) || mergeTrees(trees, subtitles);
type: "text/vtt" if (tree?.cues?.length) {
})); const vtt = seri.serialize(tree.cues);
art.option.subtitle.escape = false; const url = URL.createObjectURL(new Blob([
art.subtitle.init({ vtt
...art.option.subtitle, ], {
url, type: "text/vtt"
type: "vtt", }));
onVttLoad: unescape art.option.subtitle.escape = false;
}); art.subtitle.init({
...art.option.subtitle,
url,
type: "vtt",
onVttLoad: unescape
});
} else throw new Error("No subtitle found");
}; };
} }
artplayerPluginMultipleSubtitles.env = "development"; artplayerPluginMultipleSubtitles.env = "development";
artplayerPluginMultipleSubtitles.version = "1.0.0"; artplayerPluginMultipleSubtitles.version = "1.0.0";
artplayerPluginMultipleSubtitles.build = "2023-11-23 22:22:14"; artplayerPluginMultipleSubtitles.build = "2023-11-24 00:15:21";
artplayerPluginMultipleSubtitles.WebVTTParser = (0, _parser.WebVTTParser);
artplayerPluginMultipleSubtitles.WebVTTSerializer = (0, _parser.WebVTTSerializer);
if (typeof window !== "undefined") window["artplayerPluginMultipleSubtitles"] = artplayerPluginMultipleSubtitles; if (typeof window !== "undefined") window["artplayerPluginMultipleSubtitles"] = artplayerPluginMultipleSubtitles;
},{"@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6","./parser":"eko7u"}],"5dUr6":[function(require,module,exports) { },{"./parser":"eko7u","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"eko7u":[function(require,module,exports) {
exports.interopDefault = function(a) {
return a && a.__esModule ? a : {
default: a
};
};
exports.defineInteropFlag = function(a) {
Object.defineProperty(a, "__esModule", {
value: true
});
};
exports.exportAll = function(source, dest) {
Object.keys(source).forEach(function(key) {
if (key === "default" || key === "__esModule" || dest.hasOwnProperty(key)) return;
Object.defineProperty(dest, key, {
enumerable: true,
get: function() {
return source[key];
}
});
});
return dest;
};
exports.export = function(dest, destName, get) {
Object.defineProperty(dest, destName, {
enumerable: true,
get: get
});
};
},{}],"eko7u":[function(require,module,exports) {
// Any copyright is dedicated to the Public Domain. // Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/ // http://creativecommons.org/publicdomain/zero/1.0/
// Not intended to be fast, but if you can make it faster, please help out! // Not intended to be fast, but if you can make it faster, please help out!
(function() { /* eslint-disable */ (function() {
var defaultCueSettings = { var defaultCueSettings = {
direction: "horizontal", direction: "horizontal",
snapToLines: true, snapToLines: true,
@@ -325,6 +302,7 @@ exports.export = function(dest, destName, get) {
Not part of the specification's parser as these would just be ignored. However, Not part of the specification's parser as these would just be ignored. However,
we want them to be conforming and not get "Cue identifier cannot be standalone". we want them to be conforming and not get "Cue identifier cannot be standalone".
*/ if (/^NOTE($|[ \t])/.test(cue.id)) { */ if (/^NOTE($|[ \t])/.test(cue.id)) {
// .startsWith fails in Chrome
linePos++; linePos++;
while(lines[linePos] != "" && lines[linePos] != undefined){ while(lines[linePos] != "" && lines[linePos] != undefined){
if (lines[linePos].indexOf("-->") != -1) err("Cannot have timestamp in a comment."); if (lines[linePos].indexOf("-->") != -1) err("Cannot have timestamp in a comment.");
@@ -506,12 +484,14 @@ exports.export = function(dest, destName, get) {
return; return;
} }
if (setting == "vertical") { if (setting == "vertical") {
// writing direction
if (value != "rl" && value != "lr") { if (value != "rl" && value != "lr") {
err("Writing direction can only be set to 'rl' or 'rl'."); err("Writing direction can only be set to 'rl' or 'rl'.");
continue; continue;
} }
cue.direction = value; cue.direction = value;
} else if (setting == "line") { } else if (setting == "line") {
// line position and optionally line alignment
if (/,/.test(value)) { if (/,/.test(value)) {
var comp = value.split(","); var comp = value.split(",");
value = comp[0]; value = comp[0];
@@ -562,6 +542,7 @@ exports.export = function(dest, destName, get) {
cue.linePosition = parseFloat(numVal); cue.linePosition = parseFloat(numVal);
if (parseFloat(numVal).toString() !== numVal) cue.nonSerializable = true; if (parseFloat(numVal).toString() !== numVal) cue.nonSerializable = true;
} else if (setting == "position") { } else if (setting == "position") {
// text position and optional positionAlign
if (/,/.test(value)) { if (/,/.test(value)) {
var comp = value.split(","); var comp = value.split(",");
value = comp[0]; value = comp[0];
@@ -593,6 +574,7 @@ exports.export = function(dest, destName, get) {
} }
cue.textPosition = parseFloat(numVal); cue.textPosition = parseFloat(numVal);
} else if (setting == "size") { } else if (setting == "size") {
// size
if (value[value.length - 1] != "%") { if (value[value.length - 1] != "%") {
err("Size must be a percentage."); err("Size must be a percentage.");
continue; continue;
@@ -615,6 +597,7 @@ exports.export = function(dest, destName, get) {
} }
cue.size = size; cue.size = size;
} else if (setting == "align") { } else if (setting == "align") {
// alignment
var alignValues = [ var alignValues = [
"start", "start",
"center", "center",
@@ -725,13 +708,11 @@ exports.export = function(dest, destName, get) {
else if (name == "v") { else if (name == "v") {
if (inScope("v")) err("<v> cannot be nested inside itself."); if (inScope("v")) err("<v> cannot be nested inside itself.");
attach(token); attach(token);
current.value = token[3] // annotation current.value = token[3]; // annotation
;
if (!token[3]) err("<v> requires an annotation."); if (!token[3]) err("<v> requires an annotation.");
} else if (name == "lang") { } else if (name == "lang") {
attach(token); attach(token);
current.value = token[3] // language current.value = token[3]; // language
;
} else err("Incorrect start tag."); } else err("Incorrect start tag.");
} else if (token[0] == "end tag") { } else if (token[0] == "end tag") {
if (mode == "chapters") err("End tags not allowed in chapter title text."); if (mode == "chapters") err("End tags not allowed in chapter title text.");
@@ -795,7 +776,8 @@ exports.export = function(dest, destName, get) {
if (m = buffer.match(/^&#(x?[0-9]+)$/)) // we prepend "0" so that x20 be interpreted as hexadecim (0x20) if (m = buffer.match(/^&#(x?[0-9]+)$/)) // we prepend "0" so that x20 be interpreted as hexadecim (0x20)
result += String.fromCharCode("0" + m[1]); result += String.fromCharCode("0" + m[1]);
else if (self.entities[buffer + c]) result += self.entities[buffer + c]; else if (self.entities[buffer + c]) result += self.entities[buffer + c];
else if (m = Object.keys(entities).find((n)=>buffer.startsWith(n))) result += self.entities[m] + buffer.slice(m.length) + c; else if (m = Object.keys(entities).find((n)=>buffer.startsWith(n))) // partial match
result += self.entities[m] + buffer.slice(m.length) + c;
else { else {
err("Incorrect escape."); err("Incorrect escape.");
result += buffer + ";"; result += buffer + ";";
@@ -891,8 +873,7 @@ exports.export = function(dest, destName, get) {
result result
]; ];
} else result += c; } else result += c;
} else err("Never happens.") // The joke is it might. } else err("Never happens."); // The joke is it might.
;
// 8 // 8
pos++; pos++;
} }
@@ -957,6 +938,36 @@ exports.export = function(dest, destName, get) {
exportify(exports); exportify(exports);
})(); })();
},{}],"5dUr6":[function(require,module,exports) {
exports.interopDefault = function(a) {
return a && a.__esModule ? a : {
default: a
};
};
exports.defineInteropFlag = function(a) {
Object.defineProperty(a, "__esModule", {
value: true
});
};
exports.exportAll = function(source, dest) {
Object.keys(source).forEach(function(key) {
if (key === "default" || key === "__esModule" || dest.hasOwnProperty(key)) return;
Object.defineProperty(dest, key, {
enumerable: true,
get: function() {
return source[key];
}
});
});
return dest;
};
exports.export = function(dest, destName, get) {
Object.defineProperty(dest, destName, {
enumerable: true,
get: get
});
};
},{}]},["LGGZX"], "LGGZX", "parcelRequire4dc0") },{}]},["LGGZX"], "LGGZX", "parcelRequire4dc0")
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map
@@ -1 +1 @@
{"mappings":"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 truncated {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CA+DwB;AA/DxB;AAEA,SAAS,SAAS,GAAG;IACjB,MAAM,MAAM;QACR,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,UAAU;IACd;IACA,MAAM,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;IAC1D,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAQ,GAAG,CAAC,IAAI,IAAI;AACjD;AAEA,eAAe,kBAAkB,MAAM,EAAE,GAAG;IACxC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,WAAW,CAAC,KAAK;IAC5D,MAAM,WAAW,MAAM,MAAM,OAAO,GAAG;IACvC,MAAM,SAAS,MAAM,SAAS,WAAW;IACzC,MAAM,UAAU,IAAI,YAAY,OAAO,QAAQ,IAAI;IACnD,MAAM,OAAO,QAAQ,MAAM,CAAC;IAC5B,OAAQ,OAAO,IAAI,IAAI,OAAO,OAAO,GAAG;QACpC,KAAK;YACD,OAAO,SAAS;QAEpB,KAAK;YACD,OAAO,SAAS;QAEpB,KAAK;YACD,OAAO;QAEX;YACI,OAAO;IACf;AACJ;AAEA,SAAS,WAAW,KAAK,EAAE,SAAS;IAChC,MAAM,SAAS,IAAI,CAAA,GAAA,oBAAY,AAAD;IAC9B,MAAM,SAAS,OAAO,KAAK,CAAC,IAAI;IAEhC,IAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,EAAE,IAAK;QACnC,MAAM,OAAO,KAAK,CAAC,EAAE;QACrB,MAAM,SAAS,SAAS,CAAC,EAAE;QAE3B,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAK;YACvC,MAAM,MAAM,KAAK,IAAI,CAAC,EAAE;YACxB,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAK;gBAC/C,MAAM,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACrC,SAAS,KAAK,GAAG,CAAC,yBAAyB,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,SAAS,KAAK,CAAC,MAAM,CAAC;YACvF;QACJ;QAEA,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,GACvB,OAAO,IAAI,GAAG,KAAK,IAAI;aAEvB,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IACpC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAK,KAAK,IAAI,CAAC,EAAE,EAAE,MAAM,YAAY,EAAE;IAGpF;IAEA,OAAO;AACX;AAEe,SAAS,iCAAiC,EAAE,SAAS,EAAE,UAAU,IAAM,IAAI,EAAE;IACxF,OAAO,OAAO;QACV,MAAM,OAAO,MAAM,QAAQ,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,SAAW,kBAAkB,QAAQ;QACnF,MAAM,SAAS,IAAI,CAAA,GAAA,oBAAY,AAAD;QAC9B,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC,MAAQ,OAAO,KAAK,CAAC,KAAK;QAClD,MAAM,OAAO,IAAI,CAAA,GAAA,wBAAgB,AAAD;QAChC,MAAM,OAAO,QAAQ,OAAO,cAAc,WAAW,OAAO;QAC5D,IAAI,MAAM,MAAM,QAAQ;YACpB,MAAM,MAAM,KAAK,SAAS,CAAC,KAAK,IAAI;YACpC,MAAM,MAAM,IAAI,eAAe,CAAC,IAAI,KAAK;gBAAC;aAAI,EAAE;gBAAE,MAAM;YAAW;YACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG;YAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC;gBACd,GAAG,IAAI,MAAM,CAAC,QAAQ;gBACtB;gBACA,MAAM;gBACN,WAAW;YACf;QACJ,OACI,MAAM,IAAI,MAAM;IAExB;AACJ;AAEA,iCAAiC,GAAG;AACpC,iCAAiC,OAAO;AACxC,iCAAiC,KAAK;AACtC,iCAAiC,YAAY,GAAG,CAAA,GAAA,oBAAY,AAAD;AAC3D,iCAAiC,gBAAgB,GAAG,CAAA,GAAA,wBAAgB,AAAD;AAEnE,IAAI,OAAO,WAAW,aAClB,MAAM,CAAC,mCAAmC,GAAG;;;AC7FjD,mDAAmD;AACnD,oDAAoD;AAEpD,2EAA2E;AAE3E,kBAAkB,GACjB,CAAA;IACG,IAAI,qBAAqB;QACrB,WAAW;QACX,aAAa;QACb,cAAc;QACd,WAAW;QACX,cAAc;QACd,eAAe;QACf,MAAM;QACN,WAAW;IACf;IAEA,IAAI,eAAe,SAAU,QAAQ;QACjC,IAAI,CAAC,UACD,WAAW;YACP,QAAQ;YACR,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,SAAS;QACb;QAEJ,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,KAAK,GAAG,SAAU,KAAK,EAAE,IAAI;YAC9B,mCAAmC;YACnC,QAAQ,MAAM,OAAO,CAAC,OAAO;YAC7B,IAAI,UAAU,cACV,YAAY,KAAK,GAAG,IACpB,UAAU,GACV,QAAQ,MAAM,KAAK,CAAC,UACpB,mBAAmB,OACnB,SAAS,EAAE,EACX,OAAO,EAAE,EACT,SAAS,EAAE;YACf,SAAS,IAAI,OAAO,EAAE,GAAG;gBACrB,OAAO,IAAI,CAAC;oBAAE,SAAS;oBAAS,MAAM,UAAU;oBAAG,KAAK;gBAAI;YAChE;YAEA,IAAI,OAAO,KAAK,CAAC,QAAQ,EACrB,aAAa,KAAK,MAAM,EACxB,YAAY,UACZ,MAAM,GACN,mBAAmB,UAAU,MAAM;YAEvC,mBAAmB,GACnB,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU;gBACtB,MAAM;gBACN,oBAAoB;YACxB;YACA,aAAa,GACb,IACI,aAAa,oBACb,KAAK,OAAO,CAAC,eAAe,IAAI,OAC/B,aAAa,oBAAoB,IAAI,CAAC,iBAAiB,KAAK,OAAO,IAAI,CAAC,iBAAiB,KAAK,KAE/F,IAAI;YAGR;YAEA,UAAU,GACV,MAAO,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,CAAC,QAAQ,IAAI,UAAW;gBACxD,IAAI;gBACJ,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI;oBACrC,mBAAmB;oBACnB;gBACJ;gBACA;YACJ;YAEA,YAAY,GACZ,MAAO,KAAK,CAAC,QAAQ,IAAI,UAAW;gBAChC,IAAI;gBACJ,MAAO,CAAC,oBAAoB,KAAK,CAAC,QAAQ,IAAI,GAC1C;gBAEJ,IAAI,CAAC,oBAAoB,KAAK,CAAC,QAAQ,IAAI,WAAW;gBAEtD,gBAAgB,GAChB,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG,oBAAoB;oBACxC,IAAI;oBACJ,WAAW;oBACX,SAAS;oBACT,aAAa;oBACb,WAAW;oBACX,aAAa;oBACb,cAAc;oBACd,WAAW;oBACX,cAAc;oBACd,eAAe;oBACf,MAAM;oBACN,WAAW;oBACX,MAAM;oBACN,MAAM;gBACV;gBAEA,IAAI,eAAe;gBAEnB,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI;oBACrC,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ;oBAEvB;;;WAGT,GACS,IAAI,iBAAiB,IAAI,CAAC,IAAI,EAAE,GAAG;wBAC/B,8BAA8B;wBAC9B;wBACA,MAAO,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,CAAC,QAAQ,IAAI,UAAW;4BACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI;4BAC7C;wBACJ;wBACA;oBACJ;oBAEA,UAAU,GACV,IAAI,kBAAkB,IAAI,CAAC,IAAI,EAAE,GAAG;wBAChC,IAAI,QAAQ,EAAE;wBACd,IAAI,UAAU;wBACd;wBACA,MAAO,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,CAAC,QAAQ,IAAI,UAAW;4BACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI;gCACrC,IAAI;gCACJ,UAAU;4BACd;4BACA,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ;4BACzB;wBACJ;wBACA,IAAI,KAAK,MAAM,EAAE;4BACb,IAAI;4BACJ;wBACJ;wBACA,IAAI,CAAC,SACD,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC;wBAE3B;oBACJ;oBAEA;oBAEA,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,CAAC,QAAQ,IAAI,WAAW;wBACrD,IAAI;wBACJ;oBACJ;oBAEA,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI;wBACrC,eAAe;wBACf,IAAI;wBACJ;oBACJ;gBACJ;gBAEA,WAAW,GACX,mBAAmB;gBACnB,IAAI,UAAU,IAAI,kCAAkC,KAAK,CAAC,QAAQ,EAAE;gBACpE,IAAI,mBAAmB;gBACvB,IAAI,KAAK,MAAM,GAAG,GACd,mBAAmB,IAAI,CAAC,KAAK,MAAM,GAAG,EAAE,CAAC,SAAS;gBAEtD,IAAI,gBLine truncated
@@ -33,14 +33,13 @@ async function loadSubtitleAsVtt(option, art) {
} }
} }
function mergeVtts(vtts, subtitles) { function mergeTrees(trees, subtitles) {
const parser = new WebVTTParser(); const parser = new WebVTTParser();
const seri = new WebVTTSerializer();
const result = parser.parse('', 'metadata'); const result = parser.parse('', 'metadata');
for (let i = 0; i < vtts.length; i++) { for (let i = 0; i < trees.length; i++) {
const tree = trees[i];
const option = subtitles[i]; const option = subtitles[i];
const tree = parser.parse(vtts[i], 'metadata');
for (let j = 0; j < tree.cues.length; j++) { for (let j = 0; j < tree.cues.length; j++) {
const cue = tree.cues[j]; const cue = tree.cues[j];
@@ -59,28 +58,37 @@ function mergeVtts(vtts, subtitles) {
} }
} }
return seri.serialize(result.cues); return result;
} }
export default function artplayerPluginMultipleSubtitles({ subtitles }) { export default function artplayerPluginMultipleSubtitles({ subtitles, onMerge = () => null }) {
return async (art) => { return async (art) => {
const vtts = await Promise.all(subtitles.map((option) => loadSubtitleAsVtt(option, art))); const vtts = await Promise.all(subtitles.map((option) => loadSubtitleAsVtt(option, art)));
const vtt = mergeVtts(vtts, subtitles); const parser = new WebVTTParser();
const url = URL.createObjectURL(new Blob([vtt], { type: 'text/vtt' })); const trees = vtts.map((vtt) => parser.parse(vtt, 'metadata'));
const seri = new WebVTTSerializer();
art.option.subtitle.escape = false; const tree = onMerge(trees, subtitles) || mergeTrees(trees, subtitles);
if (tree?.cues?.length) {
art.subtitle.init({ const vtt = seri.serialize(tree.cues);
...art.option.subtitle, const url = URL.createObjectURL(new Blob([vtt], { type: 'text/vtt' }));
url, art.option.subtitle.escape = false;
type: 'vtt', art.subtitle.init({
onVttLoad: unescape, ...art.option.subtitle,
}); url,
type: 'vtt',
onVttLoad: unescape,
});
} else {
throw new Error('No subtitle found');
}
}; };
} }
artplayerPluginMultipleSubtitles.env = process.env.NODE_ENV; artplayerPluginMultipleSubtitles.env = process.env.NODE_ENV;
artplayerPluginMultipleSubtitles.version = process.env.APP_VER; artplayerPluginMultipleSubtitles.version = process.env.APP_VER;
artplayerPluginMultipleSubtitles.build = process.env.BUILD_DATE; artplayerPluginMultipleSubtitles.build = process.env.BUILD_DATE;
artplayerPluginMultipleSubtitles.WebVTTParser = WebVTTParser;
artplayerPluginMultipleSubtitles.WebVTTSerializer = WebVTTSerializer;
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window['artplayerPluginMultipleSubtitles'] = artplayerPluginMultipleSubtitles; window['artplayerPluginMultipleSubtitles'] = artplayerPluginMultipleSubtitles;
@@ -9,6 +9,7 @@ declare const artplayerPluginMultipleSubtitles: (option: {
name?: string; name?: string;
type?: 'vtt' | 'srt' | 'ass'; type?: 'vtt' | 'srt' | 'ass';
encoding?: string; encoding?: string;
onParser?(...args: object[]): object;
}[]; }[];
}) => (art: Artplayer) => { }) => (art: Artplayer) => {
name: 'artplayerPluginMultipleSubtitles'; name: 'artplayerPluginMultipleSubtitles';