From 01fc575706036e85fed1bcf0b9372cbfaafa0820 Mon Sep 17 00:00:00 2001 From: the1812 Date: Sat, 4 May 2019 22:43:06 +0800 Subject: [PATCH] Fix bugs in batch download entry --- bilibili-evolved.offline.user.js | 8 ++-- bilibili-evolved.preview-offline.user.js | 8 ++-- min/batch-download.min.js | 2 +- min/download-video.min.js | 2 +- video/download-video/batch-download.js | 57 ++++++++++++++++++++++-- video/download-video/download-video.js | 29 +++++++++--- 6 files changed, 87 insertions(+), 19 deletions(-) diff --git a/bilibili-evolved.offline.user.js b/bilibili-evolved.offline.user.js index 7782d84fe..3f2498268 100644 --- a/bilibili-evolved.offline.user.js +++ b/bilibili-evolved.offline.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name Bilibili Evolved (Offline) -// @version 292.21 +// @version 292.29 // @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中. // @author Grant Howard, Coulomb-G // @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) @@ -983,7 +983,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/about.min.js"] = (()=>{return(e,i)=>{$("body").append((i.data.aboutDom||i.data.aboutHtml).text);const n=GM_info.script.name.replace("Bilibili Evolved","").replace(/^[\(\) ]+|[\(\) ]+$/g,"")+" · "+e.currentVersion;$(".bilibili-evolved-version").text(n);const o=[{name:"jQuery",homepage:"https://jquery.com/",license:"MIT",version:"3.2.1"},{name:"JSZip",homepage:"https://stuk.github.io/jszip/",license:"MIT",version:"3.1.5"}];o.forEach(e=>{$(".open-source-components").append(`\n
  • \n \n
    ${e.name}
    \n
    ${e.version} · ${e.license}
    \n
    \n
  • \n `)});function t(){$("#about-close").on("click",()=>{$(".bilibili-evolved-about").toggleClass("opened")});$(".gui-settings").on("click",e=>{if(e.shiftKey===true){$(".bilibili-evolved-about").toggleClass("opened")}})}return{widget:{success:t}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-continue.min.js"] = (()=>{return(e,i)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}function t(e){const i=e.text();if(/第(\d+)话/.test(i)){e.parent().find(".bilibili-player-video-toast-item-jump").click();SpinQuery.condition(()=>document.querySelector(".bilibili-player-video video"),e=>e&&e.paused===true,e=>e.play());return}const t=/((\d)*:)?(\d)*:(\d)*/g;const n=i.match(t);if(!n){return}const r=n[0].split(":");const o=(()=>{if(r.length===3){const[e,i,t]=r.map(e=>parseInt(e));return e*60*60+i*60+t}else if(r.length===2){const[e,i]=r.map(e=>parseInt(e));return e*60+i}else{logError(`解析历史时间发生错误: historyTime=${JSON.stringify(r)}`);return NaN}})();const l=e.parent();const s=document.querySelector("video");if(o从头开始`);i.appendTo(l).on("click",()=>s.currentTime=0);e.html(`已跳转到上次历史记录${n[0]}`)}else{l.find(".bilibili-player-video-toast-item-close").get(0).click()}}function n(){SpinQuery.condition(()=>$(".bilibili-player-video-toast-item-text"),e=>e.text().indexOf("上次看到")!==-1,e=>t(e.filter((e,i)=>i.innerText.indexOf("上次看到")!==-1)))}if(Observer.videoChange){Observer.videoChange(n)}else{Observer.childList("#bofqi",n)}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-play.min.js"] = (()=>{return(e,d)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}SpinQuery.condition(()=>document.querySelector(".bilibili-player-video video"),e=>e&&e.paused===true,e=>e.play())}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,c)=>{class a{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(){return`{x:"test"}`}}const e=[a];class n{async collectData(){const t=new(e.find(t=>t.test()));return await t.collectData()}}return{export:{BatchExtractor:n}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{class s{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(t){const e=document.querySelector("meta[property='og:url']");if(e===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return""}const s=e.getAttribute("content").match(/play\/ss(\d+)/)[1];if(s===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return""}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${s}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return""}const r=i.result.main_section.episodes.map(t=>{return{aid:t.aid,cid:t.cid,number:t.title,title:t.long_title}});const n=[];for(const e of r){const s=`https://api.bilibili.com/pgc/player/web/playurl?avid=${e.aid}&cid=${e.cid}&qn=${t}&otype=json`;const i=await Ajax.getJsonWithCredentials(s);const r=i.data||i.result||i;if(r.quality!==t){Toast.error("获取下载链接失败, 请确认当前账号有下载权限后重试.","批量下载");return""}const a=r.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}});n.push({fragments:a,title:`${e.number} - ${e.title}`,totalSize:a.map(t=>t.size).reduce((t,e)=>t+e)})}return JSON.stringify(n)}}const i=[s];class r{async collectData(t,e){const s=new(i.find(t=>t.test()));const r=await s.collectData(t.quality);e.dismiss();return r}}return{export:{BatchExtractor:r}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/biliplus-redirect.min.js"] = (()=>{return(i,c)=>{const l=`hd.biliplus.com`;const e=["bilibili.com/video/av","bilibili.com/bangumi/play","bilibili.com/bangumi/media","space.bilibili.com"];return{widget:{condition:()=>{return e.some(i=>document.URL.includes(i))},content:`\n `,success:()=>{const i=document.querySelector("#biliplus-redirect");i.addEventListener("click",()=>{if(location.host==="space.bilibili.com"){location.replace(document.URL.replace("space.bilibili.com/",`${l}/space/`))}else{location.host=l}})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blur-video-control.min.css"] = `.video-control-blur-layer{width:100%;height:100%;position:absolute;-webkit-backdrop-filter:blur(48px);backdrop-filter:blur(48px);z-index:-1;top:0}.bilibili-player-video-control-mask{background:0 0!important}.bilibili-player-video-control-bottom,.bui-slider .bui-track.bui-track-video-progress .bui-bar-wrap{background-color:transparent!important}.bilibili-player-video-control-bottom{position:relative}.bilibili-player-area .bilibili-player-video-control-bottom,.bilibili-player-area .bilibili-player-video-control-wrap{transition:none!important}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blur-video-control.min.js"] = (()=>{return(e,r)=>{const i=()=>{SpinQuery.count(()=>$(".bui-slider .bui-track.bui-track-video-progress,.bilibili-player-video-control-bottom"),2,e=>{if(!e.hasClass("video-control-blur-container")){e.addClass("video-control-blur-container");e.prepend(`
    `)}})};if(Observer.videoChange){Observer.videoChange(i)}else{Observer.childList("#bofqi",i)}r.applyStyle("blurVideoControlStyle")}})(); @@ -1014,7 +1014,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m 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:i}=e.import("video-info");const{DanmakuConverter:o}=e.import("danmaku-converter");async function a(t,e){const a=n();const r=new i((unsafeWindow||window).cid);await r.fetchInfo();const l=await(async()=>{if(e===true){let t={title:a};try{await loadLazyPanel(".bilibili-player-video-danmaku-setting");const e=t=>{const e=parseFloat(document.querySelector(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};t.font=document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;t.alpha=parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));t.duration=(()=>{const t=[10,8,6,4,2][e(".bilibili-player-setting-speedplus .bui-thumb")];return e=>{switch(e.type){case 4:case 5:return 4;default:return t}}})();t.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,i]of Object.entries(e)){if(document.querySelector(n).classList.contains("disabled")){t=t.concat(i)}}return t.concat(7,8)})();const n=[1.4,1.2,1,.8,.6][e(".bilibili-player-setting-fontsize .bui-thumb")];t.resolution={x:1920*n,y:1080*n};t.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(t.bottomMarginPercent===0&&document.querySelector(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){t.bottomMarginPercent=.15}t.bold=document.querySelector(".bilibili-player-video-danmaku-setting-right-font-bold input").checked}catch(e){t={font:"微软雅黑",alpha:.6,duration:t=>{switch(t.type){case 4:case 5:return 4;default:return 6}},blockTypes:[7,8],resolution:{x:1920,y:1080},bottomMarginPercent:.15,bold:false}}const e=new o(t);const n=e.convertToAssDocument(r.rawXML);return new Blob([n.generateAss()],{type:"text/plain"})}else{return new Blob([r.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(l);const s=$("#danmaku-link");const u=s.attr("href");if(u){URL.revokeObjectURL(u)}clearTimeout(t);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";s.attr("download",`${a}.${e?"ass":"xml"}`).attr("href",c).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",e=>{if(e.target!==t){const t=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);a(t,e.shiftKey)}})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video-panel.opened{transform:scaleY(1) translateX(-50%)}.download-video-panel{position:absolute;top:calc(100% + 2px);transition:.16s ease-out;transform-origin:top;transform:scaleY(0) translateX(-50%);background:#fff;box-shadow:0 3px 20px 2px #0004;z-index:100;left:50%}.video-action>div,ol.video-quality li{cursor:pointer;align-items:center;margin:0;padding:8px 16px;transition:.2s ease-out;text-align:center;white-space:nowrap}.video-action>div{padding:12px 24px}.video-action>div:hover,ol.video-quality li:hover{background:rgba(0,0,0,.16)}.video-action,.video-error,.video-progress,.video-quality{display:none}.download-video-panel.action:not(.error) .video-action,.download-video-panel.error .video-error,.download-video-panel.progress:not(.error) .video-progress,.download-video-panel.quality:not(.error) .video-quality{display:block}.download-progress-text{display:flex}.download-progress-background{background-color:#8884;height:4px;width:100%;margin-top:4px}.download-progress-foreground{background-color:var(--theme-color);transform-origin:left;transition:.2s ease-out;transform:scaleX(0);height:100%;width:100%}.download-progress-cancel{margin-top:8px;display:flex;justify-content:center}.download-progress-cancel>span{background-color:#8884;padding:4px 8px;cursor:pointer}.download-progress-cancel>span:hover{opacity:.9}.download-progress-cancel>span:active{opacity:.8}.video-error,.video-progress{padding:12px}.video-progress{min-width:120px}#video-action-batch-data,#video-action-batch-download-data,#video-complete{display:none}.batch #video-action-batch-data,.batch #video-action-batch-download-data{display:block}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.html"] = `
    下载视频
    `; -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(e,t)=>{const{getFriendlyTitle:s}=t.import("title");const n={entity:null,aid:undefined,cid:undefined};class o{constructor(){this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}get menuPanel(){return document.querySelector(".download-video-panel")}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&otype=json`}}}class a extends o{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=&otype=json`}}}class r{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new l(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{n.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const o=s.data||s.result||s;const a=o.accept_quality;const i=o.accept_format.split(",");const l=o.accept_description;const c=[];while(a.length>0){const e=new r(a.pop(),i.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class i{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class l{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{n.entity.getUrl(this.format.quality).then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText.replace(/http:/g,"https:"));const o=s.data||s.result||s;if(o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const a=o.durl;this.fragments=a.map(e=>new i(e.length,e.size,e.url,e.backup_url));e(this.fragments)});n.withCredentials=true;n.open("GET",s);n.send()})})}updateProgress(){const e=this.progressMap?[...this.progressMap.values()].reduce((e,t)=>e+t,0)/this.totalSize:0;if(e>1||e<0){console.error(`[下载视频] 进度异常: ${e}`,this.progressMap.values())}this.progress&&this.progress(e)}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;const o=e=>[...this.progressMap.keys()].indexOf(e)+1;while(n{const n=new XMLHttpRequest;n.open("GET",e.url);n.responseType="arraybuffer";n.withCredentials=false;n.addEventListener("progress",e=>{console.log(`[下载视频] 视频片段${o(n)}下载进度: ${e.loaded}/${i} bytes loaded, ${r}`);this.progressMap.set(n,e.loaded);this.updateProgress()});n.addEventListener("load",()=>{if((""+n.status)[0]==="2"){t(n.response)}else{s(`请求失败.`)}});n.addEventListener("abort",()=>s("下载已取消."));n.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${o(n)}下载失败: ${r}`);this.progressMap.set(n,0);this.updateProgress();n.open("GET",e.url);n.setRequestHeader("Range",r);n.send()});n.setRequestHeader("Range",r);this.progressMap.set(n,0);n.send();this.workingXhr.push(n)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}exportData(e=false){const t=JSON.stringify({fragments:this.fragments,title:s(true),totalSize:this.fragments.map(e=>e.size).reduce((e,t)=>e+t)});if(e){GM_setClipboard(t,"text")}else{const e=document.createElement("a");const s=new Blob([t],{type:"text/json"});const n=URL.createObjectURL(s);e.setAttribute("href",n);e.setAttribute("download",`cid${unsafeWindow.cid}.json`);document.body.appendChild(e);e.click();e.remove();URL.revokeObjectURL(n)}}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=document.querySelector("a#video-complete").getAttribute("href");if(e&&!document.querySelector(`.link[href="${e}"]`)){URL.revokeObjectURL(e)}[...document.querySelectorAll(".toast-card-header")].filter(e=>e.innerText.includes("下载视频")).forEach(e=>e.querySelector(".toast-card-dismiss").click())}downloadSingle(e){const[t]=e;const n=this.makeBlob(t);const o=s()+this.extension();return[n,o]}async downloadMultiple(e){const t=new JSZip;const n=s();if(e.length>1){e.forEach((e,s)=>{const o=this.fragments[s];t.file(`${n} - ${s+1}${this.extension(o)}`,this.makeBlob(e,o))})}else{const[s]=e;t.file(`${n}${this.extension()}`,this.makeBlob(s))}const o=await t.generateAsync({type:"blob"});const a=n+".zip";return[o,a]}async download(){const e=[];this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}this.cleanUpOldBlobUrl();const n=URL.createObjectURL(t);this.progress&&this.progress(0);return{url:n,filename:s}}}async function c(){const e=["/www.bilibili.com/bangumi"];if(e.some(e=>document.URL.includes(e))){const{BatchExtractor:e}=await t.importAsync("batchDownload");const s=new e;document.getElementById("download-video").classList.add("batch");document.getElementById("video-action-batch-data").addEventListener("click",async()=>{const e=await s.collectData();GM_setClipboard(e,{type:"text/json"});Toast.success("已复制批量数据到剪贴板.","复制批量数据",3e3);n.entity.resetMenuClass()});document.getElementById("video-action-batch-download-data").addEventListener("click",async()=>{const e=await s.collectData();const t=document.createElement("a");const o=new Blob([e],{type:"text/json"});const a=URL.createObjectURL(o);t.setAttribute("href",a);t.setAttribute("download",`export.json`);document.body.appendChild(t);t.click();t.remove();URL.revokeObjectURL(a);n.entity.resetMenuClass()})}}async function d(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);n.aid=e;n.cid=t;if(document.URL.indexOf("bangumi")!==-1){n.entity=new a}else{n.entity=new o}return Boolean(e&&t)}async function u(){let e=await r.availableFormats;let[s]=e;const o=async()=>{await d();e=await r.availableFormats;const t=$("ol.video-quality");t.html("");e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{s=e;n.entity.nextMenuClass()}).prependTo(t)})};if(Observer.videoChange){Observer.videoChange(o)}else{Observer.childList("#bofqi",o)}const a=()=>s.downloadInfo().catch(e=>{n.entity.addError();$(".video-error").text(e)});async function i(){if(!s){return}n.entity.nextMenuClass();const e=await a();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{n.entity.addError();$(".video-error").text(e)});if(!t){return}const o=document.getElementById("video-complete");o.setAttribute("href",t.url);o.setAttribute("download",t.filename);o.click();const r=`下载完成. 再次保存`;Toast.success(r,"下载视频");n.entity.resetMenuClass()}async function l(){if(!s){return}const e=await a();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);n.entity.resetMenuClass()}document.querySelector("#video-action-download").addEventListener("click",i);document.querySelector("#video-action-copy").addEventListener("click",l);document.querySelector("#video-action-copy-data").addEventListener("click",async()=>{if(!s){return}const e=await a();e.exportData(true);Toast.success("已复制数据到剪贴板.","复制数据",3e3);n.entity.resetMenuClass()});document.querySelector("#video-action-download-data").addEventListener("click",async()=>{if(!s){return}const e=await a();e.exportData(false);n.entity.resetMenuClass()});t.applyStyle("downloadVideoStyle");const u=document.querySelector(".download-video-panel");const p=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!u.contains(e.target)){p()}});$(".video-error").on("click",()=>{$(".video-error").text("");n.entity.removeError()});await SpinQuery.select(()=>document.querySelector(".download-video-panel"));n.entity.addMenuClass();c()}return{widget:{content:(t.data.downloadVideoDom||t.data.downloadVideoHtml).text,condition:d,success:u}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(e,t)=>{const{getFriendlyTitle:s}=t.import("title");const n={entity:null,aid:undefined,cid:undefined};let o=null;class r{constructor(){this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}get menuPanel(){return document.querySelector(".download-video-panel")}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&otype=json`}}}class a extends r{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=&otype=json`}}}class i{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new c(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{n.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const o=s.data||s.result||s;const r=o.accept_quality;const a=o.accept_format.split(",");const l=o.accept_description;const c=[];while(r.length>0){const e=new i(r.pop(),a.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class l{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class c{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{n.entity.getUrl(this.format.quality).then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText.replace(/http:/g,"https:"));const o=s.data||s.result||s;if(o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const r=o.durl;this.fragments=r.map(e=>new l(e.length,e.size,e.url,e.backup_url));e(this.fragments)});n.withCredentials=true;n.open("GET",s);n.send()})})}updateProgress(){const e=this.progressMap?[...this.progressMap.values()].reduce((e,t)=>e+t,0)/this.totalSize:0;if(e>1||e<0){console.error(`[下载视频] 进度异常: ${e}`,this.progressMap.values())}this.progress&&this.progress(e)}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;const o=e=>[...this.progressMap.keys()].indexOf(e)+1;while(n{const n=new XMLHttpRequest;n.open("GET",e.url);n.responseType="arraybuffer";n.withCredentials=false;n.addEventListener("progress",e=>{console.log(`[下载视频] 视频片段${o(n)}下载进度: ${e.loaded}/${i} bytes loaded, ${a}`);this.progressMap.set(n,e.loaded);this.updateProgress()});n.addEventListener("load",()=>{if((""+n.status)[0]==="2"){t(n.response)}else{s(`请求失败.`)}});n.addEventListener("abort",()=>s("下载已取消."));n.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${o(n)}下载失败: ${a}`);this.progressMap.set(n,0);this.updateProgress();n.open("GET",e.url);n.setRequestHeader("Range",a);n.send()});n.setRequestHeader("Range",a);this.progressMap.set(n,0);n.send();this.workingXhr.push(n)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}exportData(e=false){const t=JSON.stringify({fragments:this.fragments,title:s(true),totalSize:this.fragments.map(e=>e.size).reduce((e,t)=>e+t)});if(e){GM_setClipboard(t,"text")}else{const e=document.createElement("a");const s=new Blob([t],{type:"text/json"});const n=URL.createObjectURL(s);e.setAttribute("href",n);e.setAttribute("download",`cid${unsafeWindow.cid}.json`);document.body.appendChild(e);e.click();e.remove();URL.revokeObjectURL(n)}}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=document.querySelector("a#video-complete").getAttribute("href");if(e&&!document.querySelector(`.link[href="${e}"]`)){URL.revokeObjectURL(e)}[...document.querySelectorAll(".toast-card-header")].filter(e=>e.innerText.includes("下载视频")).forEach(e=>e.querySelector(".toast-card-dismiss").click())}downloadSingle(e){const[t]=e;const n=this.makeBlob(t);const o=s()+this.extension();return[n,o]}async downloadMultiple(e){const t=new JSZip;const n=s();if(e.length>1){e.forEach((e,s)=>{const o=this.fragments[s];t.file(`${n} - ${s+1}${this.extension(o)}`,this.makeBlob(e,o))})}else{const[s]=e;t.file(`${n}${this.extension()}`,this.makeBlob(s))}const o=await t.generateAsync({type:"blob"});const r=n+".zip";return[o,r]}async download(){const e=[];this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}this.cleanUpOldBlobUrl();const n=URL.createObjectURL(t);this.progress&&this.progress(0);return{url:n,filename:s}}}async function d(){const e=["/www.bilibili.com/bangumi"];if(e.some(e=>document.URL.includes(e))){const{BatchExtractor:e}=await t.importAsync("batchDownload");const s=new e;document.getElementById("download-video").classList.add("batch");document.getElementById("video-action-batch-data").addEventListener("click",async()=>{if(!o){return}n.entity.resetMenuClass();const e=Toast.info("获取链接中...","批量下载");const t=await s.collectData(o,e);if(!t){return}GM_setClipboard(t,{type:"text/json"});Toast.success("已复制批量数据到剪贴板.","复制批量数据",3e3)});document.getElementById("video-action-batch-download-data").addEventListener("click",async()=>{if(!o){return}n.entity.resetMenuClass();const e=Toast.info("获取链接中...","批量下载");const t=await s.collectData(o,e);if(!t){return}const r=document.createElement("a");const a=new Blob([t],{type:"text/json"});const i=URL.createObjectURL(a);r.setAttribute("href",i);r.setAttribute("download",`export.json`);document.body.appendChild(r);r.click();r.remove();URL.revokeObjectURL(i)})}}async function u(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);n.aid=e;n.cid=t;if(document.URL.indexOf("bangumi")!==-1){n.entity=new a}else{n.entity=new r}return Boolean(e&&t)}async function p(){let e=await i.availableFormats;o=e[0];const s=async()=>{await u();e=await i.availableFormats;const t=$("ol.video-quality");t.html("");e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{o=e;n.entity.nextMenuClass()}).prependTo(t)})};if(Observer.videoChange){Observer.videoChange(s)}else{Observer.childList("#bofqi",s)}const r=()=>o.downloadInfo().catch(e=>{n.entity.addError();$(".video-error").text(e)});async function a(){if(!o){return}n.entity.nextMenuClass();const e=await r();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{n.entity.addError();$(".video-error").text(e)});if(!t){return}const s=document.getElementById("video-complete");s.setAttribute("href",t.url);s.setAttribute("download",t.filename);s.click();const a=`下载完成. 再次保存`;Toast.success(a,"下载视频");n.entity.resetMenuClass()}async function l(){if(!o){return}const e=await r();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);n.entity.resetMenuClass()}document.querySelector("#video-action-download").addEventListener("click",a);document.querySelector("#video-action-copy").addEventListener("click",l);document.querySelector("#video-action-copy-data").addEventListener("click",async()=>{if(!o){return}const e=await r();e.exportData(true);Toast.success("已复制数据到剪贴板.","复制数据",3e3);n.entity.resetMenuClass()});document.querySelector("#video-action-download-data").addEventListener("click",async()=>{if(!o){return}const e=await r();e.exportData(false);n.entity.resetMenuClass()});t.applyStyle("downloadVideoStyle");const c=document.querySelector(".download-video-panel");const p=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!c.contains(e.target)){p()}});$(".video-error").on("click",()=>{$(".video-error").text("");n.entity.removeError()});await SpinQuery.select(()=>document.querySelector(".download-video-panel"));n.entity.addMenuClass();d()}return{widget:{content:(t.data.downloadVideoDom||t.data.downloadVideoHtml).text,condition:u,success:p}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-danmaku.min.js"] = (()=>{return(e,i)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}const r=()=>{SpinQuery.any(()=>$(".bui-collapse-header"),e=>{if(parseInt($(".bui-collapse-body").css("height"))===0&&$(".bui-collapse-arrow-text").text()==="展开"){e.click()}})};if(Observer.videoChange){Observer.videoChange(r)}else{Observer.childList("#bofqi",r)}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-description.min.css"] = `.play-up-info .play-up-self,.video-desc .info{height:auto!important}.play-up-info .play-up-self-btn,.video-desc .btn{display:none!important}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-description.min.js"] = (()=>{return(e,p)=>{p.applyStyle("expandDescriptionStyle")}})(); @@ -1038,7 +1038,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.de-DE.min.js"] = (()=>{return(e,n)=>{const r=new Map([[`*`,[]]]);const t=new Map([]);return{export:{map:r,regex:t}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.en-US.min.js"] = (()=>{return(e,t)=>{const o=new Map([[`主站`,`Home`],[`画友`,`Painting`],[`音频`,`Music`],[`游戏中心`,`Game`],[`直播`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Live`}],[`会员购`,`Shop`],[`漫画`,`Comic`],[`下载APP`,`APP`],[`大会员`,`VIP`],[`年度大会员`,`Annual VIP`],[`消息`,`Message`],[`动态`,`Activity`],[`稍后再看`,`Watchlater`],[`已加稍后再看`,`Added`],[`移除`,`Remove`],[`收藏`,`Favorite`],[`历史`,`History`],[`投稿`,`Upload`],[`关注`,[`Follow`,{selector:`.user-panel .text, .n .n-data .n-data-k`,text:`Following`}]],[`关注数`,`Following`],[`粉丝`,`Followers`],[`粉丝数`,`Followers`],[`已关注`,`Following`],[`回复我的`,`Reply`],[`@我的`,`@Mentioned`],[`收到的赞`,`Likes`],[`系统通知`,`System`],[`我的消息`,`Whisper`],[`主页`,`Home`],[`频道`,`Channel`],[`订阅`,`Subscriptions`],[`设置`,`Settings`],[`搜索`,`Search`],[`搜索视频`,`Search videos`],[`搜索设置项`,`Search settings`],[`查看全部`,`View more`],[`查看更多`,`View more`],[`视频`,`Video`],[`专栏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Column`}],[`转发`,`Forward`],[`评论`,`Reviews`],[`赞`,`Like`],[`视角:`,`View: `],[`我自己`,`Myself`],[`新访客`,`New visitors`],[`我的粉丝`,`Followers`],[`暂时没有新动态了哦!`,`Nothing new at this moment...`],[`历史动态`,`History`],[`投稿了`,`posted`],[`更新了`,`updated`],[`番剧`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Bangumi`}],[`样式`,`Style`],[`工具`,`Tools`],[`触摸`,`Touch`],[`其他`,`Other`],[`附加功能`,`Add-on features`],[`空空如也哦...`,`Nothing...`],[`正在直播`,`Live broadcasting`],[`投稿视频`,`Posted video`],[`展开全文`,`Expand`],[`动画`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Anime`}],[`科技`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Tech`}],[`游戏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Game`}],[`生活`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Life`}],[`国创`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Native`}],[`音乐`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Music`}],[`舞蹈`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Dance`}],[`数码`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Digital`}],[`鬼畜`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Kichiku`}],[`时尚`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Fashion`}],[`广告`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Ads`}],[`娱乐`,[{selector:`.elevator-module .nav-list .item`,not:true,text:`Entertainment`},{selector:`.primary-menu .nav-menu li .nav-name`,text:`Entmt`}]],[`电影`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Movie`}],[`TV剧`,{selector:`.elevator-module .nav-list .item`,not:true,text:`TV drama`}],[`影视`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Film`}],[`纪录片`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Documentary`}],[`放映厅`,`Cinema`],[`广场`,`Plaza`],[`小黑屋`,`Blackroom`],[`*`,[]]]);const l=new Map([]);return{export:{map:o,regex:l}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.ja-JP.min.js"] = (()=>{return(t,e)=>{const o=new Map([[`主站`,`ホーム`],[`画友`,`絵画`],[`音频`,`音楽`],[`游戏中心`,`ゲーム`],[`会员购`,`ショップ`],[`下载APP`,`アプリ`],[`大会员`,`大会員`],[`消息`,`通知`],[`动态`,`情報`],[`稍后再看`,`後で見る`],[`收藏`,`お気に入り`],[`更多`,`もっと`],[`排行`,`ランキング`],[`图片`,`画像`],[`视频`,`ビデオ`],[`番剧`,`番組`],[`音乐`,`音楽`],[`时尚`,`潮流`],[`电影`,`劇場`],[`影视`,`映画`],[`特摄`,`特撮`],[`学习`,`勉強`],[`放映厅`,`映画館`],[`广告`,`広告`],[`广场`,`広場`],[`发布`,`発表`],[`举报`,`報告`],[`首页`,`ホーム`],[`热门`,`人気`],[`周一`,`月`],[`周二`,`火`],[`周三`,`水`],[`周四`,`木`],[`周五`,`金`],[`周六`,`土`],[`周日`,`日`],[`今天`,`今日`],[`昨天`,`昨日`],[`近1周`,`1週間`],[`1周前`,`1週前`],[`发送`,`送信`],[`取消`,`キャンセル`],[`关闭`,`閉じる`],[`表情`,`ステッカー`],[`小视频`,`短いビデオ`],[`短视频`,`短いビデオ`],[`查看更多`,`もっと見る`],[`显示更多`,`もっと見る`],[`浏览更多`,`もっと見る`],[`查看全部`,`すべて見る`],[`所有关注`,`すべでのフォロー`],[`进入专栏区`,`コラム領域に入る`],[`暂时没有新动态了哦!`,`暫く新しい情報がないよ`],[`播放历史`,`再生履歴`],[`暂停记录历史`,`再生履歴機能を一時停止`],[`啊叻?你要暂停历史记录功能吗?`,`あれー?再生履歴機能を一時停止しますか?`],[`确定暂停`,`一時停止`],[`清空历史`,`すべての再生履歴を削除`],[`已看完`,`読み終えた`],[`一键清空`,`すべてを削除`],[`移除已观看视频`,`視聴済み動画を削除`],[`已观看`,`視聴済み`],[`删除`,`削除`],[`确认`,`確認`],[`添加`,`追加`],[`取消关注`,`フォロー解除`],[`全部`,`すべて`],[`投稿视频`,`ビデオ`],[`公告栏`,`掲示板`],[`正在直播`,`配信中`],[`虚拟主播`,`Vtuber`],[`房间标题`,`タイトル`],[`设置`,`設定`],[`频道`,`チャンネル`],[`标签`,`タグ`],[`关注`,`フォロー`],[`关注数`,`フォロー数`],[`粉丝`,`ファン`],[`粉丝数`,`ファン数`],[`阅读数`,`閲覧数`],[`阅读量`,`閲覧数`],[`相簿`,`アルバム`],[`我的频道`,`私のチャンネル`],[`我的视频`,`私のビデオ`],[`我的音频`,`私の音楽`],[`我的音乐`,`私の音楽`],[`我的专栏`,`私のコラム`],[`我的相簿`,`私のアルバム`],[`我的关注`,`私のフォロー`],[`我的粉丝`,`私のファン`],[`我的消息`,`DM`],[`我的收藏`,`私のお気に入り`],[`我的订阅`,`私の購読`],[`系统通知`,`システム`],[`网游`,`オンライン`],[`手游`,`モバイル`],[`单机`,`単機ゲーム`],[`电台`,`ラジオ`],[`绘画`,`絵画`],[`热门话题`,`人気話題`],[`热门排行`,`人気ランキング`],[`我关注的话题`,`注目した話題`],[`前往TA的直播间`,`配信ルームへ移動`],[`请输入弹幕 DA☆ZE~`,`弾幕を入力してください( •̀ ω •́ )✧`],[`有什么想和大家分享的?`,`何をみんなと共有したいのですか`],[`有新动态,点击查看`,`新しい情報がある、クリックして見る`],[`以上为热门评论,`,`以上が人気コメント`],[`请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。`,`インターネット関連のポリシーや規制を意識的に遵守し、ポルノ・暴力・反動的な発言を厳禁してください。`],[`点击查看`,`クリックして見る`],[`刚刚`,`さっき`],[`转发动态`,`リポスト`],[`分享动态`,`シェア`],[`转发`,`リポスト`],[`赞`,`いいね`],[`好评`,`いいね`],[`重播`,`再放送`],[`投币`,`コインを投げる`],[`同时点赞内容`,`同時に好評`],[`添加到收藏夹`,`お気に入りに追加`],[`投稿了`,`投稿した`],[`动态首页`,`情報ホーム`],[`历史动态`,`情報履歴`],[`追番`,`番組を購読`],[`已追番`,`購読中`],[`取消追番`,`取り消し`],[`追剧`,`ドラマを購読`],[`已追剧`,`購読中`],[`取消追剧`,`取り消し`],[`取消订阅`,`購読を解除`],[`用手机观看`,`携帯で見る`],[`用手机看`,`携帯で見る`],[`相关推荐`,`関連推薦`],[`点评`,`採点`],[`评论`,`コメント`],[`新番时间表`,`番組時間表`],[`小黑屋`,`公開処刑`],[`摄影`,`撮影`],[`其他`,`他の`],[`下载`,`ダウンロード`],[`更新了`,`更新した`],[`排行榜`,`ランキング`],[`推荐`,`推薦`],[`播放`,`再生`],[`播放数量`,`再生数`],[`自动`,`自動`],[`暂停`,`一時停止`],[`静音`,`消音`],[`弹幕`,`弾幕`],[`硬币`,`コイン`],[`宽屏模式`,`シアターモード`],[`进入全屏`,`全画面に入る`],[`打开洗脑循环`,`サイクルを開く`],[`观看人数`,`観覧人数`],[`转载`,`転載`],[`展开`,`表示`],[`收起`,`非表示`],[`展开全部`,`フルテキスト`],[`展开全文`,`フルテキスト`],[`收起全文`,`一部を表示`],[`已结束`,`終わり`],[`电视剧`,`ドラマ`],[`上一页`,`前へ`],[`下一页`,`次へ`],[`搜索`,`検索`],[`直播中`,`配信中`],[`等级`,`レベル`],[`个人中心`,`個人センター`],[`创作中心`,`創作センター`],[`直播中心`,`配信センター`],[`订单中心`,`受注センター`],[`B币钱包`,`ビリ财布`],[`B币`,`ビリコイン`],[`主页`,`ホーム`],[`排序`,`序列`],[`移除`,`削除`],[`复制`,`コピー`],[`换一换`,`更新`],[`特别推荐`,`特別推薦`],[`热门榜单`,`人気ランキング`],[`播放全部`,`すべて再生`],[`自动播放`,`自動再生`],[`观看历史`,`視聴履歴`],[`个人收益`,`個人収益`],[`同时转发到我的动态`,`同時にシェアする`],[`人气值`,`人気値`],[`友爱社`,`応援社`],[`话题`,`話題`],[`活动`,`活動`],[`活动中心`,`活動中心`],[`消息中心`,`ニュースセンター`],[`专栏投稿`,`コラム`],[`音频投稿`,`音楽`],[`视频投稿`,`ビデオ`],[`相簿投稿`,`アルバム`],[`上传视频`,`アップロード`],[`退出登录`,`ログアウト`],[`回复我的`,`返信`],[`TA 的直播间`,`彼の配信ルーム`],[`TA 的小视频`,`彼のミニ動画`],[`TA的视频`,`彼のビデオ`],[`TA的音频`,`彼の音楽`],[`TA的专栏`,`彼のコラム`],[`TA的频道`,`彼のチャンネル`],[`TA的订阅`,`彼の購読`],[`TA的收藏夹`,`彼のお気に入り`],[`领取`,`受け取り`],[`确定`,`確定`],[`公开`,`表示`],[`隐藏`,`非表示`],[`搜索设置项`,`検索設定項目`],[`样式`,`スタイル`],[`工具`,`道具`],[`触摸`,`タッチスクリーン`],[`指定播放器布局`,`プレーヤーのレイアウト`],[`视频区布局`,`ビデオ`],[`番剧区布局`,`番組`],[`使用默认播放器模式`,`プレーヤ・モード`],[`默认播放器模式`,`デフォルト・モード`],[`播放时应用模式`,`再生時に使う`],[`播放时自动关灯`,`再生時はライトを消す`],[`使用默认视频画质`,`映像画質`],[`画质设定`,`画質設定`],[`使用默认弹幕设置`,`弾幕設定`],[`开启弹幕`,`弾幕を開ける`],[`记住弹幕设置`,`シールド設定を覚える`],[`自动展开弹幕列表`,`弾幕リストを表示`],[`弹幕列表`,`弾幕リスト`],[`自动展开视频简介`,`動画概要欄を表示`],[`自动从历史记录点播放`,`視聴履歴から自動再生`],[`自动播放视频`,`ビデオを自動再生`],[`跳过充电鸣谢`,`エンディングをスキップ`],[`启用逐帧调整`,`フレーム毎に調整`],[`自动定位到播放器`,`プレーヤー自動定位`],[`定位偏移量`,`位置オフセット`],[`外置稍后再看`,`外付け「後で見る」`],[`主题颜色`,`テーマカラー`],[`样式调整`,`スタイルの調整`],[`顶栏(对横幅)透明度`,`(横断幕に)頂欄の透明度`],[`夜间模式`,`ダークテーマ`],[`夜间模式计划时段`,`ダークテーマ计画タイム`],[`首页使用紧凑布局`,`トップページにコンパクトなレイアウトを使う`],[`简化评论区`,`コメントエリアの簡潔化`],[`简化直播间`,`配信ルームの簡潔化`],[`搜索栏置顶`,`検索欄がトップになる`],[`显示顶部横幅`,`トップの横断幕を表示`],[`显示排行榜图标`,`ランキングのアイコンを表示`],[`模糊视频控制栏背景`,`ビデオ制御欄の背景がぼやける`],[`控制栏着色`,`制御欄に黒を付ける`],[`不透明度`,`不透過度`],[`缩放直播看板娘`,`配信ルームの看板娘をズーム`],[`删除直播水印`,`生放送透かしを削除`],[`删除视频标题层`,`ビデオ・タイトル層を削除します`],[`删除广告`,`広告を削除`],[`稍后再看重定向`,`後で見るのビデオをリダイレクト`],[`收藏夹视频重定向`,`お気に入りのビデオをリダイレクト`],[`隐藏搜索推荐`,`検索欄の推薦語を非表示`],[`展开动态标题`,`情報のタイトルを表示`],[`展开选集标题`,`選集のタイトルを表示`],[`BiliPlus跳转支持`,`BiliPlusをジャンプする`],[`高分辨率图片`,`高解像度画像`],[`旧版动态跳转支持`,`旧版の情報をジャンプする`],[`界面翻译`,`インタフェース翻訳`],[`语言`,`言語`],[`顶栏触摸优化`,`頂欄にタッチ最適化を行う`],[`素质三连触摸支持`,`三連撃タッチサポート`],[`播放器触摸支持`,`プレーヤータッチサポート`],[`启用实验性动画效果`,`実験的動画効果`],[`启用双击控制`,`ダブルクリック制御`],[`显示消息`,`メッセージを表示`],[`显示内部错误消息`,`エラーメッセージを表示`],[`启用缓存`,`キャッシュを有効にする`],[`附加功能`,`追加機能`],[`空空如也哦...`,`何もないよ = ̄ω ̄=`],[`清除缓存`,`キャッシュを消去する`],[`转到BiliPlus`,`BiliPlusをジャンプ`],[`查看封面`,`サムネイルを見る`],[`下载弹幕`,`弾幕をダウンロード`],[`下载视频`,`ビデオをダウンロード`],[`下载音频`,`音楽をダウンロード`],[`更换勋章`,`勲章を入れ換える`],[`更换头衔`,`肩書きを入れ換える`],[`动画`,{selector:`.elevator-module .nav-list .item`,not:true,text:`アニメ`}],[`舞蹈`,{selector:`.elevator-module .nav-list .item`,not:true,text:`ダンス`}],[`专栏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`コラム`}],[`游戏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`ゲーム`}],[`直播`,{selector:`.elevator-module .nav-list .item`,not:true,text:`生放送`}],[`数码`,{selector:`.elevator-module .nav-list .item`,not:true,text:`デジタル`}],[`纪录片`,{selector:`.elevator-module .nav-list .item`,not:true,text:`ドキュメンタリー`}],[`娱乐`,{selector:`.elevator-module .nav-list .item`,not:true,text:`エンタメ`}],[`常规`,{selector:`.gui-settings-dropdown *`,not:true,text:`標準`}],[`宽屏`,{selector:`.gui-settings-dropdown *`,not:true,text:`シアターモード`}],[`网页全屏`,{selector:`.gui-settings-dropdown *`,not:true,text:`ウェブの全画面`}],[`全屏`,{selector:`.gui-settings-dropdown *`,not:true,text:`全画面`}],[`历史`,[`歴史`,{text:`履歴`,selector:`.nav-con.fr .nav-item .t`}]],[`登录`,`ログイン`],[`注册`,`登録`],[`我的直播间`,`私の配信ルーム`],[`直播间`,`配信ルーム`],[`订阅`,`購読`],[`主站空间`,`個人センター`],[`播放数`,`再生数`],[`综合`,`総合`],[`用户`,`ユーザー`],[`投稿管理`,`投稿センター`],[`个人信息`,`個人情報`],[`开播设置`,`放送設定`],[`直播分类:`,`配信分類:`],[`修改分区`,`カテゴリーを変更`],[`房间标题:`,`生放送タイトル:`],[`开始直播`,`配信を開始`],[`关闭直播`,`配信を中止`],[`主播公告`,`チャンネル公告`],[`简介`,`概要`],[`直播封面`,`配信サムネイル`],[`我的个人标签`,`私のタグ`],[`个人简介`,`個人紹介`],[`直播间信息`,`配信ルーム情報`],[`我的船员`,`私の船員`],[`直播数据`,`配信データ`],[`数据总览`,`データ統計`],[`直播时长`,`総配信時間`],[`最高人气值`,`最大人気値`],[`金仓鼠`,`ゴールデンハムスター :`],[`贝壳`,`貝殻 :`],[`直播收益(金仓鼠)`,`生放送収益(ゴールデンハムスター)`],[`直播收益`,`生放送収益`],[`新增关注数`,`新しい登録者`],[`人均观看时长`,`平均視聴時間`],[`礼物流水`,`ギフト記録`],[`礼物统计`,`ギフト一覧`],[`消费排行`,`投げ銭ランキング`],[`更多>>`,`もっと>>`],[`主播`,`配信者`],[`未开播`,`待機中`],[`金瓜子`,`金ヒマワリの種`],[`银瓜子`,`銀ヒマワリの種`],[`残忍取关`,`フォロー解除`],[`再考虑一下`,`考え直す`],[`已关注`,`フォロー中`],[`七日榜`,`週間rank`],[`舰队`,`艦隊`],[`房管`,`管理者`],[`分享`,`共有`],[`轮播`,`再放送`],[`闲置`,`待機中`],[`回复`,`返信`],[`查看更多评论`,`もっとコメントを表示`],[`英雄联盟`,`LOL`],[`APEX英雄`,`Apex Legends`],[`守望先锋`,`Overwatch`],[`绝地求生`,`PUBG`],[`王者荣耀`,`伝説対決`],[`第五人格`,`Identity V`],[`绝地求生:刺激战场`,`PUBG Mobile`],[`崩坏3`,`崩壊3rd`],[`主机游戏`,`ホストゲーム`],[`我的世界`,`マイクラ`],[`怪物猎人:世界`,`モンハンワールド`],[`只狼:影逝二度`,`SEKIRO/隻狼`],[`鬼泣5`,`デビルメイクライ5`],[`视频唱见`,`歌ってみた`],[`舞见`,`踊ってみた`],[`视频聊天`,`ビデオチャット`],[`才艺`,`タレントショー`],[`唱见电台`,`歌見ラジオ`],[`声优`,`声優`],[`聊天电台`,`チャットラジオ`],[`同人绘画`,`同人絵画`],[`原创绘画`,`オリジナル絵画`],[`临摹绘画`,`模写絵画`],[`其他绘画`,`他の絵`],[`扭蛋机`,`ガチャポン`],[`我关注的直播`,`フォローした配信`],[`我关注的动态`,`フォローした情報`],[`按热度排序`,`評価順`],[`全部评论`,`すべてのコメント`],[`发消息`,`DMを送る`],[`点赞`,`いいね!`],[`发表评论`,`コメント`],[`你的rtmp地址:`,`サーバー:`],[`你的直播码:`,`ストリームキー:`],[`颜值领域专属封面`,`顔出し用サムネ`],[`私信存档`,`DMアーカイブ`],[`历史私信`,`昔のDM`],[`用户中心`,`個人センター`],[`我的信息`,`個人情報`],[`领取奖励`,`受け取り`],[`关注直播间`,`フォロー`],[`加入黑名单`,`ブロックする`],[`悄悄关注`,`非公開フォロー`],[`个人信息举报`,`通報する`],[`观众分析`,`視聴者分析`],[`游客分析`,`ゲスト分析`],[`粉丝分析`,`フォロワー分析`],[`游客基本属性`,`ゲスト基本属性`],[`性别占比`,`性別割合`],[`观众年龄`,`年齢割合`],[`观看途径`,`端末割合`],[`消息设置`,`通知設定`],[`消息提醒样式`,`通知様式`],[`(不含应援团)`,`(応援社は除外)`],[`红点`,`赤い点`],[`不提醒`,`通知しない`],[`推荐位申请`,`推薦枠申し込み`],[`直播看板娘`,`配信マスコート`],[`收到的赞`,`いいね!`],[`*`,[]]]);const r=new Map([[/^浏览:([0-9\.a-z]+)$/,`閲覧:$1`],[/^收藏:([0-9\.a-z]+)$/,`お気に入り:$1`],[/^支持:([0-9\.a-z]+)$/,`いいね:$1`],[/^共([\d]+)页$/,`全部で $1 ページ`],[/^小视频 ([\d]+)$/,`短いビデオ $1`],[/^相簿 ([\d]+)$/,`アルバム $1`],[/^在线人数:([\d]+)$/,`オンライン:$1`],[/^([\d]+)[ ]?分钟前$/,`$1 分前`],[/^([\d]+)[ ]?小时前$/,`$1 時間前`],[/^([\d\.万]+)播放/,`$1視聴`],[/^([\d\.万]+)弹幕$/,`$1弾幕`],[/^([\+]?[ ]?)关注([:]?[:]?[ ]?)([\d]+)?$/,`$1フォロー$2$3`],[/^上传时间:([\d])/,`アップロード時間:$1`],[/^粉丝([:]?[:]?[ ]?)$/,`ファン$1`],[/^@([ ]?)我的$/,`私に$1@`],[/^TA([ ]?)的相簿$/,`彼の$1アルバム`],[/^([\d]+)硬币$/,`$1コイン`],[/^阅读([:]?[:]?[ ]?)$/,`閲覧$1`]]);return{export:{map:o,regex:r}}}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.min.css"] = `#page-follows .follow-sidenav .text,.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.author-info .communicate-btn,.author-info .favourite-btn,.bili-search .nav-wrap .wrap>.sub,.dashboard li.like,.h .h-f-btn,.history-wrap .history-btn,.live-sidebar-ctnr .sidebar-btn,.media-info .media-right .media-tool-bar .btn-follow,.n .n-data,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{width:auto!important}.bb-comment .comment-send .comment-emoji{width:max-content!important}.live-panel .more-button,.tag-panel .more-button{width:44px!important}.link-navbar .main-ctnr .nav-logo{width:70px!important}.bili-header-m .profile-m .grade .bar{width:160px!important}.bili-search .contain,.link-navbar .main-ctnr{width:90%!important}.bili-search .video.list{width:calc(100% - 172px)!important}.bili-search .video.list .des{width:100%!important}.gui-settings-box{width:450px!important}#page-follows .follow-sidenav .text{min-width:78px!important}.h .h-f-btn{min-width:76px!important}.primary-menu .nav-menu .nav-name,.primary-menu .nav-menu .side-nav .side-link span{white-space:pre!important}.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.bb-comment .comment-send .comment-emoji,.h .h-f-btn,.media-info .media-right .media-tool-bar .btn-follow,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{padding:0 8px!important}.n .n-data{padding:10px 8px!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn:nth-child(2n){padding-left:8px!important}.dashboard li.share .text{padding-top:15px!important}.dashboard li.collection{margin:0 10px 0 0!important}.bili-search .rocket-con{margin-left:40%!important}.bili-search .video.matrix:nth-child(5n){margin-right:32px!important}.dynamic-m .dyn_menu .line,.nav-wrap .hover-bar,.tab-bar .line{display:none!important}.tab-bar .tab .tab-text.selected{color:var(--theme-color)!important;border-bottom:2px solid!important;box-sizing:border-box!important}.live-panel .more-button{transform:translateX(-9px)!important}.bilibili-player-ending-panel-box-functions .bilibili-player-upinfo-spans>div{align-items:center!important}.dashboard li.collection>div:first-child,.user-panel-ctnr .user-panel .content-ctnr .section-block{display:flex!important;align-items:center!important;flex-direction:column!important}.dashboard li.share{display:inline-flex!important;align-items:center!important;flex-direction:column!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn{float:none!important}#area-list ul li dd{font-size:18px!important}.author-info .communicate-btn,.author-info .communicate-btn:active,.author-info .favourite-btn,.author-info .favourite-btn:active{font-size:12px!important}.dashboard li.like{border-color:transparent!important}.gui-settings-tooltip{left:470px!important}`; +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.min.css"] = `#page-follows .follow-sidenav .text,.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.author-info .communicate-btn,.author-info .favourite-btn,.bili-search .nav-wrap .wrap>.sub,.dashboard li.like,.h .h-f-btn,.history-wrap .history-btn,.live-sidebar-ctnr .sidebar-btn,.media-info .media-right .media-tool-bar .btn-follow,.n .n-data,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{width:auto!important}.bb-comment .comment-send .comment-emoji{width:max-content!important}.live-panel .more-button,.tag-panel .more-button{width:44px!important}.link-navbar .main-ctnr .nav-logo{width:70px!important}.bili-header-m .profile-m .grade .bar{width:160px!important}.bili-search .contain,.link-navbar .main-ctnr{width:90%!important}.bili-search .video.list{width:calc(100% - 172px)!important}.bili-search .video.list .des{width:100%!important}.gui-settings-box{width:450px!important}#page-follows .follow-sidenav .text{min-width:78px!important}.h .h-f-btn{min-width:76px!important}.primary-menu .nav-menu .nav-name,.primary-menu .nav-menu .side-nav .side-link span{white-space:pre!important}.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.bb-comment .comment-send .comment-emoji,.h .h-f-btn,.media-info .media-right .media-tool-bar .btn-follow,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{padding:0 8px!important}.n .n-data{padding:10px 8px!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn:nth-child(2n){padding-left:8px!important}.dashboard li.share .text{padding-top:15px!important}.dashboard li.collection{margin:0 10px 0 0!important}.bili-search .rocket-con{margin-left:40%!important}.bili-search .video.matrix:nth-child(5n){margin-right:32px!important}.dynamic-m .dyn_menu .line,.nav-wrap .hover-bar,.tab-bar .line{display:none!important}.tab-bar .tab .tab-text.selected{color:var(--theme-color)!important;border-bottom:2px solid!important;box-sizing:border-box!important}.live-panel .more-button{transform:translateX(-9px)!important}.bilibili-player-ending-panel-box-functions .bilibili-player-upinfo-spans>div{align-items:center!important}.dashboard li.collection>div:first-child{display:flex!important;align-items:center!important;flex-direction:column!important}.dashboard li.share{display:inline-flex!important;align-items:center!important;flex-direction:column!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn{float:none!important}#area-list ul li dd{font-size:18px!important}.author-info .communicate-btn,.author-info .communicate-btn:active,.author-info .favourite-btn,.author-info .favourite-btn:active{font-size:12px!important}.dashboard li.like{border-color:transparent!important}.gui-settings-tooltip{left:470px!important}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.min.js"] = (()=>{return(e,t)=>{const a={"日本語":"ja-JP",English:"en-US",Deutsch:"de-DE"};class s{accepts(e){return e.nodeType===Node.ELEMENT_NODE}getValue(e){return e.nodeValue}setValue(e,t){e.nodeValue=t}getElement(e){return e}translate(e){const t=this.getValue(e);if(!t||typeof t!=="string"||t==="*"){return}const a=s.map.get(t.trim());if(a===undefined){const a=s.regex.find(([e])=>e.test(t));if(a){const[s,r]=a;this.setValue(e,t.replace(s,r))}}else if(typeof a==="string"){this.setValue(e,a)}else if(Array.isArray(a)){let t=null;for(const s of a){if(typeof s==="string"){t=s}else{const{text:a,selector:r,not:n}=s;if(this.getElement(e).matches(r)!==Boolean(n)){t=a}}}if(t!==null){this.setValue(e,t)}}else{const{text:t,selector:s,not:r}=a;if(this.getElement(e).matches(s)!==Boolean(r)){this.setValue(e,t)}}}static walk(e,t){const a=document.createTreeWalker(e,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null,false);let s=a.nextNode();while(s){t(s);s=a.nextNode()}}static translate(e){if(e.nodeType===Node.TEXT_NODE){s.textNode.translate(e);return}s.walk(e,e=>{for(const t of s.allTranslators){if(t.accepts(e)){t.translate(e)}}})}static translateCssMatches(){const e=s.map.get("*");if(!e){return}for(const{selector:t,text:a}of e){const e=document.querySelector(t);if(e){[...e.childNodes].filter(e=>e.nodeType===Node.TEXT_NODE).forEach(e=>e.nodeValue=a)}}}}class r extends s{accepts(e){return e.nodeType===Node.TEXT_NODE}getElement(e){return e.parentElement}}class n extends s{getValue(e){return e.getAttribute("title")}setValue(e,t){e.setAttribute("title",t)}}class l extends s{getValue(e){return e.getAttribute("placeholder")}setValue(e,t){e.setAttribute("placeholder",t)}}s.textNode=new r;s.title=new n;s.placeholder=new l;s.allTranslators=[s.textNode,s.title,s.placeholder];(async()=>{const r=a[e.i18nLanguage];const{map:n,regex:l}=await t.importAsync(`i18n.${r}`);document.documentElement.setAttribute("lang",r);s.map=n;s.regex=[...l.entries()];s.translate(document.body);s.translateCssMatches();Observer.observe("body",e=>{e.forEach(e=>{if(e.type==="childList"){if(e.addedNodes.length>0){s.translateCssMatches()}e.addedNodes.forEach(e=>{s.translate(e)})}else if(e.type==="characterData"){s.textNode.translate(e.target)}})},{characterData:true,childList:true,subtree:true})})();return{export:{Translator:s,TextNodeTranslator:r,TitleTranslator:n,PlaceholderTranslator:l},dropdown:{key:"i18nLanguage",items:[`日本語`]}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.zh-TW.min.js"] = (()=>{return(r,e)=>{const n=new Map([[`主站`,`主站`],[`画友`,`絵画`],[`音频`,`音樂`],[`游戏中心`,`遊戲`],[`会员购`,`購物`],[`漫画`,`漫畫`],[`下载APP`,`下載APP`],[`大会员`,`大會員`],[`动态`,`動態`],[`稍后再看`,`稍後再看`],[`历史`,`歷史`],[`番剧`,`番劇`],[`动画`,`動畫`],[`国创`,`國創`],[`音乐`,`音樂`],[`游戏`,`遊戲`],[`数码`,`數位`],[`电影`,`電影`],[`纪录片`,`紀錄片`],[`时尚`,`時尚`],[`娱乐`,`娛樂`],[`广告`,`廣告`],[`原创`,`原創`],[`广场`,`廣場`],[`发布`,`發佈`],[`专栏`,`專欄`],[`关注`,`關注`],[`粉丝`,`粉絲`],[`热门`,`熱門`],[`视频`,`影片`],[`图片`,`圖片`],[`小视频`,`短影片`],[`公告栏`,`公告欄`],[`特别推荐`,`特別推薦`],[`有新动态`,`有新動態`],[`所有关注`,`所有關注`],[`首页`,`首頁`],[`编辑`,`編輯`],[`回复`,`回覆`],[`举报`,`舉報`],[`在线人数`,`在線人數`],[`*`,[]]]);return{export:{map:n}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/icons.min.css"] = `.icons-enabled [class^=icon-]{width:24px;height:24px;display:inline-block;background-image:none}.icons-enabled [class^=icon-]::after{content:"";width:24px;height:24px;display:inline-block}.icons-enabled .icon-view::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-clear::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-download::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-update::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-info::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-settings::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-widgets::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-cancel::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-ok::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-video::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-style::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-tool::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-touch::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-other::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-arrow::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-rank::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-like::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-danmaku::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-search::after{background-image:url('data:image/svg+xml;utf-8, ')}.compact .primary-menu .nav-menu>li.home>a,.icons-enabled .icon-home::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.zhuanlan,.icons-enabled .icon-read::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.square,.icons-enabled .icon-square::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.live,.icons-enabled .icon-live::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.blackroom,.icons-enabled .icon-judge::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-medal::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-live-title::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-biliplus::after{background-image:url('data:image/svg+xml;utf-8, ')}`; diff --git a/bilibili-evolved.preview-offline.user.js b/bilibili-evolved.preview-offline.user.js index 16741e07f..aaddc1876 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 292.21 +// @version 292.29 // @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中. // @author Grant Howard, Coulomb-G // @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) @@ -983,7 +983,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/about.min.js"] = (()=>{return(e,i)=>{$("body").append((i.data.aboutDom||i.data.aboutHtml).text);const n=GM_info.script.name.replace("Bilibili Evolved","").replace(/^[\(\) ]+|[\(\) ]+$/g,"")+" · "+e.currentVersion;$(".bilibili-evolved-version").text(n);const o=[{name:"jQuery",homepage:"https://jquery.com/",license:"MIT",version:"3.2.1"},{name:"JSZip",homepage:"https://stuk.github.io/jszip/",license:"MIT",version:"3.1.5"}];o.forEach(e=>{$(".open-source-components").append(`\n
  • \n \n
    ${e.name}
    \n
    ${e.version} · ${e.license}
    \n
    \n
  • \n `)});function t(){$("#about-close").on("click",()=>{$(".bilibili-evolved-about").toggleClass("opened")});$(".gui-settings").on("click",e=>{if(e.shiftKey===true){$(".bilibili-evolved-about").toggleClass("opened")}})}return{widget:{success:t}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-continue.min.js"] = (()=>{return(e,i)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}function t(e){const i=e.text();if(/第(\d+)话/.test(i)){e.parent().find(".bilibili-player-video-toast-item-jump").click();SpinQuery.condition(()=>document.querySelector(".bilibili-player-video video"),e=>e&&e.paused===true,e=>e.play());return}const t=/((\d)*:)?(\d)*:(\d)*/g;const n=i.match(t);if(!n){return}const r=n[0].split(":");const o=(()=>{if(r.length===3){const[e,i,t]=r.map(e=>parseInt(e));return e*60*60+i*60+t}else if(r.length===2){const[e,i]=r.map(e=>parseInt(e));return e*60+i}else{logError(`解析历史时间发生错误: historyTime=${JSON.stringify(r)}`);return NaN}})();const l=e.parent();const s=document.querySelector("video");if(o从头开始`);i.appendTo(l).on("click",()=>s.currentTime=0);e.html(`已跳转到上次历史记录${n[0]}`)}else{l.find(".bilibili-player-video-toast-item-close").get(0).click()}}function n(){SpinQuery.condition(()=>$(".bilibili-player-video-toast-item-text"),e=>e.text().indexOf("上次看到")!==-1,e=>t(e.filter((e,i)=>i.innerText.indexOf("上次看到")!==-1)))}if(Observer.videoChange){Observer.videoChange(n)}else{Observer.childList("#bofqi",n)}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-play.min.js"] = (()=>{return(e,d)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}SpinQuery.condition(()=>document.querySelector(".bilibili-player-video video"),e=>e&&e.paused===true,e=>e.play())}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,c)=>{class a{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(){return`{x:"test"}`}}const e=[a];class n{async collectData(){const t=new(e.find(t=>t.test()));return await t.collectData()}}return{export:{BatchExtractor:n}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{class s{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(t){const e=document.querySelector("meta[property='og:url']");if(e===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return""}const s=e.getAttribute("content").match(/play\/ss(\d+)/)[1];if(s===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return""}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${s}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return""}const r=i.result.main_section.episodes.map(t=>{return{aid:t.aid,cid:t.cid,number:t.title,title:t.long_title}});const n=[];for(const e of r){const s=`https://api.bilibili.com/pgc/player/web/playurl?avid=${e.aid}&cid=${e.cid}&qn=${t}&otype=json`;const i=await Ajax.getJsonWithCredentials(s);const r=i.data||i.result||i;if(r.quality!==t){Toast.error("获取下载链接失败, 请确认当前账号有下载权限后重试.","批量下载");return""}const a=r.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}});n.push({fragments:a,title:`${e.number} - ${e.title}`,totalSize:a.map(t=>t.size).reduce((t,e)=>t+e)})}return JSON.stringify(n)}}const i=[s];class r{async collectData(t,e){const s=new(i.find(t=>t.test()));const r=await s.collectData(t.quality);e.dismiss();return r}}return{export:{BatchExtractor:r}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/biliplus-redirect.min.js"] = (()=>{return(i,c)=>{const l=`hd.biliplus.com`;const e=["bilibili.com/video/av","bilibili.com/bangumi/play","bilibili.com/bangumi/media","space.bilibili.com"];return{widget:{condition:()=>{return e.some(i=>document.URL.includes(i))},content:`\n `,success:()=>{const i=document.querySelector("#biliplus-redirect");i.addEventListener("click",()=>{if(location.host==="space.bilibili.com"){location.replace(document.URL.replace("space.bilibili.com/",`${l}/space/`))}else{location.host=l}})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blur-video-control.min.css"] = `.video-control-blur-layer{width:100%;height:100%;position:absolute;-webkit-backdrop-filter:blur(48px);backdrop-filter:blur(48px);z-index:-1;top:0}.bilibili-player-video-control-mask{background:0 0!important}.bilibili-player-video-control-bottom,.bui-slider .bui-track.bui-track-video-progress .bui-bar-wrap{background-color:transparent!important}.bilibili-player-video-control-bottom{position:relative}.bilibili-player-area .bilibili-player-video-control-bottom,.bilibili-player-area .bilibili-player-video-control-wrap{transition:none!important}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blur-video-control.min.js"] = (()=>{return(e,r)=>{const i=()=>{SpinQuery.count(()=>$(".bui-slider .bui-track.bui-track-video-progress,.bilibili-player-video-control-bottom"),2,e=>{if(!e.hasClass("video-control-blur-container")){e.addClass("video-control-blur-container");e.prepend(`
    `)}})};if(Observer.videoChange){Observer.videoChange(i)}else{Observer.childList("#bofqi",i)}r.applyStyle("blurVideoControlStyle")}})(); @@ -1014,7 +1014,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m 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:i}=e.import("video-info");const{DanmakuConverter:o}=e.import("danmaku-converter");async function a(t,e){const a=n();const r=new i((unsafeWindow||window).cid);await r.fetchInfo();const l=await(async()=>{if(e===true){let t={title:a};try{await loadLazyPanel(".bilibili-player-video-danmaku-setting");const e=t=>{const e=parseFloat(document.querySelector(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};t.font=document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;t.alpha=parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));t.duration=(()=>{const t=[10,8,6,4,2][e(".bilibili-player-setting-speedplus .bui-thumb")];return e=>{switch(e.type){case 4:case 5:return 4;default:return t}}})();t.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,i]of Object.entries(e)){if(document.querySelector(n).classList.contains("disabled")){t=t.concat(i)}}return t.concat(7,8)})();const n=[1.4,1.2,1,.8,.6][e(".bilibili-player-setting-fontsize .bui-thumb")];t.resolution={x:1920*n,y:1080*n};t.bottomMarginPercent=[.75,.5,.25,0,0][e(".bilibili-player-setting-area .bui-thumb")];if(t.bottomMarginPercent===0&&document.querySelector(".bilibili-player-video-danmaku-setting-left-preventshade input").checked){t.bottomMarginPercent=.15}t.bold=document.querySelector(".bilibili-player-video-danmaku-setting-right-font-bold input").checked}catch(e){t={font:"微软雅黑",alpha:.6,duration:t=>{switch(t.type){case 4:case 5:return 4;default:return 6}},blockTypes:[7,8],resolution:{x:1920,y:1080},bottomMarginPercent:.15,bold:false}}const e=new o(t);const n=e.convertToAssDocument(r.rawXML);return new Blob([n.generateAss()],{type:"text/plain"})}else{return new Blob([r.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(l);const s=$("#danmaku-link");const u=s.attr("href");if(u){URL.revokeObjectURL(u)}clearTimeout(t);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";s.attr("download",`${a}.${e?"ass":"xml"}`).attr("href",c).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let t=await SpinQuery.select(()=>(unsafeWindow||window).cid);return Boolean(t)},success:()=>{const t=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",e=>{if(e.target!==t){const t=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);a(t,e.shiftKey)}})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video-panel.opened{transform:scaleY(1) translateX(-50%)}.download-video-panel{position:absolute;top:calc(100% + 2px);transition:.16s ease-out;transform-origin:top;transform:scaleY(0) translateX(-50%);background:#fff;box-shadow:0 3px 20px 2px #0004;z-index:100;left:50%}.video-action>div,ol.video-quality li{cursor:pointer;align-items:center;margin:0;padding:8px 16px;transition:.2s ease-out;text-align:center;white-space:nowrap}.video-action>div{padding:12px 24px}.video-action>div:hover,ol.video-quality li:hover{background:rgba(0,0,0,.16)}.video-action,.video-error,.video-progress,.video-quality{display:none}.download-video-panel.action:not(.error) .video-action,.download-video-panel.error .video-error,.download-video-panel.progress:not(.error) .video-progress,.download-video-panel.quality:not(.error) .video-quality{display:block}.download-progress-text{display:flex}.download-progress-background{background-color:#8884;height:4px;width:100%;margin-top:4px}.download-progress-foreground{background-color:var(--theme-color);transform-origin:left;transition:.2s ease-out;transform:scaleX(0);height:100%;width:100%}.download-progress-cancel{margin-top:8px;display:flex;justify-content:center}.download-progress-cancel>span{background-color:#8884;padding:4px 8px;cursor:pointer}.download-progress-cancel>span:hover{opacity:.9}.download-progress-cancel>span:active{opacity:.8}.video-error,.video-progress{padding:12px}.video-progress{min-width:120px}#video-action-batch-data,#video-action-batch-download-data,#video-complete{display:none}.batch #video-action-batch-data,.batch #video-action-batch-download-data{display:block}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.html"] = `
    下载视频
    `; -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(e,t)=>{const{getFriendlyTitle:s}=t.import("title");const n={entity:null,aid:undefined,cid:undefined};class o{constructor(){this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}get menuPanel(){return document.querySelector(".download-video-panel")}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&otype=json`}}}class a extends o{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=&otype=json`}}}class r{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new l(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{n.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const o=s.data||s.result||s;const a=o.accept_quality;const i=o.accept_format.split(",");const l=o.accept_description;const c=[];while(a.length>0){const e=new r(a.pop(),i.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class i{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class l{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{n.entity.getUrl(this.format.quality).then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText.replace(/http:/g,"https:"));const o=s.data||s.result||s;if(o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const a=o.durl;this.fragments=a.map(e=>new i(e.length,e.size,e.url,e.backup_url));e(this.fragments)});n.withCredentials=true;n.open("GET",s);n.send()})})}updateProgress(){const e=this.progressMap?[...this.progressMap.values()].reduce((e,t)=>e+t,0)/this.totalSize:0;if(e>1||e<0){console.error(`[下载视频] 进度异常: ${e}`,this.progressMap.values())}this.progress&&this.progress(e)}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;const o=e=>[...this.progressMap.keys()].indexOf(e)+1;while(n{const n=new XMLHttpRequest;n.open("GET",e.url);n.responseType="arraybuffer";n.withCredentials=false;n.addEventListener("progress",e=>{console.log(`[下载视频] 视频片段${o(n)}下载进度: ${e.loaded}/${i} bytes loaded, ${r}`);this.progressMap.set(n,e.loaded);this.updateProgress()});n.addEventListener("load",()=>{if((""+n.status)[0]==="2"){t(n.response)}else{s(`请求失败.`)}});n.addEventListener("abort",()=>s("下载已取消."));n.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${o(n)}下载失败: ${r}`);this.progressMap.set(n,0);this.updateProgress();n.open("GET",e.url);n.setRequestHeader("Range",r);n.send()});n.setRequestHeader("Range",r);this.progressMap.set(n,0);n.send();this.workingXhr.push(n)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}exportData(e=false){const t=JSON.stringify({fragments:this.fragments,title:s(true),totalSize:this.fragments.map(e=>e.size).reduce((e,t)=>e+t)});if(e){GM_setClipboard(t,"text")}else{const e=document.createElement("a");const s=new Blob([t],{type:"text/json"});const n=URL.createObjectURL(s);e.setAttribute("href",n);e.setAttribute("download",`cid${unsafeWindow.cid}.json`);document.body.appendChild(e);e.click();e.remove();URL.revokeObjectURL(n)}}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=document.querySelector("a#video-complete").getAttribute("href");if(e&&!document.querySelector(`.link[href="${e}"]`)){URL.revokeObjectURL(e)}[...document.querySelectorAll(".toast-card-header")].filter(e=>e.innerText.includes("下载视频")).forEach(e=>e.querySelector(".toast-card-dismiss").click())}downloadSingle(e){const[t]=e;const n=this.makeBlob(t);const o=s()+this.extension();return[n,o]}async downloadMultiple(e){const t=new JSZip;const n=s();if(e.length>1){e.forEach((e,s)=>{const o=this.fragments[s];t.file(`${n} - ${s+1}${this.extension(o)}`,this.makeBlob(e,o))})}else{const[s]=e;t.file(`${n}${this.extension()}`,this.makeBlob(s))}const o=await t.generateAsync({type:"blob"});const a=n+".zip";return[o,a]}async download(){const e=[];this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}this.cleanUpOldBlobUrl();const n=URL.createObjectURL(t);this.progress&&this.progress(0);return{url:n,filename:s}}}async function c(){const e=["/www.bilibili.com/bangumi"];if(e.some(e=>document.URL.includes(e))){const{BatchExtractor:e}=await t.importAsync("batchDownload");const s=new e;document.getElementById("download-video").classList.add("batch");document.getElementById("video-action-batch-data").addEventListener("click",async()=>{const e=await s.collectData();GM_setClipboard(e,{type:"text/json"});Toast.success("已复制批量数据到剪贴板.","复制批量数据",3e3);n.entity.resetMenuClass()});document.getElementById("video-action-batch-download-data").addEventListener("click",async()=>{const e=await s.collectData();const t=document.createElement("a");const o=new Blob([e],{type:"text/json"});const a=URL.createObjectURL(o);t.setAttribute("href",a);t.setAttribute("download",`export.json`);document.body.appendChild(t);t.click();t.remove();URL.revokeObjectURL(a);n.entity.resetMenuClass()})}}async function d(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);n.aid=e;n.cid=t;if(document.URL.indexOf("bangumi")!==-1){n.entity=new a}else{n.entity=new o}return Boolean(e&&t)}async function u(){let e=await r.availableFormats;let[s]=e;const o=async()=>{await d();e=await r.availableFormats;const t=$("ol.video-quality");t.html("");e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{s=e;n.entity.nextMenuClass()}).prependTo(t)})};if(Observer.videoChange){Observer.videoChange(o)}else{Observer.childList("#bofqi",o)}const a=()=>s.downloadInfo().catch(e=>{n.entity.addError();$(".video-error").text(e)});async function i(){if(!s){return}n.entity.nextMenuClass();const e=await a();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{n.entity.addError();$(".video-error").text(e)});if(!t){return}const o=document.getElementById("video-complete");o.setAttribute("href",t.url);o.setAttribute("download",t.filename);o.click();const r=`下载完成. 再次保存`;Toast.success(r,"下载视频");n.entity.resetMenuClass()}async function l(){if(!s){return}const e=await a();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);n.entity.resetMenuClass()}document.querySelector("#video-action-download").addEventListener("click",i);document.querySelector("#video-action-copy").addEventListener("click",l);document.querySelector("#video-action-copy-data").addEventListener("click",async()=>{if(!s){return}const e=await a();e.exportData(true);Toast.success("已复制数据到剪贴板.","复制数据",3e3);n.entity.resetMenuClass()});document.querySelector("#video-action-download-data").addEventListener("click",async()=>{if(!s){return}const e=await a();e.exportData(false);n.entity.resetMenuClass()});t.applyStyle("downloadVideoStyle");const u=document.querySelector(".download-video-panel");const p=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!u.contains(e.target)){p()}});$(".video-error").on("click",()=>{$(".video-error").text("");n.entity.removeError()});await SpinQuery.select(()=>document.querySelector(".download-video-panel"));n.entity.addMenuClass();c()}return{widget:{content:(t.data.downloadVideoDom||t.data.downloadVideoHtml).text,condition:d,success:u}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(e,t)=>{const{getFriendlyTitle:s}=t.import("title");const n={entity:null,aid:undefined,cid:undefined};let o=null;class r{constructor(){this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}get menuPanel(){return document.querySelector(".download-video-panel")}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&otype=json`}}}class a extends r{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=&otype=json`}}}class i{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new c(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{n.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const o=s.data||s.result||s;const r=o.accept_quality;const a=o.accept_format.split(",");const l=o.accept_description;const c=[];while(r.length>0){const e=new i(r.pop(),a.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class l{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class c{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{n.entity.getUrl(this.format.quality).then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText.replace(/http:/g,"https:"));const o=s.data||s.result||s;if(o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const r=o.durl;this.fragments=r.map(e=>new l(e.length,e.size,e.url,e.backup_url));e(this.fragments)});n.withCredentials=true;n.open("GET",s);n.send()})})}updateProgress(){const e=this.progressMap?[...this.progressMap.values()].reduce((e,t)=>e+t,0)/this.totalSize:0;if(e>1||e<0){console.error(`[下载视频] 进度异常: ${e}`,this.progressMap.values())}this.progress&&this.progress(e)}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;const o=e=>[...this.progressMap.keys()].indexOf(e)+1;while(n{const n=new XMLHttpRequest;n.open("GET",e.url);n.responseType="arraybuffer";n.withCredentials=false;n.addEventListener("progress",e=>{console.log(`[下载视频] 视频片段${o(n)}下载进度: ${e.loaded}/${i} bytes loaded, ${a}`);this.progressMap.set(n,e.loaded);this.updateProgress()});n.addEventListener("load",()=>{if((""+n.status)[0]==="2"){t(n.response)}else{s(`请求失败.`)}});n.addEventListener("abort",()=>s("下载已取消."));n.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${o(n)}下载失败: ${a}`);this.progressMap.set(n,0);this.updateProgress();n.open("GET",e.url);n.setRequestHeader("Range",a);n.send()});n.setRequestHeader("Range",a);this.progressMap.set(n,0);n.send();this.workingXhr.push(n)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}exportData(e=false){const t=JSON.stringify({fragments:this.fragments,title:s(true),totalSize:this.fragments.map(e=>e.size).reduce((e,t)=>e+t)});if(e){GM_setClipboard(t,"text")}else{const e=document.createElement("a");const s=new Blob([t],{type:"text/json"});const n=URL.createObjectURL(s);e.setAttribute("href",n);e.setAttribute("download",`cid${unsafeWindow.cid}.json`);document.body.appendChild(e);e.click();e.remove();URL.revokeObjectURL(n)}}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=document.querySelector("a#video-complete").getAttribute("href");if(e&&!document.querySelector(`.link[href="${e}"]`)){URL.revokeObjectURL(e)}[...document.querySelectorAll(".toast-card-header")].filter(e=>e.innerText.includes("下载视频")).forEach(e=>e.querySelector(".toast-card-dismiss").click())}downloadSingle(e){const[t]=e;const n=this.makeBlob(t);const o=s()+this.extension();return[n,o]}async downloadMultiple(e){const t=new JSZip;const n=s();if(e.length>1){e.forEach((e,s)=>{const o=this.fragments[s];t.file(`${n} - ${s+1}${this.extension(o)}`,this.makeBlob(e,o))})}else{const[s]=e;t.file(`${n}${this.extension()}`,this.makeBlob(s))}const o=await t.generateAsync({type:"blob"});const r=n+".zip";return[o,r]}async download(){const e=[];this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}this.cleanUpOldBlobUrl();const n=URL.createObjectURL(t);this.progress&&this.progress(0);return{url:n,filename:s}}}async function d(){const e=["/www.bilibili.com/bangumi"];if(e.some(e=>document.URL.includes(e))){const{BatchExtractor:e}=await t.importAsync("batchDownload");const s=new e;document.getElementById("download-video").classList.add("batch");document.getElementById("video-action-batch-data").addEventListener("click",async()=>{if(!o){return}n.entity.resetMenuClass();const e=Toast.info("获取链接中...","批量下载");const t=await s.collectData(o,e);if(!t){return}GM_setClipboard(t,{type:"text/json"});Toast.success("已复制批量数据到剪贴板.","复制批量数据",3e3)});document.getElementById("video-action-batch-download-data").addEventListener("click",async()=>{if(!o){return}n.entity.resetMenuClass();const e=Toast.info("获取链接中...","批量下载");const t=await s.collectData(o,e);if(!t){return}const r=document.createElement("a");const a=new Blob([t],{type:"text/json"});const i=URL.createObjectURL(a);r.setAttribute("href",i);r.setAttribute("download",`export.json`);document.body.appendChild(r);r.click();r.remove();URL.revokeObjectURL(i)})}}async function u(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);n.aid=e;n.cid=t;if(document.URL.indexOf("bangumi")!==-1){n.entity=new a}else{n.entity=new r}return Boolean(e&&t)}async function p(){let e=await i.availableFormats;o=e[0];const s=async()=>{await u();e=await i.availableFormats;const t=$("ol.video-quality");t.html("");e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{o=e;n.entity.nextMenuClass()}).prependTo(t)})};if(Observer.videoChange){Observer.videoChange(s)}else{Observer.childList("#bofqi",s)}const r=()=>o.downloadInfo().catch(e=>{n.entity.addError();$(".video-error").text(e)});async function a(){if(!o){return}n.entity.nextMenuClass();const e=await r();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{n.entity.addError();$(".video-error").text(e)});if(!t){return}const s=document.getElementById("video-complete");s.setAttribute("href",t.url);s.setAttribute("download",t.filename);s.click();const a=`下载完成. 再次保存`;Toast.success(a,"下载视频");n.entity.resetMenuClass()}async function l(){if(!o){return}const e=await r();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);n.entity.resetMenuClass()}document.querySelector("#video-action-download").addEventListener("click",a);document.querySelector("#video-action-copy").addEventListener("click",l);document.querySelector("#video-action-copy-data").addEventListener("click",async()=>{if(!o){return}const e=await r();e.exportData(true);Toast.success("已复制数据到剪贴板.","复制数据",3e3);n.entity.resetMenuClass()});document.querySelector("#video-action-download-data").addEventListener("click",async()=>{if(!o){return}const e=await r();e.exportData(false);n.entity.resetMenuClass()});t.applyStyle("downloadVideoStyle");const c=document.querySelector(".download-video-panel");const p=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!c.contains(e.target)){p()}});$(".video-error").on("click",()=>{$(".video-error").text("");n.entity.removeError()});await SpinQuery.select(()=>document.querySelector(".download-video-panel"));n.entity.addMenuClass();d()}return{widget:{content:(t.data.downloadVideoDom||t.data.downloadVideoHtml).text,condition:u,success:p}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-danmaku.min.js"] = (()=>{return(e,i)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}const r=()=>{SpinQuery.any(()=>$(".bui-collapse-header"),e=>{if(parseInt($(".bui-collapse-body").css("height"))===0&&$(".bui-collapse-arrow-text").text()==="展开"){e.click()}})};if(Observer.videoChange){Observer.videoChange(r)}else{Observer.childList("#bofqi",r)}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-description.min.css"] = `.play-up-info .play-up-self,.video-desc .info{height:auto!important}.play-up-info .play-up-self-btn,.video-desc .btn{display:none!important}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-description.min.js"] = (()=>{return(e,p)=>{p.applyStyle("expandDescriptionStyle")}})(); @@ -1038,7 +1038,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.de-DE.min.js"] = (()=>{return(e,n)=>{const r=new Map([[`*`,[]]]);const t=new Map([]);return{export:{map:r,regex:t}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.en-US.min.js"] = (()=>{return(e,t)=>{const o=new Map([[`主站`,`Home`],[`画友`,`Painting`],[`音频`,`Music`],[`游戏中心`,`Game`],[`直播`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Live`}],[`会员购`,`Shop`],[`漫画`,`Comic`],[`下载APP`,`APP`],[`大会员`,`VIP`],[`年度大会员`,`Annual VIP`],[`消息`,`Message`],[`动态`,`Activity`],[`稍后再看`,`Watchlater`],[`已加稍后再看`,`Added`],[`移除`,`Remove`],[`收藏`,`Favorite`],[`历史`,`History`],[`投稿`,`Upload`],[`关注`,[`Follow`,{selector:`.user-panel .text, .n .n-data .n-data-k`,text:`Following`}]],[`关注数`,`Following`],[`粉丝`,`Followers`],[`粉丝数`,`Followers`],[`已关注`,`Following`],[`回复我的`,`Reply`],[`@我的`,`@Mentioned`],[`收到的赞`,`Likes`],[`系统通知`,`System`],[`我的消息`,`Whisper`],[`主页`,`Home`],[`频道`,`Channel`],[`订阅`,`Subscriptions`],[`设置`,`Settings`],[`搜索`,`Search`],[`搜索视频`,`Search videos`],[`搜索设置项`,`Search settings`],[`查看全部`,`View more`],[`查看更多`,`View more`],[`视频`,`Video`],[`专栏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Column`}],[`转发`,`Forward`],[`评论`,`Reviews`],[`赞`,`Like`],[`视角:`,`View: `],[`我自己`,`Myself`],[`新访客`,`New visitors`],[`我的粉丝`,`Followers`],[`暂时没有新动态了哦!`,`Nothing new at this moment...`],[`历史动态`,`History`],[`投稿了`,`posted`],[`更新了`,`updated`],[`番剧`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Bangumi`}],[`样式`,`Style`],[`工具`,`Tools`],[`触摸`,`Touch`],[`其他`,`Other`],[`附加功能`,`Add-on features`],[`空空如也哦...`,`Nothing...`],[`正在直播`,`Live broadcasting`],[`投稿视频`,`Posted video`],[`展开全文`,`Expand`],[`动画`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Anime`}],[`科技`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Tech`}],[`游戏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Game`}],[`生活`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Life`}],[`国创`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Native`}],[`音乐`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Music`}],[`舞蹈`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Dance`}],[`数码`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Digital`}],[`鬼畜`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Kichiku`}],[`时尚`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Fashion`}],[`广告`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Ads`}],[`娱乐`,[{selector:`.elevator-module .nav-list .item`,not:true,text:`Entertainment`},{selector:`.primary-menu .nav-menu li .nav-name`,text:`Entmt`}]],[`电影`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Movie`}],[`TV剧`,{selector:`.elevator-module .nav-list .item`,not:true,text:`TV drama`}],[`影视`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Film`}],[`纪录片`,{selector:`.elevator-module .nav-list .item`,not:true,text:`Documentary`}],[`放映厅`,`Cinema`],[`广场`,`Plaza`],[`小黑屋`,`Blackroom`],[`*`,[]]]);const l=new Map([]);return{export:{map:o,regex:l}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.ja-JP.min.js"] = (()=>{return(t,e)=>{const o=new Map([[`主站`,`ホーム`],[`画友`,`絵画`],[`音频`,`音楽`],[`游戏中心`,`ゲーム`],[`会员购`,`ショップ`],[`下载APP`,`アプリ`],[`大会员`,`大会員`],[`消息`,`通知`],[`动态`,`情報`],[`稍后再看`,`後で見る`],[`收藏`,`お気に入り`],[`更多`,`もっと`],[`排行`,`ランキング`],[`图片`,`画像`],[`视频`,`ビデオ`],[`番剧`,`番組`],[`音乐`,`音楽`],[`时尚`,`潮流`],[`电影`,`劇場`],[`影视`,`映画`],[`特摄`,`特撮`],[`学习`,`勉強`],[`放映厅`,`映画館`],[`广告`,`広告`],[`广场`,`広場`],[`发布`,`発表`],[`举报`,`報告`],[`首页`,`ホーム`],[`热门`,`人気`],[`周一`,`月`],[`周二`,`火`],[`周三`,`水`],[`周四`,`木`],[`周五`,`金`],[`周六`,`土`],[`周日`,`日`],[`今天`,`今日`],[`昨天`,`昨日`],[`近1周`,`1週間`],[`1周前`,`1週前`],[`发送`,`送信`],[`取消`,`キャンセル`],[`关闭`,`閉じる`],[`表情`,`ステッカー`],[`小视频`,`短いビデオ`],[`短视频`,`短いビデオ`],[`查看更多`,`もっと見る`],[`显示更多`,`もっと見る`],[`浏览更多`,`もっと見る`],[`查看全部`,`すべて見る`],[`所有关注`,`すべでのフォロー`],[`进入专栏区`,`コラム領域に入る`],[`暂时没有新动态了哦!`,`暫く新しい情報がないよ`],[`播放历史`,`再生履歴`],[`暂停记录历史`,`再生履歴機能を一時停止`],[`啊叻?你要暂停历史记录功能吗?`,`あれー?再生履歴機能を一時停止しますか?`],[`确定暂停`,`一時停止`],[`清空历史`,`すべての再生履歴を削除`],[`已看完`,`読み終えた`],[`一键清空`,`すべてを削除`],[`移除已观看视频`,`視聴済み動画を削除`],[`已观看`,`視聴済み`],[`删除`,`削除`],[`确认`,`確認`],[`添加`,`追加`],[`取消关注`,`フォロー解除`],[`全部`,`すべて`],[`投稿视频`,`ビデオ`],[`公告栏`,`掲示板`],[`正在直播`,`配信中`],[`虚拟主播`,`Vtuber`],[`房间标题`,`タイトル`],[`设置`,`設定`],[`频道`,`チャンネル`],[`标签`,`タグ`],[`关注`,`フォロー`],[`关注数`,`フォロー数`],[`粉丝`,`ファン`],[`粉丝数`,`ファン数`],[`阅读数`,`閲覧数`],[`阅读量`,`閲覧数`],[`相簿`,`アルバム`],[`我的频道`,`私のチャンネル`],[`我的视频`,`私のビデオ`],[`我的音频`,`私の音楽`],[`我的音乐`,`私の音楽`],[`我的专栏`,`私のコラム`],[`我的相簿`,`私のアルバム`],[`我的关注`,`私のフォロー`],[`我的粉丝`,`私のファン`],[`我的消息`,`DM`],[`我的收藏`,`私のお気に入り`],[`我的订阅`,`私の購読`],[`系统通知`,`システム`],[`网游`,`オンライン`],[`手游`,`モバイル`],[`单机`,`単機ゲーム`],[`电台`,`ラジオ`],[`绘画`,`絵画`],[`热门话题`,`人気話題`],[`热门排行`,`人気ランキング`],[`我关注的话题`,`注目した話題`],[`前往TA的直播间`,`配信ルームへ移動`],[`请输入弹幕 DA☆ZE~`,`弾幕を入力してください( •̀ ω •́ )✧`],[`有什么想和大家分享的?`,`何をみんなと共有したいのですか`],[`有新动态,点击查看`,`新しい情報がある、クリックして見る`],[`以上为热门评论,`,`以上が人気コメント`],[`请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。`,`インターネット関連のポリシーや規制を意識的に遵守し、ポルノ・暴力・反動的な発言を厳禁してください。`],[`点击查看`,`クリックして見る`],[`刚刚`,`さっき`],[`转发动态`,`リポスト`],[`分享动态`,`シェア`],[`转发`,`リポスト`],[`赞`,`いいね`],[`好评`,`いいね`],[`重播`,`再放送`],[`投币`,`コインを投げる`],[`同时点赞内容`,`同時に好評`],[`添加到收藏夹`,`お気に入りに追加`],[`投稿了`,`投稿した`],[`动态首页`,`情報ホーム`],[`历史动态`,`情報履歴`],[`追番`,`番組を購読`],[`已追番`,`購読中`],[`取消追番`,`取り消し`],[`追剧`,`ドラマを購読`],[`已追剧`,`購読中`],[`取消追剧`,`取り消し`],[`取消订阅`,`購読を解除`],[`用手机观看`,`携帯で見る`],[`用手机看`,`携帯で見る`],[`相关推荐`,`関連推薦`],[`点评`,`採点`],[`评论`,`コメント`],[`新番时间表`,`番組時間表`],[`小黑屋`,`公開処刑`],[`摄影`,`撮影`],[`其他`,`他の`],[`下载`,`ダウンロード`],[`更新了`,`更新した`],[`排行榜`,`ランキング`],[`推荐`,`推薦`],[`播放`,`再生`],[`播放数量`,`再生数`],[`自动`,`自動`],[`暂停`,`一時停止`],[`静音`,`消音`],[`弹幕`,`弾幕`],[`硬币`,`コイン`],[`宽屏模式`,`シアターモード`],[`进入全屏`,`全画面に入る`],[`打开洗脑循环`,`サイクルを開く`],[`观看人数`,`観覧人数`],[`转载`,`転載`],[`展开`,`表示`],[`收起`,`非表示`],[`展开全部`,`フルテキスト`],[`展开全文`,`フルテキスト`],[`收起全文`,`一部を表示`],[`已结束`,`終わり`],[`电视剧`,`ドラマ`],[`上一页`,`前へ`],[`下一页`,`次へ`],[`搜索`,`検索`],[`直播中`,`配信中`],[`等级`,`レベル`],[`个人中心`,`個人センター`],[`创作中心`,`創作センター`],[`直播中心`,`配信センター`],[`订单中心`,`受注センター`],[`B币钱包`,`ビリ财布`],[`B币`,`ビリコイン`],[`主页`,`ホーム`],[`排序`,`序列`],[`移除`,`削除`],[`复制`,`コピー`],[`换一换`,`更新`],[`特别推荐`,`特別推薦`],[`热门榜单`,`人気ランキング`],[`播放全部`,`すべて再生`],[`自动播放`,`自動再生`],[`观看历史`,`視聴履歴`],[`个人收益`,`個人収益`],[`同时转发到我的动态`,`同時にシェアする`],[`人气值`,`人気値`],[`友爱社`,`応援社`],[`话题`,`話題`],[`活动`,`活動`],[`活动中心`,`活動中心`],[`消息中心`,`ニュースセンター`],[`专栏投稿`,`コラム`],[`音频投稿`,`音楽`],[`视频投稿`,`ビデオ`],[`相簿投稿`,`アルバム`],[`上传视频`,`アップロード`],[`退出登录`,`ログアウト`],[`回复我的`,`返信`],[`TA 的直播间`,`彼の配信ルーム`],[`TA 的小视频`,`彼のミニ動画`],[`TA的视频`,`彼のビデオ`],[`TA的音频`,`彼の音楽`],[`TA的专栏`,`彼のコラム`],[`TA的频道`,`彼のチャンネル`],[`TA的订阅`,`彼の購読`],[`TA的收藏夹`,`彼のお気に入り`],[`领取`,`受け取り`],[`确定`,`確定`],[`公开`,`表示`],[`隐藏`,`非表示`],[`搜索设置项`,`検索設定項目`],[`样式`,`スタイル`],[`工具`,`道具`],[`触摸`,`タッチスクリーン`],[`指定播放器布局`,`プレーヤーのレイアウト`],[`视频区布局`,`ビデオ`],[`番剧区布局`,`番組`],[`使用默认播放器模式`,`プレーヤ・モード`],[`默认播放器模式`,`デフォルト・モード`],[`播放时应用模式`,`再生時に使う`],[`播放时自动关灯`,`再生時はライトを消す`],[`使用默认视频画质`,`映像画質`],[`画质设定`,`画質設定`],[`使用默认弹幕设置`,`弾幕設定`],[`开启弹幕`,`弾幕を開ける`],[`记住弹幕设置`,`シールド設定を覚える`],[`自动展开弹幕列表`,`弾幕リストを表示`],[`弹幕列表`,`弾幕リスト`],[`自动展开视频简介`,`動画概要欄を表示`],[`自动从历史记录点播放`,`視聴履歴から自動再生`],[`自动播放视频`,`ビデオを自動再生`],[`跳过充电鸣谢`,`エンディングをスキップ`],[`启用逐帧调整`,`フレーム毎に調整`],[`自动定位到播放器`,`プレーヤー自動定位`],[`定位偏移量`,`位置オフセット`],[`外置稍后再看`,`外付け「後で見る」`],[`主题颜色`,`テーマカラー`],[`样式调整`,`スタイルの調整`],[`顶栏(对横幅)透明度`,`(横断幕に)頂欄の透明度`],[`夜间模式`,`ダークテーマ`],[`夜间模式计划时段`,`ダークテーマ计画タイム`],[`首页使用紧凑布局`,`トップページにコンパクトなレイアウトを使う`],[`简化评论区`,`コメントエリアの簡潔化`],[`简化直播间`,`配信ルームの簡潔化`],[`搜索栏置顶`,`検索欄がトップになる`],[`显示顶部横幅`,`トップの横断幕を表示`],[`显示排行榜图标`,`ランキングのアイコンを表示`],[`模糊视频控制栏背景`,`ビデオ制御欄の背景がぼやける`],[`控制栏着色`,`制御欄に黒を付ける`],[`不透明度`,`不透過度`],[`缩放直播看板娘`,`配信ルームの看板娘をズーム`],[`删除直播水印`,`生放送透かしを削除`],[`删除视频标题层`,`ビデオ・タイトル層を削除します`],[`删除广告`,`広告を削除`],[`稍后再看重定向`,`後で見るのビデオをリダイレクト`],[`收藏夹视频重定向`,`お気に入りのビデオをリダイレクト`],[`隐藏搜索推荐`,`検索欄の推薦語を非表示`],[`展开动态标题`,`情報のタイトルを表示`],[`展开选集标题`,`選集のタイトルを表示`],[`BiliPlus跳转支持`,`BiliPlusをジャンプする`],[`高分辨率图片`,`高解像度画像`],[`旧版动态跳转支持`,`旧版の情報をジャンプする`],[`界面翻译`,`インタフェース翻訳`],[`语言`,`言語`],[`顶栏触摸优化`,`頂欄にタッチ最適化を行う`],[`素质三连触摸支持`,`三連撃タッチサポート`],[`播放器触摸支持`,`プレーヤータッチサポート`],[`启用实验性动画效果`,`実験的動画効果`],[`启用双击控制`,`ダブルクリック制御`],[`显示消息`,`メッセージを表示`],[`显示内部错误消息`,`エラーメッセージを表示`],[`启用缓存`,`キャッシュを有効にする`],[`附加功能`,`追加機能`],[`空空如也哦...`,`何もないよ = ̄ω ̄=`],[`清除缓存`,`キャッシュを消去する`],[`转到BiliPlus`,`BiliPlusをジャンプ`],[`查看封面`,`サムネイルを見る`],[`下载弹幕`,`弾幕をダウンロード`],[`下载视频`,`ビデオをダウンロード`],[`下载音频`,`音楽をダウンロード`],[`更换勋章`,`勲章を入れ換える`],[`更换头衔`,`肩書きを入れ換える`],[`动画`,{selector:`.elevator-module .nav-list .item`,not:true,text:`アニメ`}],[`舞蹈`,{selector:`.elevator-module .nav-list .item`,not:true,text:`ダンス`}],[`专栏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`コラム`}],[`游戏`,{selector:`.elevator-module .nav-list .item`,not:true,text:`ゲーム`}],[`直播`,{selector:`.elevator-module .nav-list .item`,not:true,text:`生放送`}],[`数码`,{selector:`.elevator-module .nav-list .item`,not:true,text:`デジタル`}],[`纪录片`,{selector:`.elevator-module .nav-list .item`,not:true,text:`ドキュメンタリー`}],[`娱乐`,{selector:`.elevator-module .nav-list .item`,not:true,text:`エンタメ`}],[`常规`,{selector:`.gui-settings-dropdown *`,not:true,text:`標準`}],[`宽屏`,{selector:`.gui-settings-dropdown *`,not:true,text:`シアターモード`}],[`网页全屏`,{selector:`.gui-settings-dropdown *`,not:true,text:`ウェブの全画面`}],[`全屏`,{selector:`.gui-settings-dropdown *`,not:true,text:`全画面`}],[`历史`,[`歴史`,{text:`履歴`,selector:`.nav-con.fr .nav-item .t`}]],[`登录`,`ログイン`],[`注册`,`登録`],[`我的直播间`,`私の配信ルーム`],[`直播间`,`配信ルーム`],[`订阅`,`購読`],[`主站空间`,`個人センター`],[`播放数`,`再生数`],[`综合`,`総合`],[`用户`,`ユーザー`],[`投稿管理`,`投稿センター`],[`个人信息`,`個人情報`],[`开播设置`,`放送設定`],[`直播分类:`,`配信分類:`],[`修改分区`,`カテゴリーを変更`],[`房间标题:`,`生放送タイトル:`],[`开始直播`,`配信を開始`],[`关闭直播`,`配信を中止`],[`主播公告`,`チャンネル公告`],[`简介`,`概要`],[`直播封面`,`配信サムネイル`],[`我的个人标签`,`私のタグ`],[`个人简介`,`個人紹介`],[`直播间信息`,`配信ルーム情報`],[`我的船员`,`私の船員`],[`直播数据`,`配信データ`],[`数据总览`,`データ統計`],[`直播时长`,`総配信時間`],[`最高人气值`,`最大人気値`],[`金仓鼠`,`ゴールデンハムスター :`],[`贝壳`,`貝殻 :`],[`直播收益(金仓鼠)`,`生放送収益(ゴールデンハムスター)`],[`直播收益`,`生放送収益`],[`新增关注数`,`新しい登録者`],[`人均观看时长`,`平均視聴時間`],[`礼物流水`,`ギフト記録`],[`礼物统计`,`ギフト一覧`],[`消费排行`,`投げ銭ランキング`],[`更多>>`,`もっと>>`],[`主播`,`配信者`],[`未开播`,`待機中`],[`金瓜子`,`金ヒマワリの種`],[`银瓜子`,`銀ヒマワリの種`],[`残忍取关`,`フォロー解除`],[`再考虑一下`,`考え直す`],[`已关注`,`フォロー中`],[`七日榜`,`週間rank`],[`舰队`,`艦隊`],[`房管`,`管理者`],[`分享`,`共有`],[`轮播`,`再放送`],[`闲置`,`待機中`],[`回复`,`返信`],[`查看更多评论`,`もっとコメントを表示`],[`英雄联盟`,`LOL`],[`APEX英雄`,`Apex Legends`],[`守望先锋`,`Overwatch`],[`绝地求生`,`PUBG`],[`王者荣耀`,`伝説対決`],[`第五人格`,`Identity V`],[`绝地求生:刺激战场`,`PUBG Mobile`],[`崩坏3`,`崩壊3rd`],[`主机游戏`,`ホストゲーム`],[`我的世界`,`マイクラ`],[`怪物猎人:世界`,`モンハンワールド`],[`只狼:影逝二度`,`SEKIRO/隻狼`],[`鬼泣5`,`デビルメイクライ5`],[`视频唱见`,`歌ってみた`],[`舞见`,`踊ってみた`],[`视频聊天`,`ビデオチャット`],[`才艺`,`タレントショー`],[`唱见电台`,`歌見ラジオ`],[`声优`,`声優`],[`聊天电台`,`チャットラジオ`],[`同人绘画`,`同人絵画`],[`原创绘画`,`オリジナル絵画`],[`临摹绘画`,`模写絵画`],[`其他绘画`,`他の絵`],[`扭蛋机`,`ガチャポン`],[`我关注的直播`,`フォローした配信`],[`我关注的动态`,`フォローした情報`],[`按热度排序`,`評価順`],[`全部评论`,`すべてのコメント`],[`发消息`,`DMを送る`],[`点赞`,`いいね!`],[`发表评论`,`コメント`],[`你的rtmp地址:`,`サーバー:`],[`你的直播码:`,`ストリームキー:`],[`颜值领域专属封面`,`顔出し用サムネ`],[`私信存档`,`DMアーカイブ`],[`历史私信`,`昔のDM`],[`用户中心`,`個人センター`],[`我的信息`,`個人情報`],[`领取奖励`,`受け取り`],[`关注直播间`,`フォロー`],[`加入黑名单`,`ブロックする`],[`悄悄关注`,`非公開フォロー`],[`个人信息举报`,`通報する`],[`观众分析`,`視聴者分析`],[`游客分析`,`ゲスト分析`],[`粉丝分析`,`フォロワー分析`],[`游客基本属性`,`ゲスト基本属性`],[`性别占比`,`性別割合`],[`观众年龄`,`年齢割合`],[`观看途径`,`端末割合`],[`消息设置`,`通知設定`],[`消息提醒样式`,`通知様式`],[`(不含应援团)`,`(応援社は除外)`],[`红点`,`赤い点`],[`不提醒`,`通知しない`],[`推荐位申请`,`推薦枠申し込み`],[`直播看板娘`,`配信マスコート`],[`收到的赞`,`いいね!`],[`*`,[]]]);const r=new Map([[/^浏览:([0-9\.a-z]+)$/,`閲覧:$1`],[/^收藏:([0-9\.a-z]+)$/,`お気に入り:$1`],[/^支持:([0-9\.a-z]+)$/,`いいね:$1`],[/^共([\d]+)页$/,`全部で $1 ページ`],[/^小视频 ([\d]+)$/,`短いビデオ $1`],[/^相簿 ([\d]+)$/,`アルバム $1`],[/^在线人数:([\d]+)$/,`オンライン:$1`],[/^([\d]+)[ ]?分钟前$/,`$1 分前`],[/^([\d]+)[ ]?小时前$/,`$1 時間前`],[/^([\d\.万]+)播放/,`$1視聴`],[/^([\d\.万]+)弹幕$/,`$1弾幕`],[/^([\+]?[ ]?)关注([:]?[:]?[ ]?)([\d]+)?$/,`$1フォロー$2$3`],[/^上传时间:([\d])/,`アップロード時間:$1`],[/^粉丝([:]?[:]?[ ]?)$/,`ファン$1`],[/^@([ ]?)我的$/,`私に$1@`],[/^TA([ ]?)的相簿$/,`彼の$1アルバム`],[/^([\d]+)硬币$/,`$1コイン`],[/^阅读([:]?[:]?[ ]?)$/,`閲覧$1`]]);return{export:{map:o,regex:r}}}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.min.css"] = `#page-follows .follow-sidenav .text,.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.author-info .communicate-btn,.author-info .favourite-btn,.bili-search .nav-wrap .wrap>.sub,.dashboard li.like,.h .h-f-btn,.history-wrap .history-btn,.live-sidebar-ctnr .sidebar-btn,.media-info .media-right .media-tool-bar .btn-follow,.n .n-data,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{width:auto!important}.bb-comment .comment-send .comment-emoji{width:max-content!important}.live-panel .more-button,.tag-panel .more-button{width:44px!important}.link-navbar .main-ctnr .nav-logo{width:70px!important}.bili-header-m .profile-m .grade .bar{width:160px!important}.bili-search .contain,.link-navbar .main-ctnr{width:90%!important}.bili-search .video.list{width:calc(100% - 172px)!important}.bili-search .video.list .des{width:100%!important}.gui-settings-box{width:450px!important}#page-follows .follow-sidenav .text{min-width:78px!important}.h .h-f-btn{min-width:76px!important}.primary-menu .nav-menu .nav-name,.primary-menu .nav-menu .side-nav .side-link span{white-space:pre!important}.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.bb-comment .comment-send .comment-emoji,.h .h-f-btn,.media-info .media-right .media-tool-bar .btn-follow,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{padding:0 8px!important}.n .n-data{padding:10px 8px!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn:nth-child(2n){padding-left:8px!important}.dashboard li.share .text{padding-top:15px!important}.dashboard li.collection{margin:0 10px 0 0!important}.bili-search .rocket-con{margin-left:40%!important}.bili-search .video.matrix:nth-child(5n){margin-right:32px!important}.dynamic-m .dyn_menu .line,.nav-wrap .hover-bar,.tab-bar .line{display:none!important}.tab-bar .tab .tab-text.selected{color:var(--theme-color)!important;border-bottom:2px solid!important;box-sizing:border-box!important}.live-panel .more-button{transform:translateX(-9px)!important}.bilibili-player-ending-panel-box-functions .bilibili-player-upinfo-spans>div{align-items:center!important}.dashboard li.collection>div:first-child,.user-panel-ctnr .user-panel .content-ctnr .section-block{display:flex!important;align-items:center!important;flex-direction:column!important}.dashboard li.share{display:inline-flex!important;align-items:center!important;flex-direction:column!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn{float:none!important}#area-list ul li dd{font-size:18px!important}.author-info .communicate-btn,.author-info .communicate-btn:active,.author-info .favourite-btn,.author-info .favourite-btn:active{font-size:12px!important}.dashboard li.like{border-color:transparent!important}.gui-settings-tooltip{left:470px!important}`; +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.min.css"] = `#page-follows .follow-sidenav .text,.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.author-info .communicate-btn,.author-info .favourite-btn,.bili-search .nav-wrap .wrap>.sub,.dashboard li.like,.h .h-f-btn,.history-wrap .history-btn,.live-sidebar-ctnr .sidebar-btn,.media-info .media-right .media-tool-bar .btn-follow,.n .n-data,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{width:auto!important}.bb-comment .comment-send .comment-emoji{width:max-content!important}.live-panel .more-button,.tag-panel .more-button{width:44px!important}.link-navbar .main-ctnr .nav-logo{width:70px!important}.bili-header-m .profile-m .grade .bar{width:160px!important}.bili-search .contain,.link-navbar .main-ctnr{width:90%!important}.bili-search .video.list{width:calc(100% - 172px)!important}.bili-search .video.list .des{width:100%!important}.gui-settings-box{width:450px!important}#page-follows .follow-sidenav .text{min-width:78px!important}.h .h-f-btn{min-width:76px!important}.primary-menu .nav-menu .nav-name,.primary-menu .nav-menu .side-nav .side-link span{white-space:pre!important}.admin-list-cntr .rank-cntr .item .admin-icon,.article-action .ops .coin-btn,.article-action .ops .fav-btn,.article-action .ops .like-btn,.attention-btn-ctnr .left-part,.bb-comment .comment-send .comment-emoji,.h .h-f-btn,.media-info .media-right .media-tool-bar .btn-follow,.textarea-container .comm-tool .comm-emoji,.textarea-container .comm-tool .comm-submit,.up-info .up-focus-btn{padding:0 8px!important}.n .n-data{padding:10px 8px!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn:nth-child(2n){padding-left:8px!important}.dashboard li.share .text{padding-top:15px!important}.dashboard li.collection{margin:0 10px 0 0!important}.bili-search .rocket-con{margin-left:40%!important}.bili-search .video.matrix:nth-child(5n){margin-right:32px!important}.dynamic-m .dyn_menu .line,.nav-wrap .hover-bar,.tab-bar .line{display:none!important}.tab-bar .tab .tab-text.selected{color:var(--theme-color)!important;border-bottom:2px solid!important;box-sizing:border-box!important}.live-panel .more-button{transform:translateX(-9px)!important}.bilibili-player-ending-panel-box-functions .bilibili-player-upinfo-spans>div{align-items:center!important}.dashboard li.collection>div:first-child{display:flex!important;align-items:center!important;flex-direction:column!important}.dashboard li.share{display:inline-flex!important;align-items:center!important;flex-direction:column!important}.user-panel-ctnr .user-panel .content-ctnr .ctrl-btn{float:none!important}#area-list ul li dd{font-size:18px!important}.author-info .communicate-btn,.author-info .communicate-btn:active,.author-info .favourite-btn,.author-info .favourite-btn:active{font-size:12px!important}.dashboard li.like{border-color:transparent!important}.gui-settings-tooltip{left:470px!important}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.min.js"] = (()=>{return(e,t)=>{const a={"日本語":"ja-JP",English:"en-US",Deutsch:"de-DE"};class s{accepts(e){return e.nodeType===Node.ELEMENT_NODE}getValue(e){return e.nodeValue}setValue(e,t){e.nodeValue=t}getElement(e){return e}translate(e){const t=this.getValue(e);if(!t||typeof t!=="string"||t==="*"){return}const a=s.map.get(t.trim());if(a===undefined){const a=s.regex.find(([e])=>e.test(t));if(a){const[s,r]=a;this.setValue(e,t.replace(s,r))}}else if(typeof a==="string"){this.setValue(e,a)}else if(Array.isArray(a)){let t=null;for(const s of a){if(typeof s==="string"){t=s}else{const{text:a,selector:r,not:n}=s;if(this.getElement(e).matches(r)!==Boolean(n)){t=a}}}if(t!==null){this.setValue(e,t)}}else{const{text:t,selector:s,not:r}=a;if(this.getElement(e).matches(s)!==Boolean(r)){this.setValue(e,t)}}}static walk(e,t){const a=document.createTreeWalker(e,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null,false);let s=a.nextNode();while(s){t(s);s=a.nextNode()}}static translate(e){if(e.nodeType===Node.TEXT_NODE){s.textNode.translate(e);return}s.walk(e,e=>{for(const t of s.allTranslators){if(t.accepts(e)){t.translate(e)}}})}static translateCssMatches(){const e=s.map.get("*");if(!e){return}for(const{selector:t,text:a}of e){const e=document.querySelector(t);if(e){[...e.childNodes].filter(e=>e.nodeType===Node.TEXT_NODE).forEach(e=>e.nodeValue=a)}}}}class r extends s{accepts(e){return e.nodeType===Node.TEXT_NODE}getElement(e){return e.parentElement}}class n extends s{getValue(e){return e.getAttribute("title")}setValue(e,t){e.setAttribute("title",t)}}class l extends s{getValue(e){return e.getAttribute("placeholder")}setValue(e,t){e.setAttribute("placeholder",t)}}s.textNode=new r;s.title=new n;s.placeholder=new l;s.allTranslators=[s.textNode,s.title,s.placeholder];(async()=>{const r=a[e.i18nLanguage];const{map:n,regex:l}=await t.importAsync(`i18n.${r}`);document.documentElement.setAttribute("lang",r);s.map=n;s.regex=[...l.entries()];s.translate(document.body);s.translateCssMatches();Observer.observe("body",e=>{e.forEach(e=>{if(e.type==="childList"){if(e.addedNodes.length>0){s.translateCssMatches()}e.addedNodes.forEach(e=>{s.translate(e)})}else if(e.type==="characterData"){s.textNode.translate(e.target)}})},{characterData:true,childList:true,subtree:true})})();return{export:{Translator:s,TextNodeTranslator:r,TitleTranslator:n,PlaceholderTranslator:l},dropdown:{key:"i18nLanguage",items:[`日本語`]}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/i18n.zh-TW.min.js"] = (()=>{return(r,e)=>{const n=new Map([[`主站`,`主站`],[`画友`,`絵画`],[`音频`,`音樂`],[`游戏中心`,`遊戲`],[`会员购`,`購物`],[`漫画`,`漫畫`],[`下载APP`,`下載APP`],[`大会员`,`大會員`],[`动态`,`動態`],[`稍后再看`,`稍後再看`],[`历史`,`歷史`],[`番剧`,`番劇`],[`动画`,`動畫`],[`国创`,`國創`],[`音乐`,`音樂`],[`游戏`,`遊戲`],[`数码`,`數位`],[`电影`,`電影`],[`纪录片`,`紀錄片`],[`时尚`,`時尚`],[`娱乐`,`娛樂`],[`广告`,`廣告`],[`原创`,`原創`],[`广场`,`廣場`],[`发布`,`發佈`],[`专栏`,`專欄`],[`关注`,`關注`],[`粉丝`,`粉絲`],[`热门`,`熱門`],[`视频`,`影片`],[`图片`,`圖片`],[`小视频`,`短影片`],[`公告栏`,`公告欄`],[`特别推荐`,`特別推薦`],[`有新动态`,`有新動態`],[`所有关注`,`所有關注`],[`首页`,`首頁`],[`编辑`,`編輯`],[`回复`,`回覆`],[`举报`,`舉報`],[`在线人数`,`在線人數`],[`*`,[]]]);return{export:{map:n}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/icons.min.css"] = `.icons-enabled [class^=icon-]{width:24px;height:24px;display:inline-block;background-image:none}.icons-enabled [class^=icon-]::after{content:"";width:24px;height:24px;display:inline-block}.icons-enabled .icon-view::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-clear::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-download::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-update::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-info::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-settings::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-widgets::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-cancel::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-ok::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-video::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-style::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-tool::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-touch::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-other::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-arrow::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-rank::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-like::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-danmaku::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-search::after{background-image:url('data:image/svg+xml;utf-8, ')}.compact .primary-menu .nav-menu>li.home>a,.icons-enabled .icon-home::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.zhuanlan,.icons-enabled .icon-read::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.square,.icons-enabled .icon-square::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.live,.icons-enabled .icon-live::after{background-image:url('data:image/svg+xml;utf-8,')}.compact .primary-menu .nav-menu .side-nav .side-link i.blackroom,.icons-enabled .icon-judge::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-medal::after{background-image:url('data:image/svg+xml;utf-8, ')}.icons-enabled .icon-live-title::after{background-image:url('data:image/svg+xml;utf-8,')}.icons-enabled .icon-biliplus::after{background-image:url('data:image/svg+xml;utf-8, ')}`; diff --git a/min/batch-download.min.js b/min/batch-download.min.js index 711b5e5db..cdf80f439 100644 --- a/min/batch-download.min.js +++ b/min/batch-download.min.js @@ -1 +1 @@ -(()=>{return(t,c)=>{class a{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(){return`{x:"test"}`}}const e=[a];class n{async collectData(){const t=new(e.find(t=>t.test()));return await t.collectData()}}return{export:{BatchExtractor:n}}}})(); \ No newline at end of file +(()=>{return(t,e)=>{class s{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(t){const e=document.querySelector("meta[property='og:url']");if(e===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return""}const s=e.getAttribute("content").match(/play\/ss(\d+)/)[1];if(s===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return""}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${s}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return""}const r=i.result.main_section.episodes.map(t=>{return{aid:t.aid,cid:t.cid,number:t.title,title:t.long_title}});const n=[];for(const e of r){const s=`https://api.bilibili.com/pgc/player/web/playurl?avid=${e.aid}&cid=${e.cid}&qn=${t}&otype=json`;const i=await Ajax.getJsonWithCredentials(s);const r=i.data||i.result||i;if(r.quality!==t){Toast.error("获取下载链接失败, 请确认当前账号有下载权限后重试.","批量下载");return""}const a=r.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}});n.push({fragments:a,title:`${e.number} - ${e.title}`,totalSize:a.map(t=>t.size).reduce((t,e)=>t+e)})}return JSON.stringify(n)}}const i=[s];class r{async collectData(t,e){const s=new(i.find(t=>t.test()));const r=await s.collectData(t.quality);e.dismiss();return r}}return{export:{BatchExtractor:r}}}})(); \ No newline at end of file diff --git a/min/download-video.min.js b/min/download-video.min.js index ae9b02679..b80570c7a 100644 --- a/min/download-video.min.js +++ b/min/download-video.min.js @@ -1 +1 @@ -(()=>{return(e,t)=>{const{getFriendlyTitle:s}=t.import("title");const n={entity:null,aid:undefined,cid:undefined};class o{constructor(){this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}get menuPanel(){return document.querySelector(".download-video-panel")}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&otype=json`}}}class a extends o{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=&otype=json`}}}class r{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new l(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{n.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const o=s.data||s.result||s;const a=o.accept_quality;const i=o.accept_format.split(",");const l=o.accept_description;const c=[];while(a.length>0){const e=new r(a.pop(),i.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class i{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class l{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{n.entity.getUrl(this.format.quality).then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText.replace(/http:/g,"https:"));const o=s.data||s.result||s;if(o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const a=o.durl;this.fragments=a.map(e=>new i(e.length,e.size,e.url,e.backup_url));e(this.fragments)});n.withCredentials=true;n.open("GET",s);n.send()})})}updateProgress(){const e=this.progressMap?[...this.progressMap.values()].reduce((e,t)=>e+t,0)/this.totalSize:0;if(e>1||e<0){console.error(`[下载视频] 进度异常: ${e}`,this.progressMap.values())}this.progress&&this.progress(e)}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;const o=e=>[...this.progressMap.keys()].indexOf(e)+1;while(n{const n=new XMLHttpRequest;n.open("GET",e.url);n.responseType="arraybuffer";n.withCredentials=false;n.addEventListener("progress",e=>{console.log(`[下载视频] 视频片段${o(n)}下载进度: ${e.loaded}/${i} bytes loaded, ${r}`);this.progressMap.set(n,e.loaded);this.updateProgress()});n.addEventListener("load",()=>{if((""+n.status)[0]==="2"){t(n.response)}else{s(`请求失败.`)}});n.addEventListener("abort",()=>s("下载已取消."));n.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${o(n)}下载失败: ${r}`);this.progressMap.set(n,0);this.updateProgress();n.open("GET",e.url);n.setRequestHeader("Range",r);n.send()});n.setRequestHeader("Range",r);this.progressMap.set(n,0);n.send();this.workingXhr.push(n)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}exportData(e=false){const t=JSON.stringify({fragments:this.fragments,title:s(true),totalSize:this.fragments.map(e=>e.size).reduce((e,t)=>e+t)});if(e){GM_setClipboard(t,"text")}else{const e=document.createElement("a");const s=new Blob([t],{type:"text/json"});const n=URL.createObjectURL(s);e.setAttribute("href",n);e.setAttribute("download",`cid${unsafeWindow.cid}.json`);document.body.appendChild(e);e.click();e.remove();URL.revokeObjectURL(n)}}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=document.querySelector("a#video-complete").getAttribute("href");if(e&&!document.querySelector(`.link[href="${e}"]`)){URL.revokeObjectURL(e)}[...document.querySelectorAll(".toast-card-header")].filter(e=>e.innerText.includes("下载视频")).forEach(e=>e.querySelector(".toast-card-dismiss").click())}downloadSingle(e){const[t]=e;const n=this.makeBlob(t);const o=s()+this.extension();return[n,o]}async downloadMultiple(e){const t=new JSZip;const n=s();if(e.length>1){e.forEach((e,s)=>{const o=this.fragments[s];t.file(`${n} - ${s+1}${this.extension(o)}`,this.makeBlob(e,o))})}else{const[s]=e;t.file(`${n}${this.extension()}`,this.makeBlob(s))}const o=await t.generateAsync({type:"blob"});const a=n+".zip";return[o,a]}async download(){const e=[];this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}this.cleanUpOldBlobUrl();const n=URL.createObjectURL(t);this.progress&&this.progress(0);return{url:n,filename:s}}}async function c(){const e=["/www.bilibili.com/bangumi"];if(e.some(e=>document.URL.includes(e))){const{BatchExtractor:e}=await t.importAsync("batchDownload");const s=new e;document.getElementById("download-video").classList.add("batch");document.getElementById("video-action-batch-data").addEventListener("click",async()=>{const e=await s.collectData();GM_setClipboard(e,{type:"text/json"});Toast.success("已复制批量数据到剪贴板.","复制批量数据",3e3);n.entity.resetMenuClass()});document.getElementById("video-action-batch-download-data").addEventListener("click",async()=>{const e=await s.collectData();const t=document.createElement("a");const o=new Blob([e],{type:"text/json"});const a=URL.createObjectURL(o);t.setAttribute("href",a);t.setAttribute("download",`export.json`);document.body.appendChild(t);t.click();t.remove();URL.revokeObjectURL(a);n.entity.resetMenuClass()})}}async function d(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);n.aid=e;n.cid=t;if(document.URL.indexOf("bangumi")!==-1){n.entity=new a}else{n.entity=new o}return Boolean(e&&t)}async function u(){let e=await r.availableFormats;let[s]=e;const o=async()=>{await d();e=await r.availableFormats;const t=$("ol.video-quality");t.html("");e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{s=e;n.entity.nextMenuClass()}).prependTo(t)})};if(Observer.videoChange){Observer.videoChange(o)}else{Observer.childList("#bofqi",o)}const a=()=>s.downloadInfo().catch(e=>{n.entity.addError();$(".video-error").text(e)});async function i(){if(!s){return}n.entity.nextMenuClass();const e=await a();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{n.entity.addError();$(".video-error").text(e)});if(!t){return}const o=document.getElementById("video-complete");o.setAttribute("href",t.url);o.setAttribute("download",t.filename);o.click();const r=`下载完成. 再次保存`;Toast.success(r,"下载视频");n.entity.resetMenuClass()}async function l(){if(!s){return}const e=await a();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);n.entity.resetMenuClass()}document.querySelector("#video-action-download").addEventListener("click",i);document.querySelector("#video-action-copy").addEventListener("click",l);document.querySelector("#video-action-copy-data").addEventListener("click",async()=>{if(!s){return}const e=await a();e.exportData(true);Toast.success("已复制数据到剪贴板.","复制数据",3e3);n.entity.resetMenuClass()});document.querySelector("#video-action-download-data").addEventListener("click",async()=>{if(!s){return}const e=await a();e.exportData(false);n.entity.resetMenuClass()});t.applyStyle("downloadVideoStyle");const u=document.querySelector(".download-video-panel");const p=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!u.contains(e.target)){p()}});$(".video-error").on("click",()=>{$(".video-error").text("");n.entity.removeError()});await SpinQuery.select(()=>document.querySelector(".download-video-panel"));n.entity.addMenuClass();c()}return{widget:{content:(t.data.downloadVideoDom||t.data.downloadVideoHtml).text,condition:d,success:u}}}})(); \ No newline at end of file +(()=>{return(e,t)=>{const{getFriendlyTitle:s}=t.import("title");const n={entity:null,aid:undefined,cid:undefined};let o=null;class r{constructor(){this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}get menuPanel(){return document.querySelector(".download-video-panel")}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${n.aid}&cid=${n.cid}&otype=json`}}}class a extends r{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${n.aid}&cid=${n.cid}&qn=&otype=json`}}}class i{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new c(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{n.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const o=s.data||s.result||s;const r=o.accept_quality;const a=o.accept_format.split(",");const l=o.accept_description;const c=[];while(r.length>0){const e=new i(r.pop(),a.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class l{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class c{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{n.entity.getUrl(this.format.quality).then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText.replace(/http:/g,"https:"));const o=s.data||s.result||s;if(o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const r=o.durl;this.fragments=r.map(e=>new l(e.length,e.size,e.url,e.backup_url));e(this.fragments)});n.withCredentials=true;n.open("GET",s);n.send()})})}updateProgress(){const e=this.progressMap?[...this.progressMap.values()].reduce((e,t)=>e+t,0)/this.totalSize:0;if(e>1||e<0){console.error(`[下载视频] 进度异常: ${e}`,this.progressMap.values())}this.progress&&this.progress(e)}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;const o=e=>[...this.progressMap.keys()].indexOf(e)+1;while(n{const n=new XMLHttpRequest;n.open("GET",e.url);n.responseType="arraybuffer";n.withCredentials=false;n.addEventListener("progress",e=>{console.log(`[下载视频] 视频片段${o(n)}下载进度: ${e.loaded}/${i} bytes loaded, ${a}`);this.progressMap.set(n,e.loaded);this.updateProgress()});n.addEventListener("load",()=>{if((""+n.status)[0]==="2"){t(n.response)}else{s(`请求失败.`)}});n.addEventListener("abort",()=>s("下载已取消."));n.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${o(n)}下载失败: ${a}`);this.progressMap.set(n,0);this.updateProgress();n.open("GET",e.url);n.setRequestHeader("Range",a);n.send()});n.setRequestHeader("Range",a);this.progressMap.set(n,0);n.send();this.workingXhr.push(n)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}exportData(e=false){const t=JSON.stringify({fragments:this.fragments,title:s(true),totalSize:this.fragments.map(e=>e.size).reduce((e,t)=>e+t)});if(e){GM_setClipboard(t,"text")}else{const e=document.createElement("a");const s=new Blob([t],{type:"text/json"});const n=URL.createObjectURL(s);e.setAttribute("href",n);e.setAttribute("download",`cid${unsafeWindow.cid}.json`);document.body.appendChild(e);e.click();e.remove();URL.revokeObjectURL(n)}}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=document.querySelector("a#video-complete").getAttribute("href");if(e&&!document.querySelector(`.link[href="${e}"]`)){URL.revokeObjectURL(e)}[...document.querySelectorAll(".toast-card-header")].filter(e=>e.innerText.includes("下载视频")).forEach(e=>e.querySelector(".toast-card-dismiss").click())}downloadSingle(e){const[t]=e;const n=this.makeBlob(t);const o=s()+this.extension();return[n,o]}async downloadMultiple(e){const t=new JSZip;const n=s();if(e.length>1){e.forEach((e,s)=>{const o=this.fragments[s];t.file(`${n} - ${s+1}${this.extension(o)}`,this.makeBlob(e,o))})}else{const[s]=e;t.file(`${n}${this.extension()}`,this.makeBlob(s))}const o=await t.generateAsync({type:"blob"});const r=n+".zip";return[o,r]}async download(){const e=[];this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}this.cleanUpOldBlobUrl();const n=URL.createObjectURL(t);this.progress&&this.progress(0);return{url:n,filename:s}}}async function d(){const e=["/www.bilibili.com/bangumi"];if(e.some(e=>document.URL.includes(e))){const{BatchExtractor:e}=await t.importAsync("batchDownload");const s=new e;document.getElementById("download-video").classList.add("batch");document.getElementById("video-action-batch-data").addEventListener("click",async()=>{if(!o){return}n.entity.resetMenuClass();const e=Toast.info("获取链接中...","批量下载");const t=await s.collectData(o,e);if(!t){return}GM_setClipboard(t,{type:"text/json"});Toast.success("已复制批量数据到剪贴板.","复制批量数据",3e3)});document.getElementById("video-action-batch-download-data").addEventListener("click",async()=>{if(!o){return}n.entity.resetMenuClass();const e=Toast.info("获取链接中...","批量下载");const t=await s.collectData(o,e);if(!t){return}const r=document.createElement("a");const a=new Blob([t],{type:"text/json"});const i=URL.createObjectURL(a);r.setAttribute("href",i);r.setAttribute("download",`export.json`);document.body.appendChild(r);r.click();r.remove();URL.revokeObjectURL(i)})}}async function u(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);n.aid=e;n.cid=t;if(document.URL.indexOf("bangumi")!==-1){n.entity=new a}else{n.entity=new r}return Boolean(e&&t)}async function p(){let e=await i.availableFormats;o=e[0];const s=async()=>{await u();e=await i.availableFormats;const t=$("ol.video-quality");t.html("");e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{o=e;n.entity.nextMenuClass()}).prependTo(t)})};if(Observer.videoChange){Observer.videoChange(s)}else{Observer.childList("#bofqi",s)}const r=()=>o.downloadInfo().catch(e=>{n.entity.addError();$(".video-error").text(e)});async function a(){if(!o){return}n.entity.nextMenuClass();const e=await r();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{n.entity.addError();$(".video-error").text(e)});if(!t){return}const s=document.getElementById("video-complete");s.setAttribute("href",t.url);s.setAttribute("download",t.filename);s.click();const a=`下载完成. 再次保存`;Toast.success(a,"下载视频");n.entity.resetMenuClass()}async function l(){if(!o){return}const e=await r();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);n.entity.resetMenuClass()}document.querySelector("#video-action-download").addEventListener("click",a);document.querySelector("#video-action-copy").addEventListener("click",l);document.querySelector("#video-action-copy-data").addEventListener("click",async()=>{if(!o){return}const e=await r();e.exportData(true);Toast.success("已复制数据到剪贴板.","复制数据",3e3);n.entity.resetMenuClass()});document.querySelector("#video-action-download-data").addEventListener("click",async()=>{if(!o){return}const e=await r();e.exportData(false);n.entity.resetMenuClass()});t.applyStyle("downloadVideoStyle");const c=document.querySelector(".download-video-panel");const p=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!c.contains(e.target)){p()}});$(".video-error").on("click",()=>{$(".video-error").text("");n.entity.removeError()});await SpinQuery.select(()=>document.querySelector(".download-video-panel"));n.entity.addMenuClass();d()}return{widget:{content:(t.data.downloadVideoDom||t.data.downloadVideoHtml).text,condition:u,success:p}}}})(); \ No newline at end of file diff --git a/video/download-video/batch-download.js b/video/download-video/batch-download.js index 989be84b5..0d27a9cbd 100644 --- a/video/download-video/batch-download.js +++ b/video/download-video/batch-download.js @@ -4,18 +4,67 @@ class BangumiBatch { return document.URL.includes("/www.bilibili.com/bangumi"); } - async collectData() + async collectData(quality) { - return `{x:"test"}`; + const metaUrl = document.querySelector("meta[property='og:url']"); + if (metaUrl === null) + { + Toast.error("获取番剧数据失败: 无法找到 Season ID", "批量下载"); + return ""; + } + const seasonId = metaUrl.getAttribute("content").match(/play\/ss(\d+)/)[1]; + if (seasonId === undefined) + { + Toast.error("获取番剧数据失败: 无法解析 Season ID", "批量下载"); + return ""; + } + const json = await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${seasonId}`); + if (json.code !== 0) + { + Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${json.message}`, "批量下载"); + return ""; + } + const pages = json.result.main_section.episodes.map(it => + { + return { aid: it.aid, cid: it.cid, number: it.title, title: it.long_title }; + }); + const result = []; + for (const page of pages) + { + const url = `https://api.bilibili.com/pgc/player/web/playurl?avid=${page.aid}&cid=${page.cid}&qn=${quality}&otype=json`; + const json = await Ajax.getJsonWithCredentials(url); + const data = json.data || json.result || json; + if (data.quality !== quality) + { + Toast.error("获取下载链接失败, 请确认当前账号有下载权限后重试.", "批量下载"); + return ""; + } + const fragments = data.durl.map(it => + { + return { + length: it.length, + size: it.size, + url: it.url, + }; + }); + result.push({ + fragments, + title: `${page.number} - ${page.title}`, + totalSize: fragments.map(it => it.size).reduce((acc, it) => acc + it), + }); + } + return JSON.stringify(result); } } const extractors = [BangumiBatch]; export class BatchExtractor { - async collectData() + async collectData(format, toast) { const extractor = new (extractors.find(it => it.test())); - return await extractor.collectData(); + const result = await extractor.collectData(format.quality); + toast.dismiss(); + return result; } } export default { diff --git a/video/download-video/download-video.js b/video/download-video/download-video.js index 86c472b42..1c5571a9a 100644 --- a/video/download-video/download-video.js +++ b/video/download-video/download-video.js @@ -5,6 +5,7 @@ const pageData = { aid: undefined, cid: undefined, }; +let selectedFormat = null; class Video { constructor() @@ -375,14 +376,33 @@ async function checkBatch() document.getElementById("download-video").classList.add("batch"); document.getElementById("video-action-batch-data").addEventListener("click", async () => { - const data = await extractor.collectData(); + if (!selectedFormat) + { + return; + } + pageData.entity.resetMenuClass(); + const toast = Toast.info("获取链接中...", "批量下载"); + const data = await extractor.collectData(selectedFormat, toast); + if (!data) + { + return; + } GM_setClipboard(data, { type: "text/json" }); Toast.success("已复制批量数据到剪贴板.", "复制批量数据", 3000); - pageData.entity.resetMenuClass(); }); document.getElementById("video-action-batch-download-data").addEventListener("click", async () => { - const data = await extractor.collectData(); + if (!selectedFormat) + { + return; + } + pageData.entity.resetMenuClass(); + const toast = Toast.info("获取链接中...", "批量下载"); + const data = await extractor.collectData(selectedFormat, toast); + if (!data) + { + return; + } const a = document.createElement("a"); const blob = new Blob([data], { type: "text/json" }); @@ -394,7 +414,6 @@ async function checkBatch() a.remove(); URL.revokeObjectURL(url); - pageData.entity.resetMenuClass(); }); } } @@ -417,7 +436,7 @@ async function loadPageData() async function loadWidget() { let formats = await VideoFormat.availableFormats; - let [selectedFormat] = formats; + selectedFormat = formats[0]; const loadQualities = async () => { await loadPageData();