diff --git a/bilibili-evolved.offline.user.js b/bilibili-evolved.offline.user.js
index 4db5e207e..087b0be10 100644
--- a/bilibili-evolved.offline.user.js
+++ b/bilibili-evolved.offline.user.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name Bilibili Evolved (Offline)
-// @version 824.30
+// @version 824.33
// @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中.
// @author Grant Howard, Coulomb-G
// @copyright 2020, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)
@@ -1397,7 +1397,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/disable-profile-popup.min.js"] = (()=>{return(e,t)=>{let i=false;const r=()=>{if(document.URL.replace(location.search,"")==="https://t.bilibili.com/"){if(i){return}(async()=>{const t=await SpinQuery.select(".live-up-list");if(t!==null){t.addEventListener("mouseenter",t=>{if(e.fixedSidebars||e.extendFeedsLive){t.stopImmediatePropagation()}},{capture:true});i=true}})()}};return{export:{disableProfilePopup:r}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/double-click-fullscreen.min.js"] = (()=>{return(i,e)=>{const l=()=>{const e=["https://www.bilibili.com/bangumi/","https://www.bilibili.com/video/"];if(!e.some(i=>document.URL.startsWith(i))){return}if(i.touchVideoPlayer&&i.touchVideoPlayerDoubleTapControl){Toast.info("在开启了播放器触摸支持-启用双击控制后, 双击全屏功能将无效.","提示");i.doubleClickFullscreen=false;return}Observer.videoChange(async()=>{await SpinQuery.unsafeJquery();const e=await SpinQuery.condition(()=>dq(".bilibili-player-area"),i=>i!==null&&unsafeWindow.$(".bilibili-player-video").data("events"));if(e===null){return}const l="double-click-fullscreen";if(!e.classList.contains(l)){e.classList.add(l);const n=unsafeWindow.$(".bilibili-player-video");const s=i.doubleClickFullscreenPreventSingleClick?n.data("events").click[0].handler:()=>{};const t=new DoubleClickEvent(()=>dq(".bilibili-player-video-btn-fullscreen").click(),i=>s(i));if(i.doubleClickFullscreenPreventSingleClick){n.unbind("click")}t.bind(n[0])}})};l()}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));const d=(()=>{const e=document.querySelector(".song-title");if(e){return e.getAttribute("title")}else{return"神秘音频"}})();i.setAttribute("download",d+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{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();const 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};let o={...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,47:1,94:2,141:3,188:4}[e];return n};o.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;o.alpha=(100-parseFloat(dq(".bilibili-player-setting-opacity .bui-thumb-tooltip").innerText))/100;o.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}}})();o.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");o.resolution={x:Math.round(1920*n),y:Math.round(1080*n)};o.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(o.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){o.bottomMarginPercent=.15}o.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",[]);o.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){o={...o,...a}}for(const[t,e]of Object.entries(o)){if(e===undefined||e===null){console.warn("danmaku config invalid for key",t,", value =",e);o[t]=a[e]}}console.log(o);const s=new i(o);const r=s.convertToAssDocument(t);return r.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\n\n\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)}}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(t,n)=>{const{getFriendlyTitle:e}=n.import("title");const{DanmakuInfo:o}=n.import("video-info");const{DanmakuConverter:a}=n.import("danmaku-converter");async function s(t){const n=e();const o={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};let s={...o,title:n};try{await loadDanmakuSettingsPanel();const t=localStorage.getItem("bilibili_player_settings");if(t){const n=JSON.parse(t);const e=(t,e)=>_.get(n,`setting_config.${t}`,e);s.blockTypes=(()=>{const t=[];const e={scroll:[1,2,3],top:[5],bottom:[4],color:["color"]};for(const[o,a]of Object.entries(e)){if(_.get(n,`block.type_${o}`,true)===false){t.push(...a)}}return t.concat(7,8)})();s.bold=e("bold",false);s.alpha=parseFloat(e("opacity","0.4"));const o=1.4-.4*e("fontsize",1);s.resolution={x:Math.round(1920*o),y:Math.round(1080*o)};s.duration=(()=>{const t=18-3*e("speedplus",0);return n=>{switch(n.type){case 4:case 5:return 4;default:return t}}})();const a=e("danmakuArea",0);s.bottomMarginPercent=a>=100?0:a/100;if(s.bottomMarginPercent===0&&e("preventshade",false)){s.bottomMarginPercent=.15}const r=_.get(n,"block.list",[]);s.blockFilter=(t=>{for(const n of r){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})}else{console.warn("[弹幕转换] 未找到播放器设置");s={...s,...o}}s.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText}catch(t){logError(t);s={...s,...o}}for(const[t,n]of Object.entries(s)){if(n===undefined||n===null){console.warn("danmaku config invalid for key",t,", value =",n);s[t]=o[n]}}console.log(s);const r=new a(s);const c=r.convertToAssDocument(t);return c.generateAss()}async function r(t){const n=e();const a=new o((unsafeWindow||window).cid);await a.fetchInfo();const r=await(async()=>{if(t===true){return new Blob([await s(a.rawXML)],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const i=dq("#danmaku-link");const l=i.getAttribute("href");if(l){URL.revokeObjectURL(l)}i.setAttribute("download",`${n}.${t?"ass":"xml"}`);i.setAttribute("href",c);i.click()}return{export:{downloadDanmaku:r,convertToAss:s},widget:{content:`\n\n\n\n`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#download-danmaku-xml");const n=dq("#download-danmaku-ass");const e=[t,n];const o=(t,n)=>{t.addEventListener("click",async()=>{try{e.forEach(t=>t.disabled=true);await r(n)}catch(t){logError(t)}finally{e.forEach(t=>t.disabled=false)}})};o(t,false);o(n,true)}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-live-records.min.js"] = (()=>{return(t,o)=>{const e=()=>document.URL.replace(location.search,"").match(/https:\/\/live\.bilibili\.com\/record\/(.+)/);return{widget:{content:`\n`,condition:async()=>{const t=e();return Boolean(t)},success:()=>{const t=dq("#download-live-records");t.addEventListener("click",async()=>{try{t.disabled=true;const o=e()[1];const n=await Ajax.getJson(`https://api.live.bilibili.com/xlive/web-room/v1/record/getLiveRecordUrl?rid=${o}&platform=html5`);if(n.code!==0){logError(new Error(`获取录像链接失败: ${n.message}`));return}const i=n.data.list.map(t=>t.url);Toast.success(i.map(t=>`${t}`).join("\n"),"下载录像")}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-subtitle.min.js"] = (()=>{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\n\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}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}.download-video.opened .rpc-settings.show{pointer-events:initial}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background-color:transparent;color:var(--download-video-foreground);box-shadow:0 0 0 1px #8884}.download-video .button:hover,.download-video button:hover{background-color:#8882}.download-video .button:active,.download-video button:active{background-color:#8884}.download-video .primary{background:var(--theme-color);box-shadow:0 0 0 1px var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(33.33% - 32px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video .actions>.aria2-rpc{flex-basis:100%}.download-video i.mdi-alert-circle{font-size:22px;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px;align-self:center}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882;box-shadow:0 0 0 1px #8884 inset}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px;min-height:180px;user-select:none}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#222}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1)}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;border:1px solid #dfdfdf;flex:1 0 0;outline:0!important}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
diff --git a/bilibili-evolved.preview-offline.user.js b/bilibili-evolved.preview-offline.user.js
index 149bee1ea..c488f0e85 100644
--- a/bilibili-evolved.preview-offline.user.js
+++ b/bilibili-evolved.preview-offline.user.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name Bilibili Evolved (Preview Offline)
-// @version 824.30
+// @version 824.33
// @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中.
// @author Grant Howard, Coulomb-G
// @copyright 2020, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)
@@ -1397,7 +1397,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/disable-profile-popup.min.js"] = (()=>{return(e,t)=>{let i=false;const r=()=>{if(document.URL.replace(location.search,"")==="https://t.bilibili.com/"){if(i){return}(async()=>{const t=await SpinQuery.select(".live-up-list");if(t!==null){t.addEventListener("mouseenter",t=>{if(e.fixedSidebars||e.extendFeedsLive){t.stopImmediatePropagation()}},{capture:true});i=true}})()}};return{export:{disableProfilePopup:r}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/double-click-fullscreen.min.js"] = (()=>{return(i,e)=>{const l=()=>{const e=["https://www.bilibili.com/bangumi/","https://www.bilibili.com/video/"];if(!e.some(i=>document.URL.startsWith(i))){return}if(i.touchVideoPlayer&&i.touchVideoPlayerDoubleTapControl){Toast.info("在开启了播放器触摸支持-启用双击控制后, 双击全屏功能将无效.","提示");i.doubleClickFullscreen=false;return}Observer.videoChange(async()=>{await SpinQuery.unsafeJquery();const e=await SpinQuery.condition(()=>dq(".bilibili-player-area"),i=>i!==null&&unsafeWindow.$(".bilibili-player-video").data("events"));if(e===null){return}const l="double-click-fullscreen";if(!e.classList.contains(l)){e.classList.add(l);const n=unsafeWindow.$(".bilibili-player-video");const s=i.doubleClickFullscreenPreventSingleClick?n.data("events").click[0].handler:()=>{};const t=new DoubleClickEvent(()=>dq(".bilibili-player-video-btn-fullscreen").click(),i=>s(i));if(i.doubleClickFullscreenPreventSingleClick){n.unbind("click")}t.bind(n[0])}})};l()}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));const d=(()=>{const e=document.querySelector(".song-title");if(e){return e.getAttribute("title")}else{return"神秘音频"}})();i.setAttribute("download",d+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{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();const 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};let o={...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,47:1,94:2,141:3,188:4}[e];return n};o.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;o.alpha=(100-parseFloat(dq(".bilibili-player-setting-opacity .bui-thumb-tooltip").innerText))/100;o.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}}})();o.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");o.resolution={x:Math.round(1920*n),y:Math.round(1080*n)};o.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(o.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){o.bottomMarginPercent=.15}o.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",[]);o.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){o={...o,...a}}for(const[t,e]of Object.entries(o)){if(e===undefined||e===null){console.warn("danmaku config invalid for key",t,", value =",e);o[t]=a[e]}}console.log(o);const s=new i(o);const r=s.convertToAssDocument(t);return r.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\n\n\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)}}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(t,n)=>{const{getFriendlyTitle:e}=n.import("title");const{DanmakuInfo:o}=n.import("video-info");const{DanmakuConverter:a}=n.import("danmaku-converter");async function s(t){const n=e();const o={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};let s={...o,title:n};try{await loadDanmakuSettingsPanel();const t=localStorage.getItem("bilibili_player_settings");if(t){const n=JSON.parse(t);const e=(t,e)=>_.get(n,`setting_config.${t}`,e);s.blockTypes=(()=>{const t=[];const e={scroll:[1,2,3],top:[5],bottom:[4],color:["color"]};for(const[o,a]of Object.entries(e)){if(_.get(n,`block.type_${o}`,true)===false){t.push(...a)}}return t.concat(7,8)})();s.bold=e("bold",false);s.alpha=parseFloat(e("opacity","0.4"));const o=1.4-.4*e("fontsize",1);s.resolution={x:Math.round(1920*o),y:Math.round(1080*o)};s.duration=(()=>{const t=18-3*e("speedplus",0);return n=>{switch(n.type){case 4:case 5:return 4;default:return t}}})();const a=e("danmakuArea",0);s.bottomMarginPercent=a>=100?0:a/100;if(s.bottomMarginPercent===0&&e("preventshade",false)){s.bottomMarginPercent=.15}const r=_.get(n,"block.list",[]);s.blockFilter=(t=>{for(const n of r){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})}else{console.warn("[弹幕转换] 未找到播放器设置");s={...s,...o}}s.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText}catch(t){logError(t);s={...s,...o}}for(const[t,n]of Object.entries(s)){if(n===undefined||n===null){console.warn("danmaku config invalid for key",t,", value =",n);s[t]=o[n]}}console.log(s);const r=new a(s);const c=r.convertToAssDocument(t);return c.generateAss()}async function r(t){const n=e();const a=new o((unsafeWindow||window).cid);await a.fetchInfo();const r=await(async()=>{if(t===true){return new Blob([await s(a.rawXML)],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const i=dq("#danmaku-link");const l=i.getAttribute("href");if(l){URL.revokeObjectURL(l)}i.setAttribute("download",`${n}.${t?"ass":"xml"}`);i.setAttribute("href",c);i.click()}return{export:{downloadDanmaku:r,convertToAss:s},widget:{content:`\n\n\n\n`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#download-danmaku-xml");const n=dq("#download-danmaku-ass");const e=[t,n];const o=(t,n)=>{t.addEventListener("click",async()=>{try{e.forEach(t=>t.disabled=true);await r(n)}catch(t){logError(t)}finally{e.forEach(t=>t.disabled=false)}})};o(t,false);o(n,true)}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-live-records.min.js"] = (()=>{return(t,o)=>{const e=()=>document.URL.replace(location.search,"").match(/https:\/\/live\.bilibili\.com\/record\/(.+)/);return{widget:{content:`\n`,condition:async()=>{const t=e();return Boolean(t)},success:()=>{const t=dq("#download-live-records");t.addEventListener("click",async()=>{try{t.disabled=true;const o=e()[1];const n=await Ajax.getJson(`https://api.live.bilibili.com/xlive/web-room/v1/record/getLiveRecordUrl?rid=${o}&platform=html5`);if(n.code!==0){logError(new Error(`获取录像链接失败: ${n.message}`));return}const i=n.data.list.map(t=>t.url);Toast.success(i.map(t=>`${t}`).join("\n"),"下载录像")}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-subtitle.min.js"] = (()=>{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\n\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}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}.download-video.opened .rpc-settings.show{pointer-events:initial}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background-color:transparent;color:var(--download-video-foreground);box-shadow:0 0 0 1px #8884}.download-video .button:hover,.download-video button:hover{background-color:#8882}.download-video .button:active,.download-video button:active{background-color:#8884}.download-video .primary{background:var(--theme-color);box-shadow:0 0 0 1px var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(33.33% - 32px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video .actions>.aria2-rpc{flex-basis:100%}.download-video i.mdi-alert-circle{font-size:22px;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px;align-self:center}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882;box-shadow:0 0 0 1px #8884 inset}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px;min-height:180px;user-select:none}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#222}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1)}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;border:1px solid #dfdfdf;flex:1 0 0;outline:0!important}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
diff --git a/bilibili-evolved.preview.user.js b/bilibili-evolved.preview.user.js
index bfc7178b4..5b3aee9da 100644
--- a/bilibili-evolved.preview.user.js
+++ b/bilibili-evolved.preview.user.js
@@ -1396,7 +1396,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/m
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/disable-profile-popup.min.js"] = (()=>{return(e,t)=>{let i=false;const r=()=>{if(document.URL.replace(location.search,"")==="https://t.bilibili.com/"){if(i){return}(async()=>{const t=await SpinQuery.select(".live-up-list");if(t!==null){t.addEventListener("mouseenter",t=>{if(e.fixedSidebars||e.extendFeedsLive){t.stopImmediatePropagation()}},{capture:true});i=true}})()}};return{export:{disableProfilePopup:r}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/double-click-fullscreen.min.js"] = (()=>{return(i,e)=>{const l=()=>{const e=["https://www.bilibili.com/bangumi/","https://www.bilibili.com/video/"];if(!e.some(i=>document.URL.startsWith(i))){return}if(i.touchVideoPlayer&&i.touchVideoPlayerDoubleTapControl){Toast.info("在开启了播放器触摸支持-启用双击控制后, 双击全屏功能将无效.","提示");i.doubleClickFullscreen=false;return}Observer.videoChange(async()=>{await SpinQuery.unsafeJquery();const e=await SpinQuery.condition(()=>dq(".bilibili-player-area"),i=>i!==null&&unsafeWindow.$(".bilibili-player-video").data("events"));if(e===null){return}const l="double-click-fullscreen";if(!e.classList.contains(l)){e.classList.add(l);const n=unsafeWindow.$(".bilibili-player-video");const s=i.doubleClickFullscreenPreventSingleClick?n.data("events").click[0].handler:()=>{};const t=new DoubleClickEvent(()=>dq(".bilibili-player-video-btn-fullscreen").click(),i=>s(i));if(i.doubleClickFullscreenPreventSingleClick){n.unbind("click")}t.bind(n[0])}})};l()}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));const d=(()=>{const e=document.querySelector(".song-title");if(e){return e.getAttribute("title")}else{return"神秘音频"}})();i.setAttribute("download",d+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-danmaku.min.js"] = (()=>{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();const 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};let o={...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,47:1,94:2,141:3,188:4}[e];return n};o.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;o.alpha=(100-parseFloat(dq(".bilibili-player-setting-opacity .bui-thumb-tooltip").innerText))/100;o.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}}})();o.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");o.resolution={x:Math.round(1920*n),y:Math.round(1080*n)};o.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(o.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){o.bottomMarginPercent=.15}o.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",[]);o.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){o={...o,...a}}for(const[t,e]of Object.entries(o)){if(e===undefined||e===null){console.warn("danmaku config invalid for key",t,", value =",e);o[t]=a[e]}}console.log(o);const s=new i(o);const r=s.convertToAssDocument(t);return r.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\n\n\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)}}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-danmaku.min.js"] = (()=>{return(t,n)=>{const{getFriendlyTitle:e}=n.import("title");const{DanmakuInfo:o}=n.import("video-info");const{DanmakuConverter:a}=n.import("danmaku-converter");async function s(t){const n=e();const o={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};let s={...o,title:n};try{await loadDanmakuSettingsPanel();const t=localStorage.getItem("bilibili_player_settings");if(t){const n=JSON.parse(t);const e=(t,e)=>_.get(n,`setting_config.${t}`,e);s.blockTypes=(()=>{const t=[];const e={scroll:[1,2,3],top:[5],bottom:[4],color:["color"]};for(const[o,a]of Object.entries(e)){if(_.get(n,`block.type_${o}`,true)===false){t.push(...a)}}return t.concat(7,8)})();s.bold=e("bold",false);s.alpha=parseFloat(e("opacity","0.4"));const o=1.4-.4*e("fontsize",1);s.resolution={x:Math.round(1920*o),y:Math.round(1080*o)};s.duration=(()=>{const t=18-3*e("speedplus",0);return n=>{switch(n.type){case 4:case 5:return 4;default:return t}}})();const a=e("danmakuArea",0);s.bottomMarginPercent=a>=100?0:a/100;if(s.bottomMarginPercent===0&&e("preventshade",false)){s.bottomMarginPercent=.15}const r=_.get(n,"block.list",[]);s.blockFilter=(t=>{for(const n of r){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})}else{console.warn("[弹幕转换] 未找到播放器设置");s={...s,...o}}s.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText}catch(t){logError(t);s={...s,...o}}for(const[t,n]of Object.entries(s)){if(n===undefined||n===null){console.warn("danmaku config invalid for key",t,", value =",n);s[t]=o[n]}}console.log(s);const r=new a(s);const c=r.convertToAssDocument(t);return c.generateAss()}async function r(t){const n=e();const a=new o((unsafeWindow||window).cid);await a.fetchInfo();const r=await(async()=>{if(t===true){return new Blob([await s(a.rawXML)],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const i=dq("#danmaku-link");const l=i.getAttribute("href");if(l){URL.revokeObjectURL(l)}i.setAttribute("download",`${n}.${t?"ass":"xml"}`);i.setAttribute("href",c);i.click()}return{export:{downloadDanmaku:r,convertToAss:s},widget:{content:`\n\n\n\n`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#download-danmaku-xml");const n=dq("#download-danmaku-ass");const e=[t,n];const o=(t,n)=>{t.addEventListener("click",async()=>{try{e.forEach(t=>t.disabled=true);await r(n)}catch(t){logError(t)}finally{e.forEach(t=>t.disabled=false)}})};o(t,false);o(n,true)}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-live-records.min.js"] = (()=>{return(t,o)=>{const e=()=>document.URL.replace(location.search,"").match(/https:\/\/live\.bilibili\.com\/record\/(.+)/);return{widget:{content:`\n`,condition:async()=>{const t=e();return Boolean(t)},success:()=>{const t=dq("#download-live-records");t.addEventListener("click",async()=>{try{t.disabled=true;const o=e()[1];const n=await Ajax.getJson(`https://api.live.bilibili.com/xlive/web-room/v1/record/getLiveRecordUrl?rid=${o}&platform=html5`);if(n.code!==0){logError(new Error(`获取录像链接失败: ${n.message}`));return}const i=n.data.list.map(t=>t.url);Toast.success(i.map(t=>`${t}`).join("\n"),"下载录像")}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-subtitle.min.js"] = (()=>{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\n\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}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}.download-video.opened .rpc-settings.show{pointer-events:initial}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background-color:transparent;color:var(--download-video-foreground);box-shadow:0 0 0 1px #8884}.download-video .button:hover,.download-video button:hover{background-color:#8882}.download-video .button:active,.download-video button:active{background-color:#8884}.download-video .primary{background:var(--theme-color);box-shadow:0 0 0 1px var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(33.33% - 32px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video .actions>.aria2-rpc{flex-basis:100%}.download-video i.mdi-alert-circle{font-size:22px;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px;align-self:center}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882;box-shadow:0 0 0 1px #8884 inset}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px;min-height:180px;user-select:none}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#222}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1)}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;border:1px solid #dfdfdf;flex:1 0 0;outline:0!important}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
diff --git a/bilibili-evolved.user.js b/bilibili-evolved.user.js
index fcbfd0177..4d3e2b354 100644
--- a/bilibili-evolved.user.js
+++ b/bilibili-evolved.user.js
@@ -1396,7 +1396,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/mi
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/disable-profile-popup.min.js"] = (()=>{return(e,t)=>{let i=false;const r=()=>{if(document.URL.replace(location.search,"")==="https://t.bilibili.com/"){if(i){return}(async()=>{const t=await SpinQuery.select(".live-up-list");if(t!==null){t.addEventListener("mouseenter",t=>{if(e.fixedSidebars||e.extendFeedsLive){t.stopImmediatePropagation()}},{capture:true});i=true}})()}};return{export:{disableProfilePopup:r}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/double-click-fullscreen.min.js"] = (()=>{return(i,e)=>{const l=()=>{const e=["https://www.bilibili.com/bangumi/","https://www.bilibili.com/video/"];if(!e.some(i=>document.URL.startsWith(i))){return}if(i.touchVideoPlayer&&i.touchVideoPlayerDoubleTapControl){Toast.info("在开启了播放器触摸支持-启用双击控制后, 双击全屏功能将无效.","提示");i.doubleClickFullscreen=false;return}Observer.videoChange(async()=>{await SpinQuery.unsafeJquery();const e=await SpinQuery.condition(()=>dq(".bilibili-player-area"),i=>i!==null&&unsafeWindow.$(".bilibili-player-video").data("events"));if(e===null){return}const l="double-click-fullscreen";if(!e.classList.contains(l)){e.classList.add(l);const n=unsafeWindow.$(".bilibili-player-video");const s=i.doubleClickFullscreenPreventSingleClick?n.data("events").click[0].handler:()=>{};const t=new DoubleClickEvent(()=>dq(".bilibili-player-video-btn-fullscreen").click(),i=>s(i));if(i.doubleClickFullscreenPreventSingleClick){n.unbind("click")}t.bind(n[0])}})};l()}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));const d=(()=>{const e=document.querySelector(".song-title");if(e){return e.getAttribute("title")}else{return"神秘音频"}})();i.setAttribute("download",d+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{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();const 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};let o={...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,47:1,94:2,141:3,188:4}[e];return n};o.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;o.alpha=(100-parseFloat(dq(".bilibili-player-setting-opacity .bui-thumb-tooltip").innerText))/100;o.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}}})();o.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");o.resolution={x:Math.round(1920*n),y:Math.round(1080*n)};o.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(o.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){o.bottomMarginPercent=.15}o.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",[]);o.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){o={...o,...a}}for(const[t,e]of Object.entries(o)){if(e===undefined||e===null){console.warn("danmaku config invalid for key",t,", value =",e);o[t]=a[e]}}console.log(o);const s=new i(o);const r=s.convertToAssDocument(t);return r.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\n\n\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)}}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(t,n)=>{const{getFriendlyTitle:e}=n.import("title");const{DanmakuInfo:o}=n.import("video-info");const{DanmakuConverter:a}=n.import("danmaku-converter");async function s(t){const n=e();const o={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};let s={...o,title:n};try{await loadDanmakuSettingsPanel();const t=localStorage.getItem("bilibili_player_settings");if(t){const n=JSON.parse(t);const e=(t,e)=>_.get(n,`setting_config.${t}`,e);s.blockTypes=(()=>{const t=[];const e={scroll:[1,2,3],top:[5],bottom:[4],color:["color"]};for(const[o,a]of Object.entries(e)){if(_.get(n,`block.type_${o}`,true)===false){t.push(...a)}}return t.concat(7,8)})();s.bold=e("bold",false);s.alpha=parseFloat(e("opacity","0.4"));const o=1.4-.4*e("fontsize",1);s.resolution={x:Math.round(1920*o),y:Math.round(1080*o)};s.duration=(()=>{const t=18-3*e("speedplus",0);return n=>{switch(n.type){case 4:case 5:return 4;default:return t}}})();const a=e("danmakuArea",0);s.bottomMarginPercent=a>=100?0:a/100;if(s.bottomMarginPercent===0&&e("preventshade",false)){s.bottomMarginPercent=.15}const r=_.get(n,"block.list",[]);s.blockFilter=(t=>{for(const n of r){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})}else{console.warn("[弹幕转换] 未找到播放器设置");s={...s,...o}}s.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText}catch(t){logError(t);s={...s,...o}}for(const[t,n]of Object.entries(s)){if(n===undefined||n===null){console.warn("danmaku config invalid for key",t,", value =",n);s[t]=o[n]}}console.log(s);const r=new a(s);const c=r.convertToAssDocument(t);return c.generateAss()}async function r(t){const n=e();const a=new o((unsafeWindow||window).cid);await a.fetchInfo();const r=await(async()=>{if(t===true){return new Blob([await s(a.rawXML)],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const i=dq("#danmaku-link");const l=i.getAttribute("href");if(l){URL.revokeObjectURL(l)}i.setAttribute("download",`${n}.${t?"ass":"xml"}`);i.setAttribute("href",c);i.click()}return{export:{downloadDanmaku:r,convertToAss:s},widget:{content:`\n\n\n\n`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#download-danmaku-xml");const n=dq("#download-danmaku-ass");const e=[t,n];const o=(t,n)=>{t.addEventListener("click",async()=>{try{e.forEach(t=>t.disabled=true);await r(n)}catch(t){logError(t)}finally{e.forEach(t=>t.disabled=false)}})};o(t,false);o(n,true)}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-live-records.min.js"] = (()=>{return(t,o)=>{const e=()=>document.URL.replace(location.search,"").match(/https:\/\/live\.bilibili\.com\/record\/(.+)/);return{widget:{content:`\n`,condition:async()=>{const t=e();return Boolean(t)},success:()=>{const t=dq("#download-live-records");t.addEventListener("click",async()=>{try{t.disabled=true;const o=e()[1];const n=await Ajax.getJson(`https://api.live.bilibili.com/xlive/web-room/v1/record/getLiveRecordUrl?rid=${o}&platform=html5`);if(n.code!==0){logError(new Error(`获取录像链接失败: ${n.message}`));return}const i=n.data.list.map(t=>t.url);Toast.success(i.map(t=>`${t}`).join("\n"),"下载录像")}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-subtitle.min.js"] = (()=>{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\n\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}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}.download-video.opened .rpc-settings.show{pointer-events:initial}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background-color:transparent;color:var(--download-video-foreground);box-shadow:0 0 0 1px #8884}.download-video .button:hover,.download-video button:hover{background-color:#8882}.download-video .button:active,.download-video button:active{background-color:#8884}.download-video .primary{background:var(--theme-color);box-shadow:0 0 0 1px var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(33.33% - 32px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video .actions>.aria2-rpc{flex-basis:100%}.download-video i.mdi-alert-circle{font-size:22px;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px;align-self:center}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882;box-shadow:0 0 0 1px #8884 inset}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px;min-height:180px;user-select:none}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#222}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1)}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;border:1px solid #dfdfdf;flex:1 0 0;outline:0!important}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
diff --git a/min/bundle.json b/min/bundle.json
index f100244a4..75920d69c 100644
--- a/min/bundle.json
+++ b/min/bundle.json
@@ -86,7 +86,7 @@
"disable-profile-popup.min.js": "69901EC9A3D15D585F61B1370DC69003CE5869499CAC9C57A03B24511F338A2D",
"double-click-fullscreen.min.js": "C6D95B92ECDE67F2C0A3C6B6E4DC655C524F6A98CE0D48733ADCE4ABA780A47B",
"download-audio.min.js": "1F4536DE4FF302BFD026CA17E028AF8EB037FB6D0CB355692549DECAEAE0E8C9",
- "download-danmaku.min.js": "B8B31AAAC93548DD324D751CD2E3342B5850F684594A59C768C7DBB72D6451F5",
+ "download-danmaku.min.js": "BCDC6878CE6A8BC6FCF6B3154FD42861C7B442F21107C67D94EEEAF2B72A3DB9",
"download-live-records.min.js": "7EF26D22D22EB75A6B27B78B3DB0E2ADE6004587C11B0C2893CF1CCB3B6FAB6F",
"download-subtitle.min.js": "EAD1F63E53C5A0A9877EBF655B68FB3438601D2869F31D0D4A2F7BD2A215E5F3",
"download-video.min.css": "E312176F7A6AA8492FCF0E6422327996D8B9FAB866A39CEA237E43FE353B6569",
diff --git a/min/bundle.zip b/min/bundle.zip
index f9594392b..598f78b8e 100644
Binary files a/min/bundle.zip and b/min/bundle.zip differ
diff --git a/min/download-danmaku.min.js b/min/download-danmaku.min.js
index 748a30b28..3b7585903 100644
--- a/min/download-danmaku.min.js
+++ b/min/download-danmaku.min.js
@@ -1 +1 @@
-(()=>{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();const 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};let o={...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,47:1,94:2,141:3,188:4}[e];return n};o.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;o.alpha=(100-parseFloat(dq(".bilibili-player-setting-opacity .bui-thumb-tooltip").innerText))/100;o.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}}})();o.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");o.resolution={x:Math.round(1920*n),y:Math.round(1080*n)};o.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(o.bottomMarginPercent===0&&dq(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){o.bottomMarginPercent=.15}o.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",[]);o.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){o={...o,...a}}for(const[t,e]of Object.entries(o)){if(e===undefined||e===null){console.warn("danmaku config invalid for key",t,", value =",e);o[t]=a[e]}}console.log(o);const s=new i(o);const r=s.convertToAssDocument(t);return r.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\n\n\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)}}}}})();
\ No newline at end of file
+(()=>{return(t,n)=>{const{getFriendlyTitle:e}=n.import("title");const{DanmakuInfo:o}=n.import("video-info");const{DanmakuConverter:a}=n.import("danmaku-converter");async function s(t){const n=e();const o={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};let s={...o,title:n};try{await loadDanmakuSettingsPanel();const t=localStorage.getItem("bilibili_player_settings");if(t){const n=JSON.parse(t);const e=(t,e)=>_.get(n,`setting_config.${t}`,e);s.blockTypes=(()=>{const t=[];const e={scroll:[1,2,3],top:[5],bottom:[4],color:["color"]};for(const[o,a]of Object.entries(e)){if(_.get(n,`block.type_${o}`,true)===false){t.push(...a)}}return t.concat(7,8)})();s.bold=e("bold",false);s.alpha=parseFloat(e("opacity","0.4"));const o=1.4-.4*e("fontsize",1);s.resolution={x:Math.round(1920*o),y:Math.round(1080*o)};s.duration=(()=>{const t=18-3*e("speedplus",0);return n=>{switch(n.type){case 4:case 5:return 4;default:return t}}})();const a=e("danmakuArea",0);s.bottomMarginPercent=a>=100?0:a/100;if(s.bottomMarginPercent===0&&e("preventshade",false)){s.bottomMarginPercent=.15}const r=_.get(n,"block.list",[]);s.blockFilter=(t=>{for(const n of r){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})}else{console.warn("[弹幕转换] 未找到播放器设置");s={...s,...o}}s.font=dq(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText}catch(t){logError(t);s={...s,...o}}for(const[t,n]of Object.entries(s)){if(n===undefined||n===null){console.warn("danmaku config invalid for key",t,", value =",n);s[t]=o[n]}}console.log(s);const r=new a(s);const c=r.convertToAssDocument(t);return c.generateAss()}async function r(t){const n=e();const a=new o((unsafeWindow||window).cid);await a.fetchInfo();const r=await(async()=>{if(t===true){return new Blob([await s(a.rawXML)],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const i=dq("#danmaku-link");const l=i.getAttribute("href");if(l){URL.revokeObjectURL(l)}i.setAttribute("download",`${n}.${t?"ass":"xml"}`);i.setAttribute("href",c);i.click()}return{export:{downloadDanmaku:r,convertToAss:s},widget:{content:`\n\n\n\n`,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=dq("#download-danmaku-xml");const n=dq("#download-danmaku-ass");const e=[t,n];const o=(t,n)=>{t.addEventListener("click",async()=>{try{e.forEach(t=>t.disabled=true);await r(n)}catch(t){logError(t)}finally{e.forEach(t=>t.disabled=false)}})};o(t,false);o(n,true)}}}}})();
\ No newline at end of file
diff --git a/src/video/download-danmaku.ts b/src/video/download-danmaku.ts
index 6cce2b100..899e8ec3f 100644
--- a/src/video/download-danmaku.ts
+++ b/src/video/download-danmaku.ts
@@ -27,67 +27,67 @@ export async function convertToAss(xml: string) {
let config = { ...defaultConfig, title } as DanmakuConverterConfig
try {
await loadDanmakuSettingsPanel()
- const getSliderFactor = (selector: string) => {
- const transform = parseFloat((dq(selector) as HTMLElement).style.transform!.replace(/translateX\(([\d\.]+)/, '$1'))
- return transform * 4 / 188
- }
- const getSliderIndex = (selector: string) => {
- const transform = parseFloat((dq(selector) as HTMLElement).style.transform!.replace(/translateX\(([\d\.]+)/, '$1')) as 0 | 47 | 94 | 141 | 188
- const index = {
- 0: 0,
- 47: 1,
- 94: 2,
- 141: 3,
- 188: 4
- }[transform]
- return index
- }
- config.font = (dq('.bilibili-player-video-danmaku-setting-right-font .bui-select-result') as HTMLElement).innerText
- config.alpha = (100 - parseFloat((dq('.bilibili-player-setting-opacity .bui-thumb-tooltip') as HTMLElement).innerText)) / 100
- config.duration = (() => {
- const scrollDuration = 18 - 3 * getSliderFactor('.bilibili-player-setting-speedplus .bui-thumb')
- return (danmaku: { type: number }) => {
- switch (danmaku.type) {
- case 4:
- case 5:
- return 4 // stickyDuration
- default:
- return scrollDuration
- }
- }
- })()
- config.blockTypes = (() => {
- let result: (DanmakuType | 'color')[] = []
- const blockValues = {
- '.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']
- // ".bilibili-player-block-filter-type[ftype=special]": [7, 8],
- }
-
- for (const [type, value] of Object.entries(blockValues)) {
- if ((dq(type) as HTMLElement).classList.contains('disabled')) {
- result = result.concat(value as (DanmakuType | 'color')[])
- }
- }
- return result.concat(7, 8)
- })()
- const resolutionFactor = 1.4 - 0.2 * getSliderFactor('.bilibili-player-setting-fontsize .bui-thumb') // 改变分辨率来调整字体大小
- config.resolution = {
- x: Math.round(1920 * resolutionFactor),
- y: Math.round(1080 * resolutionFactor),
- }
- config.bottomMarginPercent = [0.75, 0.5, 0.25, 0, 0][getSliderIndex('.bilibili-player-setting-area .bui-thumb')]
- if (config.bottomMarginPercent === 0 && (dq('.bilibili-player-video-danmaku-setting-left-preventshade input') as HTMLInputElement).checked) // 无显示区域限制时要检查是否开启防挡字幕
- {
- config.bottomMarginPercent = 0.15
- }
- config.bold = (dq('.bilibili-player-video-danmaku-setting-right-font-bold input') as HTMLInputElement).checked
- // 用户屏蔽词
const playerSettingsJson = localStorage.getItem('bilibili_player_settings')
+
if (playerSettingsJson) {
const playerSettings = JSON.parse(playerSettingsJson)
+ const getConfig = (prop: string, defaultValue?: T): T =>
+ _.get(playerSettings, `setting_config.${prop}`, defaultValue)
+
+ // 屏蔽类型
+ config.blockTypes = (() => {
+ const result: (DanmakuType | 'color')[] = []
+ const blockValues = {
+ scroll: [1, 2, 3],
+ top: [5],
+ bottom: [4],
+ color: ['color']
+ }
+
+ for (const [type, value] of Object.entries(blockValues)) {
+ if (_.get(playerSettings, `block.type_${type}`, true) === false) {
+ result.push(...value as (DanmakuType | 'color')[])
+ }
+ }
+ return result.concat(7, 8) // 高级弹幕不做转换
+ })()
+
+ // 加粗
+ config.bold = getConfig('bold', false)
+
+ // 不透明度
+ config.alpha = parseFloat(getConfig('opacity', '0.4'))
+
+ // 分辨率
+ const resolutionFactor = 1.4 - 0.4 * getConfig('fontsize', 1)
+ config.resolution = {
+ x: Math.round(1920 * resolutionFactor),
+ y: Math.round(1080 * resolutionFactor),
+ }
+
+ // 弹幕持续时长
+ config.duration = (() => {
+ const scrollDuration = 18 - 3 * getConfig('speedplus', 0)
+ return (danmaku: { type: number }) => {
+ switch (danmaku.type) {
+ case 4:
+ case 5:
+ return 4 // stickyDuration
+ default:
+ return scrollDuration
+ }
+ }
+ })()
+
+ // 底部间距
+ const bottomMargin = getConfig('danmakuArea', 0)
+ config.bottomMarginPercent = bottomMargin >= 100 ? 0 : bottomMargin / 100
+ // 无显示区域限制时要检查是否开启防挡字幕
+ if (config.bottomMarginPercent === 0 && getConfig('preventshade', false)) {
+ config.bottomMarginPercent = 0.15
+ }
+
+ // 用户屏蔽词
const blockSettings = _.get(playerSettings, 'block.list', []) as {
/** 类型 */
t: 'keyword' | 'regexp' | 'user',
@@ -125,9 +125,20 @@ export async function convertToAss(xml: string) {
}
return true
}
+ } else {
+ console.warn('[弹幕转换] 未找到播放器设置')
+ config = {
+ ...config,
+ ...defaultConfig
+ }
}
+
+ // 字体直接从 HTML 里取了, localStorage 里是 font-family 解析更麻烦些
+ config.font = (dq('.bilibili-player-video-danmaku-setting-right-font .bui-select-result') as HTMLElement).innerText
+
} catch (error) {
// The default config
+ logError(error)
config = {
...config,
...defaultConfig,