!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["video/subtitle/download"]=t():e["video/subtitle/download"]=t()}(globalThis,(()=>(()=>{var e,t,n={890:(e,t,n)=>{"use strict";n.d(t,{k7:()=>l,ZS:()=>a,p3:()=>s});const o=coreApis.ajax;var i=n(5),r=n(121);const a=async()=>{const{SubtitleConverter:e,SubtitleSize:t,SubtitleLocation:o}=await Promise.resolve().then(n.bind(n,428)),{playerAgent:i}=await Promise.resolve().then(n.t.bind(n,241,23)),a=i.getPlayerConfig("subtitle",null);if(!a)return[e.defaultConfig,""];const s=a.lan,l=(0,r.getFriendlyTitle)(!0),d={.6:t.VerySmall,.8:t.Small,1:t.Medium,1.3:t.Large,1.6:t.VeryLarge}[a.fontsize],c=parseInt(a.color).toString(16),{opacity:u}=a,f={bc:o.BottomCenter,bl:o.BottomLeft,br:o.BottomRight,tc:o.TopCenter,tl:o.TopLeft,tr:o.TopRight,"bottom-center":o.BottomCenter,"bottom-left":o.BottomLeft,"bottom-right":o.BottomRight,"top-center":o.TopCenter,"top-left":o.TopLeft,"top-right":o.TopRight}[a.position],p=i.query.video.element.sync();return[{title:l,height:p.videoHeight,width:p.videoWidth,color:c,location:f,opacity:u,size:d,boxPadding:1,boxMargin:32},s]},s=async(e,t)=>{const n=await(0,o.bilibiliApi)((0,o.getJsonWithCredentials)(`https://api.bilibili.com/x/player/wbi/v2?aid=${e}&cid=${t}`));return lodash.get(n,"subtitle.subtitles",[])},l=async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{aid:l=unsafeWindow.aid,cid:d=unsafeWindow.cid,title:c=(0,r.getFriendlyTitle)(!0),language:u}=t;if(!l||!d)throw new Error("未找到视频 AID 和 CID");const f=await s(l,d);if(0===f.length)return i.Toast.info("当前视频没有字幕.","下载字幕",3e3),null;const[p,g]=await a(),m=f.find((e=>e.lan===(u??g)))||f[0],v=(await(0,o.getJson)(m.subtitle_url)).body;if("ass"===e){const{SubtitleConverter:e}=await Promise.resolve().then(n.bind(n,428)),t=new e({...p,title:c}),o=await t.convertToAss(v);return new Blob([o],{type:"text/ass"})}return new Blob([JSON.stringify(v,void 0,2)],{type:"text/json"})}},428:(e,t,n)=>{"use strict";function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{SubtitleConverter:()=>a,SubtitleLocation:()=>i,SubtitleSize:()=>r});const i={TopLeft:7,TopCenter:8,TopRight:9,BottomLeft:1,BottomCenter:2,BottomRight:3};let r=function(e){return e[e.VerySmall=1]="VerySmall",e[e.Small=2]="Small",e[e.Medium=3]="Medium",e[e.Large=4]="Large",e[e.VeryLarge=5]="VeryLarge",e}({});class a{constructor(e){o(this,"config",void 0),this.config=Object.assign(a.defaultConfig,e)}async getAssMeta(){const{convertHexColorForStyle:e}=await Promise.resolve().then(n.t.bind(n,381,23)),t=e(this.config.color),o=e("#000000",this.config.opacity),r=[],a=(10*(this.config.size-3)+48)*this.config.height/720;console.log(a);for(const[e,n]of Object.entries(i))r.push(`Style: ${e},微软雅黑,${a},${t},${t},${o},${o},0,0,0,0,100,100,0,0,3,${this.config.boxPadding},0,${n},${this.config.boxMargin},${this.config.boxMargin},${this.config.boxMargin},0`);return`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.config.title}\nScriptType: v4.00+\nPlayResX: ${this.config.width}\nPlayResY: ${this.config.height}\nTimer: 10.0000\nWrapStyle: 0\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${r.join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text`.trim()}async convertToAss(e){const{convertTimeByEndTime:t,normalizeContent:o}=await Promise.resolve().then(n.t.bind(n,381,23));return`${await this.getAssMeta()}\n${e.map((e=>{const[n,r]=t(e.from,e.to);var a;return`Dialogue: 0,${n},${r},${a=this.config.location,Object.entries(i).filter((e=>{let[,t]=e;return t===a})).map((e=>{let[t]=e;return t})).shift()},,0,0,0,,${o(e.content)}`})).join("\n")}`}}o(a,"defaultConfig",void 0),a.defaultConfig={title:"",color:"#ffffff",width:1920,height:1080,size:r.Medium,opacity:.5,location:i.BottomCenter,boxPadding:1,boxMargin:32}},603:(e,t,n)=>{var o=n(955)((function(e){return e[1]}));o.push([e.id,".subtitle-download {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: 6px;\n border-radius: 4px;\n padding: 8px;\n box-sizing: border-box;\n box-shadow: 0 0 0 1px #8884;\n background-color: #fff;\n}\nbody.dark .subtitle-download {\n background-color: var(--be-color-panel-bg, #333);\n}\n.subtitle-download-header {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n align-self: stretch;\n}\n.subtitle-download-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.subtitle-download-title .be-icon {\n opacity: 0.75;\n}\n.subtitle-download-language {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.subtitle-download-formats {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}",""]),e.exports=o},363:(e,t,n)=>{var o=n(955)((function(e){return e[1]}));o.push([e.id,".download-subtitle-config.download-video-config-section .be-dropdown {\n text-transform: uppercase;\n}",""]),e.exports=o},955:e=>{"use strict"; // eslint-disable-next-line func-names e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")}, // eslint-disable-next-line func-names t.i=function(e,n,o){"string"==typeof e&&( // eslint-disable-next-line no-param-reassign e=[[null,e,""]]);var i={};if(o)for(var r=0;r{"use strict";var o,i=function(){return void 0===o&&( // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 // @see https://github.com/webpack-contrib/style-loader/issues/177 o=Boolean(window&&document&&document.all&&!window.atob)),o},r=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),a=[];function s(e){for(var t=-1,n=0;n{"use strict";n.r(t),n.d(t,{default:()=>y});var o=function(){var e=this,t=e._self._c,n=e._self._setupProxy;return n.folded?t("div",[t(n.DefaultWidget,{attrs:{name:"下载字幕",icon:"mdi-subtitles"},on:{click:function(e){return n.expandDownloadOptions()}}})],1):t("div",{staticClass:"subtitle-download"},[t("div",{staticClass:"subtitle-download-header"},[t("div",{staticClass:"subtitle-download-title"},[t(n.VIcon,{attrs:{size:24,icon:"mdi-subtitles"}}),e._v(" "),t("span",[e._v("下载字幕")])],1),e._v(" "),t(n.VButton,{attrs:{round:"",icon:"",type:"transparent"},on:{click:function(e){n.folded=!0}}},[t(n.VIcon,{attrs:{size:18,icon:"mdi-close"}})],1)],1),e._v(" "),n.subtitleLanguageOptions.length>0?t("div",{staticClass:"subtitle-download-language"},[t("div",{},[e._v("语言:")]),e._v(" "),t(n.VDropdown,{attrs:{items:n.subtitleLanguageOptions,disabled:n.disabled},model:{value:n.selectedLanguage,callback:function(e){n.selectedLanguage=e},expression:"selectedLanguage"}})],1):e._e(),e._v(" "),t("div",{staticClass:"subtitle-download-formats"},[t(n.DefaultWidget,{attrs:{disabled:n.disabled,name:"下载 JSON",icon:"mdi-download"},on:{click:function(e){return n.download("json")}}}),e._v(" "),t(n.DefaultWidget,{attrs:{disabled:n.disabled,name:"下载 ASS",icon:"mdi-download"},on:{click:function(e){return n.download("ass")}}})],1)])};o._withStripped=!0;const i=globalThis.Vue;var r=n(164);const a=coreApis.utils.log;var s=n(121);const l=coreApis.download;var d=n(890);const c=coreApis.utils.sort;var u=n(5);const f=(0,i.defineComponent)({__name:"DownloadSubtitle",setup(e){const t=(0,i.ref)(!0),n=(0,i.ref)(!1),o=(0,i.ref)([]),f=(0,i.ref)(void 0),p=async()=>(await(0,d.p3)(unsafeWindow.aid,unsafeWindow.cid)).toSorted((0,c.ascendingBigIntSort)((e=>e.id_str))).map((e=>({displayName:0!==e.ai_status?`${e.lan_doc} (AI)`:e.lan_doc,name:e.lan})));Promise.all([p(),(0,d.ZS)()]).then((e=>{let[t,[,n]]=e;o.value=t;const i=t.find((e=>e.name===n));void 0!==i&&(f.value=i)}));return{__sfc:!0,folded:t,disabled:n,subtitleLanguageOptions:o,selectedLanguage:f,getSubtitleLanguageOptions:p,expandDownloadOptions:()=>{0!==o.value.length?t.value=!1:u.Toast.info("当前视频没有字幕.","下载字幕",3e3)},download:async e=>{try{n.value=!0;const t=await(0,d.k7)(e,{language:f.value?.name});if(null===t)return;l.DownloadPackage.single(`${(0,s.getFriendlyTitle)(!0)}.${e}`,t)}catch(e){(0,a.logError)(e)}finally{n.value=!1}},DefaultWidget:r.DefaultWidget,VButton:r.VButton,VDropdown:r.VDropdown,VIcon:r.VIcon}}}),p=f;var g=n(991),m=n.n(g),v=n(603),b=n.n(v),h={insert:"head",singleton:!1};m()(b(),h);b().locals;const y=(0,n(678).A)(p,o,[],!1,null,null,null).exports},263:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var o=function(){var e=this,t=e._self._c;e._self._setupProxy;return t("div",{staticClass:"download-subtitle-config download-video-config-section"},[t("div",{staticClass:"download-video-config-item"},[t("div",{staticClass:"download-video-config-title"},[e._v("字幕:")]),e._v(" "),t("VDropdown",{attrs:{items:e.items},scopedSlots:e._u([{key:"item",fn:function({item:t}){return[e._v("\n "+e._s(t)+"\n ")]}}]),model:{value:e.type,callback:function(t){e.type=t},expression:"type"}})],1)])};o._withStripped=!0;const i=coreApis.settings;var r=n(164);const a=(0,i.getComponentSettings)("downloadVideo").options,s=Vue.extend({components:{VDropdown:r.VDropdown},data:()=>({type:a.subtitleType??"无",items:["无","ass","json"]}),computed:{enabled(){return"无"!==this.type}},watch:{type(e){a.subtitleType=e}}});var l=n(991),d=n.n(l),c=n(363),u=n.n(c),f={insert:"head",singleton:!1};d()(u(),f);u().locals;const p=(0,n(678).A)(s,o,[],!1,null,null,null).exports},678:(e,t,n)=>{"use strict";function o(e,t,n,o,i,r,a,s){var l,d="function"==typeof e?e.options:e;if(t&&(d.render=t,d.staticRenderFns=n,d._compiled=!0),o&&(d.functional=!0),r&&(d._scopeId="data-v-"+r),a?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},d._ssrRegister=l):i&&(l=s?function(){i.call(this,(d.functional?this.parent:this).$root.$options.shadowRoot)}:i),l)if(d.functional){d._injectStyles=l;var c=d.render;d.render=function(e,t){return l.call(t),c(e,t)}}else{var u=d.beforeCreate;d.beforeCreate=u?[].concat(u,l):[l]}return{exports:e,options:d}}n.d(t,{A:()=>o})},215:e=>{function t(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}t.keys=()=>[],t.resolve=t,t.id=215,e.exports=t},76:e=>{"use strict";e.exports="启用下载字幕支持, 在视频页面中可从功能面板里下载字幕. (AI 生成的不可下载)\n"},381:e=>{"use strict";e.exports=coreApis.componentApis.video.assUtils},241:e=>{"use strict";e.exports=coreApis.componentApis.video.playerAgent},5:e=>{"use strict";e.exports=coreApis.toast},164:e=>{"use strict";e.exports=coreApis.ui},121:e=>{"use strict";e.exports=coreApis.utils.title}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={id:e,exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(n,o){if(1&o&&(n=this(n)),8&o)return n;if("object"==typeof n&&n){if(4&o&&n.__esModule)return n;if(16&o&&"function"==typeof n.then)return n}var r=Object.create(null);i.r(r);var a={};e=e||[null,t({}),t([]),t(t)];for(var s=2&o&&n;"object"==typeof s&&!~e.indexOf(s);s=t(s))Object.getOwnPropertyNames(s).forEach((e=>a[e]=()=>n[e]));return a.default=()=>n,i.d(r,a),r},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0;var r={};return(()=>{"use strict";i.d(r,{component:()=>s});const e=coreApis.componentApis.define,t=coreApis.spinQuery;var n=i(5);const o=coreApis.utils.urls;var a=i(890);const s=(0,e.defineComponentMetadata)({name:"downloadSubtitle",displayName:"下载字幕",tags:[componentsTags.video],entry:none,urlInclude:o.videoAndBangumiUrls,widget:{condition:t.hasVideo,component:()=>Promise.resolve().then(i.bind(i,610)).then((e=>e.default))},plugin:{displayName:"下载视频 - 下载字幕支持",setup:e=>{let{addData:t}=e;t("downloadVideo.assets",(async e=>{e.push({name:"downloadSubtitles",displayName:"下载字幕",getAssets:async(e,t)=>{const{type:o,enabled:i}=t;if(!i)return[];const r=n.Toast.info("获取字幕中...","下载字幕");let s=0;const l=await Promise.allSettled(e.map((async t=>{const n=await(0,a.k7)(o,t.input);return s++,r.message=`获取字幕中... (${s}/${e.length})`,{name:`${t.input.title}.${o}`,data:n}}))),d=l.filter((e=>"fulfilled"===e.status)),c=l.filter((e=>"rejected"===e.status));return r.message=`获取完成. 成功 ${d.length} 个, 失败 ${c.length} 个.`,d.map((e=>e.value))},component:()=>Promise.resolve().then(i.bind(i,263)).then((e=>e.default))})}))}},commitHash:"1d532c0545945809dd7a80dc0bdb6aa6dc2edfd5",coreVersion:"2.10.7",description:(()=>{const e=i(215);return{...Object.fromEntries(e.keys().map((t=>[t.match(/index\.(.+)\.md$/)[1],e(t)]))),"zh-CN":()=>Promise.resolve().then(i.t.bind(i,76,17)).then((e=>e.default))}})()})})(),r=r.component})()));