mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-09 03:46:16 -08:00
- Created a new documentation file for the danmuku plugin, detailing its usage and providing code examples. - Added a comprehensive guide for language settings (i18n), including instructions for importing languages, setting default languages, and modifying language options. - Included code snippets for initializing the Artplayer with different languages and examples for adding new languages.
9 lines
18 KiB
JavaScript
9 lines
18 KiB
JavaScript
|
|
/*!
|
|
* artplayer-plugin-libass.js v1.0.0
|
|
* Github: https://github.com/zhw2590582/ArtPlayer
|
|
* (c) 2017-2025 Harvey Zack
|
|
* Released under the MIT License.
|
|
*/
|
|
!function(e,t,r,s,i,n,a,o){var l="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},c="function"==typeof l[s]&&l[s],d=c.i||{},u=c.cache||{},v="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function f(t,r){if(!u[t]){if(!e[t]){if(i[t])return i[t];var n="function"==typeof l[s]&&l[s];if(!r&&n)return n(t,!0);if(c)return c(t,!0);if(v&&"string"==typeof t)return v(t);var a=Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}d.resolve=function(r){var s=e[t][1][r];return null!=s?s:r},d.cache={};var o=u[t]=new f.Module(t);e[t][0].call(o.exports,d,o,o.exports,l)}return u[t].exports;function d(e){var t=d.resolve(e);return!1===t?{}:f(t)}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.require=v,this.exports={}},f.modules=e,f.cache=u,f.parent=c,f.distDir=void 0,f.publicUrl=void 0,f.devServer=void 0,f.i=d,f.register=function(t,r){e[t]=[function(e,t){t.exports=r},{}]},Object.defineProperty(f,"root",{get:function(){return l[s]}}),l[s]=f;for(var h=0;h<t.length;h++)f(t[h]);if(r){var m=f(r);"object"==typeof exports&&"undefined"!=typeof module?module.exports=m:"function"==typeof define&&define.amd&&define(function(){return m})}}({"4omrA":[function(e,t,r,s){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(r),i.export(r,"default",()=>o);var n=e("./adapter"),a=i.interopDefault(n);function o(e){return t=>{let r=new(0,a.default)(t,e);return{name:"artplayerPluginLibass",libass:r.libass,visible:r.visible,init:r.init.bind(r),switch:r.switch.bind(r),show:r.show.bind(r),hide:r.hide.bind(r),destroy:r.destroy.bind(r)}}}"undefined"!=typeof window&&(window.artplayerPluginLibass=o)},{"./adapter":"i5CMM","@parcel/transformer-js/src/esmodule-helpers.js":"w4pLy"}],i5CMM:[function(e,t,r,s){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(r);var n=e("libass-wasm"),a=i.interopDefault(n);let o=`[Script Info] ScriptType: v4.00+`;r.default=class{constructor(e,t){let{constructor:r,template:s}=e;this.art=e,this.$video=s.$video,this.$webvtt=s.$subtitle,this.utils=r.utils,this.libass=null,e.once("ready",this.init.bind(this,t))}async init(e){this.#e(),await this.#t(e),this.#r(),this.art.emit("artplayerPluginLibass:init",this);let t=this.art?.option?.subtitle?.url;t&&"ass"===this.utils.getExt(t)&&this.switch(t)}switch(e){this.art.emit("artplayerPluginLibass:switch",e),e&&"ass"===this.utils.getExt(e)?(this.currentType="ass",this.libass.freeTrack(),this.libass.setTrackByUrl(this.#s(e)),this.visible=this.art.subtitle.show):(this.currentType="webvtt",this.hide(),this.libass.freeTrack())}setVisibility(e){this.visible=e}setOffset(e){this.timeOffset=e}get active(){return"ass"===this.currentType}get visible(){return!!this.libass&&"none"!==this.libass.canvasParent.style.display}set visible(e){this.art.emit("artplayerPluginLibass:visible",e),this.#i(!this.active),this.libass.canvasParent&&(this.libass.canvasParent.style.display=e?"block":"none",e&&this.libass.resize())}get timeOffset(){return this.libass.timeOffset}set timeOffset(e){this.art.emit("artplayerPluginLibass:timeOffset",e),this.libass.timeOffset=e}show(){this.visible=!0}hide(){this.visible=!1}destroy(){this.art.emit("artplayerPluginLibass:destroy"),this.#n(),this.libass.dispose(),URL.revokeObjectURL(this.workerScriptUrl),this.libass=null}async #t(e={}){if(!e.fallbackFont)return this.utils.errorHandle(e.fallbackFont,"artplayerPluginLibass: fallbackFont is required");e.workerUrl||(e.workerUrl="https://cdnjs.cloudflare.com/ajax/libs/libass-wasm/4.1.0/js/subtitles-octopus-worker.js"),e.availableFonts&&(e.availableFonts=Object.entries(e.availableFonts).reduce((e,[t,r])=>(e[t]=this.#s(r),e),{})),this.libass=new(0,a.default)({subContent:o,video:this.$video,...e,workerUrl:await this.#a(e),fallbackFont:this.#s(e.fallbackFont),fonts:e.fonts?.map(e=>this.#s(e))}),this.libass.canvasParent.className="artplayer-plugin-libass",this.libass.canvasParent.style.cssText=` position: absolute; top: 0; left: 0; width: 100%; height: 100%; user-select: none; pointer-events: none; z-index: 20;`}#r(){this.switchHandler=this.switch.bind(this),this.visibleHandler=this.setVisibility.bind(this),this.offsetHandler=this.setOffset.bind(this),this.art.on("subtitle",this.visibleHandler),this.art.on("subtitleLoad",this.switchHandler),this.art.on("subtitleOffset",this.offsetHandler),this.art.once("destroy",this.destroy.bind(this))}#n(){this.art.off("subtitle",this.visibleHandler),this.art.off("subtitleLoad",this.switchHandler),this.art.off("subtitleOffset",this.offsetHandler)}#i(e){this.$webvtt.style.visibility=e?"visible":"hidden"}#s(e){return this.#o(e)?e:new URL(e,document.baseURI).toString()}#o(e){return/^https?:\/\//.test(e)}#a({workerUrl:e,wasmUrl:t}){return new Promise(r=>{fetch(e).then(e=>e.text()).then(s=>{let i=s,n=new Blob([i=i.replace(/wasmBinaryFile\s*=\s*"(subtitles-octopus-worker\.wasm)"/g,(r,s)=>(t=t?this.#s(t):new URL(s,e).toString(),`wasmBinaryFile = "${t}"`))],{type:"text/javascript"});r(URL.createObjectURL(n))})})}#e(){let e=!1;try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){let t=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));t instanceof WebAssembly.Module&&(e=new WebAssembly.Instance(t)instanceof WebAssembly.Instance)}}catch(e){}this.utils.errorHandle(e,"Browser does not support WebAssembly")}}},{"libass-wasm":"2bwuu","@parcel/transformer-js/src/esmodule-helpers.js":"w4pLy"}],"2bwuu":[function(e,t,r,s){"function"==typeof SubtitlesOctopusOnLoad&&SubtitlesOctopusOnLoad(),t.exports&&(t.exports=function(e){var t=!1;try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){let e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));e instanceof WebAssembly.Module&&(t=new WebAssembly.Instance(e)instanceof WebAssembly.Instance)}}catch(e){}console.log("WebAssembly support detected: "+(t?"yes":"no"));var r=this;function s(){r.setCurrentTime(r.video.currentTime+r.timeOffset)}function i(){r.setIsPaused(!1,r.video.currentTime+r.timeOffset)}function n(){r.setIsPaused(!0,r.video.currentTime+r.timeOffset)}function a(){r.video.removeEventListener("timeupdate",s,!1)}function o(){r.video.addEventListener("timeupdate",s,!1);var e=r.video.currentTime+r.timeOffset;r.setCurrentTime(e)}function l(){r.setRate(r.video.playbackRate)}function c(){r.setIsPaused(!0,r.video.currentTime+r.timeOffset)}function d(e){e.target.removeEventListener(e.type,d,!1),r.resize()}function u(){var e=r.renderFramesData,t=performance.now();r.ctx.clearRect(0,0,r.canvas.width,r.canvas.height);for(var s=0;s<e.canvases.length;s++){var i=e.canvases[s];r.bufferCanvas.width=i.w,r.bufferCanvas.height=i.h;var n=new Uint8ClampedArray(i.buffer);if(r.hasAlphaBug)for(var a=3;a<n.length;a+=4)n[a]=n[a]>=1?n[a]:1;var o=new ImageData(n,i.w,i.h);r.bufferCanvasCtx.putImageData(o,0,0),r.ctx.drawImage(r.bufferCanvas,i.x,i.y)}if(r.debug){var l=Math.round(performance.now()-t),c=e.blendTime;void 0!==c?console.log("render: "+Math.round(e.spentTime-c)+" ms, blend: "+Math.round(c)+" ms, draw: "+l+" ms; TOTAL="+Math.round(e.spentTime+l)+" ms"):console.log(Math.round(e.spentTime)+" ms (+ "+l+" ms draw)"),r.renderStart=performance.now()}}function v(){var e=r.renderFramesData,t=performance.now();r.ctx.clearRect(0,0,r.canvas.width,r.canvas.height);for(var s=0;s<e.bitmaps.length;s++){var i=e.bitmaps[s];r.ctx.drawImage(i.bitmap,i.x,i.y)}if(r.debug){var n=Math.round(performance.now()-t);console.log(e.bitmaps.length+" bitmaps, libass: "+Math.round(e.libassTime)+"ms, decode: "+Math.round(e.decodeTime)+"ms, draw: "+n+"ms"),r.renderStart=performance.now()}}r.canvas=e.canvas,r.renderMode=e.renderMode||(e.lossyRender?"lossy":"wasm-blend"),r.libassMemoryLimit=e.libassMemoryLimit||0,r.libassGlyphLimit=e.libassGlyphLimit||0,r.targetFps=e.targetFps||24,r.prescaleFactor=e.prescaleFactor||1,r.prescaleHeightLimit=e.prescaleHeightLimit||1080,r.maxRenderHeight=e.maxRenderHeight||0,r.dropAllAnimations=e.dropAllAnimations||!1,r.isOurCanvas=!1,r.video=e.video,r.canvasParent=null,r.fonts=e.fonts||[],r.availableFonts=e.availableFonts||[],r.fallbackFont=e.fallbackFont||"default.woff2",r.lazyFileLoading=e.lazyFileLoading||!1,r.onReadyEvent=e.onReady,t?r.workerUrl=e.workerUrl||"subtitles-octopus-worker.js":r.workerUrl=e.legacyWorkerUrl||"subtitles-octopus-worker-legacy.js",r.subUrl=e.subUrl,r.subContent=e.subContent||null,r.onErrorEvent=e.onError,r.debug=e.debug||!1,r.lastRenderTime=0,r.pixelRatio=window.devicePixelRatio||1,r.timeOffset=e.timeOffset||0,r.hasAlphaBug=!1,function(){if("function"==typeof ImageData.prototype.constructor)try{new window.ImageData(new Uint8ClampedArray([0,0,0,0]),1,1);return}catch(e){console.log("detected that ImageData is not constructable despite browser saying so")}var e=document.createElement("canvas").getContext("2d");window.ImageData=function(){var t=0;if(arguments[0]instanceof Uint8ClampedArray)var r=arguments[t++];var s=arguments[t++],i=arguments[t],n=e.createImageData(s,i);return r&&n.data.set(r),n}}(),r.workerError=function(e){if(console.error("Worker error: ",e),r.onErrorEvent&&r.onErrorEvent(e),!r.debug)throw r.dispose(),Error("Worker error: "+e)},r.init=function(){if(!window.Worker)return void r.workerError("worker not supported");r.worker||(r.worker=new Worker(r.workerUrl),r.worker.addEventListener("message",r.onWorkerMessage),r.worker.addEventListener("error",r.workerError)),r.workerActive=!1,r.createCanvas(),r.setVideo(e.video),r.setSubUrl(e.subUrl),r.worker.postMessage({target:"worker-init",width:r.canvas.width,height:r.canvas.height,URL:document.URL,currentScript:r.workerUrl,preMain:!0,renderMode:r.renderMode,subUrl:r.subUrl,subContent:r.subContent,fonts:r.fonts,availableFonts:r.availableFonts,fallbackFont:r.fallbackFont,lazyFileLoading:r.lazyFileLoading,debug:r.debug,targetFps:r.targetFps,libassMemoryLimit:r.libassMemoryLimit,libassGlyphLimit:r.libassGlyphLimit,dropAllAnimations:r.dropAllAnimations})},r.createCanvas=function(){!r.canvas&&(r.video?(r.isOurCanvas=!0,r.canvas=document.createElement("canvas"),r.canvas.className="libassjs-canvas",r.canvas.style.display="none",r.canvasParent=document.createElement("div"),r.canvasParent.className="libassjs-canvas-parent",r.canvasParent.appendChild(r.canvas),r.video.nextSibling?r.video.parentNode.insertBefore(r.canvasParent,r.video.nextSibling):r.video.parentNode.appendChild(r.canvasParent)):r.canvas||r.workerError("Don't know where to render: you should give video or canvas in options.")),r.ctx=r.canvas.getContext("2d"),r.bufferCanvas=document.createElement("canvas"),r.bufferCanvasCtx=r.bufferCanvas.getContext("2d"),r.bufferCanvas.width=1,r.bufferCanvas.height=1;var e=new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1);r.bufferCanvasCtx.clearRect(0,0,1,1),r.ctx.clearRect(0,0,1,1);var t=r.ctx.getImageData(0,0,1,1).data;r.bufferCanvasCtx.putImageData(e,0,0),r.ctx.drawImage(r.bufferCanvas,0,0);var s=r.ctx.getImageData(0,0,1,1).data;r.hasAlphaBug=t[1]!=s[1],r.hasAlphaBug&&console.log("Detected a browser having issue with transparent pixels, applying workaround")},r.setVideo=function(e){r.video=e,r.video&&(r.video.addEventListener("timeupdate",s,!1),r.video.addEventListener("playing",i,!1),r.video.addEventListener("pause",n,!1),r.video.addEventListener("seeking",a,!1),r.video.addEventListener("seeked",o,!1),r.video.addEventListener("ratechange",l,!1),r.video.addEventListener("waiting",c,!1),document.addEventListener("fullscreenchange",r.resizeWithTimeout,!1),document.addEventListener("mozfullscreenchange",r.resizeWithTimeout,!1),document.addEventListener("webkitfullscreenchange",r.resizeWithTimeout,!1),document.addEventListener("msfullscreenchange",r.resizeWithTimeout,!1),window.addEventListener("resize",r.resizeWithTimeout,!1),"undefined"!=typeof ResizeObserver&&(r.ro=new ResizeObserver(r.resizeWithTimeout),r.ro.observe(r.video)),r.video.videoWidth>0?r.resize():r.video.addEventListener("loadedmetadata",d,!1))},r.getVideoPosition=function(){var e=r.video.videoWidth/r.video.videoHeight,t=r.video.offsetWidth,s=r.video.offsetHeight,i=t,n=s;t/s>e?i=Math.floor(s*e):n=Math.floor(t/e);var a=(t-i)/2,o=(s-n)/2;return{width:i,height:n,x:a,y:o}},r.setSubUrl=function(e){r.subUrl=e},r.renderFrameData=null,r.workerActive=!1,r.frameId=0,r.onWorkerMessage=function(e){!r.workerActive&&(r.workerActive=!0,r.onReadyEvent&&r.onReadyEvent());var t=e.data;switch(t.target){case"stdout":console.log(t.content);break;case"console-log":console.log.apply(console,JSON.parse(t.content));break;case"console-debug":console.debug.apply(console,JSON.parse(t.content));break;case"console-info":console.info.apply(console,JSON.parse(t.content));break;case"console-warn":console.warn.apply(console,JSON.parse(t.content));break;case"console-error":console.error.apply(console,JSON.parse(t.content));break;case"stderr":console.error(t.content);break;case"window":window[t.method]();break;case"canvas":switch(t.op){case"getContext":r.ctx=r.canvas.getContext(t.type,t.attributes);break;case"resize":r.resize(t.width,t.height);break;case"renderCanvas":r.lastRenderTime<t.time&&(r.lastRenderTime=t.time,r.renderFramesData=t,window.requestAnimationFrame(u));break;case"renderFastCanvas":r.lastRenderTime<t.time&&(r.lastRenderTime=t.time,r.renderFramesData=t,window.requestAnimationFrame(v));break;case"setObjectProperty":r.canvas[t.object][t.property]=t.value;break;default:throw"eh?"}break;case"tick":r.frameId=t.id,r.worker.postMessage({target:"tock",id:r.frameId});break;case"custom":if(r.onCustomMessage)r.onCustomMessage(e);else throw"Custom message received but client onCustomMessage not implemented.";break;case"setimmediate":r.worker.postMessage({target:"setimmediate"});break;case"get-events":case"get-styles":case"ready":break;default:throw"what? "+t.target}},r.resize=function(e,t,s,i){var n=null;if(s=s||0,i=i||0,(!e||!t)&&r.video){var a=function(e,t){var s=r.prescaleFactor<=0?1:r.prescaleFactor;if(t<=0||e<=0)e=0,t=0;else{var i=s<1?-1:1,n=t;i*n*s<=i*r.prescaleHeightLimit?n*=s:i*n<i*r.prescaleHeightLimit&&(n=r.prescaleHeightLimit),r.maxRenderHeight>0&&n>r.maxRenderHeight&&(n=r.maxRenderHeight),e*=n/t,t=n}return{width:e,height:t}}((n=r.getVideoPosition()).width*r.pixelRatio,n.height*r.pixelRatio);e=a.width,t=a.height;var o=r.canvasParent.getBoundingClientRect().top-r.video.getBoundingClientRect().top;s=n.y-o,i=n.x}if(!e||!t){r.video||console.error("width or height is 0. You should specify width & height for resize.");return}(r.canvas.width!=e||r.canvas.height!=t||r.canvas.style.top!=s||r.canvas.style.left!=i)&&(r.canvas.width=e,r.canvas.height=t,null!=n&&(r.canvasParent.style.position="relative",r.canvas.style.display="block",r.canvas.style.position="absolute",r.canvas.style.width=n.width+"px",r.canvas.style.height=n.height+"px",r.canvas.style.top=s+"px",r.canvas.style.left=i+"px",r.canvas.style.pointerEvents="none"),r.worker.postMessage({target:"canvas",width:r.canvas.width,height:r.canvas.height}))},r.resizeWithTimeout=function(){r.resize(),setTimeout(r.resize,100)},r.runBenchmark=function(){r.worker.postMessage({target:"runBenchmark"})},r.customMessage=function(e,t){t=t||{},r.worker.postMessage({target:"custom",userData:e,preMain:t.preMain})},r.setCurrentTime=function(e){r.worker.postMessage({target:"video",currentTime:e})},r.setTrackByUrl=function(e){r.worker.postMessage({target:"set-track-by-url",url:e})},r.setTrack=function(e){r.worker.postMessage({target:"set-track",content:e})},r.freeTrack=function(e){r.worker.postMessage({target:"free-track"})},r.render=r.setCurrentTime,r.setIsPaused=function(e,t){r.worker.postMessage({target:"video",isPaused:e,currentTime:t})},r.setRate=function(e){r.worker.postMessage({target:"video",rate:e})},r.dispose=function(){r.worker.postMessage({target:"destroy"}),r.worker.terminate(),r.worker.removeEventListener("message",r.onWorkerMessage),r.worker.removeEventListener("error",r.workerError),r.workerActive=!1,r.worker=null,r.video&&(r.video.removeEventListener("timeupdate",s,!1),r.video.removeEventListener("playing",i,!1),r.video.removeEventListener("pause",n,!1),r.video.removeEventListener("seeking",a,!1),r.video.removeEventListener("seeked",o,!1),r.video.removeEventListener("ratechange",l,!1),r.video.removeEventListener("waiting",c,!1),r.video.removeEventListener("loadedmetadata",d,!1),document.removeEventListener("fullscreenchange",r.resizeWithTimeout,!1),document.removeEventListener("mozfullscreenchange",r.resizeWithTimeout,!1),document.removeEventListener("webkitfullscreenchange",r.resizeWithTimeout,!1),document.removeEventListener("msfullscreenchange",r.resizeWithTimeout,!1),window.removeEventListener("resize",r.resizeWithTimeout,!1),r.video.parentNode.removeChild(r.canvasParent),r.video=null),r.ro&&(r.ro.disconnect(),r.ro=null),r.onCustomMessage=null,r.onErrorEvent=null,r.onReadyEvent=null},r.fetchFromWorker=function(e,t,s){try{var i=e.target,n=setTimeout(function(){o(Error("Error: Timeout while try to fetch "+i))},5e3),a=function(e){e.data.target==i&&(t(e.data),r.worker.removeEventListener("message",a),r.worker.removeEventListener("error",o),clearTimeout(n))},o=function(e){s(e),r.worker.removeEventListener("message",a),r.worker.removeEventListener("error",o),clearTimeout(n)};r.worker.addEventListener("message",a),r.worker.addEventListener("error",o),r.worker.postMessage(e)}catch(e){s(e)}},r.createEvent=function(e){r.worker.postMessage({target:"create-event",event:e})},r.getEvents=function(e,t){r.fetchFromWorker({target:"get-events"},function(t){e(t.events)},t)},r.setEvent=function(e,t){r.worker.postMessage({target:"set-event",event:e,index:t})},r.removeEvent=function(e){r.worker.postMessage({target:"remove-event",index:e})},r.createStyle=function(e){r.worker.postMessage({target:"create-style",style:e})},r.getStyles=function(e,t){r.fetchFromWorker({target:"get-styles"},function(t){e(t.styles)},t)},r.setStyle=function(e,t){r.worker.postMessage({target:"set-style",style:e,index:t})},r.removeStyle=function(e){r.worker.postMessage({target:"remove-style",index:e})},r.init()})},{}],w4pLy:[function(e,t,r,s){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){"default"===r||"__esModule"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}]},["4omrA"],"4omrA","parcelRequire03dd",{});let{default:e}=parcelRequire03dd("4omrA");export{e as default};
|
|
//# sourceMappingURL=artplayer-plugin-libass.esm.js.map
|