mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
3.2 KiB
JavaScript
1 line
3.2 KiB
JavaScript
(()=>(t,e)=>{let i;const n=(t,e)=>{const n=document.createElement("a");const s=URL.createObjectURL(new Blob([t]));if(i){URL.revokeObjectURL(i)}i=s;n.setAttribute("href",s);n.setAttribute("download",escapeFilename(e));document.body.appendChild(n);n.click();n.remove()};const s=async()=>{const{getFriendlyTitle:t}=await e.importAsync("title");const{SubtitleConverter:i,SubtitleSize:n,SubtitleLocation:s}=await e.importAsync("subtitle-converter");const o=await loadSubtitleSettingsPanel();if(!o){logError("未找到字幕设置");return[i.defaultConfig,""]}const l=o.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const a=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:n.VeryLarge,163.5:n.Large,107:n.Medium,50.5:n.Small,0:n.VerySmall};const b=u[r];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])=>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,i)=>{const{VideoInfo:n}=await e.importAsync("video-info");const s=new n(t);s.cid=typeof i==="string"?parseInt(i):i;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 i=dq("#download-subtitle-ass");const l=[t,i];const a=(t,i)=>{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 c=await o(t,a);if(c.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const[r,u]=await s();const b=c.find((t=>t.language===u))||c[0];const d=await Ajax.getJson(b.url);const g=d.body;if(i){const{SubtitleConverter:t}=await e.importAsync("subtitle-converter");const i=new t(r);const s=await i.convertToAss(g);n(s,r.title+".ass")}else{n(JSON.stringify(g),r.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(i,true)}},export:{getSubtitleConfig:s,getSubtitleList:o}}})(); |