Bilibili-Evolved/min/download-subtitle.min.js
2020-05-17 15:27:06 +08:00

1 line
2.7 KiB
JavaScript

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