mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
3.0 KiB
JavaScript
1 line
3.0 KiB
JavaScript
(()=>{return(t,e)=>{let n;const i=(t,e)=>{const i=document.createElement("a");const o=URL.createObjectURL(new Blob([t]));if(n){URL.revokeObjectURL(n)}n=o;i.setAttribute("href",o);i.setAttribute("download",escapeFilename(e));document.body.appendChild(i);i.click();i.remove()};const o=async()=>{const{getFriendlyTitle:t}=await e.importAsync("title");const{SubtitleConverter:n,SubtitleSize:i,SubtitleLocation:o}=await e.importAsync("subtitle-converter");const s=await loadSubtitleSettingsPanel();if(!s){logError("未找到字幕设置");return[n.defaultConfig,""]}const l=s.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const a=t(true);const c=s.querySelector(".bilibili-player-video-subtitle-setting-fontsize .bui-thumb");const r=parseFloat(c.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[r];const d=s.querySelector(".bilibili-player-video-subtitle-setting-color .bui-select-result span:first-child");const p=d.getAttribute("style").match(/background:[ ]*(.+);/)[1];const g=s.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 w={bc:o.BottomCenter,bl:o.BottomLeft,br:o.BottomRight,tc:o.TopCenter,tl:o.TopLeft,tr:o.TopRight};const m=Object.entries(w).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:p,location:m,opacity:f,size:b,boxPadding:1,boxMargin:32};return[h,l]};const s=async(t,n)=>{const{VideoInfo:i}=await e.importAsync("video-info");const o=new i(t);o.cid=typeof n==="string"?parseInt(n):n;await o.fetchInfo();return o.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 c=await s(t,a);if(c.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const[r,u]=await o();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 o=await n.convertToAss(p);i(o,r.title+".ass")}else{i(JSON.stringify(p),r.title+".json")}}catch(t){logError(t)}finally{l.forEach(t=>t.disabled=false)}})};a(t,false);a(n,true)}},export:{getSubtitleConfig:o,getSubtitleList:s}}}})(); |