!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports["video/download/wasm-output"]=e():t["video/download/wasm-output"]=e()}(globalThis,(()=>(()=>{"use strict";var t={198:(t,e,a)=>{a.r(e),a.d(e,{default:()=>d});var o=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"wasm-output-config"},[e("div",{staticClass:"download-video-config-item",staticStyle:{"flex-wrap":"wrap"}},[e("div",{staticClass:"download-video-config-title"},[t._v("输出格式:")]),t._v(" "),e("VDropdown",{attrs:{items:t.outputTypes},on:{change:t.saveOptions},scopedSlots:t._u([{key:"item",fn:function({item:e}){return[t._v("\n "+t._s(e)+"\n ")]}}]),model:{value:t.outputType,callback:function(e){t.outputType=e},expression:"outputType"}}),t._v(" "),t._m(0)],1),t._v(" "),t.hasMetadata?e("div",{staticClass:"download-video-config-item",staticStyle:{"flex-wrap":"wrap"}},[e("div",{staticClass:"download-video-config-title"},[t._v("写入元数据:")]),t._v(" "),e("SwitchBox",{on:{change:t.saveOptions},model:{value:t.muxWithMetadata,callback:function(e){t.muxWithMetadata=e},expression:"muxWithMetadata"}}),t._v(" "),e("div",{staticClass:"download-video-config-description",staticStyle:{width:"100%"}},[t._v("\n 支持元数据类型「ffmetadata」\n ")])],1):t._e(),t._v(" "),t.hasCover?e("div",{staticClass:"download-video-config-item",staticStyle:{"flex-wrap":"wrap"}},[e("div",{staticClass:"download-video-config-title"},[t._v("附加封面:")]),t._v(" "),e("SwitchBox",{on:{change:t.saveOptions},model:{value:t.attachCover,callback:function(e){t.attachCover=e},expression:"attachCover"}}),t._v(" "),t.hasMetadata?e("div",{staticClass:"download-video-config-description",staticStyle:{width:"100%"}},[t._v("\n 附加封面至 MP4 格式会导致元数据自定义字段失效\n ")]):t._e()],1):t._e()])};o._withStripped=!0;const n=coreApis.ui;var i=a(905);const{options:s}=(0,i.getComponentSettings)("downloadVideo"),r={muxWithMetadata:!1,attachCover:!1,outputType:"auto",...s};var c=function(t,e,a,o,n,i,s,r){var c,d="function"==typeof t?t.options:t;if(e&&(d.render=e,d.staticRenderFns=a,d._compiled=!0),o&&(d.functional=!0),i&&(d._scopeId="data-v-"+i),s?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),n&&n.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(s)},d._ssrRegister=c):n&&(c=r?function(){n.call(this,(d.functional?this.parent:this).$root.$options.shadowRoot)}:n),c)if(d.functional){d._injectStyles=c;var l=d.render;d.render=function(t,e){return c.call(e),l(t,e)}}else{var u=d.beforeCreate;d.beforeCreate=u?[].concat(u,c):[c]}return{exports:t,options:d}}(Vue.extend({components:{SwitchBox:n.SwitchBox,VDropdown:n.VDropdown},data(){const t=(0,i.isComponentEnabled)("saveVideoMetadata"),e=(0,i.isComponentEnabled)("viewCover");return{hasMetadata:t,hasCover:e,muxWithMetadata:t&&r.muxWithMetadata,attachCover:e&&r.attachCover,outputType:r.outputType,outputTypes:["auto","mp4","matroska"]}},methods:{saveOptions(){r.muxWithMetadata=this.muxWithMetadata,r.attachCover=this.attachCover,r.outputType=this.outputType,Object.assign(s,r)}}}),o,[function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"download-video-config-description",staticStyle:{width:"100%"}},[t._v("\n 非特殊需求请保持自动"),e("br"),t._v("\n 指定 MP4 格式若包含无损音频,会将 FLAC 格式的音轨重新编码为 ALAC 格式\n ")])}],!1,null,null,null);const d=c.exports},905:t=>{t.exports=coreApis.settings}},e={};function a(o){var n=e[o];if(void 0!==n)return n.exports;var i=e[o]={exports:{}};return t[o](i,i.exports,a),i.exports}a.d=(t,e)=>{for(var o in e)a.o(e,o)&&!a.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),a.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};a.d(o,{plugin:()=>D,D:()=>j});const n=coreApis.toast,i=coreApis.download,s=coreApis.meta;var r=a(905);const c=coreApis.utils.formatters;function d(t,e,a){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var a=t[Symbol.toPrimitive];if(void 0!==a){var o=a.call(t,e||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e,a){(function(t,e){if(e.has(t))throw new TypeError("Cannot initialize the same private elements twice on an object")})(t,e),e.set(t,a)}function u(t,e,a){return t.set(m(t,e),a),a}function p(t,e){return t.get(m(t,e))}function m(t,e,a){if("function"==typeof t?t===e:t.has(e))return arguments.length<3?e:a;throw new TypeError("Private element is not present on this object")} /* eslint-disable @typescript-eslint/naming-convention */const h=(()=>{let t=0;return()=>t++})();var f=function(t){return t.LOAD="LOAD",t.EXEC="EXEC",t.WRITE_FILE="WRITE_FILE",t.READ_FILE="READ_FILE",t.DELETE_FILE="DELETE_FILE",t.ERROR="ERROR",t.PROGRESS="PROGRESS",t}(f||{}),v=new WeakMap,w=new WeakMap,g=new WeakMap,y=new WeakMap,E=new WeakMap,_=new WeakMap;const b={mp4:{extension:"mp4",mime:"video/mp4",muxArgs:(t,e,a)=>{const o=["-i","video","-i","audio"];return t&&e?(o.push("-i","cover","-i","metadata"),o.push("-map","0","-map","1","-map","2"),o.push("-map_metadata","3","-disposition:2","attached_pic")):t&&!e?(o.push("-i","cover"),o.push("-map","0","-map","1","-map","2"),o.push("-disposition:2","attached_pic")):!t&&e&&(o.push("-i","metadata"),o.push("-map_metadata","2","-movflags","+use_metadata_tags")),o.push("-codec:v","copy"),o.push("-codec:a",a?"alac":"copy"),o.push("-f","mp4"),o}},matroska:{extension:"mkv",mime:"video/x-matroska",muxArgs:(t,e)=>{const a=["-i","video","-i","audio"];return t&&e?(a.push("-i","metadata","-attach","cover"),a.push("-map","0","-map","1"),a.push("-map_metadata","2"),a.push("-metadata:s:t:0","mimetype=image/jpeg","-metadata:s:t:0","filename=cover.jpg")):t&&!e?(a.push("-attach","cover"),a.push("-metadata:s:t:0","mimetype=image/jpeg","-metadata:s:t:0","filename=cover.jpg")):!t&&e&&a.push("-i","metadata","-map_metadata","2"),a.push("-codec","copy","-f","matroska"),a}}};const x=coreApis.runtimeLibrary,C={cache:"cache"};async function S(t,e){return async function(){return new Promise(((t,e)=>{const a=unsafeWindow.indexedDB.open("bilibili-evolved-wasm-output",124);a.onerror=e,a.onupgradeneeded=()=>{const t=a.result;for(const e of t.objectStoreNames)t.deleteObjectStore(e);Object.values(C).forEach((e=>{t.createObjectStore(e)}))},a.onsuccess=()=>t(a.result)}))}().then((a=>new Promise(((o,n)=>{const i=a.transaction(t,e);o(i.objectStore(t)),i.onerror=n}))))}async function F(t,e,a){const o=await S(t).then((t=>async function(t,e){return new Promise(((a,o)=>{const n=t.get(e);n.onerror=o,n.onsuccess=()=>a(n.result)}))}(t,e)));if(o)return o;const n=await a(e);return await S(t,"readwrite").then((t=>async function(t,e,a){return new Promise(((o,n)=>{const i=t.put(e,a);i.onerror=n,i.onsuccess=()=>o(i.result)}))}(t,n,e))),n}function A(t){const e=[];return(a,o)=>(n,i,s)=>{e[a]=`${o}: ${function(t,e,a){const o=(0,c.formatFileSize)(t),n=e>0?` / ${(0,c.formatFileSize)(e)}`:"",i=e>0?` @ ${(0,c.formatPercent)(t/e)}`:"";let s="",r="";return e>t&&a>0&&(r=` (${(0,c.formatFileSize)(a)}/s)`,s=` - ${(0,c.formatDuration)((e-t)/a)}`),`${o}${n}${i}${r}${s}`}(n,i,s)}`,t.message=e.join("\n")}}function k(t){return t.headers.get("Content-Encoding")?-1:parseInt(t.headers.get("Content-Length"))}async function L(t,e){const a=await fetch(t);if(!a.ok)throw new Error(`${a.status} ${a.statusText}`);const o=a.body.getReader(),n=k(a);let i=0;const s=[];let r=Date.now(),c=0,d=0; // eslint-disable-next-line no-constant-condition for(;;){const{done:t,value:a}=await o.read();if(t)break;s.push(a),i+=a.length;const l=Date.now(),u=(l-r)/1e3;if(u>1){const t=(i-c)/u;e(i,n,t),r=l,c=i,d=t}else e(i,n,c>0?d:0)}const l=new Uint8Array(i);let u=0;for(const t of s)l.set(t,u),u+=t.length;return l}async function R(t){try{const e=await fetch(t,{method:"HEAD"});return e.ok?k(e):-1}catch(t){return-1}}async function M(t,e,a){return F(C.cache,t,(async()=>{const t=await L(e.url,a),o=await x.RuntimeLibrary.sha256(t);if(o!==e.sha256)throw new Error(`Check integrity failed from ${e.url}, expected = ${e.sha256}, actual = ${o}`);return t}))}function T(t,e){const a=new Blob([t],{type:e});return URL.createObjectURL(a)}const O=new class{constructor(){var t=this;l(this,v,null),l(this,w,{}),l(this,g,{}),l(this,y,void 0),d(this,"loaded",!1),l(this,E,(()=>{p(v,this)&&(p(v,this).onmessage=t=>{let{data:{id:e,type:a,data:o}}=t;switch(a){case f.LOAD:this.loaded=!0,p(w,this)[e](o);break;case f.EXEC:case f.WRITE_FILE:case f.READ_FILE:case f.DELETE_FILE:p(w,this)[e](o);break;case f.PROGRESS:p(y,this)&&p(y,this).call(this,o);break;case f.ERROR:p(g,this)[e](o)}delete p(w,this)[e],delete p(g,this)[e]})})),l(this,_,(function(e){let{type:a,data:o}=e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2?arguments[2]:void 0;return p(v,t)?new Promise(((e,s)=>{const r=h();p(v,t)&&p(v,t).postMessage({id:r,type:a,data:o},n),p(w,t)[r]=e,p(g,t)[r]=s,i?.addEventListener("abort",(()=>{s(new DOMException(`Message # ${r} was aborted`,"AbortError"))}),{once:!0})})):Promise.reject(new Error("FFmpeg is not loaded"))})),d(this,"load",((t,e)=>(p(v,this)||(u(v,this,new Worker(t.workerLoadURL,{type:"classic"})),p(E,this).call(this)),p(_,this).call(this,{type:f.LOAD,data:t},void 0,e)))),d(this,"exec",(function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,o=arguments.length>2?arguments[2]:void 0;return p(_,t).call(t,{type:f.EXEC,data:{args:e,timeout:a}},void 0,o)})),d(this,"terminate",(()=>{const t=Object.keys(p(g,this));for(const e of t)p(g,this)[e](new Error("FFmpeg terminated")),delete p(g,this)[e],delete p(w,this)[e];p(v,this)&&(p(v,this).terminate(),u(v,this,null),this.loaded=!1)})),d(this,"writeFile",((t,e,a)=>{const o=[];return o.push(e.buffer),p(_,this).call(this,{type:f.WRITE_FILE,data:{path:t,data:e}},o,a)})),d(this,"readFile",((t,e)=>p(_,this).call(this,{type:f.READ_FILE,data:{path:t,encoding:"binary"}},void 0,e))),d(this,"deleteFile",((t,e)=>p(_,this).call(this,{type:f.DELETE_FILE,data:{path:t}},void 0,e)))}onProgress(t){u(y,this,t)}};async function P(t,e,a,o,s,r,d){let l=arguments.length>7&&void 0!==arguments[7]?arguments[7]:1,u=arguments.length>8&&void 0!==arguments[8]?arguments[8]:1;const p=n.Toast.info("",`${j} - ${l} / ${u}`),m=A(p),[h,f]=await Promise.all([L(e,m(0,"正在下载视频流")),L(a,m(1,"正在下载音频流"))]);let v,w;o&&(v=await L(o,m(0,"正在下载封面"))),s&&(w=(new TextEncoder).encode(s));const{data:g,format:{extension:y}}=await async function(t,e,a,o,n,i,s,r){"auto"===e&&(e=i?"matroska":"mp4",e=s&&r?"matroska":e);const c=b[e],d=c.muxArgs(!!s,!!r,i);d.push("output"),console.debug("FFmpeg commandline args:",d.join(" ")),await t.writeFile("video",o),await t.writeFile("audio",n),s&&await t.writeFile("cover",s),r&&await t.writeFile("metadata",r),t.onProgress(a),await t.exec(d);const l=await t.readFile("output"),u=new Blob([l],{type:c.mime});return await Promise.all([t.deleteFile("video"),t.deleteFile("audio"),t.deleteFile("output"),r?t.deleteFile("metadata"):Promise.resolve(),s?t.deleteFile("cover"):Promise.resolve()]),{data:u,format:c}}(O,r,(t=>{p.message=`混流中: ${(0,c.formatPercent)(t.progress)}`}),h,f,d,v,w);p.message="完成!",p.duration=1e3,await i.DownloadPackage.single(t.replace(/.[^/.]+$/,`.${y}`),g)}async function $(t,e,a,o){O.loaded||await async function(){const t=n.Toast.info("正在加载 FFmpeg",`${j} - 初始化`),e=A(t),[a,o,i]=await Promise.all([M("ffmpeg-worker",s.meta.compilationInfo.altCdn.library.ffmpeg.worker,e(0,"正在加载 FFmpeg Worker")),M("ffmpeg-core",s.meta.compilationInfo.altCdn.library.ffmpeg.core,e(1,"正在加载 FFmpeg Core")),M("ffmpeg-wasm",s.meta.compilationInfo.altCdn.library.ffmpeg.wasm,e(2,"正在加载 FFmpeg WASM"))]);await O.load({workerLoadURL:T(a,"text/javascript"),coreURL:T(o,"text/javascript"),wasmURL:T(i,"application/wasm")}),t.message="完成!",t.close()}();const{infos:i,extraAssets:d,extraOnlineAssets:l}=t;let u,p;if(a){const e=[];for(const{asset:t,instance:a}of d)u||"saveVideoMetadata"!==t.name||"ffmetadata"!==a.type?e.push({asset:t,instance:a}):u=await t.getAssets(i,a);t.extraAssets=e}if(o){const e=[];for(const{asset:t,instance:a}of l)p||"downloadCover"!==t.name||"jpg"!==a.type?e.push({asset:t,instance:a}):p=await t.getUrls(i,a);t.extraOnlineAssets=e}const{dashAudioExtension:m,dashFlacAudioExtension:h,dashVideoExtension:f}=(0,r.getComponentSettings)("downloadVideo").options;for(let t=0;t2097152e3)throw new Error(`仅支持合并 2GB 内的音视频(${(0,c.formatFileSize)(d)})`);await P(o.title,o.url,n.url,p?.[t]?.url,u?.[t]?.data,e,n.extension===h,t+1,i.length)}}const j="WASM 混流输出",W="使用 WASM 在浏览器中下载并合并音视频, 支持批量下载",D={name:"downloadVideo.outputs.wasm",displayName:`下载视频 - ${j}`,description:W,author:[{name:"WakelessSloth56",link:"https://github.com/WakelessSloth56"},{name:"LainIO24",link:"https://github.com/LainIO24"}],setup:t=>{let{addData:e}=t;e("downloadVideo.outputs",(t=>{t.push({name:"wasm",displayName:"WASM",description:`${W}。运行过程中请勿关闭页面,初次使用或清除缓存后需要加载约 30 MB 的 WASM 文件。由于浏览器限制,仅支持合并 2GB 以内的音视频。`,runAction:async(t,e)=>{try{await $(t,e.outputType,e.muxWithMetadata,e.attachCover)}catch(t){n.Toast.error(String(t),j)}},component:()=>Promise.resolve().then(a.bind(a,198)).then((t=>t.default))})}))},commitHash:"1d532c0545945809dd7a80dc0bdb6aa6dc2edfd5",coreVersion:"2.10.7"};return o=o.plugin})()));