mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
3.5 KiB
JavaScript
1 line
3.5 KiB
JavaScript
(()=>{return(t,e)=>{const{getFriendlyTitle:n}=e.import("title");const{DanmakuInfo:a}=e.import("video-info");const{DanmakuConverter:i}=e.import("danmaku-converter");async function o(t){const e=n();let a={title:e};try{await loadDanmakuSettingsPanel();const t=t=>{const e=parseFloat(dq(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));return e*4/188};const e=t=>{const e=parseFloat(dq(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};a.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;a.alpha=(100-parseFloat(dq(".bilibili-player-setting-opacity .bui-thumb-tooltip").innerText))/100;a.duration=(()=>{const e=18-3*t(".bilibili-player-setting-speedplus .bui-thumb");return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();a.blockTypes=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"]};for(const[n,a]of Object.entries(e)){if(dq(n).classList.contains("disabled")){t=t.concat(a)}}return t.concat(7,8)})();const n=1.4-.2*t(".bilibili-player-setting-fontsize .bui-thumb");a.resolution={x:1920*n,y:1080*n};a.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(a.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){a.bottomMarginPercent=.15}a.bold=dq(".bilibili-player-video-danmaku-setting-right-font-bold input").checked;const i=localStorage.getItem("bilibili_player_settings");if(i){const t=JSON.parse(i);const e=_.get(t,"block.list",[]);a.blockFilter=(t=>{for(const n of e){if(!n.s){continue}switch(n.t){case"keyword":{if(t.content.includes(n.v)){return false}break}case"regexp":{if(new RegExp(n.v).test(t.content)){return false}break}case"user":{if(t.userHash===n.v){return false}break}}}return true})}}catch(t){a={...a,font:"微软雅黑",alpha:.4,duration:t=>{switch(t.type){case 4:case 5:return 4;default:return 6}},blockTypes:[7,8],resolution:{x:1920,y:1080},bottomMarginPercent:.15,bold:false}}const o=new i(a);const s=o.convertToAssDocument(t);return s.generateAss()}async function s(t){const e=n();const i=new a((unsafeWindow||window).cid);await i.fetchInfo();const s=await(async()=>{if(t===true){return new Blob([await o(i.rawXML)],{type:"text/plain"})}else{return new Blob([i.rawXML],{type:"text/plain"})}})();const r=URL.createObjectURL(s);const l=dq("#danmaku-link");const c=l.getAttribute("href");if(c){URL.revokeObjectURL(c)}l.setAttribute("download",`${e}.${t?"ass":"xml"}`);l.setAttribute("href",r);l.click()}return{export:{downloadDanmaku:s,convertToAss:o},widget:{content:`\n<a id="danmaku-link" style="display:none"></a>\n<button\n class="gui-settings-flat-button"\n id="download-danmaku-xml">\n<i class="icon-danmaku"></i>\n<span>下载弹幕<span>(XML)</span></span>\n</button>\n<button\n class="gui-settings-flat-button"\n id="download-danmaku-ass">\n<i class="icon-danmaku"></i>\n<span>下载弹幕<span>(ASS)</span></span>\n</button>\n`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#download-danmaku-xml");const e=dq("#download-danmaku-ass");const n=[t,e];const a=(t,e)=>{t.addEventListener("click",async()=>{try{n.forEach(t=>t.disabled=true);await s(e)}catch(t){logError(t)}finally{n.forEach(t=>t.disabled=false)}})};a(t,false);a(e,true)}}}}})(); |