Bilibili-Evolved/min/download-subtitle.min.js
2020-10-30 10:56:46 +08:00

1 line
3.2 KiB
JavaScript

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