diff --git a/bilibili-evolved.offline.user.js b/bilibili-evolved.offline.user.js
index 2770a9479..6a124fba1 100644
--- a/bilibili-evolved.offline.user.js
+++ b/bilibili-evolved.offline.user.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name Bilibili Evolved (Offline)
-// @version 614.29
+// @version 614.31
// @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中.
// @author Grant Howard, Coulomb-G
// @copyright 2020, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)
@@ -1196,7 +1196,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-draw.min.js"] = (()=>{return(t,n)=>{(async()=>{if(!/^https:\/\/live\.bilibili\.com\/[\d]+/.test(document.URL)){return}const t=await SpinQuery.condition(()=>dq(".chat-popups-section"),t=>t.querySelector("chat-draw-area")===null);if(!t){console.warn("[自动领奖] 未能找到弹窗容器");return}Observer.childListSubtree(t,()=>{let t;console.log("draw button = ",dq(".chat-popups-section .draw>span:nth-child(3)"));t=dq(".chat-popups-section .draw>span:nth-child(3)");if(t===null){const t=dq(".chat-popups-section .function-bar>span:nth-child(3)");if(t!==null){const n=Observer.attributes(t,()=>{if(t.style.display!=="none"){n.forEach(t=>t.stop());t.click()}})}}if(t!==null){t.click()}})})()}})();
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/bangumi-timeline.vue.min.js"] = (()=>{return(e,i)=>{const t=`
{{t.date}}
{{t.dayOfWeekText}}
`;i.applyStyleFromText(`.simple-home .bangumi-timeline-container{width:100%}.simple-home .bangumi-timeline-container .bangumi-timeline{display:flex;align-items:flex-start;overflow:auto;scrollbar-width:none!important;scroll-behavior:smooth;--column-count:1;--column-width:250px;--column-gap:24px;width:calc(var(--column-count) * (var(--column-width) + var(--column-gap)) - .5 * var(--column-gap))}.simple-home .bangumi-timeline-container .bangumi-timeline::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day{scroll-snap-align:start;width:var(--column-width);max-height:calc(var(--total-height) - 32px);overflow:auto;flex:0 0 auto;padding-bottom:16px;scroll-behavior:smooth;scrollbar-width:none!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{display:grid;grid-template:"icon date" 1fr "icon dow" 1fr/auto 1fr;grid-column-gap:8px;column-gap:8px;height:60px;padding-bottom:12px;cursor:pointer;position:sticky;top:0;z-index:1;background-color:#f4f4f4}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{background-color:#181818}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{grid-area:icon;justify-self:center;align-self:center;background-image:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/icons.png);background-size:247px 663px;width:38px;height:36px;background-position-x:-146px;filter:brightness(.5)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-1{background-position-y:-36px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-2{background-position-y:-108px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-3{background-position-y:-180px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-4{background-position-y:-252px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-5{background-position-y:-324px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-6{background-position-y:-396px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-7{background-position-y:-468px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .date{grid-area:date;align-self:end;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .day-of-week{grid-area:dow;align-self:start;font-weight:700;font-size:15px;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{width:50px;height:48px;background-position-x:-56px;filter:none}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .date{font-size:14px;opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .day-of-week{font-size:18px;opacity:1}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{filter:brightness(.8)}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{filter:invert(1)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day{margin-top:26px;width:246px;height:469px;background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-1.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day.alt{background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-2.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container{margin-top:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container>:not(:last-child){margin-bottom:8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time{display:flex;align-items:center;font-weight:700}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent{color:var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item{box-shadow:0 4px 8px 0 #0001,inset 0 0 0 2px var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item .cover-container{margin:2px;border-radius:6px 0 0 6px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time .be-icon{margin-right:6px;font-size:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{display:grid;height:72px;grid-template:"cover title" auto "cover ep" auto/72px 1fr;background-color:#fff;color:inherit;box-shadow:0 4px 8px 0 #0001;border-radius:8px;grid-row-gap:8px;row-gap:8px}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{background-color:#282828}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container{grid-area:cover;overflow:hidden;border-radius:8px 0 0 8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container img{width:100%;height:100%}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay{opacity:.4}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay:hover{opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover{color:var(--theme-color)!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover .cover-container img{transform:scale(1.05)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .title{grid-area:title;align-self:end;font-size:13px;font-weight:700;margin:0 12px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:2.6em;word-break:break-all;line-height:1.3;overflow:hidden}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title{grid-area:ep;align-self:start;margin:0 12px;display:flex;align-items:center}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title .be-icon{color:var(--theme-color);margin-right:4px;font-size:18px;line-height:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day:not(:last-child){margin-right:var(--column-gap)}@media screen and (min-width:1000px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:2}}@media screen and (min-width:1300px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:3}}@media screen and (min-width:1550px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:4}}`,"bangumi-timeline-style");const n={global:"https://bangumi.bilibili.com/web_api/timeline_global",chinese:"https://bangumi.bilibili.com/web_api/timeline_cn"};return{export:Object.assign({template:t},{components:{Icon:()=>i.importAsync("icon.vue"),DpiImg:()=>i.importAsync("dpi-img.vue")},props:{type:{type:String,default:"global",required:false}},data(){return{timeline:[],recentTime:""}},computed:{apiUrl(){return n[this.type]||n.global}},watch:{type(){this.updateTimeline()}},methods:{calculateRecentTime(){const e=this.timeline.find(e=>e.isToday);const i=Number(new Date);const t=Object.entries(e.bangumis).map(([e,i])=>{return{time:e,timestamp:i[0].timestamp,bangumis:i}});if(t.length===0){return}const n=t.filter(e=>e.timestampe.time)}},moveTimeline(e){const i=e.currentTarget;const t=i.parentElement;const n=t.parentElement;const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1])+parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);const o=t.offsetLeft-n.scrollLeft;if(o=m*2){n.scrollLeft+=m}console.log(e,i,t,n);console.log(m,m*2,t.offsetLeft,n.scrollLeft,o)},async updateTimeline(){try{const e=await Ajax.getJsonWithCredentials(this.apiUrl);if(e.code!==0){throw new Error(e.message)}const i=e.result.map(e=>{return{date:e.date,dayOfWeek:e.day_of_week,dayOfWeekText:"周"+[,"一","二","三","四","五","六","日"][e.day_of_week],isToday:Boolean(e.is_today),bangumis:_.groupBy(e.seasons.map(e=>{return{coverUrl:e.cover.replace("http:","https:"),squareCoverUrl:e.square_cover.replace("http:","https:"),time:e.pub_time,timestamp:e.pub_ts*1e3,url:e.url,follow:Boolean(e.follow),epTitle:e.pub_index||e.delay_reason+" "+e.delay_index,title:e.title,delay:Boolean(e.delay),published:Boolean(e.is_published)}}),e=>e.time)}});this.timeline=i;this.calculateRecentTime();setInterval(()=>{if(document.hasFocus()){this.calculateRecentTime()}},60*1e3);await this.$nextTick();const t=this.$el;const n=this.$el.querySelector(".bangumi-timeline");const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1]);const o=parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);n.scrollLeft=5*(m+o)}catch(e){logError(e);this.$emit("error")}finally{this.$emit("load")}}},async mounted(){await this.updateTimeline()}})}}})();
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t,true);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/biliplus-redirect.min.js"] = (()=>{return(i,e)=>{const n=`hd.biliplus.com`;const c=["bilibili.com/video/av","bilibili.com/bangumi/play","bilibili.com/bangumi/media","space.bilibili.com"];return{widget:{condition:()=>{return c.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.assign(document.URL.replace("space.bilibili.com/",`${n}/space/`))}else if(document.URL.includes("/bangumi/")){const i=unsafeWindow.aid||document.querySelector(".av-link,.info-sec-av").innerText.replace(/[aAvV]/g,"");location.assign(`https://${n}/video/av${i}/`)}else{location.host=n}})}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blackboard.min.js"] = (()=>{return(e,t)=>{const r=async()=>{if(dq(".international-home")){const e=await SpinQuery.condition(()=>unsafeWindow["__INITIAL_STATE__"],e=>e!==undefined);return dqa(".home-slide .item").slice(0,5).map((t,r)=>{const i=t.querySelector("a").getAttribute("data-loc-id");return{url:e.locsData[i][r].url,title:t.querySelector(".title").innerText.trim(),isAd:Boolean(t.querySelector(".gg-icon")),imageUrl:t.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}else{const e=dq(".chief-recommend-module .panel");const t=e.querySelector(".pic");const r=e.querySelectorAll(".title > a");return[...t.querySelectorAll("li")].map((e,t)=>{const i=r[t];return{url:i.getAttribute("href"),title:i.innerText.trim(),isAd:Boolean(i.querySelector(".gg-pic")),imageUrl:e.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}};return{export:{getBlackboards:r}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blackboard.vue.min.js"] = (()=>{return(a,r)=>{const i=``;r.applyStyleFromText(`.simple-home .blackboards{display:grid;grid-template-areas:"header header" "dots cards";grid-template-columns:8px 1fr;grid-template-rows:1fr 250px;row-gap:16px;column-gap:16px;align-self:start}.simple-home .blackboards .blackboard-cards{grid-area:cards;--blackboard-width:568.5px;--blackboard-height:250px;width:var(--blackboard-width);height:var(--blackboard-height);border-radius:16px;overflow:hidden}.simple-home .blackboards .blackboard-cards .blackboard-card{width:100%;height:100%;position:relative;display:block;transition:.3s cubic-bezier(.65,.05,.36,1)}.simple-home .blackboards .blackboard-cards .blackboard-card img{width:100%;height:100%;object-fit:fill;display:block}.simple-home .blackboards .blackboard-cards .blackboard-card .title{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);padding:4px 16px;color:#fff;background-color:#000a;font-size:14px;font-weight:700;border-radius:14px;white-space:nowrap;opacity:0}.simple-home .blackboards .blackboard-cards .blackboard-card:hover .title{opacity:1}`,"blackboard-style");return{export:Object.assign({template:i},{components:{Icon:()=>r.importAsync("icon.vue"),"dpi-img":()=>r.importAsync("dpi-img.vue")},data(){return{blackboards:[],interval:0}},destroyed(){if(this.interval){clearInterval(this.interval)}},computed:{cardsContainer(){return this.$el.querySelector(".blackboard-cards")}},async mounted(){const{getBlackboards:a}=await r.importAsync("blackboard");this.blackboards=(await a()).filter(a=>!a.isAd);const i=dq(".blackboards");this.interval=setInterval(()=>{if(!document.hasFocus()||i.matches(".blackboards:hover")){return}const a=parseInt(dq(`.blackboard-radio:checked`).getAttribute("data-index"));let r;if(a===this.blackboards.length-1){r=0}else{r=a+1}dq(`.blackboard-radio[data-index='${r}']`).checked=true},5e3)}})}}})();
@@ -1255,7 +1255,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-subtitle.min.js"] = (()=>{return(t,e)=>{let i;const o=(t,e)=>{const o=document.createElement("a");const n=URL.createObjectURL(new Blob([t]));if(i){URL.revokeObjectURL(i)}i=n;o.setAttribute("href",n);o.setAttribute("download",escapeFilename(e));document.body.appendChild(o);o.click();o.remove()};return{widget:{content:`\n`,condition:videoCondition,success:()=>{const t=dq("#download-subtitle");t.addEventListener("click",async i=>{try{t.disabled=true;const{aid:n,cid:s}=unsafeWindow;if(!n||!s){logError("未找到视频AID和CID");return}const{VideoInfo:l}=await e.importAsync("video-info");const{getFriendlyTitle:c}=await e.importAsync("title");const r=new l(n);r.cid=parseInt(s);await r.fetchInfo();const a=r.subtitles;if(a.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const d=await loadSubtitleSettingsPanel();if(!d){logError("未找到字幕设置");return}const u=d.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const b=a.find(t=>t.language===u)||a[0];const f=await Ajax.getJson(b.url);const p=f.body;const y=c(true);if(i.shiftKey){const{SubtitleConverter:t,SubtitleSize:i,SubtitleLocation:n}=await e.importAsync("subtitle-converter");const s=d.querySelector(".bilibili-player-video-subtitle-setting-fontsize .bui-thumb");const l=parseFloat(s.style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const c={214:i.VeryLarge,163.5:i.Large,107:i.Medium,50.5:i.Small,0:i.VerySmall};const r=c[l];const a=d.querySelector(".bilibili-player-video-subtitle-setting-color .bui-select-result span:first-child");const u=a.getAttribute("style").match(/background:[ ]*(.+);/)[1];const b=d.querySelector(".bilibili-player-video-subtitle-setting-opacity .bui-bar");const f=parseFloat(b.style.transform.replace(/scaleX\(([\d\.]+)/,"$1"));const g=dq(".subtitle-position");const m={bc:n.BottomCenter,bl:n.BottomLeft,br:n.BottomRight,tc:n.TopCenter,tl:n.TopLeft,tr:n.TopRight};const h=Object.entries(m).filter(([t])=>{return g.classList.contains(`subtitle-position-${t}`)}).map(([,t])=>t).shift();const w=dq("video");const v={title:y,height:w.videoHeight,width:w.videoWidth,color:u,location:h,opacity:f,size:r};const S=new t(v);const L=await S.convertToAss(p);o(L,y+".ass")}else{o(JSON.stringify(p),y+".json")}}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background:#8884;color:var(--download-video-foreground)}.download-video .button:hover,.download-video button:hover{background:#8886}.download-video .primary{background:var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(50% - 16px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video i.mdi-alert-circle{font-size:14pt;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#282828}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1);pointer-events:initial}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;flex:1 0 0;outline:0!important;border-color:#dfdfdf}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.html"] = `![]()
警告: 过大的视频大小会在直接下载时占用大量内存, 并可能导致浏览器标签页崩溃. 请考虑降低清晰度或使用导出选项.
预计大小: {{displaySize}}导出
`;
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getFormat(){let t;if(this.selectedTab.name==="manual"){t=f.find(t=>t.displayName===this.manualQualityModel.value)}else{t=d.find(t=>t.displayName===this.qualityModel.value)}if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getManualFormat(){let t;t=f.find(t=>t.displayName===this.manualQualityModel.value);if(!t){console.error(`No format found. model value = ${this.manualQualityModel.value}`);return null}return t},getFormat(){let t;t=d.find(t=>t.displayName===this.qualityModel.value);if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getManualFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getManualFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video-package.min.js"] = (()=>{return(e,t)=>{class n{constructor(e={}){this.config=e;this.entries=[]}download(e,t){const a=document.createElement("a");const i=URL.createObjectURL(t);if(n.lastPackageUrl){URL.revokeObjectURL(n.lastPackageUrl)}n.lastPackageUrl=i;a.setAttribute("href",i);a.setAttribute("download",escapeFilename(e));document.body.appendChild(a);a.click();a.remove()}add(e,t){if(t===null||t===undefined){return}this.entries.push({name:escapeFilename(e),data:t})}async blob(){if(this.entries.length===0){return null}if(this.entries.length===1){const e=this.entries[0].data;return typeof e==="string"?new Blob([e]):e}const e=new JSZip;this.entries.forEach(({name:t,data:n})=>{e.file(t,n)});return await e.generateAsync({type:"blob"})}async emit(e){if(this.entries.length===0){return}if(!e||this.entries.length===1){e=this.entries[0].name}const t=await this.blob();if(!t){return}return this.download(e,t)}static async single(e,t,a={}){const i=new n(a);i.add(e,t);return await i.emit()}}n.lastPackageUrl="";return{export:{DownloadVideoPackage:n}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/dpi-img.vue.min.js"] = (()=>{return(t,e)=>{const s=`
`;return{export:Object.assign({template:s},{props:{size:[Object,Number],src:String,blur:Number,root:HTMLElement,rootMargin:String,threshold:Number,placeholderImage:Boolean},data(){return{srcset:null,actualSrc:null,isPlaceholderActive:false}},watch:{size(){this.sourceChange()},src(){this.sourceChange()}},methods:{sourceChange(){if(this.actualSrc===null||this.srcset===null){return}this.calcSrc()},calcSrc(){const t=!this.src||!this.size;this.isPlaceholderActive=t&&this.placeholderImage;if(t){this.srcset=null;if(this.placeholderImage){this.actualSrc=`https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`}else{this.actualSrc=null}return}let e=this.src;if(e.startsWith("http:")){e=e.replace("http:","https:")}if(e.includes("//static.hdslb.com/images/member/noface.gif")){this.srcset=e;this.actualSrc=e;return}const s=e.substring(e.lastIndexOf(".")+1);this.srcset=getDpiSourceSet(e,this.size,s);this.actualSrc=e}},mounted(){const t={root:this.root,rootMargin:this.rootMargin||"200px",threshold:this.threshold};const e=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){this.calcSrc();e.disconnect()}})},t);e.observe(this.$el)},computed:{width(){if(typeof this.size==="object"&&"width"in this.size){return this.size.width}return null},height(){if(typeof this.size==="object"&&"height"in this.size){return this.size.height}return null},filter(){const t=[];if(this.blur){t.push(`blur(${this.blur}px)`)}return t.join(" ")}}})}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-danmaku.min.js"] = (()=>{return(e,a)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}Observer.videoChange(async()=>{const e=await SpinQuery.select(".bui-collapse-wrap");if(e&&e.classList.contains("bui-collapse-wrap-folded")){const e=await SpinQuery.select(".bui-collapse-header");e.click()}})}})();
@@ -1396,7 +1396,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/v-dropdown.vue.min.js"] = (()=>{return(o,r)=>{const e=`{{ value }}
`;r.applyStyleFromText(`.v-dropdown{--background-color:#eee;position:relative;background-color:var(--background-color);cursor:pointer;display:flex;align-items:center;justify-content:space-between;min-width:100px;border-radius:var(--corner-radius)}body.dark .v-dropdown{--background-color:#333}.v-dropdown.round{border-radius:14px;padding:0 4px}.v-dropdown .dropdown-menu{transform-origin:top;transform:translateY(-4px) translateX(-50%);pointer-events:none;opacity:0;position:absolute;top:calc(100% + 2px);left:50%;background-color:var(--background-color);z-index:1;transition:.2s ease-out;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu.opened{transform:translateY(0) translateX(-50%);pointer-events:initial;opacity:1}.v-dropdown .dropdown-menu li{padding:4px 16px;box-sizing:content-box;white-space:nowrap;min-width:64px;text-align:center;cursor:pointer;color:inherit;background-color:transparent;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.08)}body.dark .v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.16)}.v-dropdown .mdi-chevron-down{font-size:16pt;line-height:1;transform:rotate(0)}.v-dropdown .dropdown-menu.opened~.mdi-chevron-down{transform:rotate(180deg)}.v-dropdown .selected{user-select:none;padding:4px 8px}`,"v-dropdown-style");return{export:Object.assign({template:e},{props:["items","value","round"],data(){return{dropdownOpen:false}},methods:{toggleDropdown(){this.dropdownOpen=!this.dropdownOpen;if(this.dropdownOpen){document.addEventListener("click",o=>{const r=o.target;if(r===this.$el||this.$el.contains(r)){return}this.dropdownOpen=false},{once:true,capture:true})}},select(o){if(o!==this.value){this.$emit("update:value",o);this.$emit("change",o)}}}})}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-card.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{durationText}}
{{watchlater ? '已添加' : '稍后再看'}}
{{title}}
{{description}}
{{upName}}
{{like}}{{coins}}{{favorites}}{{playCount}}{{danmakuCount}}
`;i.applyStyleFromText(`.video-card{display:grid;grid-template-columns:200px 1fr;grid-template-rows:1fr 1fr 1fr;grid-template-areas:"cover title" "cover description" "cover up";height:var(--card-height);width:var(--card-width);color:#000;background-color:#fff;border-radius:16px;box-shadow:0 4px 8px 0 #0001;margin-right:var(--card-margin);margin-bottom:var(--card-margin);position:relative}body.dark .video-card,body.dark .video-card:hover{background-color:#282828;color:#eee}.video-card:hover{color:#000}.video-card.vertical{grid-template-columns:auto auto;grid-template-rows:2fr 1fr 1fr;grid-template-areas:"cover cover" "title title" "up up"}.video-card.vertical .description,.video-card.vertical .topics{display:none}.video-card.vertical .cover-container{border-radius:16px 16px 0 0}.video-card.vertical .title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:3em;word-break:break-all;white-space:normal;line-height:1.5;font-size:11pt}.video-card.vertical .up{align-self:start;white-space:nowrap}.video-card.vertical .up .name{text-overflow:ellipsis;overflow:hidden}.video-card.vertical .up:not(.no-face){margin-left:8px;max-width:calc(var(--card-width) - 16px)}.video-card.vertical .up.no-face{margin-top:8px;max-width:calc(var(--card-width) - 24px)}.video-card.vertical .stats{align-self:end;justify-self:start;margin-bottom:8px;margin-right:0}.video-card>*{justify-self:self-start;align-self:center}.video-card:hover .cover{transform:scale(1.05);transition:.1s cubic-bezier(.39,.58,.57,1)}.video-card:hover .duration,.video-card:hover .watchlater{opacity:1}.video-card .duration,.video-card .watchlater{opacity:0}.video-card .cover-container{grid-area:cover;border-radius:16px 0 0 16px;position:relative;width:100%;height:100%;overflow:hidden}.video-card .cover-container .cover{object-fit:cover;width:100%;height:100%}.video-card .cover-container>:not(.cover){position:absolute}.video-card .cover-container .duration,.video-card .cover-container .watchlater{bottom:6px;padding:4px 8px;background-color:#000a;color:#fff;border-radius:14px;height:24px;box-sizing:border-box}.video-card .cover-container .duration .mdi,.video-card .cover-container .watchlater .mdi{font-size:12pt;line-height:1;margin-right:4px}.video-card .cover-container .duration{left:6px}.video-card .cover-container .watchlater{right:6px;display:flex;align-items:center;padding-left:4px}.video-card .title{grid-area:title;font-size:12pt;font-weight:700;color:inherit;padding:0 12px;white-space:nowrap;overflow:hidden;justify-self:stretch;text-overflow:ellipsis}.video-card .topics{grid-area:description;display:flex;align-items:center;margin-left:12px}.video-card .topics .topic{color:inherit;padding:6px 8px;background-color:#8882;margin-right:8px;border-radius:14px;white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.video-card .topics .topic:hover{background-color:#8884;color:var(--theme-color)}.video-card .description{grid-area:description;color:inherit;overflow:hidden;align-self:stretch;justify-self:stretch;margin:0 12px;line-height:1.5;height:3em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;scrollbar-width:none!important}.video-card .description::-webkit-scrollbar{width:0!important}.video-card .description.single-line{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.video-card .stats,.video-card .up{grid-area:up}.video-card .up{margin-left:12px;display:flex;align-items:center;padding:2px;background-color:#8882;border-radius:14px;color:inherit}.video-card .up.no-face{background-color:transparent;padding:0}.video-card .up.no-face .be-icon{font-size:14pt;opacity:.75}.video-card .up .face{border-radius:50%;width:24px;height:24px}.video-card .up .name{margin:0 8px}.video-card .up:not(.no-face):hover{background-color:#8884}.video-card .up:hover .be-icon,.video-card .up:hover .name{color:var(--theme-color)}.video-card .stats{justify-self:self-end;margin-right:12px;display:flex;align-items:center;opacity:.5}.video-card .stats .be-icon{font-size:12pt;margin:0 4px 0 12px}.video-card .stats .be-icon.be-iconfont-favorites-outline{font-size:14pt}.video-card .stats .be-icon.be-iconfont-coin-outline{font-size:11pt}`,"video-card-style");return{export:Object.assign({template:t},{props:["data","orientation"],store:store,components:{"dpi-img":()=>i.importAsync("dpi-img.vue"),Icon:()=>i.importAsync("icon.vue")},data(){return{upFaceUrl:"",danmakuCount:"",like:"",coins:"",favorites:"",dynamic:"",topics:[],upID:0,epID:0,..._.omit(this.data,"watchlater"),watchlaterInit:this.data.watchlater}},computed:{vertical(){return this.orientation==="vertical"},...Vuex.mapState(["watchlaterList"]),watchlater(){if(getUID()&&this.watchlaterInit!==null){return this.watchlaterList.includes(this.aid)}else{return null}}},methods:{...Vuex.mapActions(["toggleWatchlater"])}})}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-card-info.min.js"] = (()=>{return(r,e)=>{}})();
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a)=>{const r=await Ajax.getJsonWithCredentials(t);const o=r.data||r.result||r;if(r.code!==0||!o.dash){throw new Error("DASH api failed")}const d=o.accept_quality;if(!d.includes(a)){throw new Error("没有找到请求的清晰度")}if(o.quality!==a){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const s=o.accept_description;const c=s[d.indexOf(a)];const n=o.dash.duration;const i=o.dash.video.filter(t=>t.id===a).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:c,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n,videoCodec:e};return r});const h=o.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n}});return{videoDashes:i,audioDashes:h}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a,r=false)=>{const o=await Ajax.getJsonWithCredentials(t);const d=o.data||o.result||o;if(o.code!==0||!d.dash){throw new Error("DASH api failed")}const s=d.accept_quality;if(!s.includes(a)&&!r){throw new Error("没有找到请求的清晰度")}if(d.quality!==a&&!r){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const c=d.accept_description;const n=c[s.indexOf(a)];const i=d.dash.duration;const h=d.dash.video.filter(t=>t.id===(r?d.quality:a)).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:n,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i,videoCodec:e};return r});const l=d.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i}});return{videoDashes:h,audioDashes:l}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-downloader-fragment.min.js"] = (()=>{return(r,e)=>{}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-info.min.js"] = (()=>{return(t,i)=>{class e{constructor(t){this.aid=t}async fetchInfo(){let t;if(this.cid){t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}&cid=${this.cid}`}else{t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`}const i=JSON.parse(await Ajax.getText(t));if(i.code!==0){throw new Error(i.message)}const e=i.data;this.cid=e.cid;this.pageCount=e.videos;this.coverUrl=e.pic;this.tagId=e.tid;this.tagName=e.tname;this.title=e.title;this.description=e.desc;this.up={uid:e.owner.mid,name:e.owner.name,faceUrl:e.owner.face};this.pages=e.pages.map(t=>{return{cid:t.cid,title:t.part,pageNumber:t.page}});this.subtitles=e.subtitle.list.map(t=>{return{id:t.id,languageCode:t.lan,language:t.lan_doc,url:t.subtitle_url.replace("http:","https:")}});return this}async fetchDanmaku(){this.danmaku=new s(this.cid.toString());return this.danmaku.fetchInfo()}}class a{constructor(t,i){this.text=t;this.p=i}}class s{constructor(t){this.cid=t}async fetchInfo(){const t=await Ajax.getText(`https://api.bilibili.com/x/v1/dm/list.so?oid=${this.cid}`);this.rawXML=t}}class n{constructor(t){this.ep=t;this.videos=[]}async fetchInfo(){const t=await Ajax.getText(`https://www.bilibili.com/bangumi/play/ep${this.ep}/`);const i=JSON.parse(t.match(/window\.__INITIAL_STATE__=(.*);\(function\(\){/)[1]);this.title=i.mediaInfo.title;this.cover=i.mediaInfo.cover;this.squareCover=i.mediaInfo.square_cover;this.aid=i.epInfo.aid;this.cid=i.epInfo.cid;this.videos=i.epList.map(async t=>{return{title:t.index_title,aid:t.aid,cid:t.cid,info:await new e(t.aid).fetchInfo()}});return this}}return{export:{VideoInfo:e,BangumiInfo:n,Danmaku:a,DanmakuInfo:s}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-list.vue.min.js"] = (()=>{return(i,e)=>{const a=``;e.applyStyleFromText(`.minimal-home .video-list .empty,.minimal-home .video-list .loading{height:48px;display:flex;align-items:center;justify-content:center;font-size:11pt;color:#707070}.minimal-home .video-list .empty .mdi,.minimal-home .video-list .loading .mdi{margin-right:8px}body.dark .minimal-home .video-list .empty,body.dark .minimal-home .video-list .loading{color:#eee}.minimal-home .video-list .cards{display:flex;flex-wrap:wrap;align-items:flex-end}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1),.minimal-home .video-list .cards.show-rank .video-card:nth-child(17),.minimal-home .video-list .cards.show-rank .video-card:nth-child(9){margin-top:48px}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{position:absolute;top:-42px;left:0;font-size:14pt;font-weight:700}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before{content:"今日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{content:"三日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before{content:"一周"}`,"video-list-style");return{export:Object.assign({template:a},{components:{VideoCard:()=>e.importAsync("video-card.vue")},props:["showRank"],data(){return{cards:[],useVerticalCards:false,loading:true}},methods:{async getRankList(){const{getTrendingVideos:i}=await e.importAsync("trending-videos");const a=async e=>{const a=await i(e);this.cards.push(...a)};await Promise.all([1,3,7].map(a))},async getActivityVideos(){const i=await Ajax.getJsonWithCredentials(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=8`);if(i.code!==0){throw new Error(i.message)}this.cards=i.data.cards.filter(i=>{return i.desc.orig_dy_id===0}).map(i=>{const e=JSON.parse(i.card);const a=_.get(i,"display.topic_info.topic_details",[]).map(i=>{return{id:i.topic_id,name:i.topic_name}});return{id:i.desc.dynamic_id_str,aid:e.aid,title:e.title,upID:i.desc.user_profile.info.uid,upName:i.desc.user_profile.info.uname,upFaceUrl:i.desc.user_profile.info.face,coverUrl:e.pic,description:e.desc,timestamp:i.timestamp,time:new Date(i.timestamp*1e3),topics:a,dynamic:e.dynamic,like:formatCount(i.desc.like),duration:e.duration,durationText:formatDuration(e.duration,0),playCount:formatCount(e.stat.view),danmakuCount:formatCount(e.stat.danmaku),watchlater:true}})}},async mounted(){try{const i=matchMedia("(max-width: 680px)");this.useVerticalCards=i.matches;i.addListener(i=>{this.useVerticalCards=i.matches});if(this.showRank){await this.getRankList()}else{await this.getActivityVideos()}}catch(i){Toast.error(i.message,this.showRank?"热门视频":"视频动态",3e3)}finally{this.loading=false}}})}}})();
diff --git a/bilibili-evolved.preview-offline.user.js b/bilibili-evolved.preview-offline.user.js
index 4ce653b4c..36af88825 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 614.29
+// @version 614.31
// @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中.
// @author Grant Howard, Coulomb-G
// @copyright 2020, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)
@@ -1196,7 +1196,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-draw.min.js"] = (()=>{return(t,n)=>{(async()=>{if(!/^https:\/\/live\.bilibili\.com\/[\d]+/.test(document.URL)){return}const t=await SpinQuery.condition(()=>dq(".chat-popups-section"),t=>t.querySelector("chat-draw-area")===null);if(!t){console.warn("[自动领奖] 未能找到弹窗容器");return}Observer.childListSubtree(t,()=>{let t;console.log("draw button = ",dq(".chat-popups-section .draw>span:nth-child(3)"));t=dq(".chat-popups-section .draw>span:nth-child(3)");if(t===null){const t=dq(".chat-popups-section .function-bar>span:nth-child(3)");if(t!==null){const n=Observer.attributes(t,()=>{if(t.style.display!=="none"){n.forEach(t=>t.stop());t.click()}})}}if(t!==null){t.click()}})})()}})();
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/bangumi-timeline.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{t.date}}
{{t.dayOfWeekText}}
`;i.applyStyleFromText(`.simple-home .bangumi-timeline-container{width:100%}.simple-home .bangumi-timeline-container .bangumi-timeline{display:flex;align-items:flex-start;overflow:auto;scrollbar-width:none!important;scroll-behavior:smooth;--column-count:1;--column-width:250px;--column-gap:24px;width:calc(var(--column-count) * (var(--column-width) + var(--column-gap)) - .5 * var(--column-gap))}.simple-home .bangumi-timeline-container .bangumi-timeline::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day{scroll-snap-align:start;width:var(--column-width);max-height:calc(var(--total-height) - 32px);overflow:auto;flex:0 0 auto;padding-bottom:16px;scroll-behavior:smooth;scrollbar-width:none!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{display:grid;grid-template:"icon date" 1fr "icon dow" 1fr/auto 1fr;grid-column-gap:8px;column-gap:8px;height:60px;padding-bottom:12px;cursor:pointer;position:sticky;top:0;z-index:1;background-color:#f4f4f4}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{background-color:#181818}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{grid-area:icon;justify-self:center;align-self:center;background-image:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/icons.png);background-size:247px 663px;width:38px;height:36px;background-position-x:-146px;filter:brightness(.5)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-1{background-position-y:-36px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-2{background-position-y:-108px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-3{background-position-y:-180px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-4{background-position-y:-252px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-5{background-position-y:-324px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-6{background-position-y:-396px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-7{background-position-y:-468px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .date{grid-area:date;align-self:end;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .day-of-week{grid-area:dow;align-self:start;font-weight:700;font-size:15px;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{width:50px;height:48px;background-position-x:-56px;filter:none}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .date{font-size:14px;opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .day-of-week{font-size:18px;opacity:1}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{filter:brightness(.8)}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{filter:invert(1)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day{margin-top:26px;width:246px;height:469px;background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-1.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day.alt{background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-2.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container{margin-top:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container>:not(:last-child){margin-bottom:8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time{display:flex;align-items:center;font-weight:700}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent{color:var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item{box-shadow:0 4px 8px 0 #0001,inset 0 0 0 2px var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item .cover-container{margin:2px;border-radius:6px 0 0 6px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time .be-icon{margin-right:6px;font-size:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{display:grid;height:72px;grid-template:"cover title" auto "cover ep" auto/72px 1fr;background-color:#fff;color:inherit;box-shadow:0 4px 8px 0 #0001;border-radius:8px;grid-row-gap:8px;row-gap:8px}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{background-color:#282828}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container{grid-area:cover;overflow:hidden;border-radius:8px 0 0 8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container img{width:100%;height:100%}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay{opacity:.4}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay:hover{opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover{color:var(--theme-color)!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover .cover-container img{transform:scale(1.05)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .title{grid-area:title;align-self:end;font-size:13px;font-weight:700;margin:0 12px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:2.6em;word-break:break-all;line-height:1.3;overflow:hidden}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title{grid-area:ep;align-self:start;margin:0 12px;display:flex;align-items:center}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title .be-icon{color:var(--theme-color);margin-right:4px;font-size:18px;line-height:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day:not(:last-child){margin-right:var(--column-gap)}@media screen and (min-width:1000px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:2}}@media screen and (min-width:1300px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:3}}@media screen and (min-width:1550px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:4}}`,"bangumi-timeline-style");const n={global:"https://bangumi.bilibili.com/web_api/timeline_global",chinese:"https://bangumi.bilibili.com/web_api/timeline_cn"};return{export:Object.assign({template:t},{components:{Icon:()=>i.importAsync("icon.vue"),DpiImg:()=>i.importAsync("dpi-img.vue")},props:{type:{type:String,default:"global",required:false}},data(){return{timeline:[],recentTime:""}},computed:{apiUrl(){return n[this.type]||n.global}},watch:{type(){this.updateTimeline()}},methods:{calculateRecentTime(){const e=this.timeline.find(e=>e.isToday);const i=Number(new Date);const t=Object.entries(e.bangumis).map(([e,i])=>{return{time:e,timestamp:i[0].timestamp,bangumis:i}});if(t.length===0){return}const n=t.filter(e=>e.timestampe.time)}},moveTimeline(e){const i=e.currentTarget;const t=i.parentElement;const n=t.parentElement;const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1])+parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);const o=t.offsetLeft-n.scrollLeft;if(o=m*2){n.scrollLeft+=m}console.log(e,i,t,n);console.log(m,m*2,t.offsetLeft,n.scrollLeft,o)},async updateTimeline(){try{const e=await Ajax.getJsonWithCredentials(this.apiUrl);if(e.code!==0){throw new Error(e.message)}const i=e.result.map(e=>{return{date:e.date,dayOfWeek:e.day_of_week,dayOfWeekText:"周"+[,"一","二","三","四","五","六","日"][e.day_of_week],isToday:Boolean(e.is_today),bangumis:_.groupBy(e.seasons.map(e=>{return{coverUrl:e.cover.replace("http:","https:"),squareCoverUrl:e.square_cover.replace("http:","https:"),time:e.pub_time,timestamp:e.pub_ts*1e3,url:e.url,follow:Boolean(e.follow),epTitle:e.pub_index||e.delay_reason+" "+e.delay_index,title:e.title,delay:Boolean(e.delay),published:Boolean(e.is_published)}}),e=>e.time)}});this.timeline=i;this.calculateRecentTime();setInterval(()=>{if(document.hasFocus()){this.calculateRecentTime()}},60*1e3);await this.$nextTick();const t=this.$el;const n=this.$el.querySelector(".bangumi-timeline");const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1]);const o=parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);n.scrollLeft=5*(m+o)}catch(e){logError(e);this.$emit("error")}finally{this.$emit("load")}}},async mounted(){await this.updateTimeline()}})}}})();
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t,true);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/biliplus-redirect.min.js"] = (()=>{return(i,e)=>{const n=`hd.biliplus.com`;const c=["bilibili.com/video/av","bilibili.com/bangumi/play","bilibili.com/bangumi/media","space.bilibili.com"];return{widget:{condition:()=>{return c.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.assign(document.URL.replace("space.bilibili.com/",`${n}/space/`))}else if(document.URL.includes("/bangumi/")){const i=unsafeWindow.aid||document.querySelector(".av-link,.info-sec-av").innerText.replace(/[aAvV]/g,"");location.assign(`https://${n}/video/av${i}/`)}else{location.host=n}})}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blackboard.min.js"] = (()=>{return(e,t)=>{const r=async()=>{if(dq(".international-home")){const e=await SpinQuery.condition(()=>unsafeWindow["__INITIAL_STATE__"],e=>e!==undefined);return dqa(".home-slide .item").slice(0,5).map((t,r)=>{const i=t.querySelector("a").getAttribute("data-loc-id");return{url:e.locsData[i][r].url,title:t.querySelector(".title").innerText.trim(),isAd:Boolean(t.querySelector(".gg-icon")),imageUrl:t.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}else{const e=dq(".chief-recommend-module .panel");const t=e.querySelector(".pic");const r=e.querySelectorAll(".title > a");return[...t.querySelectorAll("li")].map((e,t)=>{const i=r[t];return{url:i.getAttribute("href"),title:i.innerText.trim(),isAd:Boolean(i.querySelector(".gg-pic")),imageUrl:e.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}};return{export:{getBlackboards:r}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blackboard.vue.min.js"] = (()=>{return(a,r)=>{const i=``;r.applyStyleFromText(`.simple-home .blackboards{display:grid;grid-template-areas:"header header" "dots cards";grid-template-columns:8px 1fr;grid-template-rows:1fr 250px;row-gap:16px;column-gap:16px;align-self:start}.simple-home .blackboards .blackboard-cards{grid-area:cards;--blackboard-width:568.5px;--blackboard-height:250px;width:var(--blackboard-width);height:var(--blackboard-height);border-radius:16px;overflow:hidden}.simple-home .blackboards .blackboard-cards .blackboard-card{width:100%;height:100%;position:relative;display:block;transition:.3s cubic-bezier(.65,.05,.36,1)}.simple-home .blackboards .blackboard-cards .blackboard-card img{width:100%;height:100%;object-fit:fill;display:block}.simple-home .blackboards .blackboard-cards .blackboard-card .title{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);padding:4px 16px;color:#fff;background-color:#000a;font-size:14px;font-weight:700;border-radius:14px;white-space:nowrap;opacity:0}.simple-home .blackboards .blackboard-cards .blackboard-card:hover .title{opacity:1}`,"blackboard-style");return{export:Object.assign({template:i},{components:{Icon:()=>r.importAsync("icon.vue"),"dpi-img":()=>r.importAsync("dpi-img.vue")},data(){return{blackboards:[],interval:0}},destroyed(){if(this.interval){clearInterval(this.interval)}},computed:{cardsContainer(){return this.$el.querySelector(".blackboard-cards")}},async mounted(){const{getBlackboards:a}=await r.importAsync("blackboard");this.blackboards=(await a()).filter(a=>!a.isAd);const i=dq(".blackboards");this.interval=setInterval(()=>{if(!document.hasFocus()||i.matches(".blackboards:hover")){return}const a=parseInt(dq(`.blackboard-radio:checked`).getAttribute("data-index"));let r;if(a===this.blackboards.length-1){r=0}else{r=a+1}dq(`.blackboard-radio[data-index='${r}']`).checked=true},5e3)}})}}})();
@@ -1255,7 +1255,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-subtitle.min.js"] = (()=>{return(t,e)=>{let i;const o=(t,e)=>{const o=document.createElement("a");const n=URL.createObjectURL(new Blob([t]));if(i){URL.revokeObjectURL(i)}i=n;o.setAttribute("href",n);o.setAttribute("download",escapeFilename(e));document.body.appendChild(o);o.click();o.remove()};return{widget:{content:`\n`,condition:videoCondition,success:()=>{const t=dq("#download-subtitle");t.addEventListener("click",async i=>{try{t.disabled=true;const{aid:n,cid:s}=unsafeWindow;if(!n||!s){logError("未找到视频AID和CID");return}const{VideoInfo:l}=await e.importAsync("video-info");const{getFriendlyTitle:c}=await e.importAsync("title");const r=new l(n);r.cid=parseInt(s);await r.fetchInfo();const a=r.subtitles;if(a.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const d=await loadSubtitleSettingsPanel();if(!d){logError("未找到字幕设置");return}const u=d.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const b=a.find(t=>t.language===u)||a[0];const f=await Ajax.getJson(b.url);const p=f.body;const y=c(true);if(i.shiftKey){const{SubtitleConverter:t,SubtitleSize:i,SubtitleLocation:n}=await e.importAsync("subtitle-converter");const s=d.querySelector(".bilibili-player-video-subtitle-setting-fontsize .bui-thumb");const l=parseFloat(s.style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const c={214:i.VeryLarge,163.5:i.Large,107:i.Medium,50.5:i.Small,0:i.VerySmall};const r=c[l];const a=d.querySelector(".bilibili-player-video-subtitle-setting-color .bui-select-result span:first-child");const u=a.getAttribute("style").match(/background:[ ]*(.+);/)[1];const b=d.querySelector(".bilibili-player-video-subtitle-setting-opacity .bui-bar");const f=parseFloat(b.style.transform.replace(/scaleX\(([\d\.]+)/,"$1"));const g=dq(".subtitle-position");const m={bc:n.BottomCenter,bl:n.BottomLeft,br:n.BottomRight,tc:n.TopCenter,tl:n.TopLeft,tr:n.TopRight};const h=Object.entries(m).filter(([t])=>{return g.classList.contains(`subtitle-position-${t}`)}).map(([,t])=>t).shift();const w=dq("video");const v={title:y,height:w.videoHeight,width:w.videoWidth,color:u,location:h,opacity:f,size:r};const S=new t(v);const L=await S.convertToAss(p);o(L,y+".ass")}else{o(JSON.stringify(p),y+".json")}}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background:#8884;color:var(--download-video-foreground)}.download-video .button:hover,.download-video button:hover{background:#8886}.download-video .primary{background:var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(50% - 16px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video i.mdi-alert-circle{font-size:14pt;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#282828}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1);pointer-events:initial}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;flex:1 0 0;outline:0!important;border-color:#dfdfdf}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.html"] = `![]()
警告: 过大的视频大小会在直接下载时占用大量内存, 并可能导致浏览器标签页崩溃. 请考虑降低清晰度或使用导出选项.
预计大小: {{displaySize}}导出
`;
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getFormat(){let t;if(this.selectedTab.name==="manual"){t=f.find(t=>t.displayName===this.manualQualityModel.value)}else{t=d.find(t=>t.displayName===this.qualityModel.value)}if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getManualFormat(){let t;t=f.find(t=>t.displayName===this.manualQualityModel.value);if(!t){console.error(`No format found. model value = ${this.manualQualityModel.value}`);return null}return t},getFormat(){let t;t=d.find(t=>t.displayName===this.qualityModel.value);if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getManualFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getManualFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video-package.min.js"] = (()=>{return(e,t)=>{class n{constructor(e={}){this.config=e;this.entries=[]}download(e,t){const a=document.createElement("a");const i=URL.createObjectURL(t);if(n.lastPackageUrl){URL.revokeObjectURL(n.lastPackageUrl)}n.lastPackageUrl=i;a.setAttribute("href",i);a.setAttribute("download",escapeFilename(e));document.body.appendChild(a);a.click();a.remove()}add(e,t){if(t===null||t===undefined){return}this.entries.push({name:escapeFilename(e),data:t})}async blob(){if(this.entries.length===0){return null}if(this.entries.length===1){const e=this.entries[0].data;return typeof e==="string"?new Blob([e]):e}const e=new JSZip;this.entries.forEach(({name:t,data:n})=>{e.file(t,n)});return await e.generateAsync({type:"blob"})}async emit(e){if(this.entries.length===0){return}if(!e||this.entries.length===1){e=this.entries[0].name}const t=await this.blob();if(!t){return}return this.download(e,t)}static async single(e,t,a={}){const i=new n(a);i.add(e,t);return await i.emit()}}n.lastPackageUrl="";return{export:{DownloadVideoPackage:n}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/dpi-img.vue.min.js"] = (()=>{return(t,e)=>{const s=`
`;return{export:Object.assign({template:s},{props:{size:[Object,Number],src:String,blur:Number,root:HTMLElement,rootMargin:String,threshold:Number,placeholderImage:Boolean},data(){return{srcset:null,actualSrc:null,isPlaceholderActive:false}},watch:{size(){this.sourceChange()},src(){this.sourceChange()}},methods:{sourceChange(){if(this.actualSrc===null||this.srcset===null){return}this.calcSrc()},calcSrc(){const t=!this.src||!this.size;this.isPlaceholderActive=t&&this.placeholderImage;if(t){this.srcset=null;if(this.placeholderImage){this.actualSrc=`https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`}else{this.actualSrc=null}return}let e=this.src;if(e.startsWith("http:")){e=e.replace("http:","https:")}if(e.includes("//static.hdslb.com/images/member/noface.gif")){this.srcset=e;this.actualSrc=e;return}const s=e.substring(e.lastIndexOf(".")+1);this.srcset=getDpiSourceSet(e,this.size,s);this.actualSrc=e}},mounted(){const t={root:this.root,rootMargin:this.rootMargin||"200px",threshold:this.threshold};const e=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){this.calcSrc();e.disconnect()}})},t);e.observe(this.$el)},computed:{width(){if(typeof this.size==="object"&&"width"in this.size){return this.size.width}return null},height(){if(typeof this.size==="object"&&"height"in this.size){return this.size.height}return null},filter(){const t=[];if(this.blur){t.push(`blur(${this.blur}px)`)}return t.join(" ")}}})}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-danmaku.min.js"] = (()=>{return(e,a)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}Observer.videoChange(async()=>{const e=await SpinQuery.select(".bui-collapse-wrap");if(e&&e.classList.contains("bui-collapse-wrap-folded")){const e=await SpinQuery.select(".bui-collapse-header");e.click()}})}})();
@@ -1396,7 +1396,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/v-dropdown.vue.min.js"] = (()=>{return(o,r)=>{const e=`{{ value }}
`;r.applyStyleFromText(`.v-dropdown{--background-color:#eee;position:relative;background-color:var(--background-color);cursor:pointer;display:flex;align-items:center;justify-content:space-between;min-width:100px;border-radius:var(--corner-radius)}body.dark .v-dropdown{--background-color:#333}.v-dropdown.round{border-radius:14px;padding:0 4px}.v-dropdown .dropdown-menu{transform-origin:top;transform:translateY(-4px) translateX(-50%);pointer-events:none;opacity:0;position:absolute;top:calc(100% + 2px);left:50%;background-color:var(--background-color);z-index:1;transition:.2s ease-out;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu.opened{transform:translateY(0) translateX(-50%);pointer-events:initial;opacity:1}.v-dropdown .dropdown-menu li{padding:4px 16px;box-sizing:content-box;white-space:nowrap;min-width:64px;text-align:center;cursor:pointer;color:inherit;background-color:transparent;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.08)}body.dark .v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.16)}.v-dropdown .mdi-chevron-down{font-size:16pt;line-height:1;transform:rotate(0)}.v-dropdown .dropdown-menu.opened~.mdi-chevron-down{transform:rotate(180deg)}.v-dropdown .selected{user-select:none;padding:4px 8px}`,"v-dropdown-style");return{export:Object.assign({template:e},{props:["items","value","round"],data(){return{dropdownOpen:false}},methods:{toggleDropdown(){this.dropdownOpen=!this.dropdownOpen;if(this.dropdownOpen){document.addEventListener("click",o=>{const r=o.target;if(r===this.$el||this.$el.contains(r)){return}this.dropdownOpen=false},{once:true,capture:true})}},select(o){if(o!==this.value){this.$emit("update:value",o);this.$emit("change",o)}}}})}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-card.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{durationText}}
{{watchlater ? '已添加' : '稍后再看'}}
{{title}}
{{description}}
{{upName}}
{{like}}{{coins}}{{favorites}}{{playCount}}{{danmakuCount}}
`;i.applyStyleFromText(`.video-card{display:grid;grid-template-columns:200px 1fr;grid-template-rows:1fr 1fr 1fr;grid-template-areas:"cover title" "cover description" "cover up";height:var(--card-height);width:var(--card-width);color:#000;background-color:#fff;border-radius:16px;box-shadow:0 4px 8px 0 #0001;margin-right:var(--card-margin);margin-bottom:var(--card-margin);position:relative}body.dark .video-card,body.dark .video-card:hover{background-color:#282828;color:#eee}.video-card:hover{color:#000}.video-card.vertical{grid-template-columns:auto auto;grid-template-rows:2fr 1fr 1fr;grid-template-areas:"cover cover" "title title" "up up"}.video-card.vertical .description,.video-card.vertical .topics{display:none}.video-card.vertical .cover-container{border-radius:16px 16px 0 0}.video-card.vertical .title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:3em;word-break:break-all;white-space:normal;line-height:1.5;font-size:11pt}.video-card.vertical .up{align-self:start;white-space:nowrap}.video-card.vertical .up .name{text-overflow:ellipsis;overflow:hidden}.video-card.vertical .up:not(.no-face){margin-left:8px;max-width:calc(var(--card-width) - 16px)}.video-card.vertical .up.no-face{margin-top:8px;max-width:calc(var(--card-width) - 24px)}.video-card.vertical .stats{align-self:end;justify-self:start;margin-bottom:8px;margin-right:0}.video-card>*{justify-self:self-start;align-self:center}.video-card:hover .cover{transform:scale(1.05);transition:.1s cubic-bezier(.39,.58,.57,1)}.video-card:hover .duration,.video-card:hover .watchlater{opacity:1}.video-card .duration,.video-card .watchlater{opacity:0}.video-card .cover-container{grid-area:cover;border-radius:16px 0 0 16px;position:relative;width:100%;height:100%;overflow:hidden}.video-card .cover-container .cover{object-fit:cover;width:100%;height:100%}.video-card .cover-container>:not(.cover){position:absolute}.video-card .cover-container .duration,.video-card .cover-container .watchlater{bottom:6px;padding:4px 8px;background-color:#000a;color:#fff;border-radius:14px;height:24px;box-sizing:border-box}.video-card .cover-container .duration .mdi,.video-card .cover-container .watchlater .mdi{font-size:12pt;line-height:1;margin-right:4px}.video-card .cover-container .duration{left:6px}.video-card .cover-container .watchlater{right:6px;display:flex;align-items:center;padding-left:4px}.video-card .title{grid-area:title;font-size:12pt;font-weight:700;color:inherit;padding:0 12px;white-space:nowrap;overflow:hidden;justify-self:stretch;text-overflow:ellipsis}.video-card .topics{grid-area:description;display:flex;align-items:center;margin-left:12px}.video-card .topics .topic{color:inherit;padding:6px 8px;background-color:#8882;margin-right:8px;border-radius:14px;white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.video-card .topics .topic:hover{background-color:#8884;color:var(--theme-color)}.video-card .description{grid-area:description;color:inherit;overflow:hidden;align-self:stretch;justify-self:stretch;margin:0 12px;line-height:1.5;height:3em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;scrollbar-width:none!important}.video-card .description::-webkit-scrollbar{width:0!important}.video-card .description.single-line{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.video-card .stats,.video-card .up{grid-area:up}.video-card .up{margin-left:12px;display:flex;align-items:center;padding:2px;background-color:#8882;border-radius:14px;color:inherit}.video-card .up.no-face{background-color:transparent;padding:0}.video-card .up.no-face .be-icon{font-size:14pt;opacity:.75}.video-card .up .face{border-radius:50%;width:24px;height:24px}.video-card .up .name{margin:0 8px}.video-card .up:not(.no-face):hover{background-color:#8884}.video-card .up:hover .be-icon,.video-card .up:hover .name{color:var(--theme-color)}.video-card .stats{justify-self:self-end;margin-right:12px;display:flex;align-items:center;opacity:.5}.video-card .stats .be-icon{font-size:12pt;margin:0 4px 0 12px}.video-card .stats .be-icon.be-iconfont-favorites-outline{font-size:14pt}.video-card .stats .be-icon.be-iconfont-coin-outline{font-size:11pt}`,"video-card-style");return{export:Object.assign({template:t},{props:["data","orientation"],store:store,components:{"dpi-img":()=>i.importAsync("dpi-img.vue"),Icon:()=>i.importAsync("icon.vue")},data(){return{upFaceUrl:"",danmakuCount:"",like:"",coins:"",favorites:"",dynamic:"",topics:[],upID:0,epID:0,..._.omit(this.data,"watchlater"),watchlaterInit:this.data.watchlater}},computed:{vertical(){return this.orientation==="vertical"},...Vuex.mapState(["watchlaterList"]),watchlater(){if(getUID()&&this.watchlaterInit!==null){return this.watchlaterList.includes(this.aid)}else{return null}}},methods:{...Vuex.mapActions(["toggleWatchlater"])}})}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-card-info.min.js"] = (()=>{return(r,e)=>{}})();
-offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a)=>{const r=await Ajax.getJsonWithCredentials(t);const o=r.data||r.result||r;if(r.code!==0||!o.dash){throw new Error("DASH api failed")}const d=o.accept_quality;if(!d.includes(a)){throw new Error("没有找到请求的清晰度")}if(o.quality!==a){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const s=o.accept_description;const c=s[d.indexOf(a)];const n=o.dash.duration;const i=o.dash.video.filter(t=>t.id===a).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:c,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n,videoCodec:e};return r});const h=o.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n}});return{videoDashes:i,audioDashes:h}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
+offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a,r=false)=>{const o=await Ajax.getJsonWithCredentials(t);const d=o.data||o.result||o;if(o.code!==0||!d.dash){throw new Error("DASH api failed")}const s=d.accept_quality;if(!s.includes(a)&&!r){throw new Error("没有找到请求的清晰度")}if(d.quality!==a&&!r){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const c=d.accept_description;const n=c[s.indexOf(a)];const i=d.dash.duration;const h=d.dash.video.filter(t=>t.id===(r?d.quality:a)).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:n,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i,videoCodec:e};return r});const l=d.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i}});return{videoDashes:h,audioDashes:l}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-downloader-fragment.min.js"] = (()=>{return(r,e)=>{}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-info.min.js"] = (()=>{return(t,i)=>{class e{constructor(t){this.aid=t}async fetchInfo(){let t;if(this.cid){t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}&cid=${this.cid}`}else{t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`}const i=JSON.parse(await Ajax.getText(t));if(i.code!==0){throw new Error(i.message)}const e=i.data;this.cid=e.cid;this.pageCount=e.videos;this.coverUrl=e.pic;this.tagId=e.tid;this.tagName=e.tname;this.title=e.title;this.description=e.desc;this.up={uid:e.owner.mid,name:e.owner.name,faceUrl:e.owner.face};this.pages=e.pages.map(t=>{return{cid:t.cid,title:t.part,pageNumber:t.page}});this.subtitles=e.subtitle.list.map(t=>{return{id:t.id,languageCode:t.lan,language:t.lan_doc,url:t.subtitle_url.replace("http:","https:")}});return this}async fetchDanmaku(){this.danmaku=new s(this.cid.toString());return this.danmaku.fetchInfo()}}class a{constructor(t,i){this.text=t;this.p=i}}class s{constructor(t){this.cid=t}async fetchInfo(){const t=await Ajax.getText(`https://api.bilibili.com/x/v1/dm/list.so?oid=${this.cid}`);this.rawXML=t}}class n{constructor(t){this.ep=t;this.videos=[]}async fetchInfo(){const t=await Ajax.getText(`https://www.bilibili.com/bangumi/play/ep${this.ep}/`);const i=JSON.parse(t.match(/window\.__INITIAL_STATE__=(.*);\(function\(\){/)[1]);this.title=i.mediaInfo.title;this.cover=i.mediaInfo.cover;this.squareCover=i.mediaInfo.square_cover;this.aid=i.epInfo.aid;this.cid=i.epInfo.cid;this.videos=i.epList.map(async t=>{return{title:t.index_title,aid:t.aid,cid:t.cid,info:await new e(t.aid).fetchInfo()}});return this}}return{export:{VideoInfo:e,BangumiInfo:n,Danmaku:a,DanmakuInfo:s}}}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-list.vue.min.js"] = (()=>{return(i,e)=>{const a=``;e.applyStyleFromText(`.minimal-home .video-list .empty,.minimal-home .video-list .loading{height:48px;display:flex;align-items:center;justify-content:center;font-size:11pt;color:#707070}.minimal-home .video-list .empty .mdi,.minimal-home .video-list .loading .mdi{margin-right:8px}body.dark .minimal-home .video-list .empty,body.dark .minimal-home .video-list .loading{color:#eee}.minimal-home .video-list .cards{display:flex;flex-wrap:wrap;align-items:flex-end}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1),.minimal-home .video-list .cards.show-rank .video-card:nth-child(17),.minimal-home .video-list .cards.show-rank .video-card:nth-child(9){margin-top:48px}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{position:absolute;top:-42px;left:0;font-size:14pt;font-weight:700}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before{content:"今日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{content:"三日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before{content:"一周"}`,"video-list-style");return{export:Object.assign({template:a},{components:{VideoCard:()=>e.importAsync("video-card.vue")},props:["showRank"],data(){return{cards:[],useVerticalCards:false,loading:true}},methods:{async getRankList(){const{getTrendingVideos:i}=await e.importAsync("trending-videos");const a=async e=>{const a=await i(e);this.cards.push(...a)};await Promise.all([1,3,7].map(a))},async getActivityVideos(){const i=await Ajax.getJsonWithCredentials(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=8`);if(i.code!==0){throw new Error(i.message)}this.cards=i.data.cards.filter(i=>{return i.desc.orig_dy_id===0}).map(i=>{const e=JSON.parse(i.card);const a=_.get(i,"display.topic_info.topic_details",[]).map(i=>{return{id:i.topic_id,name:i.topic_name}});return{id:i.desc.dynamic_id_str,aid:e.aid,title:e.title,upID:i.desc.user_profile.info.uid,upName:i.desc.user_profile.info.uname,upFaceUrl:i.desc.user_profile.info.face,coverUrl:e.pic,description:e.desc,timestamp:i.timestamp,time:new Date(i.timestamp*1e3),topics:a,dynamic:e.dynamic,like:formatCount(i.desc.like),duration:e.duration,durationText:formatDuration(e.duration,0),playCount:formatCount(e.stat.view),danmakuCount:formatCount(e.stat.danmaku),watchlater:true}})}},async mounted(){try{const i=matchMedia("(max-width: 680px)");this.useVerticalCards=i.matches;i.addListener(i=>{this.useVerticalCards=i.matches});if(this.showRank){await this.getRankList()}else{await this.getActivityVideos()}}catch(i){Toast.error(i.message,this.showRank?"热门视频":"视频动态",3e3)}finally{this.loading=false}}})}}})();
diff --git a/bilibili-evolved.preview.user.js b/bilibili-evolved.preview.user.js
index 9b48db0b6..8ad190f2b 100644
--- a/bilibili-evolved.preview.user.js
+++ b/bilibili-evolved.preview.user.js
@@ -1195,7 +1195,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/m
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/auto-draw.min.js"] = (()=>{return(t,n)=>{(async()=>{if(!/^https:\/\/live\.bilibili\.com\/[\d]+/.test(document.URL)){return}const t=await SpinQuery.condition(()=>dq(".chat-popups-section"),t=>t.querySelector("chat-draw-area")===null);if(!t){console.warn("[自动领奖] 未能找到弹窗容器");return}Observer.childListSubtree(t,()=>{let t;console.log("draw button = ",dq(".chat-popups-section .draw>span:nth-child(3)"));t=dq(".chat-popups-section .draw>span:nth-child(3)");if(t===null){const t=dq(".chat-popups-section .function-bar>span:nth-child(3)");if(t!==null){const n=Observer.attributes(t,()=>{if(t.style.display!=="none"){n.forEach(t=>t.stop());t.click()}})}}if(t!==null){t.click()}})})()}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/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())}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/bangumi-timeline.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{t.date}}
{{t.dayOfWeekText}}
`;i.applyStyleFromText(`.simple-home .bangumi-timeline-container{width:100%}.simple-home .bangumi-timeline-container .bangumi-timeline{display:flex;align-items:flex-start;overflow:auto;scrollbar-width:none!important;scroll-behavior:smooth;--column-count:1;--column-width:250px;--column-gap:24px;width:calc(var(--column-count) * (var(--column-width) + var(--column-gap)) - .5 * var(--column-gap))}.simple-home .bangumi-timeline-container .bangumi-timeline::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day{scroll-snap-align:start;width:var(--column-width);max-height:calc(var(--total-height) - 32px);overflow:auto;flex:0 0 auto;padding-bottom:16px;scroll-behavior:smooth;scrollbar-width:none!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{display:grid;grid-template:"icon date" 1fr "icon dow" 1fr/auto 1fr;grid-column-gap:8px;column-gap:8px;height:60px;padding-bottom:12px;cursor:pointer;position:sticky;top:0;z-index:1;background-color:#f4f4f4}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{background-color:#181818}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{grid-area:icon;justify-self:center;align-self:center;background-image:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/icons.png);background-size:247px 663px;width:38px;height:36px;background-position-x:-146px;filter:brightness(.5)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-1{background-position-y:-36px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-2{background-position-y:-108px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-3{background-position-y:-180px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-4{background-position-y:-252px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-5{background-position-y:-324px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-6{background-position-y:-396px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-7{background-position-y:-468px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .date{grid-area:date;align-self:end;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .day-of-week{grid-area:dow;align-self:start;font-weight:700;font-size:15px;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{width:50px;height:48px;background-position-x:-56px;filter:none}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .date{font-size:14px;opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .day-of-week{font-size:18px;opacity:1}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{filter:brightness(.8)}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{filter:invert(1)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day{margin-top:26px;width:246px;height:469px;background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-1.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day.alt{background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-2.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container{margin-top:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container>:not(:last-child){margin-bottom:8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time{display:flex;align-items:center;font-weight:700}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent{color:var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item{box-shadow:0 4px 8px 0 #0001,inset 0 0 0 2px var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item .cover-container{margin:2px;border-radius:6px 0 0 6px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time .be-icon{margin-right:6px;font-size:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{display:grid;height:72px;grid-template:"cover title" auto "cover ep" auto/72px 1fr;background-color:#fff;color:inherit;box-shadow:0 4px 8px 0 #0001;border-radius:8px;grid-row-gap:8px;row-gap:8px}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{background-color:#282828}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container{grid-area:cover;overflow:hidden;border-radius:8px 0 0 8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container img{width:100%;height:100%}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay{opacity:.4}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay:hover{opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover{color:var(--theme-color)!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover .cover-container img{transform:scale(1.05)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .title{grid-area:title;align-self:end;font-size:13px;font-weight:700;margin:0 12px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:2.6em;word-break:break-all;line-height:1.3;overflow:hidden}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title{grid-area:ep;align-self:start;margin:0 12px;display:flex;align-items:center}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title .be-icon{color:var(--theme-color);margin-right:4px;font-size:18px;line-height:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day:not(:last-child){margin-right:var(--column-gap)}@media screen and (min-width:1000px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:2}}@media screen and (min-width:1300px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:3}}@media screen and (min-width:1550px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:4}}`,"bangumi-timeline-style");const n={global:"https://bangumi.bilibili.com/web_api/timeline_global",chinese:"https://bangumi.bilibili.com/web_api/timeline_cn"};return{export:Object.assign({template:t},{components:{Icon:()=>i.importAsync("icon.vue"),DpiImg:()=>i.importAsync("dpi-img.vue")},props:{type:{type:String,default:"global",required:false}},data(){return{timeline:[],recentTime:""}},computed:{apiUrl(){return n[this.type]||n.global}},watch:{type(){this.updateTimeline()}},methods:{calculateRecentTime(){const e=this.timeline.find(e=>e.isToday);const i=Number(new Date);const t=Object.entries(e.bangumis).map(([e,i])=>{return{time:e,timestamp:i[0].timestamp,bangumis:i}});if(t.length===0){return}const n=t.filter(e=>e.timestampe.time)}},moveTimeline(e){const i=e.currentTarget;const t=i.parentElement;const n=t.parentElement;const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1])+parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);const o=t.offsetLeft-n.scrollLeft;if(o=m*2){n.scrollLeft+=m}console.log(e,i,t,n);console.log(m,m*2,t.offsetLeft,n.scrollLeft,o)},async updateTimeline(){try{const e=await Ajax.getJsonWithCredentials(this.apiUrl);if(e.code!==0){throw new Error(e.message)}const i=e.result.map(e=>{return{date:e.date,dayOfWeek:e.day_of_week,dayOfWeekText:"周"+[,"一","二","三","四","五","六","日"][e.day_of_week],isToday:Boolean(e.is_today),bangumis:_.groupBy(e.seasons.map(e=>{return{coverUrl:e.cover.replace("http:","https:"),squareCoverUrl:e.square_cover.replace("http:","https:"),time:e.pub_time,timestamp:e.pub_ts*1e3,url:e.url,follow:Boolean(e.follow),epTitle:e.pub_index||e.delay_reason+" "+e.delay_index,title:e.title,delay:Boolean(e.delay),published:Boolean(e.is_published)}}),e=>e.time)}});this.timeline=i;this.calculateRecentTime();setInterval(()=>{if(document.hasFocus()){this.calculateRecentTime()}},60*1e3);await this.$nextTick();const t=this.$el;const n=this.$el.querySelector(".bangumi-timeline");const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1]);const o=parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);n.scrollLeft=5*(m+o)}catch(e){logError(e);this.$emit("error")}finally{this.$emit("load")}}},async mounted(){await this.updateTimeline()}})}}})();
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t,true);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/biliplus-redirect.min.js"] = (()=>{return(i,e)=>{const n=`hd.biliplus.com`;const c=["bilibili.com/video/av","bilibili.com/bangumi/play","bilibili.com/bangumi/media","space.bilibili.com"];return{widget:{condition:()=>{return c.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.assign(document.URL.replace("space.bilibili.com/",`${n}/space/`))}else if(document.URL.includes("/bangumi/")){const i=unsafeWindow.aid||document.querySelector(".av-link,.info-sec-av").innerText.replace(/[aAvV]/g,"");location.assign(`https://${n}/video/av${i}/`)}else{location.host=n}})}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/blackboard.min.js"] = (()=>{return(e,t)=>{const r=async()=>{if(dq(".international-home")){const e=await SpinQuery.condition(()=>unsafeWindow["__INITIAL_STATE__"],e=>e!==undefined);return dqa(".home-slide .item").slice(0,5).map((t,r)=>{const i=t.querySelector("a").getAttribute("data-loc-id");return{url:e.locsData[i][r].url,title:t.querySelector(".title").innerText.trim(),isAd:Boolean(t.querySelector(".gg-icon")),imageUrl:t.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}else{const e=dq(".chief-recommend-module .panel");const t=e.querySelector(".pic");const r=e.querySelectorAll(".title > a");return[...t.querySelectorAll("li")].map((e,t)=>{const i=r[t];return{url:i.getAttribute("href"),title:i.innerText.trim(),isAd:Boolean(i.querySelector(".gg-pic")),imageUrl:e.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}};return{export:{getBlackboards:r}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/blackboard.vue.min.js"] = (()=>{return(a,r)=>{const i=``;r.applyStyleFromText(`.simple-home .blackboards{display:grid;grid-template-areas:"header header" "dots cards";grid-template-columns:8px 1fr;grid-template-rows:1fr 250px;row-gap:16px;column-gap:16px;align-self:start}.simple-home .blackboards .blackboard-cards{grid-area:cards;--blackboard-width:568.5px;--blackboard-height:250px;width:var(--blackboard-width);height:var(--blackboard-height);border-radius:16px;overflow:hidden}.simple-home .blackboards .blackboard-cards .blackboard-card{width:100%;height:100%;position:relative;display:block;transition:.3s cubic-bezier(.65,.05,.36,1)}.simple-home .blackboards .blackboard-cards .blackboard-card img{width:100%;height:100%;object-fit:fill;display:block}.simple-home .blackboards .blackboard-cards .blackboard-card .title{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);padding:4px 16px;color:#fff;background-color:#000a;font-size:14px;font-weight:700;border-radius:14px;white-space:nowrap;opacity:0}.simple-home .blackboards .blackboard-cards .blackboard-card:hover .title{opacity:1}`,"blackboard-style");return{export:Object.assign({template:i},{components:{Icon:()=>r.importAsync("icon.vue"),"dpi-img":()=>r.importAsync("dpi-img.vue")},data(){return{blackboards:[],interval:0}},destroyed(){if(this.interval){clearInterval(this.interval)}},computed:{cardsContainer(){return this.$el.querySelector(".blackboard-cards")}},async mounted(){const{getBlackboards:a}=await r.importAsync("blackboard");this.blackboards=(await a()).filter(a=>!a.isAd);const i=dq(".blackboards");this.interval=setInterval(()=>{if(!document.hasFocus()||i.matches(".blackboards:hover")){return}const a=parseInt(dq(`.blackboard-radio:checked`).getAttribute("data-index"));let r;if(a===this.blackboards.length-1){r=0}else{r=a+1}dq(`.blackboard-radio[data-index='${r}']`).checked=true},5e3)}})}}})();
@@ -1254,7 +1254,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/m
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-subtitle.min.js"] = (()=>{return(t,e)=>{let i;const o=(t,e)=>{const o=document.createElement("a");const n=URL.createObjectURL(new Blob([t]));if(i){URL.revokeObjectURL(i)}i=n;o.setAttribute("href",n);o.setAttribute("download",escapeFilename(e));document.body.appendChild(o);o.click();o.remove()};return{widget:{content:`\n`,condition:videoCondition,success:()=>{const t=dq("#download-subtitle");t.addEventListener("click",async i=>{try{t.disabled=true;const{aid:n,cid:s}=unsafeWindow;if(!n||!s){logError("未找到视频AID和CID");return}const{VideoInfo:l}=await e.importAsync("video-info");const{getFriendlyTitle:c}=await e.importAsync("title");const r=new l(n);r.cid=parseInt(s);await r.fetchInfo();const a=r.subtitles;if(a.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const d=await loadSubtitleSettingsPanel();if(!d){logError("未找到字幕设置");return}const u=d.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const b=a.find(t=>t.language===u)||a[0];const f=await Ajax.getJson(b.url);const p=f.body;const y=c(true);if(i.shiftKey){const{SubtitleConverter:t,SubtitleSize:i,SubtitleLocation:n}=await e.importAsync("subtitle-converter");const s=d.querySelector(".bilibili-player-video-subtitle-setting-fontsize .bui-thumb");const l=parseFloat(s.style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const c={214:i.VeryLarge,163.5:i.Large,107:i.Medium,50.5:i.Small,0:i.VerySmall};const r=c[l];const a=d.querySelector(".bilibili-player-video-subtitle-setting-color .bui-select-result span:first-child");const u=a.getAttribute("style").match(/background:[ ]*(.+);/)[1];const b=d.querySelector(".bilibili-player-video-subtitle-setting-opacity .bui-bar");const f=parseFloat(b.style.transform.replace(/scaleX\(([\d\.]+)/,"$1"));const g=dq(".subtitle-position");const m={bc:n.BottomCenter,bl:n.BottomLeft,br:n.BottomRight,tc:n.TopCenter,tl:n.TopLeft,tr:n.TopRight};const h=Object.entries(m).filter(([t])=>{return g.classList.contains(`subtitle-position-${t}`)}).map(([,t])=>t).shift();const w=dq("video");const v={title:y,height:w.videoHeight,width:w.videoWidth,color:u,location:h,opacity:f,size:r};const S=new t(v);const L=await S.convertToAss(p);o(L,y+".ass")}else{o(JSON.stringify(p),y+".json")}}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background:#8884;color:var(--download-video-foreground)}.download-video .button:hover,.download-video button:hover{background:#8886}.download-video .primary{background:var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(50% - 16px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video i.mdi-alert-circle{font-size:14pt;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#282828}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1);pointer-events:initial}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;flex:1 0 0;outline:0!important;border-color:#dfdfdf}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-video.min.html"] = `![]()
警告: 过大的视频大小会在直接下载时占用大量内存, 并可能导致浏览器标签页崩溃. 请考虑降低清晰度或使用导出选项.
预计大小: {{displaySize}}导出
`;
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getFormat(){let t;if(this.selectedTab.name==="manual"){t=f.find(t=>t.displayName===this.manualQualityModel.value)}else{t=d.find(t=>t.displayName===this.qualityModel.value)}if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getManualFormat(){let t;t=f.find(t=>t.displayName===this.manualQualityModel.value);if(!t){console.error(`No format found. model value = ${this.manualQualityModel.value}`);return null}return t},getFormat(){let t;t=d.find(t=>t.displayName===this.qualityModel.value);if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getManualFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getManualFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/download-video-package.min.js"] = (()=>{return(e,t)=>{class n{constructor(e={}){this.config=e;this.entries=[]}download(e,t){const a=document.createElement("a");const i=URL.createObjectURL(t);if(n.lastPackageUrl){URL.revokeObjectURL(n.lastPackageUrl)}n.lastPackageUrl=i;a.setAttribute("href",i);a.setAttribute("download",escapeFilename(e));document.body.appendChild(a);a.click();a.remove()}add(e,t){if(t===null||t===undefined){return}this.entries.push({name:escapeFilename(e),data:t})}async blob(){if(this.entries.length===0){return null}if(this.entries.length===1){const e=this.entries[0].data;return typeof e==="string"?new Blob([e]):e}const e=new JSZip;this.entries.forEach(({name:t,data:n})=>{e.file(t,n)});return await e.generateAsync({type:"blob"})}async emit(e){if(this.entries.length===0){return}if(!e||this.entries.length===1){e=this.entries[0].name}const t=await this.blob();if(!t){return}return this.download(e,t)}static async single(e,t,a={}){const i=new n(a);i.add(e,t);return await i.emit()}}n.lastPackageUrl="";return{export:{DownloadVideoPackage:n}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/dpi-img.vue.min.js"] = (()=>{return(t,e)=>{const s=`
`;return{export:Object.assign({template:s},{props:{size:[Object,Number],src:String,blur:Number,root:HTMLElement,rootMargin:String,threshold:Number,placeholderImage:Boolean},data(){return{srcset:null,actualSrc:null,isPlaceholderActive:false}},watch:{size(){this.sourceChange()},src(){this.sourceChange()}},methods:{sourceChange(){if(this.actualSrc===null||this.srcset===null){return}this.calcSrc()},calcSrc(){const t=!this.src||!this.size;this.isPlaceholderActive=t&&this.placeholderImage;if(t){this.srcset=null;if(this.placeholderImage){this.actualSrc=`https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`}else{this.actualSrc=null}return}let e=this.src;if(e.startsWith("http:")){e=e.replace("http:","https:")}if(e.includes("//static.hdslb.com/images/member/noface.gif")){this.srcset=e;this.actualSrc=e;return}const s=e.substring(e.lastIndexOf(".")+1);this.srcset=getDpiSourceSet(e,this.size,s);this.actualSrc=e}},mounted(){const t={root:this.root,rootMargin:this.rootMargin||"200px",threshold:this.threshold};const e=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){this.calcSrc();e.disconnect()}})},t);e.observe(this.$el)},computed:{width(){if(typeof this.size==="object"&&"width"in this.size){return this.size.width}return null},height(){if(typeof this.size==="object"&&"height"in this.size){return this.size.height}return null},filter(){const t=[];if(this.blur){t.push(`blur(${this.blur}px)`)}return t.join(" ")}}})}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/expand-danmaku.min.js"] = (()=>{return(e,a)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}Observer.videoChange(async()=>{const e=await SpinQuery.select(".bui-collapse-wrap");if(e&&e.classList.contains("bui-collapse-wrap-folded")){const e=await SpinQuery.select(".bui-collapse-header");e.click()}})}})();
@@ -1395,7 +1395,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/m
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/v-dropdown.vue.min.js"] = (()=>{return(o,r)=>{const e=`{{ value }}
`;r.applyStyleFromText(`.v-dropdown{--background-color:#eee;position:relative;background-color:var(--background-color);cursor:pointer;display:flex;align-items:center;justify-content:space-between;min-width:100px;border-radius:var(--corner-radius)}body.dark .v-dropdown{--background-color:#333}.v-dropdown.round{border-radius:14px;padding:0 4px}.v-dropdown .dropdown-menu{transform-origin:top;transform:translateY(-4px) translateX(-50%);pointer-events:none;opacity:0;position:absolute;top:calc(100% + 2px);left:50%;background-color:var(--background-color);z-index:1;transition:.2s ease-out;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu.opened{transform:translateY(0) translateX(-50%);pointer-events:initial;opacity:1}.v-dropdown .dropdown-menu li{padding:4px 16px;box-sizing:content-box;white-space:nowrap;min-width:64px;text-align:center;cursor:pointer;color:inherit;background-color:transparent;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.08)}body.dark .v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.16)}.v-dropdown .mdi-chevron-down{font-size:16pt;line-height:1;transform:rotate(0)}.v-dropdown .dropdown-menu.opened~.mdi-chevron-down{transform:rotate(180deg)}.v-dropdown .selected{user-select:none;padding:4px 8px}`,"v-dropdown-style");return{export:Object.assign({template:e},{props:["items","value","round"],data(){return{dropdownOpen:false}},methods:{toggleDropdown(){this.dropdownOpen=!this.dropdownOpen;if(this.dropdownOpen){document.addEventListener("click",o=>{const r=o.target;if(r===this.$el||this.$el.contains(r)){return}this.dropdownOpen=false},{once:true,capture:true})}},select(o){if(o!==this.value){this.$emit("update:value",o);this.$emit("change",o)}}}})}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-card.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{durationText}}
{{watchlater ? '已添加' : '稍后再看'}}
{{title}}
{{description}}
{{upName}}
{{like}}{{coins}}{{favorites}}{{playCount}}{{danmakuCount}}
`;i.applyStyleFromText(`.video-card{display:grid;grid-template-columns:200px 1fr;grid-template-rows:1fr 1fr 1fr;grid-template-areas:"cover title" "cover description" "cover up";height:var(--card-height);width:var(--card-width);color:#000;background-color:#fff;border-radius:16px;box-shadow:0 4px 8px 0 #0001;margin-right:var(--card-margin);margin-bottom:var(--card-margin);position:relative}body.dark .video-card,body.dark .video-card:hover{background-color:#282828;color:#eee}.video-card:hover{color:#000}.video-card.vertical{grid-template-columns:auto auto;grid-template-rows:2fr 1fr 1fr;grid-template-areas:"cover cover" "title title" "up up"}.video-card.vertical .description,.video-card.vertical .topics{display:none}.video-card.vertical .cover-container{border-radius:16px 16px 0 0}.video-card.vertical .title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:3em;word-break:break-all;white-space:normal;line-height:1.5;font-size:11pt}.video-card.vertical .up{align-self:start;white-space:nowrap}.video-card.vertical .up .name{text-overflow:ellipsis;overflow:hidden}.video-card.vertical .up:not(.no-face){margin-left:8px;max-width:calc(var(--card-width) - 16px)}.video-card.vertical .up.no-face{margin-top:8px;max-width:calc(var(--card-width) - 24px)}.video-card.vertical .stats{align-self:end;justify-self:start;margin-bottom:8px;margin-right:0}.video-card>*{justify-self:self-start;align-self:center}.video-card:hover .cover{transform:scale(1.05);transition:.1s cubic-bezier(.39,.58,.57,1)}.video-card:hover .duration,.video-card:hover .watchlater{opacity:1}.video-card .duration,.video-card .watchlater{opacity:0}.video-card .cover-container{grid-area:cover;border-radius:16px 0 0 16px;position:relative;width:100%;height:100%;overflow:hidden}.video-card .cover-container .cover{object-fit:cover;width:100%;height:100%}.video-card .cover-container>:not(.cover){position:absolute}.video-card .cover-container .duration,.video-card .cover-container .watchlater{bottom:6px;padding:4px 8px;background-color:#000a;color:#fff;border-radius:14px;height:24px;box-sizing:border-box}.video-card .cover-container .duration .mdi,.video-card .cover-container .watchlater .mdi{font-size:12pt;line-height:1;margin-right:4px}.video-card .cover-container .duration{left:6px}.video-card .cover-container .watchlater{right:6px;display:flex;align-items:center;padding-left:4px}.video-card .title{grid-area:title;font-size:12pt;font-weight:700;color:inherit;padding:0 12px;white-space:nowrap;overflow:hidden;justify-self:stretch;text-overflow:ellipsis}.video-card .topics{grid-area:description;display:flex;align-items:center;margin-left:12px}.video-card .topics .topic{color:inherit;padding:6px 8px;background-color:#8882;margin-right:8px;border-radius:14px;white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.video-card .topics .topic:hover{background-color:#8884;color:var(--theme-color)}.video-card .description{grid-area:description;color:inherit;overflow:hidden;align-self:stretch;justify-self:stretch;margin:0 12px;line-height:1.5;height:3em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;scrollbar-width:none!important}.video-card .description::-webkit-scrollbar{width:0!important}.video-card .description.single-line{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.video-card .stats,.video-card .up{grid-area:up}.video-card .up{margin-left:12px;display:flex;align-items:center;padding:2px;background-color:#8882;border-radius:14px;color:inherit}.video-card .up.no-face{background-color:transparent;padding:0}.video-card .up.no-face .be-icon{font-size:14pt;opacity:.75}.video-card .up .face{border-radius:50%;width:24px;height:24px}.video-card .up .name{margin:0 8px}.video-card .up:not(.no-face):hover{background-color:#8884}.video-card .up:hover .be-icon,.video-card .up:hover .name{color:var(--theme-color)}.video-card .stats{justify-self:self-end;margin-right:12px;display:flex;align-items:center;opacity:.5}.video-card .stats .be-icon{font-size:12pt;margin:0 4px 0 12px}.video-card .stats .be-icon.be-iconfont-favorites-outline{font-size:14pt}.video-card .stats .be-icon.be-iconfont-coin-outline{font-size:11pt}`,"video-card-style");return{export:Object.assign({template:t},{props:["data","orientation"],store:store,components:{"dpi-img":()=>i.importAsync("dpi-img.vue"),Icon:()=>i.importAsync("icon.vue")},data(){return{upFaceUrl:"",danmakuCount:"",like:"",coins:"",favorites:"",dynamic:"",topics:[],upID:0,epID:0,..._.omit(this.data,"watchlater"),watchlaterInit:this.data.watchlater}},computed:{vertical(){return this.orientation==="vertical"},...Vuex.mapState(["watchlaterList"]),watchlater(){if(getUID()&&this.watchlaterInit!==null){return this.watchlaterList.includes(this.aid)}else{return null}}},methods:{...Vuex.mapActions(["toggleWatchlater"])}})}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-card-info.min.js"] = (()=>{return(r,e)=>{}})();
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a)=>{const r=await Ajax.getJsonWithCredentials(t);const o=r.data||r.result||r;if(r.code!==0||!o.dash){throw new Error("DASH api failed")}const d=o.accept_quality;if(!d.includes(a)){throw new Error("没有找到请求的清晰度")}if(o.quality!==a){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const s=o.accept_description;const c=s[d.indexOf(a)];const n=o.dash.duration;const i=o.dash.video.filter(t=>t.id===a).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:c,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n,videoCodec:e};return r});const h=o.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n}});return{videoDashes:i,audioDashes:h}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a,r=false)=>{const o=await Ajax.getJsonWithCredentials(t);const d=o.data||o.result||o;if(o.code!==0||!d.dash){throw new Error("DASH api failed")}const s=d.accept_quality;if(!s.includes(a)&&!r){throw new Error("没有找到请求的清晰度")}if(d.quality!==a&&!r){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const c=d.accept_description;const n=c[s.indexOf(a)];const i=d.dash.duration;const h=d.dash.video.filter(t=>t.id===(r?d.quality:a)).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:n,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i,videoCodec:e};return r});const l=d.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i}});return{videoDashes:h,audioDashes:l}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-downloader-fragment.min.js"] = (()=>{return(r,e)=>{}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-info.min.js"] = (()=>{return(t,i)=>{class e{constructor(t){this.aid=t}async fetchInfo(){let t;if(this.cid){t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}&cid=${this.cid}`}else{t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`}const i=JSON.parse(await Ajax.getText(t));if(i.code!==0){throw new Error(i.message)}const e=i.data;this.cid=e.cid;this.pageCount=e.videos;this.coverUrl=e.pic;this.tagId=e.tid;this.tagName=e.tname;this.title=e.title;this.description=e.desc;this.up={uid:e.owner.mid,name:e.owner.name,faceUrl:e.owner.face};this.pages=e.pages.map(t=>{return{cid:t.cid,title:t.part,pageNumber:t.page}});this.subtitles=e.subtitle.list.map(t=>{return{id:t.id,languageCode:t.lan,language:t.lan_doc,url:t.subtitle_url.replace("http:","https:")}});return this}async fetchDanmaku(){this.danmaku=new s(this.cid.toString());return this.danmaku.fetchInfo()}}class a{constructor(t,i){this.text=t;this.p=i}}class s{constructor(t){this.cid=t}async fetchInfo(){const t=await Ajax.getText(`https://api.bilibili.com/x/v1/dm/list.so?oid=${this.cid}`);this.rawXML=t}}class n{constructor(t){this.ep=t;this.videos=[]}async fetchInfo(){const t=await Ajax.getText(`https://www.bilibili.com/bangumi/play/ep${this.ep}/`);const i=JSON.parse(t.match(/window\.__INITIAL_STATE__=(.*);\(function\(\){/)[1]);this.title=i.mediaInfo.title;this.cover=i.mediaInfo.cover;this.squareCover=i.mediaInfo.square_cover;this.aid=i.epInfo.aid;this.cid=i.epInfo.cid;this.videos=i.epList.map(async t=>{return{title:t.index_title,aid:t.aid,cid:t.cid,info:await new e(t.aid).fetchInfo()}});return this}}return{export:{VideoInfo:e,BangumiInfo:n,Danmaku:a,DanmakuInfo:s}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/min/video-list.vue.min.js"] = (()=>{return(i,e)=>{const a=``;e.applyStyleFromText(`.minimal-home .video-list .empty,.minimal-home .video-list .loading{height:48px;display:flex;align-items:center;justify-content:center;font-size:11pt;color:#707070}.minimal-home .video-list .empty .mdi,.minimal-home .video-list .loading .mdi{margin-right:8px}body.dark .minimal-home .video-list .empty,body.dark .minimal-home .video-list .loading{color:#eee}.minimal-home .video-list .cards{display:flex;flex-wrap:wrap;align-items:flex-end}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1),.minimal-home .video-list .cards.show-rank .video-card:nth-child(17),.minimal-home .video-list .cards.show-rank .video-card:nth-child(9){margin-top:48px}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{position:absolute;top:-42px;left:0;font-size:14pt;font-weight:700}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before{content:"今日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{content:"三日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before{content:"一周"}`,"video-list-style");return{export:Object.assign({template:a},{components:{VideoCard:()=>e.importAsync("video-card.vue")},props:["showRank"],data(){return{cards:[],useVerticalCards:false,loading:true}},methods:{async getRankList(){const{getTrendingVideos:i}=await e.importAsync("trending-videos");const a=async e=>{const a=await i(e);this.cards.push(...a)};await Promise.all([1,3,7].map(a))},async getActivityVideos(){const i=await Ajax.getJsonWithCredentials(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=8`);if(i.code!==0){throw new Error(i.message)}this.cards=i.data.cards.filter(i=>{return i.desc.orig_dy_id===0}).map(i=>{const e=JSON.parse(i.card);const a=_.get(i,"display.topic_info.topic_details",[]).map(i=>{return{id:i.topic_id,name:i.topic_name}});return{id:i.desc.dynamic_id_str,aid:e.aid,title:e.title,upID:i.desc.user_profile.info.uid,upName:i.desc.user_profile.info.uname,upFaceUrl:i.desc.user_profile.info.face,coverUrl:e.pic,description:e.desc,timestamp:i.timestamp,time:new Date(i.timestamp*1e3),topics:a,dynamic:e.dynamic,like:formatCount(i.desc.like),duration:e.duration,durationText:formatDuration(e.duration,0),playCount:formatCount(e.stat.view),danmakuCount:formatCount(e.stat.danmaku),watchlater:true}})}},async mounted(){try{const i=matchMedia("(max-width: 680px)");this.useVerticalCards=i.matches;i.addListener(i=>{this.useVerticalCards=i.matches});if(this.showRank){await this.getRankList()}else{await this.getActivityVideos()}}catch(i){Toast.error(i.message,this.showRank?"热门视频":"视频动态",3e3)}finally{this.loading=false}}})}}})();
diff --git a/bilibili-evolved.user.js b/bilibili-evolved.user.js
index 86fe06462..1c76ab29e 100644
--- a/bilibili-evolved.user.js
+++ b/bilibili-evolved.user.js
@@ -1195,7 +1195,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/mi
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/auto-draw.min.js"] = (()=>{return(t,n)=>{(async()=>{if(!/^https:\/\/live\.bilibili\.com\/[\d]+/.test(document.URL)){return}const t=await SpinQuery.condition(()=>dq(".chat-popups-section"),t=>t.querySelector("chat-draw-area")===null);if(!t){console.warn("[自动领奖] 未能找到弹窗容器");return}Observer.childListSubtree(t,()=>{let t;console.log("draw button = ",dq(".chat-popups-section .draw>span:nth-child(3)"));t=dq(".chat-popups-section .draw>span:nth-child(3)");if(t===null){const t=dq(".chat-popups-section .function-bar>span:nth-child(3)");if(t!==null){const n=Observer.attributes(t,()=>{if(t.style.display!=="none"){n.forEach(t=>t.stop());t.click()}})}}if(t!==null){t.click()}})})()}})();
onlineData["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())}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/bangumi-timeline.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{t.date}}
{{t.dayOfWeekText}}
`;i.applyStyleFromText(`.simple-home .bangumi-timeline-container{width:100%}.simple-home .bangumi-timeline-container .bangumi-timeline{display:flex;align-items:flex-start;overflow:auto;scrollbar-width:none!important;scroll-behavior:smooth;--column-count:1;--column-width:250px;--column-gap:24px;width:calc(var(--column-count) * (var(--column-width) + var(--column-gap)) - .5 * var(--column-gap))}.simple-home .bangumi-timeline-container .bangumi-timeline::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day{scroll-snap-align:start;width:var(--column-width);max-height:calc(var(--total-height) - 32px);overflow:auto;flex:0 0 auto;padding-bottom:16px;scroll-behavior:smooth;scrollbar-width:none!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day::-webkit-scrollbar{height:0!important;width:0!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{display:grid;grid-template:"icon date" 1fr "icon dow" 1fr/auto 1fr;grid-column-gap:8px;column-gap:8px;height:60px;padding-bottom:12px;cursor:pointer;position:sticky;top:0;z-index:1;background-color:#f4f4f4}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container{background-color:#181818}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{grid-area:icon;justify-self:center;align-self:center;background-image:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/icons.png);background-size:247px 663px;width:38px;height:36px;background-position-x:-146px;filter:brightness(.5)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-1{background-position-y:-36px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-2{background-position-y:-108px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-3{background-position-y:-180px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-4{background-position-y:-252px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-5{background-position-y:-324px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-6{background-position-y:-396px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon.day-of-week-7{background-position-y:-468px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .date{grid-area:date;align-self:end;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .day-of-week{grid-area:dow;align-self:start;font-weight:700;font-size:15px;opacity:.75}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{width:50px;height:48px;background-position-x:-56px;filter:none}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .date{font-size:14px;opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .day-of-week{font-size:18px;opacity:1}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container .icon{filter:brightness(.8)}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .date-container.today .icon{filter:invert(1)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day{margin-top:26px;width:246px;height:469px;background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-1.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .empty-day.alt{background:url(//s1.hdslb.com/bfs/static/bangumi-timeline/asserts/empty-2.png) no-repeat}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container{margin-top:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container>:not(:last-child){margin-bottom:8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time{display:flex;align-items:center;font-weight:700}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent{color:var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item{box-shadow:0 4px 8px 0 #0001,inset 0 0 0 2px var(--theme-color)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time.recent~.bangumi-item .cover-container{margin:2px;border-radius:6px 0 0 6px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .time .be-icon{margin-right:6px;font-size:18px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{display:grid;height:72px;grid-template:"cover title" auto "cover ep" auto/72px 1fr;background-color:#fff;color:inherit;box-shadow:0 4px 8px 0 #0001;border-radius:8px;grid-row-gap:8px;row-gap:8px}body.dark .simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item{background-color:#282828}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container{grid-area:cover;overflow:hidden;border-radius:8px 0 0 8px}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .cover-container img{width:100%;height:100%}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay{opacity:.4}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item.delay:hover{opacity:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover{color:var(--theme-color)!important}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item:hover .cover-container img{transform:scale(1.05)}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .title{grid-area:title;align-self:end;font-size:13px;font-weight:700;margin:0 12px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:2.6em;word-break:break-all;line-height:1.3;overflow:hidden}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title{grid-area:ep;align-self:start;margin:0 12px;display:flex;align-items:center}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day .time-container .bangumi-item .ep-title .be-icon{color:var(--theme-color);margin-right:4px;font-size:18px;line-height:1}.simple-home .bangumi-timeline-container .bangumi-timeline .timeline-day:not(:last-child){margin-right:var(--column-gap)}@media screen and (min-width:1000px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:2}}@media screen and (min-width:1300px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:3}}@media screen and (min-width:1550px){.simple-home .bangumi-timeline-container .bangumi-timeline{--column-count:4}}`,"bangumi-timeline-style");const n={global:"https://bangumi.bilibili.com/web_api/timeline_global",chinese:"https://bangumi.bilibili.com/web_api/timeline_cn"};return{export:Object.assign({template:t},{components:{Icon:()=>i.importAsync("icon.vue"),DpiImg:()=>i.importAsync("dpi-img.vue")},props:{type:{type:String,default:"global",required:false}},data(){return{timeline:[],recentTime:""}},computed:{apiUrl(){return n[this.type]||n.global}},watch:{type(){this.updateTimeline()}},methods:{calculateRecentTime(){const e=this.timeline.find(e=>e.isToday);const i=Number(new Date);const t=Object.entries(e.bangumis).map(([e,i])=>{return{time:e,timestamp:i[0].timestamp,bangumis:i}});if(t.length===0){return}const n=t.filter(e=>e.timestampe.time)}},moveTimeline(e){const i=e.currentTarget;const t=i.parentElement;const n=t.parentElement;const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1])+parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);const o=t.offsetLeft-n.scrollLeft;if(o=m*2){n.scrollLeft+=m}console.log(e,i,t,n);console.log(m,m*2,t.offsetLeft,n.scrollLeft,o)},async updateTimeline(){try{const e=await Ajax.getJsonWithCredentials(this.apiUrl);if(e.code!==0){throw new Error(e.message)}const i=e.result.map(e=>{return{date:e.date,dayOfWeek:e.day_of_week,dayOfWeekText:"周"+[,"一","二","三","四","五","六","日"][e.day_of_week],isToday:Boolean(e.is_today),bangumis:_.groupBy(e.seasons.map(e=>{return{coverUrl:e.cover.replace("http:","https:"),squareCoverUrl:e.square_cover.replace("http:","https:"),time:e.pub_time,timestamp:e.pub_ts*1e3,url:e.url,follow:Boolean(e.follow),epTitle:e.pub_index||e.delay_reason+" "+e.delay_index,title:e.title,delay:Boolean(e.delay),published:Boolean(e.is_published)}}),e=>e.time)}});this.timeline=i;this.calculateRecentTime();setInterval(()=>{if(document.hasFocus()){this.calculateRecentTime()}},60*1e3);await this.$nextTick();const t=this.$el;const n=this.$el.querySelector(".bangumi-timeline");const a=getComputedStyle(n);const m=parseInt(a.getPropertyValue("--column-width").match(/(.+)px/)[1]);const o=parseInt(a.getPropertyValue("--column-gap").match(/(.+)px/)[1]);n.scrollLeft=5*(m+o)}catch(e){logError(e);this.$emit("error")}finally{this.$emit("load")}}},async mounted(){await this.updateTimeline()}})}}})();
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/batch-download.min.js"] = (()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t,true);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/biliplus-redirect.min.js"] = (()=>{return(i,e)=>{const n=`hd.biliplus.com`;const c=["bilibili.com/video/av","bilibili.com/bangumi/play","bilibili.com/bangumi/media","space.bilibili.com"];return{widget:{condition:()=>{return c.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.assign(document.URL.replace("space.bilibili.com/",`${n}/space/`))}else if(document.URL.includes("/bangumi/")){const i=unsafeWindow.aid||document.querySelector(".av-link,.info-sec-av").innerText.replace(/[aAvV]/g,"");location.assign(`https://${n}/video/av${i}/`)}else{location.host=n}})}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blackboard.min.js"] = (()=>{return(e,t)=>{const r=async()=>{if(dq(".international-home")){const e=await SpinQuery.condition(()=>unsafeWindow["__INITIAL_STATE__"],e=>e!==undefined);return dqa(".home-slide .item").slice(0,5).map((t,r)=>{const i=t.querySelector("a").getAttribute("data-loc-id");return{url:e.locsData[i][r].url,title:t.querySelector(".title").innerText.trim(),isAd:Boolean(t.querySelector(".gg-icon")),imageUrl:t.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}else{const e=dq(".chief-recommend-module .panel");const t=e.querySelector(".pic");const r=e.querySelectorAll(".title > a");return[...t.querySelectorAll("li")].map((e,t)=>{const i=r[t];return{url:i.getAttribute("href"),title:i.innerText.trim(),isAd:Boolean(i.querySelector(".gg-pic")),imageUrl:e.querySelector("img").getAttribute("src").replace(/@.+$/,"")}})}};return{export:{getBlackboards:r}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/blackboard.vue.min.js"] = (()=>{return(a,r)=>{const i=``;r.applyStyleFromText(`.simple-home .blackboards{display:grid;grid-template-areas:"header header" "dots cards";grid-template-columns:8px 1fr;grid-template-rows:1fr 250px;row-gap:16px;column-gap:16px;align-self:start}.simple-home .blackboards .blackboard-cards{grid-area:cards;--blackboard-width:568.5px;--blackboard-height:250px;width:var(--blackboard-width);height:var(--blackboard-height);border-radius:16px;overflow:hidden}.simple-home .blackboards .blackboard-cards .blackboard-card{width:100%;height:100%;position:relative;display:block;transition:.3s cubic-bezier(.65,.05,.36,1)}.simple-home .blackboards .blackboard-cards .blackboard-card img{width:100%;height:100%;object-fit:fill;display:block}.simple-home .blackboards .blackboard-cards .blackboard-card .title{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);padding:4px 16px;color:#fff;background-color:#000a;font-size:14px;font-weight:700;border-radius:14px;white-space:nowrap;opacity:0}.simple-home .blackboards .blackboard-cards .blackboard-card:hover .title{opacity:1}`,"blackboard-style");return{export:Object.assign({template:i},{components:{Icon:()=>r.importAsync("icon.vue"),"dpi-img":()=>r.importAsync("dpi-img.vue")},data(){return{blackboards:[],interval:0}},destroyed(){if(this.interval){clearInterval(this.interval)}},computed:{cardsContainer(){return this.$el.querySelector(".blackboard-cards")}},async mounted(){const{getBlackboards:a}=await r.importAsync("blackboard");this.blackboards=(await a()).filter(a=>!a.isAd);const i=dq(".blackboards");this.interval=setInterval(()=>{if(!document.hasFocus()||i.matches(".blackboards:hover")){return}const a=parseInt(dq(`.blackboard-radio:checked`).getAttribute("data-index"));let r;if(a===this.blackboards.length-1){r=0}else{r=a+1}dq(`.blackboard-radio[data-index='${r}']`).checked=true},5e3)}})}}})();
@@ -1254,7 +1254,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/mi
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-subtitle.min.js"] = (()=>{return(t,e)=>{let i;const o=(t,e)=>{const o=document.createElement("a");const n=URL.createObjectURL(new Blob([t]));if(i){URL.revokeObjectURL(i)}i=n;o.setAttribute("href",n);o.setAttribute("download",escapeFilename(e));document.body.appendChild(o);o.click();o.remove()};return{widget:{content:`\n`,condition:videoCondition,success:()=>{const t=dq("#download-subtitle");t.addEventListener("click",async i=>{try{t.disabled=true;const{aid:n,cid:s}=unsafeWindow;if(!n||!s){logError("未找到视频AID和CID");return}const{VideoInfo:l}=await e.importAsync("video-info");const{getFriendlyTitle:c}=await e.importAsync("title");const r=new l(n);r.cid=parseInt(s);await r.fetchInfo();const a=r.subtitles;if(a.length===0){Toast.info("当前视频没有字幕.","下载字幕",3e3);return}const d=await loadSubtitleSettingsPanel();if(!d){logError("未找到字幕设置");return}const u=d.querySelector(".bilibili-player-video-subtitle-setting-lan .bui-select-result").innerHTML;const b=a.find(t=>t.language===u)||a[0];const f=await Ajax.getJson(b.url);const p=f.body;const y=c(true);if(i.shiftKey){const{SubtitleConverter:t,SubtitleSize:i,SubtitleLocation:n}=await e.importAsync("subtitle-converter");const s=d.querySelector(".bilibili-player-video-subtitle-setting-fontsize .bui-thumb");const l=parseFloat(s.style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const c={214:i.VeryLarge,163.5:i.Large,107:i.Medium,50.5:i.Small,0:i.VerySmall};const r=c[l];const a=d.querySelector(".bilibili-player-video-subtitle-setting-color .bui-select-result span:first-child");const u=a.getAttribute("style").match(/background:[ ]*(.+);/)[1];const b=d.querySelector(".bilibili-player-video-subtitle-setting-opacity .bui-bar");const f=parseFloat(b.style.transform.replace(/scaleX\(([\d\.]+)/,"$1"));const g=dq(".subtitle-position");const m={bc:n.BottomCenter,bl:n.BottomLeft,br:n.BottomRight,tc:n.TopCenter,tl:n.TopLeft,tr:n.TopRight};const h=Object.entries(m).filter(([t])=>{return g.classList.contains(`subtitle-position-${t}`)}).map(([,t])=>t).shift();const w=dq("video");const v={title:y,height:w.videoHeight,width:w.videoWidth,color:u,location:h,opacity:f,size:r};const S=new t(v);const L=await S.convertToAss(p);o(L,y+".ass")}else{o(JSON.stringify(p),y+".json")}}catch(t){logError(t)}finally{t.disabled=false}})}}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.css"] = `.download-video{--download-video-background:white;--download-video-foreground:black;position:absolute;top:96px;left:50%;transform:translateX(-50%) scale(.95);background:var(--download-video-background);color:var(--download-video-foreground);box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;z-index:10001;pointer-events:none;opacity:0;padding:16px;width:300px;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;box-sizing:content-box;line-height:normal}.download-video,.download-video *{transition:.2s ease-out;-webkit-tap-highlight-color:transparent!important}.download-video.opened{pointer-events:initial;opacity:1;transform:translateX(-50%) scale(1)}body.dark .download-video{--download-video-background:#222;--download-video-foreground:#eee}.round-corner .download-video,.round-corner .download-video .episode-list .v-checkbox,.round-corner .download-video .rpc-settings{border-radius:var(--large-corner-radius)}.round-corner .download-video .button,.round-corner .download-video .cover,.round-corner .download-video .direct-download .progress .background,.round-corner .download-video .direct-download .progress .foreground,.round-corner .download-video .rpc-settings input[type=text],.round-corner .download-video .size-warning-tip,.round-corner .download-video .title,.round-corner .download-video button{border-radius:var(--corner-radius)}.download-video .cover{min-height:100px;max-height:120px;object-fit:contain}.download-video h1{font-size:13pt;font-weight:700;color:var(--download-video-foreground)}.download-video h2{font-size:11pt;font-weight:700;color:var(--download-video-foreground)}.download-video .header{display:flex;justify-content:space-between;align-items:center}.download-video .header .grow{flex-grow:1}.download-video .header .mdi-download{font-size:16pt;color:var(--download-video-foreground);margin-right:8px}.download-video .header .mdi-close{font-size:16pt;color:var(--download-video-foreground);cursor:pointer}.download-video .header .mdi-close:hover{color:var(--theme-color)}.download-video .info{display:flex;flex-direction:column;align-items:center;margin-top:12px}.download-video .title{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;margin-top:12px}.download-video .title .bold{width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.download-video .title .size{font-size:10pt;color:var(--download-video-foreground);align-self:center;display:flex;align-items:center;height:24px}.download-video .bold{color:var(--download-video-foreground);font-weight:700;font-size:12pt}.download-video .option-item{display:flex;justify-content:space-between;align-items:center;padding-top:12px;font-size:10pt}.download-video .tabs{display:flex;padding:12px 0;font-size:10pt}.download-video .tabs .tab{cursor:pointer;position:relative;opacity:.5}.download-video .tabs .tab.active{font-weight:700;opacity:1}.download-video .tabs .tab:not(:last-child){margin-right:16px}.download-video .tabs .tab::after{content:"";position:absolute;border-radius:2px;background-color:var(--theme-color);height:3px;width:80%;left:10%;bottom:-8px;transition:.2s ease-out;transform:scaleX(0)}.download-video .tabs .tab.active::after{transform:scaleX(1)}.download-video .separator{height:1px;background:#8884;width:100%;margin:12px 0;flex-shrink:0}.download-video .direct-download{display:flex;flex-direction:column;align-items:start;justify-content:space-between}.download-video .button,.download-video button{border:none;outline:0!important;padding:6px 16px;font-size:10pt;cursor:pointer;background:#8884;color:var(--download-video-foreground)}.download-video .button:hover,.download-video button:hover{background:#8886}.download-video .primary{background:var(--theme-color);color:var(--foreground-color);align-self:center}.download-video .primary:hover{background:var(--theme-color-90)}.download-video .busy .button,.download-video .busy .primary,.download-video .busy button,.download-video button:disabled{background-color:#0001;color:#8884;cursor:not-allowed}.download-video .busy .button,.download-video .busy button{cursor:wait!important}.download-video .direct-download .progress{align-self:stretch;display:flex;align-items:center;margin-top:8px}.download-video .direct-download .progress .background{flex-grow:1;height:4px;background:#8884;margin-right:4px;position:relative}.download-video .direct-download .progress .background .foreground{position:absolute;top:0;left:0;height:4px;background:linear-gradient(to right,var(--theme-color),var(--theme-color-60))}.download-video .direct-download .progress .percent{width:50px;text-align:right;font-size:12px}.download-video .actions{display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px -4px 0}.download-video .actions>*{margin:4px;flex-grow:1;flex-basis:calc(50% - 16px);display:flex;justify-content:center;align-items:center;white-space:nowrap}.download-video i.mdi-alert-circle{font-size:14pt;color:#ff9800}.download-video .size-warning{position:relative;padding:0 8px}.download-video .size-warning-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:var(--download-video-background);color:var(--download-video-foreground);border:1px dashed var(--theme-color);z-index:2;font-size:10pt;width:200px;padding:8px;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;pointer-events:none;opacity:0}.download-video .size-warning:hover .size-warning-tip{opacity:1}.download-video .episode-list .v-checkbox{padding:4px 8px;margin:4px 0;position:relative;background-color:transparent}.download-video .episode-list .v-checkbox.checked{background-color:#8882}.download-video .episode-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.download-video .episode-list{overflow:auto;max-height:320px}.download-video button.list-tool{padding:4px;line-height:1;font-size:12pt;margin:0 4px}.download-video .episode-header h2{flex-grow:1}.download-video .selected-count{width:64px;font-size:12px;text-align:right}.download-video .aria2-rpc .mdi{margin-left:8px;font-size:14pt;line-height:1}.download-video .aria2-rpc{position:relative}.download-video .rpc-settings{position:absolute;display:flex;flex-direction:column;align-items:stretch;color:var(--download-video-foreground);background:#fff;bottom:120%;left:50%;cursor:initial;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;transform-origin:bottom;transform:translateX(-50%) scale(.9);opacity:0;pointer-events:none;padding:8px;z-index:3;transition:.3s cubic-bezier(.18,.89,.32,1.28);width:120%}body.dark .download-video .rpc-settings{background:#282828}.download-video .rpc-settings>*{margin:8px}.download-video .rpc-settings.show{opacity:1;transform:translateX(-50%) scale(1);pointer-events:initial}.download-video .rpc-settings input[type=text]{background:0 0;color:var(--download-video-foreground);border:1px solid #8884;padding:4px;margin-left:8px}.download-video .rpc-settings input[type=text]:focus{border-color:var(--theme-color)}.download-video .rpc-settings .operations{display:flex;align-items:center;justify-content:space-evenly}.download-video .final-dir{white-space:normal;word-break:break-all}.download-video .rpc-settings-item{display:flex;align-items:center;justify-content:space-between;white-space:nowrap}.download-video .rpc-settings-item input[type=text]{flex-grow:1;margin-left:24px}.download-video button.cancel-download,.download-video button.start-download{margin-top:8px}.download-video .direct-download-header{align-self:stretch;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-header{margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.download-video .manual-input-content{display:flex;justify-content:stretch}.download-video .manual-input-content textarea{margin:0;height:180px;resize:none;padding:8px;border-radius:4px;flex:1 0 0;outline:0!important;border-color:#dfdfdf}.download-video .manual-input-content textarea:focus,.download-video .manual-input-content textarea:focus-within{border-color:var(--theme-color)}body.dark .download-video .direct-download .progress .foreground{background:linear-gradient(to right,var(--theme-color-70),var(--theme-color))}`;
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.html"] = `![]()
警告: 过大的视频大小会在直接下载时占用大量内存, 并可能导致浏览器标签页崩溃. 请考虑降低清晰度或使用导出选项.
预计大小: {{displaySize}}导出
`;
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getFormat(){let t;if(this.selectedTab.name==="manual"){t=f.find(t=>t.displayName===this.manualQualityModel.value)}else{t=d.find(t=>t.displayName===this.qualityModel.value)}if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getManualFormat(){let t;t=f.find(t=>t.displayName===this.manualQualityModel.value);if(!t){console.error(`No format found. model value = ${this.manualQualityModel.value}`);return null}return t},getFormat(){let t;t=d.find(t=>t.displayName===this.qualityModel.value);if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getManualFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getManualFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video-package.min.js"] = (()=>{return(e,t)=>{class n{constructor(e={}){this.config=e;this.entries=[]}download(e,t){const a=document.createElement("a");const i=URL.createObjectURL(t);if(n.lastPackageUrl){URL.revokeObjectURL(n.lastPackageUrl)}n.lastPackageUrl=i;a.setAttribute("href",i);a.setAttribute("download",escapeFilename(e));document.body.appendChild(a);a.click();a.remove()}add(e,t){if(t===null||t===undefined){return}this.entries.push({name:escapeFilename(e),data:t})}async blob(){if(this.entries.length===0){return null}if(this.entries.length===1){const e=this.entries[0].data;return typeof e==="string"?new Blob([e]):e}const e=new JSZip;this.entries.forEach(({name:t,data:n})=>{e.file(t,n)});return await e.generateAsync({type:"blob"})}async emit(e){if(this.entries.length===0){return}if(!e||this.entries.length===1){e=this.entries[0].name}const t=await this.blob();if(!t){return}return this.download(e,t)}static async single(e,t,a={}){const i=new n(a);i.add(e,t);return await i.emit()}}n.lastPackageUrl="";return{export:{DownloadVideoPackage:n}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/dpi-img.vue.min.js"] = (()=>{return(t,e)=>{const s=`
`;return{export:Object.assign({template:s},{props:{size:[Object,Number],src:String,blur:Number,root:HTMLElement,rootMargin:String,threshold:Number,placeholderImage:Boolean},data(){return{srcset:null,actualSrc:null,isPlaceholderActive:false}},watch:{size(){this.sourceChange()},src(){this.sourceChange()}},methods:{sourceChange(){if(this.actualSrc===null||this.srcset===null){return}this.calcSrc()},calcSrc(){const t=!this.src||!this.size;this.isPlaceholderActive=t&&this.placeholderImage;if(t){this.srcset=null;if(this.placeholderImage){this.actualSrc=`https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`}else{this.actualSrc=null}return}let e=this.src;if(e.startsWith("http:")){e=e.replace("http:","https:")}if(e.includes("//static.hdslb.com/images/member/noface.gif")){this.srcset=e;this.actualSrc=e;return}const s=e.substring(e.lastIndexOf(".")+1);this.srcset=getDpiSourceSet(e,this.size,s);this.actualSrc=e}},mounted(){const t={root:this.root,rootMargin:this.rootMargin||"200px",threshold:this.threshold};const e=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){this.calcSrc();e.disconnect()}})},t);e.observe(this.$el)},computed:{width(){if(typeof this.size==="object"&&"width"in this.size){return this.size.width}return null},height(){if(typeof this.size==="object"&&"height"in this.size){return this.size.height}return null},filter(){const t=[];if(this.blur){t.push(`blur(${this.blur}px)`)}return t.join(" ")}}})}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/expand-danmaku.min.js"] = (()=>{return(e,a)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}Observer.videoChange(async()=>{const e=await SpinQuery.select(".bui-collapse-wrap");if(e&&e.classList.contains("bui-collapse-wrap-folded")){const e=await SpinQuery.select(".bui-collapse-header");e.click()}})}})();
@@ -1395,7 +1395,7 @@ onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/mi
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/v-dropdown.vue.min.js"] = (()=>{return(o,r)=>{const e=`{{ value }}
`;r.applyStyleFromText(`.v-dropdown{--background-color:#eee;position:relative;background-color:var(--background-color);cursor:pointer;display:flex;align-items:center;justify-content:space-between;min-width:100px;border-radius:var(--corner-radius)}body.dark .v-dropdown{--background-color:#333}.v-dropdown.round{border-radius:14px;padding:0 4px}.v-dropdown .dropdown-menu{transform-origin:top;transform:translateY(-4px) translateX(-50%);pointer-events:none;opacity:0;position:absolute;top:calc(100% + 2px);left:50%;background-color:var(--background-color);z-index:1;transition:.2s ease-out;box-shadow:rgba(0,0,0,.2) 0 4px 8px 0;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu.opened{transform:translateY(0) translateX(-50%);pointer-events:initial;opacity:1}.v-dropdown .dropdown-menu li{padding:4px 16px;box-sizing:content-box;white-space:nowrap;min-width:64px;text-align:center;cursor:pointer;color:inherit;background-color:transparent;border-radius:var(--corner-radius)}.v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.08)}body.dark .v-dropdown .dropdown-menu li:hover{background-color:rgba(0,0,0,.16)}.v-dropdown .mdi-chevron-down{font-size:16pt;line-height:1;transform:rotate(0)}.v-dropdown .dropdown-menu.opened~.mdi-chevron-down{transform:rotate(180deg)}.v-dropdown .selected{user-select:none;padding:4px 8px}`,"v-dropdown-style");return{export:Object.assign({template:e},{props:["items","value","round"],data(){return{dropdownOpen:false}},methods:{toggleDropdown(){this.dropdownOpen=!this.dropdownOpen;if(this.dropdownOpen){document.addEventListener("click",o=>{const r=o.target;if(r===this.$el||this.$el.contains(r)){return}this.dropdownOpen=false},{once:true,capture:true})}},select(o){if(o!==this.value){this.$emit("update:value",o);this.$emit("change",o)}}}})}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-card.vue.min.js"] = (()=>{return(e,i)=>{const t=`{{durationText}}
{{watchlater ? '已添加' : '稍后再看'}}
{{title}}
{{description}}
{{upName}}
{{like}}{{coins}}{{favorites}}{{playCount}}{{danmakuCount}}
`;i.applyStyleFromText(`.video-card{display:grid;grid-template-columns:200px 1fr;grid-template-rows:1fr 1fr 1fr;grid-template-areas:"cover title" "cover description" "cover up";height:var(--card-height);width:var(--card-width);color:#000;background-color:#fff;border-radius:16px;box-shadow:0 4px 8px 0 #0001;margin-right:var(--card-margin);margin-bottom:var(--card-margin);position:relative}body.dark .video-card,body.dark .video-card:hover{background-color:#282828;color:#eee}.video-card:hover{color:#000}.video-card.vertical{grid-template-columns:auto auto;grid-template-rows:2fr 1fr 1fr;grid-template-areas:"cover cover" "title title" "up up"}.video-card.vertical .description,.video-card.vertical .topics{display:none}.video-card.vertical .cover-container{border-radius:16px 16px 0 0}.video-card.vertical .title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:3em;word-break:break-all;white-space:normal;line-height:1.5;font-size:11pt}.video-card.vertical .up{align-self:start;white-space:nowrap}.video-card.vertical .up .name{text-overflow:ellipsis;overflow:hidden}.video-card.vertical .up:not(.no-face){margin-left:8px;max-width:calc(var(--card-width) - 16px)}.video-card.vertical .up.no-face{margin-top:8px;max-width:calc(var(--card-width) - 24px)}.video-card.vertical .stats{align-self:end;justify-self:start;margin-bottom:8px;margin-right:0}.video-card>*{justify-self:self-start;align-self:center}.video-card:hover .cover{transform:scale(1.05);transition:.1s cubic-bezier(.39,.58,.57,1)}.video-card:hover .duration,.video-card:hover .watchlater{opacity:1}.video-card .duration,.video-card .watchlater{opacity:0}.video-card .cover-container{grid-area:cover;border-radius:16px 0 0 16px;position:relative;width:100%;height:100%;overflow:hidden}.video-card .cover-container .cover{object-fit:cover;width:100%;height:100%}.video-card .cover-container>:not(.cover){position:absolute}.video-card .cover-container .duration,.video-card .cover-container .watchlater{bottom:6px;padding:4px 8px;background-color:#000a;color:#fff;border-radius:14px;height:24px;box-sizing:border-box}.video-card .cover-container .duration .mdi,.video-card .cover-container .watchlater .mdi{font-size:12pt;line-height:1;margin-right:4px}.video-card .cover-container .duration{left:6px}.video-card .cover-container .watchlater{right:6px;display:flex;align-items:center;padding-left:4px}.video-card .title{grid-area:title;font-size:12pt;font-weight:700;color:inherit;padding:0 12px;white-space:nowrap;overflow:hidden;justify-self:stretch;text-overflow:ellipsis}.video-card .topics{grid-area:description;display:flex;align-items:center;margin-left:12px}.video-card .topics .topic{color:inherit;padding:6px 8px;background-color:#8882;margin-right:8px;border-radius:14px;white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.video-card .topics .topic:hover{background-color:#8884;color:var(--theme-color)}.video-card .description{grid-area:description;color:inherit;overflow:hidden;align-self:stretch;justify-self:stretch;margin:0 12px;line-height:1.5;height:3em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;scrollbar-width:none!important}.video-card .description::-webkit-scrollbar{width:0!important}.video-card .description.single-line{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.video-card .stats,.video-card .up{grid-area:up}.video-card .up{margin-left:12px;display:flex;align-items:center;padding:2px;background-color:#8882;border-radius:14px;color:inherit}.video-card .up.no-face{background-color:transparent;padding:0}.video-card .up.no-face .be-icon{font-size:14pt;opacity:.75}.video-card .up .face{border-radius:50%;width:24px;height:24px}.video-card .up .name{margin:0 8px}.video-card .up:not(.no-face):hover{background-color:#8884}.video-card .up:hover .be-icon,.video-card .up:hover .name{color:var(--theme-color)}.video-card .stats{justify-self:self-end;margin-right:12px;display:flex;align-items:center;opacity:.5}.video-card .stats .be-icon{font-size:12pt;margin:0 4px 0 12px}.video-card .stats .be-icon.be-iconfont-favorites-outline{font-size:14pt}.video-card .stats .be-icon.be-iconfont-coin-outline{font-size:11pt}`,"video-card-style");return{export:Object.assign({template:t},{props:["data","orientation"],store:store,components:{"dpi-img":()=>i.importAsync("dpi-img.vue"),Icon:()=>i.importAsync("icon.vue")},data(){return{upFaceUrl:"",danmakuCount:"",like:"",coins:"",favorites:"",dynamic:"",topics:[],upID:0,epID:0,..._.omit(this.data,"watchlater"),watchlaterInit:this.data.watchlater}},computed:{vertical(){return this.orientation==="vertical"},...Vuex.mapState(["watchlaterList"]),watchlater(){if(getUID()&&this.watchlaterInit!==null){return this.watchlaterList.includes(this.aid)}else{return null}}},methods:{...Vuex.mapActions(["toggleWatchlater"])}})}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-card-info.min.js"] = (()=>{return(r,e)=>{}})();
-onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a)=>{const r=await Ajax.getJsonWithCredentials(t);const o=r.data||r.result||r;if(r.code!==0||!o.dash){throw new Error("DASH api failed")}const d=o.accept_quality;if(!d.includes(a)){throw new Error("没有找到请求的清晰度")}if(o.quality!==a){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const s=o.accept_description;const c=s[d.indexOf(a)];const n=o.dash.duration;const i=o.dash.video.filter(t=>t.id===a).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:c,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n,videoCodec:e};return r});const h=o.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n}});return{videoDashes:i,audioDashes:h}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
+onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-dash.min.js"] = (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a,r=false)=>{const o=await Ajax.getJsonWithCredentials(t);const d=o.data||o.result||o;if(o.code!==0||!d.dash){throw new Error("DASH api failed")}const s=d.accept_quality;if(!s.includes(a)&&!r){throw new Error("没有找到请求的清晰度")}if(d.quality!==a&&!r){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const c=d.accept_description;const n=c[s.indexOf(a)];const i=d.dash.duration;const h=d.dash.video.filter(t=>t.id===(r?d.quality:a)).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:n,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i,videoCodec:e};return r});const l=d.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i}});return{videoDashes:h,audioDashes:l}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-downloader-fragment.min.js"] = (()=>{return(r,e)=>{}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-info.min.js"] = (()=>{return(t,i)=>{class e{constructor(t){this.aid=t}async fetchInfo(){let t;if(this.cid){t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}&cid=${this.cid}`}else{t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`}const i=JSON.parse(await Ajax.getText(t));if(i.code!==0){throw new Error(i.message)}const e=i.data;this.cid=e.cid;this.pageCount=e.videos;this.coverUrl=e.pic;this.tagId=e.tid;this.tagName=e.tname;this.title=e.title;this.description=e.desc;this.up={uid:e.owner.mid,name:e.owner.name,faceUrl:e.owner.face};this.pages=e.pages.map(t=>{return{cid:t.cid,title:t.part,pageNumber:t.page}});this.subtitles=e.subtitle.list.map(t=>{return{id:t.id,languageCode:t.lan,language:t.lan_doc,url:t.subtitle_url.replace("http:","https:")}});return this}async fetchDanmaku(){this.danmaku=new s(this.cid.toString());return this.danmaku.fetchInfo()}}class a{constructor(t,i){this.text=t;this.p=i}}class s{constructor(t){this.cid=t}async fetchInfo(){const t=await Ajax.getText(`https://api.bilibili.com/x/v1/dm/list.so?oid=${this.cid}`);this.rawXML=t}}class n{constructor(t){this.ep=t;this.videos=[]}async fetchInfo(){const t=await Ajax.getText(`https://www.bilibili.com/bangumi/play/ep${this.ep}/`);const i=JSON.parse(t.match(/window\.__INITIAL_STATE__=(.*);\(function\(\){/)[1]);this.title=i.mediaInfo.title;this.cover=i.mediaInfo.cover;this.squareCover=i.mediaInfo.square_cover;this.aid=i.epInfo.aid;this.cid=i.epInfo.cid;this.videos=i.epList.map(async t=>{return{title:t.index_title,aid:t.aid,cid:t.cid,info:await new e(t.aid).fetchInfo()}});return this}}return{export:{VideoInfo:e,BangumiInfo:n,Danmaku:a,DanmakuInfo:s}}}})();
onlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-list.vue.min.js"] = (()=>{return(i,e)=>{const a=``;e.applyStyleFromText(`.minimal-home .video-list .empty,.minimal-home .video-list .loading{height:48px;display:flex;align-items:center;justify-content:center;font-size:11pt;color:#707070}.minimal-home .video-list .empty .mdi,.minimal-home .video-list .loading .mdi{margin-right:8px}body.dark .minimal-home .video-list .empty,body.dark .minimal-home .video-list .loading{color:#eee}.minimal-home .video-list .cards{display:flex;flex-wrap:wrap;align-items:flex-end}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1),.minimal-home .video-list .cards.show-rank .video-card:nth-child(17),.minimal-home .video-list .cards.show-rank .video-card:nth-child(9){margin-top:48px}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before,.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{position:absolute;top:-42px;left:0;font-size:14pt;font-weight:700}.minimal-home .video-list .cards.show-rank .video-card:nth-child(1)::before{content:"今日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(9)::before{content:"三日"}.minimal-home .video-list .cards.show-rank .video-card:nth-child(17)::before{content:"一周"}`,"video-list-style");return{export:Object.assign({template:a},{components:{VideoCard:()=>e.importAsync("video-card.vue")},props:["showRank"],data(){return{cards:[],useVerticalCards:false,loading:true}},methods:{async getRankList(){const{getTrendingVideos:i}=await e.importAsync("trending-videos");const a=async e=>{const a=await i(e);this.cards.push(...a)};await Promise.all([1,3,7].map(a))},async getActivityVideos(){const i=await Ajax.getJsonWithCredentials(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${getUID()}&type_list=8`);if(i.code!==0){throw new Error(i.message)}this.cards=i.data.cards.filter(i=>{return i.desc.orig_dy_id===0}).map(i=>{const e=JSON.parse(i.card);const a=_.get(i,"display.topic_info.topic_details",[]).map(i=>{return{id:i.topic_id,name:i.topic_name}});return{id:i.desc.dynamic_id_str,aid:e.aid,title:e.title,upID:i.desc.user_profile.info.uid,upName:i.desc.user_profile.info.uname,upFaceUrl:i.desc.user_profile.info.face,coverUrl:e.pic,description:e.desc,timestamp:i.timestamp,time:new Date(i.timestamp*1e3),topics:a,dynamic:e.dynamic,like:formatCount(i.desc.like),duration:e.duration,durationText:formatDuration(e.duration,0),playCount:formatCount(e.stat.view),danmakuCount:formatCount(e.stat.danmaku),watchlater:true}})}},async mounted(){try{const i=matchMedia("(max-width: 680px)");this.useVerticalCards=i.matches;i.addListener(i=>{this.useVerticalCards=i.matches});if(this.showRank){await this.getRankList()}else{await this.getActivityVideos()}}catch(i){Toast.error(i.message,this.showRank?"热门视频":"视频动态",3e3)}finally{this.loading=false}}})}}})();
diff --git a/min/batch-download.min.js b/min/batch-download.min.js
index 018ba8c23..0a1f50db4 100644
--- a/min/batch-download.min.js
+++ b/min/batch-download.min.js
@@ -1 +1 @@
-(()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
\ No newline at end of file
+(()=>{return(t,e)=>{const{formatTitle:i}=e.import("title");const s=12;const a=[".mp4",".m4a"];class n{constructor(t){this.config=t;this.itemList=[]}static formatTitle(e){const s=t.batchFilenameFormat;const a=i(s,true,e);return escapeFilename(a," ")}async getRawItems(t){return JSON.parse(await this.collectData(t))}extension(t,e){const i=[".flv",".mp4"].find(e=>t.includes(e));if(i){return i}else if(t.includes(".m4s")){return a[e]}else{return".flv"}}async collectAria2(i,a){const n=await this.getRawItems(i);if(a){const i=t.aria2RpcOption;const{sendRpc:a}=await e.importAsync("aria2-rpc");for(const t of n){const e=t.fragments.map((e,a)=>{let n="";if(t.fragments.length>1&&!e.url.includes(".m4s")){n=" - "+(a+1)}const r=[];if(i.secretKey!==""){r.push(`token:${i.secretKey}`)}r.push([e.url]);r.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${t.title}${n}${this.extension(e.url,a)}`,split:s,dir:i.baseDir+i.dir||undefined,"max-download-limit":i.maxDownloadLimit||undefined});const o=encodeURIComponent(`${t.title}${n}`);return{params:r,id:o}});await a(e,true)}}else{return`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${n.map(t=>{return t.fragments.map((e,i)=>{let a="";if(t.fragments.length>1&&!e.url.includes(".m4s")){a=` - ${i+1}`}return`\n${e.url}\n referer=${t.referer}\n user-agent=${UserAgent}\n out=${t.title}${a}${this.extension(e.url,i)}\n split=${s}\n`.trim()}).join("\n")}).join("\n")}\n`.trim()}}}class r extends n{constructor(){super(...arguments);this.aid=unsafeWindow.aid}static async test(){if(document.URL.includes("//www.bilibili.com/video/av")){return await SpinQuery.select("#multi_page")!==null}return false}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`;const e=await Ajax.getJson(t);if(e.code!==0){Toast.error(`获取视频选集列表失败, message=${e.message}`,"批量下载");return[]}const i=e.data.pages;if(i===undefined){Toast.error(`获取视频选集列表失败, 没有找到选集信息.`,"批量下载");return[]}this.itemList=i.map(t=>{return{title:`P${t.page} ${t.part}`,titleParameters:{n:t.page,ep:t.part},cid:t.cid,aid:this.aid}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t,true);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class o extends n{constructor(t){super(t);this.mainVideo=new r(t);this.mainVideo.aid="78976165";this.spVideo=new r(t);this.spVideo.aid="78979124"}static async test(){return document.URL.includes("//www.bilibili.com/blackboard/bnj2020.html")}async getItemList(){return(await this.mainVideo.getItemList()).concat(await this.spVideo.getItemList())}async collectData(t){return(await this.mainVideo.collectData(t)).concat(await this.spVideo.collectData(t))}}class c extends n{static async test(){return document.URL.includes("/www.bilibili.com/bangumi")}async getItemList(){if(this.itemList.length>0){return this.itemList}const t=document.querySelector("meta[property='og:url']");if(t===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return[]}const e=t.getAttribute("content").match(/play\/ss(\d+)/)[1];if(e===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return[]}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${e}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return[]}this.itemList=i.result.main_section.episodes.map((t,e)=>{const i=t.long_title?t.title:(e+1).toString();const s=t.long_title?t.long_title:t.title;return{aid:t.aid,cid:t.cid,title:`${i} - ${s}`,titleParameters:{n:i,ep:s}}});return this.itemList}async collectData(t){const i=[];for(const s of(await this.getItemList()).filter(this.config.itemFilter)){const a=this.config.api?this.config.api(s.aid,s.cid,t):`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${t}&otype=json`;const r=await Ajax.getJsonWithCredentials(a);const o=r.data||r.result||r;if(o.quality!==t){console.warn(`${s.title} 不支持所选画质, 已回退到较低画质. (quality=${o.quality})`)}let c;if(o.durl){c=o.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}})}else{const{getDashInfo:i,dashToFragments:s}=await e.importAsync("video-dash");const n=await i(a,typeof t==="string"?parseInt(t):t);c=s(n)}i.push({fragments:c,title:n.formatTitle(s.titleParameters),totalSize:c.map(t=>t.size).reduce((t,e)=>t+e),cid:s.cid,referer:document.URL.replace(window.location.search,"")})}return JSON.stringify(i)}}class l extends r{constructor(){super(...arguments);this.items=[]}async getItemList(){const{VideoInfo:t}=await e.importAsync("video-info");const i=await Promise.all(this.items.map(async e=>{const i=new t(e);await i.fetchInfo();return i.pages.map((t,i)=>{return{aid:e,cid:t.cid,titleParameters:{n:(i+1).toString(),ep:t.title},title:`P${i+1} ${t.title}`}})}));return _.flatten(i)}}const u=[c,r,o];let d;class m{constructor(t){this.config=Object.assign({itemFilter:()=>true},t)}static async test(){for(const t of u){if(await t.test()===true){d=t;return true}}return false}getExtractor(){if(d===null){logError("[批量下载] 未找到合适的解析模块.");throw new Error(`[Batch Download] module not found.`)}const t=new d(this.config);return t}async getItemList(){const t=this.getExtractor();return await t.getItemList()}async getRawItems(t){const e=this.getExtractor();return await e.getRawItems(t.quality)}async collectData(t,e){const i=this.getExtractor();const s=await i.collectData(t.quality);e.dismiss();return s}async collectAria2(t,e,i=false){const s=this.getExtractor();const a=await s.collectAria2(t.quality,i);e.dismiss();return a}formatTitle(t){return n.formatTitle(t)}}return{export:{BatchExtractor:m,ManualInputBatch:l}}}})();
\ No newline at end of file
diff --git a/min/bundle.json b/min/bundle.json
index 89e235eac..1cbd5fd8c 100644
--- a/min/bundle.json
+++ b/min/bundle.json
@@ -12,7 +12,7 @@
"auto-draw.min.js": "AE72CF2623DF2D15AD4AF82D125FFAF7EF5B1E6B36D9E9AC646AC98AA6AA8698",
"auto-play.min.js": "DC9938AC15DADDC9D88DCA0C9BE64BE142C37D32CB85E42E23DAB2A7378531E5",
"bangumi-timeline.vue.min.js": "753B8C96AFB3E6AC4C9507576D12B6CBB207BC1CC3FE5885C419E99C65BCD547",
- "batch-download.min.js": "44F0F3C9CFC0DD3B841A0CA24F506918E8F8AB44ABEED43D03464B3BC88CCD40",
+ "batch-download.min.js": "A93E6C2030A9C80D8B9187A47D6B19A74BCF93F34C614C96F76F725D5DE0FB0C",
"biliplus-redirect.min.js": "9882D14DAC5C103212A101A5168883C41B4B3B2737FD5F222DC343D0304FF8AF",
"blackboard.min.js": "8BB9CCDE72302AE7DE39D66F9231EFB82BA27DDA799BA4AAAC06F6DE802661BF",
"blackboard.vue.min.js": "84A30D5A6F322A3C083FC1100E9FF51233ECD08AFBD89A6449AD2388ACCC8522",
@@ -71,7 +71,7 @@
"download-subtitle.min.js": "4B99A00FEEA40C6D577AC8BD8DFFD34D91B75E150C7848B965D58B0096DF762C",
"download-video.min.css": "8B68CCDADACC3D84BC1AC661C3E46CD3EBEB657CC89F244B05D756B0ECF4069C",
"download-video.min.html": "D5542056B00352B37B9BAF05D823832B477FD10E8F6C179A02A4B1ADBB6F0761",
- "download-video.min.js": "A4356AF7EF2EE2298377673D134656D9D989E268002128B0D2B8B2AB47BE44B7",
+ "download-video.min.js": "17E76FB8966626D13C0AF0547C91AA94539697BFB52EF0A290C65C7BC730B250",
"download-video-package.min.js": "B10FF11DE7DFBACEC38F195B8E836511E527215B5E177CB1D223D14F30EB1435",
"dpi-img.vue.min.js": "11DF7577B754D8C01E8331E4FDAC9494E72523099845A0D6B0D897849CD841D6",
"expand-danmaku.min.js": "B21658C40085AEA8DC49652AE62EB8610BB2EBEAF7A9C9AF69EF3B11E08EEC8D",
@@ -212,7 +212,7 @@
"v-dropdown.vue.min.js": "DE6DF6A2081FEE6AB802A355FEC5FF87B7FDE054BC01AB145379DB6634A83133",
"video-card.vue.min.js": "C335B564D4D625D4AE26D15A4031898479EEE81A84AB43A7D4D8D144C32B5D6F",
"video-card-info.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
- "video-dash.min.js": "010621860893DE3E324090F01CCDE542B6AE7F2115F44D76A634C9D541980BBA",
+ "video-dash.min.js": "8F657BDA87B5DE18F8978B02B311F491F9D23302DB0E38C5A62CA1BCB5F56726",
"video-downloader-fragment.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"video-info.min.js": "EDF4176D830A516FBE476576B1944E09997309A543233DDF298FF23213B08CFC",
"video-list.vue.min.js": "9B0FB6AC3D3CD8D0250CBBC787D5BE823C46216CD71B9E8DCAC75AFE1BE5A9EA",
diff --git a/min/bundle.zip b/min/bundle.zip
index c5b7f5ad9..a856eedad 100644
Binary files a/min/bundle.zip and b/min/bundle.zip differ
diff --git a/min/download-video.min.js b/min/download-video.min.js
index fb71793fd..159047c52 100644
--- a/min/download-video.min.js
+++ b/min/download-video.min.js
@@ -1 +1 @@
-(()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getFormat(){let t;if(this.selectedTab.name==="manual"){t=f.find(t=>t.displayName===this.manualQualityModel.value)}else{t=d.find(t=>t.displayName===this.qualityModel.value)}if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
\ No newline at end of file
+(()=>{return(t,e)=>{const{getFriendlyTitle:a}=e.import("title");const{VideoInfo:s,DanmakuInfo:i}=e.import("video-info");const{DownloadVideoPackage:n}=e.import("download-video-package");class o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fnver=0&fnval=16`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${e}&cid=${a}&otype=json`}}}return e.bind(this)}async getDashUrl(t){return(await this.getApiGenerator(true))(c.aid,c.cid,t)}async getUrl(t){return(await this.getApiGenerator())(c.aid,c.cid,t)}}class r extends o{async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&fourk=1&fnval=16`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&otype=json&fourk=1&fnval=16`}}else{if(s){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${e}&cid=${a}&qn=&otype=json`}}}return e.bind(this)}}class l extends o{constructor(t){super();this.ep=t}async getApiGenerator(t=false){function e(e,a,s){if(t){if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}&fnver=0&fnval=16`}}else{if(s){return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&qn=${s}&otype=json&ep_id=${this.ep}`}else{return`https://api.bilibili.com/pugv/player/web/playurl?avid=${e}&cid=${a}&otype=json&ep_id=${this.ep}`}}}return e.bind(this)}}const c={entity:new o,aid:"",cid:""};let d=[];let p=null;let h=null;class u{constructor(t,e,a){this.quality=t;this.internalName=e;this.displayName=a}async downloadInfo(t=false){const e=new m(this);await e.fetchVideoInfo(t);return e}static parseFormats(t){const e=t.accept_quality;const a=t.accept_format.split(",");const s=t.accept_description;const i=e.map((t,e)=>{return new u(t,a[e],s[e])});return i}static async filterFormats(t){if(h===null){h=(await Ajax.getJsonWithCredentials("https://api.bilibili.com/x/web-interface/nav")).data}_.remove(t,t=>{const e=t.quality;if(h.isLogin===false){return e>=64}if(h.vipStatus!==1){return e===116||e===112||e===74}return false});return t}static async getAvailableDashFormats(){const t=await c.entity.getDashUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}static async getAvailableFormats(){const t=await c.entity.getUrl();const e=await Ajax.getJsonWithCredentials(t);if(e.code!==0){throw new Error("获取清晰度信息失败.")}const a=e.data||e.result||e;return await u.filterFormats(u.parseFormats(a))}}const f=[new u(120,"4K","超清 4K"),new u(116,"1080P60","高清 1080P60"),new u(112,"1080P+","高清 1080P+"),new u(80,"1080P","高清 1080P"),new u(74,"720P60","高清 720P60"),new u(64,"720P","高清 720P"),new u(32,"480P","清晰 480P"),new u(15,"320P","流畅 320P")];class m{constructor(t,e){this.fragmentSplitFactor=6*2;this.workingXhr=null;this.progressMap=new Map;this.format=t;this.fragments=e||[];this.videoSpeed=new w(this)}get danmakuOption(){return t.downloadVideoDefaultDanmaku}get isDash(){return this.fragments.some(t=>t.url.includes(".m4s"))}get totalSize(){return this.fragments.map(t=>t.size).reduce((t,e)=>t+e)}async fetchVideoInfo(t=false){if(!t){const t=await c.entity.getUrl(this.format.quality);const a=await Ajax.getTextWithCredentials(t);const s=JSON.parse(a.replace(/http:/g,"https:"));const i=s.data||s.result||s;const n=this.format.quality;if(i.quality!==n){const{throwQualityError:t}=await e.importAsync("quality-errors");t(n)}const o=i.durl;this.fragments=o.map(t=>{return{length:t.length,size:t.size,url:t.url,backupUrls:t.backup_url}})}else{const{dashToFragments:t,getDashInfo:a}=await e.importAsync("video-dash");const s=await a(await c.entity.getDashUrl(this.format.quality),this.format.quality);this.fragments=t(s)}return this.fragments}updateProgress(){const t=this.progressMap?[...this.progressMap.values()].reduce((t,e)=>t+e,0)/this.totalSize:0;if(t>1||t<0){console.error(`[下载视频] 进度异常: ${t}`,this.progressMap.values())}this.progress&&this.progress(t)}cancelDownload(){this.videoSpeed.stopMeasure();if(this.workingXhr!==null){this.workingXhr.forEach(t=>t.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(t){const e=[];const a=this.isDash?4*1024*1024:16*1024*1024;let s;if(t.size<=a*6){s=t.size/this.fragmentSplitFactor}else{s=a}let i=0;const n=t=>[...this.progressMap.keys()].indexOf(t)+1;while(i{const s=new XMLHttpRequest;s.open("GET",t.url);s.responseType="arraybuffer";s.withCredentials=false;s.addEventListener("progress",t=>{console.debug(`[下载视频] 视频片段${n(s)}下载进度: ${t.loaded}/${r} bytes loaded, ${o}`);this.progressMap.set(s,t.loaded);this.updateProgress()});s.addEventListener("load",()=>{if((""+s.status)[0]==="2"){console.debug(`[下载视频] 视频片段${n(s)}下载完成`);e(s.response)}else{a(`视频片段${n(s)}请求失败, response = ${s.status}`)}});s.addEventListener("abort",()=>a("canceled"));s.addEventListener("error",()=>{console.error(`[下载视频] 视频片段${n(s)}下载失败: ${o}`);this.progressMap.set(s,0);this.updateProgress();s.open("GET",t.url);s.setRequestHeader("Range",o);s.send()});s.setRequestHeader("Range",o);this.progressMap.set(s,0);s.send();this.workingXhr.push(s)}));i=Math.round(i+s)+1}return Promise.all(e)}async copyUrl(){const t=this.fragments.map(t=>t.url).reduce((t,e)=>t+"\r\n"+e);GM.setClipboard(t,"text")}async showUrl(){const t=this.fragments.map(t=>`\n${t.url}\n`).reduce((t,e)=>t+"\r\n"+e);Toast.success(t+`复制全部`,"显示链接");const e=await SpinQuery.select("#copy-link");e.addEventListener("click",async()=>{await this.copyUrl()})}async exportData(t=false){const e=JSON.stringify([{fragments:this.fragments,title:a(),totalSize:this.fragments.map(t=>t.size).reduce((t,e)=>t+e),referer:document.URL.replace(window.location.search,"")}]);if(t){GM.setClipboard(e,"text")}else{const t=new Blob([e],{type:"text/json"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.json`,t);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}async exportAria2(s=false){if(s){const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,s);await i.emit();const o=t.aria2RpcOption;const r=this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}const i=[];if(o.secretKey!==""){i.push(`token:${o.secretKey}`)}i.push([t.url]);i.push({referer:document.URL.replace(window.location.search,""),"user-agent":UserAgent,out:`${a()}${s}${this.extension(t)}`,split:this.fragmentSplitFactor,dir:o.baseDir+o.dir||undefined,"max-download-limit":o.maxDownloadLimit||undefined});const n=encodeURIComponent(`${a()}${s}`);return{params:i,id:n}});const{sendRpc:l}=await e.importAsync("aria2-rpc");await l(r)}else{const t=`\n# Generated by Bilibili Evolved Video Export\n# https://github.com/the1812/Bilibili-Evolved/\n${this.fragments.map((t,e)=>{let s="";if(this.fragments.length>1&&!this.isDash){s=" - "+(e+1)}return`\n${t.url}\n referer=${document.URL.replace(window.location.search,"")}\n user-agent=${UserAgent}\n out=${a()}${s}${this.extension(t)}\n split=${this.fragmentSplitFactor}\n`.trim()}).join("\n")}\n`.trim();const e=new Blob([t],{type:"text/plain"});const s=await this.downloadDanmaku();const i=new n;i.add(`${a()}.txt`,e);i.add(a()+"."+this.danmakuOption.toLowerCase(),s);await i.emit(`${a()}.zip`)}}extension(t){const e=t||this.fragments[0];const a=[".flv",".mp4"].find(t=>e.url.includes(t));if(a){return a}else if(e.url.includes(".m4s")){return this.fragments.indexOf(e)===0?".mp4":".m4a"}else{console.warn("No extension detected.");return".flv"}}async downloadDanmaku(){if(this.danmakuOption!=="无"){const t=new i(c.cid);await t.fetchInfo();if(this.danmakuOption==="XML"){return t.rawXML}else{const{convertToAss:a}=await e.importAsync("download-danmaku");return a(t.rawXML)}}else{return null}}async download(){this.workingXhr=[];this.progressMap=new Map;this.updateProgress();const t=[];this.videoSpeed.startMeasure();for(const e of this.fragments){const a=await this.downloadFragment(e);t.push(a)}if(t.length<1){throw new Error("下载失败.")}const e=a();const s=new n;t.forEach((a,i)=>{let n;const o=this.fragments[i];if(t.length>1&&!this.isDash){n=`${e} - ${i+1}${this.extension(o)}`}else{n=`${e}${this.extension(o)}`}s.add(n,new Blob(Array.isArray(a)?a:[a]))});const i=await this.downloadDanmaku();s.add(`${a()}.${this.danmakuOption==="ASS"?"ass":"xml"}`,i);await s.emit(e+".zip");this.progress&&this.progress(0);this.videoSpeed.stopMeasure()}}class w{constructor(t){this.lastProgress=0;this.measureInterval=1e3;this.workingDownloader=t}startMeasure(){this.intervalTimer=setInterval(()=>{const t=this.workingDownloader.progressMap?[...this.workingDownloader.progressMap.values()].reduce((t,e)=>t+e,0):0;const e=t-this.lastProgress;if(this.speedUpdate!==undefined){this.speedUpdate(formatFileSize(e)+"/s")}this.lastProgress=t},this.measureInterval)}stopMeasure(){clearInterval(this.intervalTimer)}}async function g(){const t=await SpinQuery.select(()=>(unsafeWindow||window).aid);const e=await SpinQuery.select(()=>(unsafeWindow||window).cid);if(!(t&&e)){return false}c.aid=t;c.cid=e;if(document.URL.includes("bangumi")){c.entity=new r}else if(document.URL.includes("cheese")){const t=document.URL.match(/cheese\/play\/ep([\d]+)/);c.entity=new l(t[1])}else{c.entity=new o}try{d=await u.getAvailableFormats()}catch(t){return false}return true}const y=e=>{const a=t.downloadVideoQuality;const s=e.find(t=>t.quality===a);if(s){return s}const i=e.filter(t=>t.quality{const t=dq(".download-video");t.classList.toggle("opened");window.scroll(0,0);dq(".gui-settings-mask").click()});document.body.insertAdjacentHTML("beforeend",e.import("downloadVideoHtml"));v()}async function v(){let r;const l=[{name:"single",displayName:"单个视频"},{name:"batch",displayName:"批量导出"},{name:"manual",displayName:"手动输入"}];const h=new Vue({el:".download-video",components:{VDropdown:()=>e.importAsync("v-dropdown.vue"),VCheckbox:()=>e.importAsync("v-checkbox.vue"),RpcProfiles:()=>e.importAsync("aria2-rpc-profiles.vue")},data:{batch:false,selectedTab:l[0],coverUrl:EmptyImageUrl,aid:c.aid,cid:c.cid,dashModel:{value:t.downloadVideoFormat,items:["flv","dash"]},qualityModel:{value:p.displayName,items:d.map(t=>t.displayName)},manualQualityModel:{value:f[1].displayName,items:f.map(t=>t.displayName)},danmakuModel:{value:t.downloadVideoDefaultDanmaku,items:["无","XML","ASS"]},codecModel:{value:t.downloadVideoDashCodec,items:["AVC/H.264","HEVC/H.265"]},progressPercent:0,size:"获取大小中",blobUrl:"",episodeList:[],downloading:false,speed:"",rpcSettings:t.aria2RpcOption,showRpcSettings:false,busy:false,saveRpcSettingsText:"保存配置",enableDash:t.enableDashDownload,lastDirectDownloadLink:"",manualInputText:""},computed:{tabs(){if(this.batch){return l}const t=[...l];_.remove(t,t=>t.name==="batch");return t},manualInputItems(){const t=this.manualInputText.split(/\s/g);const e=t.map(t=>t.match(/av(\d+)/i)||t.match(/^(\d+)$/));return _.uniq(e.filter(t=>t!==null).map(t=>t[1]))},downloadSingle(){return this.selectedTab.name==="single"},displaySize(){if(typeof this.size==="string"){return this.size}return formatFileSize(this.size)},sizeWarning(){if(typeof this.size==="string"){return false}return this.size>1073741824},selectedEpisodeCount(){return this.episodeList.filter(t=>t.checked).length},dash(){return this.dashModel.value==="dash"}},methods:{close(){this.$el.classList.remove("opened")},danmakuOptionChange(){t.downloadVideoDefaultDanmaku=this.danmakuModel.value},async codecChange(){t.downloadVideoDashCodec=this.codecModel.value;await this.formatChange()},async dashChange(){const e=t.downloadVideoFormat=this.dashModel.value;let a=[];if(e==="flv"){a=await u.getAvailableFormats()}else{a=await u.getAvailableDashFormats()}d=a;p=y(d);this.qualityModel.items=a.map(t=>t.displayName);this.qualityModel.value=this.qualityModel.items[d.indexOf(p)];await this.formatChange()},async formatChange(e=false){const a=this.getFormat();if(e){t.downloadVideoQuality=a.quality}try{this.size="获取大小中";const t=await a.downloadInfo(this.dash);this.size=t.totalSize}catch(t){this.size="获取大小失败";throw t}},getManualFormat(){let t;t=f.find(t=>t.displayName===this.manualQualityModel.value);if(!t){console.error(`No format found. model value = ${this.manualQualityModel.value}`);return null}return t},getFormat(){let t;t=d.find(t=>t.displayName===this.qualityModel.value);if(!t){console.error(`No format found. model value = ${this.qualityModel.value}`);return null}return t},async exportData(t){if(this.busy===true){return}try{this.busy=true;if(this.selectedTab.name==="batch"){await this.exportBatchData(t);return}if(this.selectedTab.name==="manual"){await this.exportManualData(t);return}const s=this.getFormat();const i=await s.downloadInfo(this.dash);switch(t){case"copyLink":await i.copyUrl();Toast.success("已复制链接到剪贴板.","下载视频",3e3);break;case"showLink":await i.showUrl();break;case"aria2":await i.exportAria2(false);break;case"aria2RPC":await i.exportAria2(true);break;case"copyVLD":await i.exportData(true);Toast.success("已复制VLD数据到剪贴板.","下载视频",3e3);break;case"exportVLD":await i.exportData(false);break;case"ffmpegFragments":if(i.fragments.length<2){Toast.info("当前视频没有分段.","分段列表",3e3)}else{const{getFragmentsList:t}=await e.importAsync("ffmpeg-support");const s=new n;s.add("ffmpeg-files.txt",t(i.fragments.length,a(),i.fragments.map(t=>i.extension(t))));await s.emit()}break;default:break}}catch(t){logError(t)}finally{this.busy=false}},async exportBatchData(t){const s=this.episodeList;if(s.every(t=>t.checked===false)){Toast.info("请至少选择1集或以上的数量!","批量导出",3e3);return}const o=t=>{const e=s.find(e=>e.cid===t.cid);if(e===undefined){return false}return e.checked};const r=this.batchExtractor;const l=this.getFormat();if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","批量导出");const a=new n;try{if(this.danmakuModel.value==="XML"){for(const t of s.filter(o)){const e=new i(t.cid);await e.fetchInfo();a.add(r.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of s.filter(o)){const s=new i(e.cid);await s.fetchInfo();a.add(r.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await a.emit(this.cid+".danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const d=Toast.info("获取链接中...","批量导出");r.config.itemFilter=o;r.config.api=await c.entity.getApiGenerator(this.dash);let p;try{switch(t){case"aria2":p=await r.collectAria2(l,d,false);await n.single(a(false)+".txt",new Blob([p],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});return;case"aria2RPC":await r.collectAria2(l,d,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);return;case"copyVLD":GM.setClipboard(await r.collectData(l,d),{mimetype:"text/plain"});Toast.success("已复制批量vld数据到剪贴板.","批量导出",3e3);return;case"exportVLD":p=await r.collectData(l,d);await n.single(a(false)+".json",new Blob([p],{type:"text/json"}),{ffmpeg:this.ffmpegOption});return;case"ffmpegFragments":{const t=await r.getRawItems(l);const s=new m(l,t[0].fragments);const{getBatchFragmentsList:i}=await e.importAsync("ffmpeg-support");const o=i(t,this.dash||s.extension());if(!o){Toast.info("所有选择的分P都没有分段.","分段列表",3e3)}else{const t=new n;for(const[e,a]of o.entries()){t.add(e,a)}await t.emit(escapeFilename(`${a(false)}.zip`))}}break;case"ffmpegEpisodes":{const t=await r.getRawItems(l);const a=new m(l,t[0].fragments);const{getBatchEpisodesList:s}=await e.importAsync("ffmpeg-support");const i=s(t,this.dash||a.extension());const o=new n;o.add("ffmpeg-files.txt",i);await o.emit()}break;default:return}}catch(t){logError(t)}finally{d.dismiss()}},async exportManualData(t){if(this.manualInputItems.length===0){Toast.info("请至少输入一个有效的视频链接!","手动输入",3e3);return}const{ManualInputBatch:a}=await e.importAsync("batch-download");const s=new a({api:await(new o).getApiGenerator(this.dash),itemFilter:()=>true});s.items=this.manualInputItems;if(this.danmakuModel.value!=="无"){const t=Toast.info("下载弹幕中...","手动输入");const o=new n;try{if(this.danmakuModel.value==="XML"){for(const t of await s.getItemList()){const e=new i(t.cid);await e.fetchInfo();o.add(a.formatTitle(t.titleParameters)+".xml",e.rawXML)}}else{const{convertToAss:t}=await e.importAsync("download-danmaku");for(const e of await s.getItemList()){const s=new i(e.cid);await s.fetchInfo();o.add(a.formatTitle(e.titleParameters)+".ass",await t(s.rawXML))}}await o.emit("manual-exports.danmakus.zip")}catch(t){logError(`弹幕下载失败`);throw t}finally{t.dismiss()}}const r=Toast.info("获取链接中...","手动输入");try{switch(t){default:case"aria2":{const t=await s.collectAria2(this.getManualFormat().quality,false);await n.single("manual-exports.txt",new Blob([t],{type:"text/plain"}),{ffmpeg:this.ffmpegOption});break}case"aria2RPC":{await s.collectAria2(this.getManualFormat().quality,true);Toast.success(`成功发送了批量请求.`,"aria2 RPC",3e3);break}}}catch(t){logError(t)}finally{r.dismiss()}},async checkBatch(){const t=["//www.bilibili.com/bangumi","//www.bilibili.com/video/av","//www.bilibili.com/blackboard/bnj2020.html"];if(!t.some(t=>document.URL.includes(t))){this.batch=false;this.episodeList=[];return}const{BatchExtractor:a}=await e.importAsync("batch-download");if(await a.test()!==true){this.batch=false;this.episodeList=[];return}const s=this.batchExtractor=new a;this.batch=true;this.episodeList=(await s.getItemList()).map((t,e)=>{return{aid:t.aid,cid:t.cid,title:t.title,titleParameters:t.titleParameters,index:e,checked:true}})},cancelDownload(){if(r){r.cancelDownload()}},async startDownload(){const t=this.getFormat();try{this.downloading=true;const e=await t.downloadInfo(this.dash);e.videoSpeed.speedUpdate=(t=>this.speed=t);e.progress=(t=>{this.progressPercent=Math.trunc(t*100)});r=e;await e.download();this.lastDirectDownloadLink=n.lastPackageUrl}catch(t){if(t!=="canceled"){logError(t)}this.progressPercent=0}finally{this.downloading=false;this.speed=""}},selectAllEpisodes(){this.episodeList.forEach(t=>t.checked=true)},unselectAllEpisodes(){this.episodeList.forEach(t=>t.checked=false)},inverseAllEpisodes(){this.episodeList.forEach(t=>t.checked=!t.checked)},toggleRpcSettings(){this.showRpcSettings=!this.showRpcSettings},saveRpcSettings(){if(this.rpcSettings.host===""){this.rpcSettings.host="127.0.0.1"}if(this.rpcSettings.port===""){this.rpcSettings.port="6800"}t.aria2RpcOption=this.rpcSettings;const e=t.aria2RpcOptionProfiles.find(e=>e.name===t.aria2RpcOptionSelectedProfile);if(e){Object.assign(e,this.rpcSettings);t.aria2RpcOptionProfiles=t.aria2RpcOptionProfiles}this.saveRpcSettingsText="已保存";setTimeout(()=>this.saveRpcSettingsText="保存配置",2e3)},updateProfile(e){t.aria2RpcOption=this.rpcSettings=_.omit(e,"name")}},async mounted(){}});Observer.videoChange(async()=>{h.close();h.batch=false;h.selectedTab=l[0];const t=dq("#download-video");const e=await g();t.style.display=e?"flex":"none";if(!e){return}h.aid=c.aid;h.cid=c.cid;try{const t=new s(c.aid);await t.fetchInfo();h.coverUrl=t.coverUrl.replace("http:","https:")}catch(t){h.coverUrl=EmptyImageUrl}h.dashChange();await h.checkBatch()})}return{widget:{content:`\n`,condition:g,success:b}}}})();
\ No newline at end of file
diff --git a/min/video-dash.min.js b/min/video-dash.min.js
index 10c3e266f..698a86db4 100644
--- a/min/video-dash.min.js
+++ b/min/video-dash.min.js
@@ -1 +1 @@
-(()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a)=>{const r=await Ajax.getJsonWithCredentials(t);const o=r.data||r.result||r;if(r.code!==0||!o.dash){throw new Error("DASH api failed")}const d=o.accept_quality;if(!d.includes(a)){throw new Error("没有找到请求的清晰度")}if(o.quality!==a){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const s=o.accept_description;const c=s[d.indexOf(a)];const n=o.dash.duration;const i=o.dash.video.filter(t=>t.id===a).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:c,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n,videoCodec:e};return r});const h=o.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n}});return{videoDashes:i,audioDashes:h}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
\ No newline at end of file
+(()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a,r=false)=>{const o=await Ajax.getJsonWithCredentials(t);const d=o.data||o.result||o;if(o.code!==0||!d.dash){throw new Error("DASH api failed")}const s=d.accept_quality;if(!s.includes(a)&&!r){throw new Error("没有找到请求的清晰度")}if(d.quality!==a&&!r){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const c=d.accept_description;const n=c[s.indexOf(a)];const i=d.dash.duration;const h=d.dash.video.filter(t=>t.id===(r?d.quality:a)).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:n,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i,videoCodec:e};return r});const l=d.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i}});return{videoDashes:h,audioDashes:l}};return{export:{getDashInfo:o,dashToFragments:r}}}})();
\ No newline at end of file
diff --git a/src/video/download-video/batch-download.ts b/src/video/download-video/batch-download.ts
index aeb9a46be..40ff0ffd0 100644
--- a/src/video/download-video/batch-download.ts
+++ b/src/video/download-video/batch-download.ts
@@ -163,7 +163,7 @@ class VideoEpisodeBatch extends Batch {
})
} else {
const { getDashInfo, dashToFragments } = await import('./video-dash')
- const info = await getDashInfo(url, typeof quality === 'string' ? parseInt(quality) : quality)
+ const info = await getDashInfo(url, typeof quality === 'string' ? parseInt(quality) : quality, true)
fragments = dashToFragments(info)
}
result.push({
diff --git a/src/video/download-video/download-video.ts b/src/video/download-video/download-video.ts
index c6a86255b..635e3a8d0 100644
--- a/src/video/download-video/download-video.ts
+++ b/src/video/download-video/download-video.ts
@@ -784,13 +784,18 @@ async function loadPanel() {
throw error
}
},
+ getManualFormat() {
+ let format: VideoFormat | undefined
+ format = allFormats.find(f => f.displayName === this.manualQualityModel.value)
+ if (!format) {
+ console.error(`No format found. model value = ${this.manualQualityModel.value}`)
+ return null
+ }
+ return format
+ },
getFormat() {
let format: VideoFormat | undefined
- if (this.selectedTab.name === 'manual') {
- format = allFormats.find(f => f.displayName === this.manualQualityModel.value)
- } else {
- format = formats.find(f => f.displayName === this.qualityModel.value)
- }
+ format = formats.find(f => f.displayName === this.qualityModel.value)
if (!format) {
console.error(`No format found. model value = ${this.qualityModel.value}`)
return null
@@ -1003,7 +1008,7 @@ async function loadPanel() {
switch (type) {
default:
case 'aria2': {
- const result = await batch.collectAria2(this.getFormat().quality, false) as string
+ const result = await batch.collectAria2(this.getManualFormat().quality, false) as string
await DownloadVideoPackage.single(
'manual-exports.txt',
new Blob([result], { type: 'text/plain' }),
@@ -1012,7 +1017,7 @@ async function loadPanel() {
break
}
case 'aria2RPC': {
- await batch.collectAria2(this.getFormat().quality, true)
+ await batch.collectAria2(this.getManualFormat().quality, true)
Toast.success(`成功发送了批量请求.`, 'aria2 RPC', 3000)
break
}
diff --git a/src/video/download-video/video-dash.ts b/src/video/download-video/video-dash.ts
index eeff86b8d..231b256fd 100644
--- a/src/video/download-video/video-dash.ts
+++ b/src/video/download-video/video-dash.ts
@@ -41,17 +41,17 @@ export const dashToFragments = (dashes: { videoDashes: VideoDash[], audioDashes:
const audio = dashes.audioDashes.sort(descendingSort(d => d.bandWidth))[0]
return [dashToFragment(video), dashToFragment(audio)]
}
-export const getDashInfo = async (api: string, quality: number) => {
+export const getDashInfo = async (api: string, quality: number, allowLowerQuality = false) => {
const json = await Ajax.getJsonWithCredentials(api)
const data = json.data || json.result || json
if (json.code !== 0 || !data.dash) {
throw new Error('DASH api failed')
}
const qualities = data.accept_quality as number[]
- if (!qualities.includes(quality)) {
+ if (!qualities.includes(quality) && !allowLowerQuality) {
throw new Error('没有找到请求的清晰度')
}
- if (data.quality !== quality) {
+ if (data.quality !== quality && !allowLowerQuality) {
const { throwQualityError } = await import('./quality-errors')
throwQualityError(quality)
}
@@ -59,7 +59,7 @@ export const getDashInfo = async (api: string, quality: number) => {
const qualityText = qualityTexts[qualities.indexOf(quality)]
const duration = data.dash.duration
const videoDashes: VideoDash[] = data.dash.video
- .filter((d: any) => d.id === quality)
+ .filter((d: any) => d.id === (allowLowerQuality ? data.quality : quality))
.map((d: any) => {
const videoCodec: DashCodec = (() => {
switch (d.codecid) {