Bilibili-Evolved/min/download-subtitle.min.js
2020-11-19 00:29:35 +08:00

1 line
3.2 KiB
JavaScript

(()=>(t,e)=>{let n;const s=(t,e)=>{const s=document.createElement("a");const i=URL.createObjectURL(new Blob([t]));if(n){URL.revokeObjectURL(n)}n=i;s.setAttribute("href",i);s.setAttribute("download",escapeFilename(e));document.body.appendChild(s);s.click();s.remove()};const i=async()=>{const{getFriendlyTitle:t}=await e.importAsync("title");const{SubtitleConverter:n,SubtitleSize:s,SubtitleLocation:i}=await e.importAsync("subtitle-converter");const o=await loadSubtitleSettingsPanel();if(!o){logError("未找到字幕设置");return[n.defaultConfig,""]}const a=o.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const l=t(true);const c=o.querySelector(".bilibili-player-video-subtitle-setting-fontsize .bui-thumb");const r=parseFloat(c.style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const u={214:s.VeryLarge,163.5:s.Large,107:s.Medium,50.5:s.Small,0:s.VerySmall};const b=u[r];const d=o.querySelector(".bilibili-player-video-subtitle-setting-color .bui-select-result span:first-child");const p=d.getAttribute("style").match(/background:[ ]*(.+);/)[1];const g=o.querySelector(".bilibili-player-video-subtitle-setting-opacity .bui-bar");const f=parseFloat(g.style.transform.replace(/scaleX\(([\d\.]+)/,"$1"));const y=dq(".subtitle-position");const m={bc:i.BottomCenter,bl:i.BottomLeft,br:i.BottomRight,tc:i.TopCenter,tl:i.TopLeft,tr:i.TopRight};const w=Object.entries(m).filter((([t])=>y.classList.contains(`subtitle-position-${t}`))).map((([,t])=>t)).shift();const S=dq("video");const h={title:l,height:S.videoHeight,width:S.videoWidth,color:p,location:w,opacity:f,size:b,boxPadding:1,boxMargin:32};return[h,a]};const o=async(t,n)=>{const{VideoInfo:s}=await e.importAsync("video-info");const i=new s(t);i.cid=typeof n==="string"?parseInt(n):n;await i.fetchInfo();return i.subtitles};return{widget:{content:`\n<button class="gui-settings-flat-button" id="download-subtitle-json">\n<i class="icon-cc-subtitles"></i>\n<span><span>下载字幕</span><span>(JSON)</span></span>\n</button>\n<button class="gui-settings-flat-button" id="download-subtitle-ass">\n<i class="icon-cc-subtitles"></i>\n<span><span>下载字幕</span><span>(ASS)</span></span>\n</button>\n`,condition:videoCondition,success:()=>{const t=dq("#download-subtitle-json");const n=dq("#download-subtitle-ass");const a=[t,n];const l=(t,n)=>{t.addEventListener("click",(async()=>{try{a.forEach((t=>t.disabled=true));const{aid:t,cid:l}=unsafeWindow;if(!t||!l){logError("未找到视频AID和CID");return}const c=await o(t,l);if(c.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const[r,u]=await i();const b=c.find((t=>t.language===u))||c[0];const d=await Ajax.getJson(b.url);const p=d.body;if(n){const{SubtitleConverter:t}=await e.importAsync("subtitle-converter");const n=new t(r);const i=await n.convertToAss(p);s(i,r.title+".ass")}else{s(JSON.stringify(p),r.title+".json")}}catch(t){if(typeof t.message==="string"&&t.message.includes("啥都木有")){logError(new Error(`未能获取字幕文件, 请确保当前视频是正常可播放的视频, 而非通过破解/换源等手段达成播放.\n${t.message}`))}else{logError(t)}}finally{a.forEach((t=>t.disabled=false))}}))};l(t,false);l(n,true)}},export:{getSubtitleConfig:i,getSubtitleList:o}}})();