Files
ArtPlayer/docs/compiled/artplayer-plugin-multiple-subtitles.legacy.js
T
Harvey Zhao 1dc8e9a4ff refactor: update global name handling in build scripts
- Replaced `toPascalCase` with `getGlobalName` in build and dev scripts to standardize global variable naming for packages.
- Added `toCamelCase` and `getGlobalName` utility functions in `utils.js` to handle naming conventions based on package type.
2026-03-07 20:41:11 +08:00

8 lines
14 KiB
JavaScript

/*!
* artplayer-plugin-multiple-subtitles.js v1.1.1
* Github: https://github.com/zhw2590582/ArtPlayer
* (c) 2017-2026 Harvey Zhao
* Released under the MIT License.
*/
!function(e,t){"object"===typeof exports&&"undefined"!==typeof module?module.exports=t():"function"==typeof define&&define.amd?(t.artplayerPluginMultipleSubtitles=t(),define(function(){return t.artplayerPluginMultipleSubtitles})):(e="undefined"!==typeof globalThis?globalThis:e||self).artplayerPluginMultipleSubtitles=t()}(this,function(){"use strict";var e=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,i=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,r=(t,n,i)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[n]=i,o=(e,t)=>{for(var n in t||(t={}))a.call(t,n)&&r(e,n,t[n]);if(i)for(var n of i(t))s.call(t,n)&&r(e,n,t[n]);return e},l=(e,t,n)=>new Promise((i,a)=>{var s=e=>{try{o(n.next(e))}catch(t){a(t)}},r=e=>{try{o(n.throw(e))}catch(t){a(t)}},o=e=>e.done?i(e.value):Promise.resolve(e.value).then(s,r);o((n=n.apply(e,t)).next())}),f={direction:"horizontal",snapToLines:!0,linePosition:"auto",lineAlign:"start",textPosition:"auto",positionAlign:"auto",size:100,alignment:"center"},c=function(e){e||(e={"&amp":"&","&lt":"<","&gt":">","&lrm":"\u200e","&rlm":"\u200f","&nbsp":"\xa0"}),this.entities=e,this.parse=function(t,n){t=t.replace(/\0/g,"\ufffd");var i=Date.now(),a=0,s=t.split(/\r\n|\r|\n/),r=!1,o=[],l=[],c=[];function p(e,t){c.push({message:e,line:a+1,col:t})}var m=s[a],g=m.length,h="WEBVTT",v=0,b=6;for("\ufeff"===m[0]&&(v=1,b+=1),(g<b||m.indexOf(h)!==0+v||g>b&&" "!==m[b]&&"\t"!==m[b])&&p('No valid signature. (File needs to start with "WEBVTT".)'),a++;""!=s[a]&&void 0!=s[a];){if(p("No blank line after the signature."),-1!=s[a].indexOf("--\x3e")){r=!0;break}a++}for(;void 0!=s[a];){for(var x;!r&&""==s[a];)a++;if(!r&&void 0==s[a])break;x=Object.assign({},f,{id:"",startTime:0,endTime:0,pauseOnExit:!1,direction:"horizontal",snapToLines:!0,linePosition:"auto",lineAlign:"start",textPosition:"auto",positionAlign:"auto",size:100,alignment:"center",text:"",tree:null});var T=!0;if(-1==s[a].indexOf("--\x3e")){if(x.id=s[a],/^NOTE($|[ \t])/.test(x.id)){for(a++;""!=s[a]&&void 0!=s[a];)-1!=s[a].indexOf("--\x3e")&&p("Cannot have timestamp in a comment."),a++;continue}if(/^STYLE($|[ \t])/.test(x.id)){var y=[],w=!1;for(a++;""!=s[a]&&void 0!=s[a];)-1!=s[a].indexOf("--\x3e")&&(p("Cannot have timestamp in a style block."),w=!0),y.push(s[a]),a++;if(l.length){p("Style blocks cannot appear after the first cue.");continue}w||o.push(y.join("\n"));continue}if(""==s[++a]||void 0==s[a]){p("Cue identifier cannot be standalone.");continue}if(-1==s[a].indexOf("--\x3e")){T=!1,p("Cue identifier needs to be followed by timestamp.");continue}}r=!1;var O=new u(s[a],p),P=0;if(l.length>0&&(P=l[l.length-1].startTime),!T||O.parse(x,P)){for(a++;""!=s[a]&&void 0!=s[a];){if(-1!=s[a].indexOf("--\x3e")){p("Blank line missing before cue."),r=!0;break}""!=x.text&&(x.text+="\n"),x.text+=s[a],a++}var I=new d(x.text,p,n,e);x.tree=I.parse(x.startTime,x.endTime),l.push(x)}else for(x=null,a++;""!=s[a]&&void 0!=s[a];){if(-1!=s[a].indexOf("--\x3e")){r=!0;break}a++}}return l.sort(function(e,t){return e.startTime<t.startTime?-1:e.startTime>t.startTime?1:e.endTime>t.endTime?-1:e.endTime<t.endTime?1:0}),{cues:l,errors:c,time:Date.now()-i,styles:o}}},u=function(e,t){var n=/[\u0020\t\f]/,i=/[^\u0020\t\f]/,a=(e=e,0),s=function(e){t(e,a+1)};function r(t){for(;void 0!=e[a]&&t.test(e[a]);)a++}function o(t){for(var n="";void 0!=e[a]&&t.test(e[a]);)n+=e[a],a++;return n}function l(){var t,n,i,r,l="minutes";if(void 0!=e[a])if(/\d/.test(e[a]))if(((t=o(/\d/)).length>2||parseInt(t,10)>59)&&(l="hours"),":"==e[a])if(a++,2==(n=o(/\d/)).length){if("hours"==l||":"==e[a]){if(":"!=e[a])return void s("No seconds found or minutes is greater than 59.");if(a++,2!=(i=o(/\d/)).length)return void s("Must be exactly two digits.")}else{if(2!=t.length)return void s("Must be exactly two digits.");i=n,n=t,t="0"}if("."==e[a])if(a++,3==(r=o(/\d/)).length)if(parseInt(n,10)>59)s("You cannot have more than 59 minutes.");else{if(!(parseInt(i,10)>59))return 60*parseInt(t,10)*60+60*parseInt(n,10)+parseInt(i,10)+parseInt(r,10)/1e3;s("You cannot have more than 59 seconds.")}else s("Milliseconds must be given in three digits.");else s('No decimal separator (".") found.')}else s("Must be exactly two digits.");else s("No time unit separator found.");else s("Timestamp must start with a character in the range 0-9.");else s("No timestamp found.")}this.parse=function(t,o){if(r(n),t.startTime=l(),void 0!=t.startTime)if(t.startTime<o&&s("Start timestamp is not greater than or equal to start timestamp of previous cue."),i.test(e[a])&&s("Timestamp not separated from '--\x3e' by whitespace."),r(n),"-"==e[a])if(a++,"-"==e[a])if(a++,">"==e[a]){if(a++,i.test(e[a])&&s("'--\x3e' not separated from timestamp by whitespace."),r(n),t.endTime=l(),void 0!=t.endTime)return t.endTime<=t.startTime&&s("End timestamp is not greater than start timestamp."),i.test(e[a]),r(n),function(e,t){for(var i=e.split(n),a=[],r=0;r<i.length;r++)if(""!=i[r]){var o=i[r].indexOf(":"),l=i[r].slice(0,o),f=i[r].slice(o+1);if(-1!=a.indexOf(l)&&s("Duplicate setting."),a.push(l),""==f)return void s("No value for setting defined.");if("vertical"==l){if("rl"!=f&&"lr"!=f){s("Writing direction can only be set to 'rl' or 'rl'.");continue}t.direction=f}else if("line"==l){if(/,/.test(f)){var c=f.split(",");f=c[0];var u=c[1]}if(!/^[-\d](\d*)(\.\d+)?%?$/.test(f)){s("Line position takes a number or percentage.");continue}if(-1!=f.indexOf("-",1)){s("Line position can only have '-' at the start.");continue}if(-1!=f.indexOf("%")&&f.indexOf("%")!=f.length-1){s("Line position can only have '%' at the end.");continue}if("-"==f[0]&&"%"==f[f.length-1]){s("Line position cannot be a negative percentage.");continue}var d=f,p=!1;if("%"==f[f.length-1]&&(p=!0,d=f.slice(0,f.length-1),parseInt(f,10)>100)){s("Line position cannot be >100%.");continue}if(""===d||isNaN(d)||!isFinite(d)){s("Line position needs to be a number");continue}if(void 0!==u){if(!["start","center","end"].includes(u)){s("Line alignment needs to be one of start, center or end");continue}t.lineAlign=u}t.snapToLines=!p,t.linePosition=parseFloat(d),parseFloat(d).toString()!==d&&(t.nonSerializable=!0)}else if("position"==l){if(/,/.test(f)){c=f.split(","),f=c[0];var m=c[1]}if("%"!=f[f.length-1]){s("Text position must be a percentage.");continue}if(parseInt(f,10)>100||parseInt(f,10)<0){s("Text position needs to be between 0 and 100%.");continue}if(""===(d=f.slice(0,f.length-1))||isNaN(d)||!isFinite(d)){s("Line position needs to be a number");continue}if(void 0!==m){if(!["line-left","center","line-right"].includes(m)){s("Position alignment needs to be one of line-left, center or line-right");continue}t.positionAlign=m}t.textPosition=parseFloat(d)}else if("size"==l){if("%"!=f[f.length-1]){s("Size must be a percentage.");continue}if(parseInt(f,10)>100){s("Size cannot be >100%.");continue}var g=f.slice(0,f.length-1);if(void 0===g||""===g||isNaN(g)){s("Size needs to be a number"),g=100;continue}if((g=parseFloat(g))<0||g>100){s("Size needs to be between 0 and 100%.");continue}t.size=g}else if("align"==l){var h=["start","center","end","left","right"];if(-1==h.indexOf(f)){s("Alignment can only be set to one of "+h.join(", ")+".");continue}t.alignment=f}else s("Invalid setting.")}}(e.substring(a),t),!0}else s("No valid timestamp separator found.");else s("No valid timestamp separator found.");else s("No valid timestamp separator found.")},this.parseTimestamp=function(){var t=l();if(void 0==e[a])return t;s("Timestamp must not have trailing characters.")}},d=function(e,t,n,i){this.entities=i;var a=this,s=(e=e,0),r=function(e){"metadata"!=n&&t(e,s+1)};function l(){for(var t="data",n="",o="",l=[];void 0!=e[s-1]||0==s;){var f=e[s];if("data"==t)if("&"==f)o=f,t="escape";else if("<"==f&&""==n)t="tag";else{if("<"==f||void 0==f)return["text",n];n+=f}else if("escape"==t){if("<"==f||void 0==f){let e;return r("Incorrect escape."),(e=o.match(/^&#([0-9]+)$/))?n+=String.fromCharCode(e[1]):a.entities[o]?n+=a.entities[o]:n+=o,["text",n]}if("&"==f)r("Incorrect escape."),n+=o,o=f;else if(/[a-z#0-9]/i.test(f))o+=f;else if(";"==f){let e;(e=o.match(/^&#(x?[0-9]+)$/))?n+=String.fromCharCode("0"+e[1]):a.entities[o+f]?n+=a.entities[o+f]:(e=Object.keys(i).find(e=>o.startsWith(e)))?n+=a.entities[e]+o.slice(e.length)+f:(r("Incorrect escape."),n+=o+";"),t="data"}else r("Incorrect escape."),n+=o+f,t="data"}else if("tag"==t)if("\t"==f||"\n"==f||"\f"==f||" "==f)t="start tag annotation";else if("."==f)t="start tag class";else if("/"==f)t="end tag";else if(/\d/.test(f))n=f,t="timestamp tag";else{if(">"==f||void 0==f)return">"==f&&s++,["start tag","",[],""];n=f,t="start tag"}else if("start tag"==t)if("\t"==f||"\f"==f||" "==f)t="start tag annotation";else if("\n"==f)o=f,t="start tag annotation";else if("."==f)t="start tag class";else{if(">"==f||void 0==f)return">"==f&&s++,["start tag",n,[],""];n+=f}else if("start tag class"==t)if("\t"==f||"\f"==f||" "==f)o&&l.push(o),o="",t="start tag annotation";else if("\n"==f)o&&l.push(o),o=f,t="start tag annotation";else if("."==f)o&&l.push(o),o="";else{if(">"==f||void 0==f)return">"==f&&s++,o&&l.push(o),["start tag",n,l,""];o+=f}else if("start tag annotation"==t){if(">"==f||void 0==f)return">"==f&&s++,["start tag",n,l,o=o.split(/[\u0020\t\f\r\n]+/).filter(function(e){if(e)return!0}).join(" ")];o+=f}else if("end tag"==t){if(">"==f||void 0==f)return">"==f&&s++,["end tag",n];n+=f}else if("timestamp tag"==t){if(">"==f||void 0==f)return">"==f&&s++,["timestamp",n];n+=f}else r("Never happens.");s++}}this.parse=function(t,i){var a={children:[]},f=a,c=[];function d(e){f.children.push({type:"object",name:e[1],classes:e[2],children:[],parent:f}),f=f.children[f.children.length-1]}function p(e){for(var t=f;t;){if(t.name==e)return!0;t=t.parent}}for(;void 0!=e[s];){var m=l();if("text"==m[0])f.children.push({type:"text",value:m[1],parent:f});else if("start tag"==m[0]){"chapters"==n&&r("Start tags not allowed in chapter title text.");var g=m[1];"v"!=g&&"lang"!=g&&""!=m[3]&&r("Only <v> and <lang> can have an annotation."),"c"==g||"i"==g||"b"==g||"u"==g||"ruby"==g||"rt"==g&&"ruby"==f.name?d(m):"v"==g?(p("v")&&r("<v> cannot be nested inside itself."),d(m),f.value=m[3],m[3]||r("<v> requires an annotation.")):"lang"==g?(d(m),f.value=m[3]):r("Incorrect start tag.")}else if("end tag"==m[0])"chapters"==n&&r("End tags not allowed in chapter title text."),m[1]==f.name?f=f.parent:"ruby"==m[1]&&"rt"==f.name?f=f.parent.parent:r("Incorrect end tag.");else if("timestamp"==m[0]){"chapters"==n&&r("Timestamp not allowed in chapter title text.");var h=new u(m[1],r).parseTimestamp();void 0!=h&&((h<=t||h>=i)&&r("Timestamp must be between start timestamp and end timestamp."),c.length>0&&c[c.length-1]>=h&&r("Timestamp must be greater than any previous timestamp."),f.children.push({type:"timestamp",value:h,parent:f}),c.push(h))}}for(;f.parent;)"v"!=f.name&&r("Required end tag missing."),f=f.parent;return function e(t){const n=o({},t);return t.children&&(n.children=t.children.map(e)),n.parent&&delete n.parent,n}(a)}},p=function(){function e(e){const t=("00"+1e3*(e-Math.floor(e)).toFixed(3)).slice(-3);let n=0,i=0,a=0;return e>=3600&&(n=Math.floor(e/3600)),i=Math.floor((e-3600*n)/60),a=Math.floor(e-3600*n-60*i),(n?n+":":"")+(""+i).padStart(2,"0")+":"+(""+a).padStart(2,"0")+"."+t}function t(n){for(var i="",a=0;a<n.length;a++){var s=n[a];if("text"==s.type)i+=s.value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");else if("object"==s.type){if(i+="<"+s.name,s.classes)for(var r=0;r<s.classes.length;r++)i+="."+s.classes[r];s.value&&(i+=" "+s.value),i+=">",s.children&&(i+=t(s.children)),i+="</"+s.name+">"}else"timestamp"==s.type?i+="<"+e(s.value)+">":i+="<"+s.value+">"}return i}function n(n){return(void 0!==n.id?n.id+"\n":"")+e(n.startTime)+" --\x3e "+e(n.endTime)+function(e){var t="";const n=Object.keys(f).filter(t=>e[t]!==f[t]);return n.includes("direction")&&(t+=" vertical:"+e.direction),n.includes("alignment")&&(t+=" align:"+e.alignment),n.includes("size")&&(t+=" size:"+e.size+"%"),(n.includes("lineAlign")||n.includes("linePosition"))&&(t+=" line:"+e.linePosition+(e.snapToLines?"":"%")+(e.lineAlign&&e.lineAlign!=f.lineAlign?","+e.lineAlign:"")),(n.includes("textPosition")||n.includes("positionAlign"))&&(t+=" position:"+e.textPosition+"%"+(e.positionAlign&&e.positionAlign!==f.positionAlign?","+e.positionAlign:"")),t}(n)+"\n"+t(n.tree.children)+"\n\n"}function i(e){return"STYLE\n"+e+"\n\n"}this.serialize=function(e,t){var a="WEBVTT\n\n";if(t)for(var s=0;s<t.length;s++)a+=i(t[s]);for(s=0;s<e.length;s++)a+=n(e[s]);return a}};return function({subtitles:e=[]}){return i=>l(null,null,function*(){const{unescape:a,getExt:s,srtToVtt:r,assToVtt:f}=i.constructor.utils,u=new c,d=new p,m=yield Promise.all(e.map(e=>function(e,t){return l(this,arguments,function*(e,{getExt:t,srtToVtt:n,assToVtt:i}){const a=yield fetch(e.url),s=yield a.arrayBuffer(),r=new TextDecoder(e.encoding||"utf-8").decode(s);switch(e.type||t(e.url)){case"srt":return n(r);case"ass":return i(r);case"vtt":return r;default:return""}})}(e,{getExt:s,srtToVtt:r,assToVtt:f}))),g=m.map((t,n)=>{const i=u.parse(t,"metadata");return i.url=e[n].url,i.name=e[n].name,i});let h="";function v(e=[]){const s=function(e){const t=(new c).parse("","metadata");for(let n=0;n<e.length;n++){const i=e[n];if(!i.updated){i.updated=!0;for(let e=0;e<i.cues.length;e++){const t=i.cues[e];for(let e=0;e<t.tree.children.length;e++){const n=t.tree.children[e];n.value=`<div class="art-subtitle-${i.name}">${n.value}</div>`}}}t.cues.push(...i.cues)}return t}(e),r=d.serialize(s.cues);URL.revokeObjectURL(h);const l=URL.createObjectURL(new Blob([r],{type:"text/vtt"}));var f;h=l,i.option.subtitle.escape=!1,i.subtitle.init((f=o({},i.option.subtitle),t(f,n({url:l,type:"vtt",onVttLoad:a}))))}return v(g),{name:"multipleSubtitles",tracks:(e=[])=>v(e.map(e=>g.find(t=>t.name===e))),reset:()=>v(g)}})}});