diff --git a/bilibili-evolved.offline.user.js b/bilibili-evolved.offline.user.js index 6ea2a598e..438c86c7c 100644 --- a/bilibili-evolved.offline.user.js +++ b/bilibili-evolved.offline.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name Bilibili Evolved (Offline) -// @version 191.84 +// @version 191.89 // @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中. // @author Grant Howard, Coulomb-G // @copyright 2019, Grant Howrad (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) @@ -747,6 +747,12 @@ event.initEvent(eventName, true, true); element.dispatchEvent(event); } + async function loadLazyPanel(selector) + { + await SpinQuery.unsafeJquery(); + const panel = await SpinQuery.any(() => unsafeWindow.$(selector)); + panel.mouseover().mouseout(); + } function contentLoaded(callback) { if (/complete|interactive|loaded/.test(document.readyState)) @@ -1190,8 +1196,8 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/dark-schedule.min.js"] = (()=>{return(e,t)=>{class s{constructor(...e){if(e.length===0){const e=new Date;this.hour=e.getHours();this.minute=e.getMinutes()}else if(e.length===1){const[t]=e;[this.hour,this.minute]=t.split(":").slice(0,2).map(e=>this.validatePart(e));this.normalize()}else if(v.length===2){[this.hour,this.minute]=e}}validatePart(e){const t=parseInt(e);if(!isNaN(t)&&0<=t&&t<=59){return t}else{return null}}normalize(){while(this.minute<0){this.minute+=60;this.hour-=1}while(this.minute>=60){this.minute-=60;this.hour+=1}while(this.hour<0){this.hour+=24}while(this.hour>=24){this.hour-=24}}lessThan(e){if(this.houre.hour||this.hour===e.hour&&this.minute>e.minute){return true}return false}equals(e){return this.hour===e.hour&&this.minute===e.minute}isInRange(e,t){if(e.equals(t)){return false}let s=this.greaterThan(e)&&this.lessThan(t);if(e.greaterThan(t)){s=this.greaterThan(e)||this.lessThan(t)}const i=s||this.equals(e);return i}static millisecondsBefore(e){const t=new s;const i=(new Date).getSeconds();const r=1e3*(t.hour*3600+t.minute*60+i);const n=1e3*(e.hour*3600+e.minute*60);let h=n-r;if(t.greaterThan(e)||t.equals(e)&&i!==0){h+=24*3600*1e3}return h}}function i(){if(e.darkSchedule){const t=new s(e.darkScheduleStart);const r=new s(e.darkScheduleEnd);const n=new s;const h=n.isInRange(t,r);if(e.useDarkStyle!==h){e.useDarkStyle=h;saveSettings(e)}let u=0;if(h){u=s.millisecondsBefore(r)}else{u=s.millisecondsBefore(t)}if(u!==0){setTimeout(()=>i(),u)}}}i();return{export:s}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/clear-cache.min.js"] = (()=>{return(n,c)=>{return{widget:{content:`\n \n \n 清除缓存\n `,condition:()=>typeof offlineData==="undefined",success:()=>{$("#clear-cache").on("click",()=>{n.cache={};saveSettings(n);Toast.success("已删除全部缓存.","清除缓存",5e3)})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(e,t)=>{const s={entity:null,aid:undefined,cid:undefined,isOldBangumi:false,isStardustBangumi:false};const n=[];class i{constructor(){this.menuPanel=document.querySelector(".download-video-panel");this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&otype=json`}}}class o extends i{constructor(){super();this.menuClasses=["action","progress"];this.currentMenuClass="action"}async getUrl(){const e=await SpinQuery.select(()=>n[0]).catch(()=>logError("获取番剧下载链接失败."));return e}}class a extends i{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=&otype=json`}}}class r{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new c(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{s.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const i=s.data||s.result||s;const o=i.accept_quality;const a=i.accept_format.split(",");const l=i.accept_description;const c=[];while(o.length>0){const e=new r(o.pop(),a.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class l{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class c{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.loaded=0;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{s.entity.getUrl(this.format.quality).then(n=>{const i=new XMLHttpRequest;i.addEventListener("load",()=>{const n=JSON.parse(i.responseText.replace(/http:/g,"https:"));const o=n.data||n.result||n;if(!s.isOldBangumi&&o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const a=o.durl;this.fragments=a.map(e=>new l(e.length,e.size,e.url,e.backup_url));e(this.fragments)});i.withCredentials=true;i.open("GET",n);i.send()})})}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;while(n{let n=0;const o=new XMLHttpRequest;o.open("GET",e.url);o.responseType="arraybuffer";o.withCredentials=false;o.addEventListener("progress",e=>{this.loaded+=e.loaded-n;n=e.loaded;this.progress&&this.progress(this.loaded/this.totalSize)});o.addEventListener("load",()=>{if((""+o.status)[0]==="2"){t(o.response)}else{s(`请求失败.`)}});o.addEventListener("abort",()=>s("下载已取消."));o.addEventListener("error",()=>s(`下载失败.`));o.setRequestHeader("Range",i);o.send();this.workingXhr.push(o)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=$("a#video-complete").attr("href");if(e&&$(`.link[href=${e}]`).length===0){URL.revokeObjectURL(e)}}downloadSingle(e){const[t]=e;const s=this.makeBlob(t);const n=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","")+this.extension();return[s,n]}async downloadMultiple(e){const t=new JSZip;const s=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");if(e.length>1){e.forEach((e,n)=>{const i=this.fragments[n];t.file(`${s} - ${n+1}${this.extension(i)}`,this.makeBlob(e,i))})}else{const[n]=e;t.file(`${s}${this.extension()}`,this.makeBlob(n))}const n=await t.generateAsync({type:"blob"});const i=s+".zip";return[n,i]}async download(){const e=[];this.loaded=0;this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}const n=URL.createObjectURL(t);this.cleanUpOldBlobUrl();this.progress&&this.progress(0);return{url:n,filename:s}}}async function d(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);s.aid=e;s.cid=t;if(document.URL.indexOf("bangumi")!==-1){const e=await SpinQuery.select(()=>document.querySelector("#bofqi"));if(!e.classList.contains("stardust-player")){s.isOldBangumi=true;s.entity=new o;await SpinQuery.unsafeJquery();unsafeWindow.$(unsafeWindow.document).ajaxSend((e,t,s)=>{if(s.url.indexOf("https://bangumi.bilibili.com/player/web_api/v2/playurl")!==-1){n.unshift(s.url)}})}else{s.isStardustBangumi=true;s.entity=new a}}else{s.entity=new i}return e!==undefined&&t!==undefined}async function u(){await d();const e=await r.availableFormats;let[n]=e;const i=()=>n.downloadInfo().catch(e=>{s.entity.addError();$(".video-error").text(e)});async function o(){if(!n){return}s.entity.nextMenuClass();const e=await i();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{s.entity.addError();$(".video-error").text(e)});if(!t){return}const o=document.getElementById("video-complete");o.setAttribute("href",t.url);o.setAttribute("download",t.filename);o.click();const a=`下载完成. 再次保存`;Toast.success(a,"下载视频");s.entity.resetMenuClass()}async function a(){if(!n){return}const e=await i();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);s.entity.resetMenuClass()}$(".video-action>#video-action-download").on("click",o);$(".video-action>#video-action-copy").on("click",a);e.forEach(e=>{$(`
  • ${e.displayName}
  • `).on("click",()=>{n=e;s.entity.nextMenuClass()}).prependTo("ol.video-quality")});t.applyStyle("downloadVideoStyle");const l=document.querySelector(".download-video-panel");const c=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!l.contains(e.target)){c()}});$(".video-error").on("click",()=>{$(".video-error").text("");s.entity.removeError()});s.entity.addMenuClass()}return{widget:{content:t.data.downloadVideoDom.text,condition:d,success:u}}}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(n,t)=>{const{DanmakuInfo:e}=t.import("videoInfo");const{DanmakuConverter:o}=t.import("danmakuConverter");async function a(n,t){const a=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const i=new e((unsafeWindow||window).cid);await i.fetchInfo();const r=(()=>{if(t===true){const n=new o({title:a,font:"Microsoft YaHei UI",alpha:.6,duration(n){switch(n.type){case 4:case 5:return 4;default:return 6}},blockTypes:[],resolution:{x:1920,y:1080},bottomMarginPercent:.15});const t=n.convertToAssDocument(i.rawXML);return new Blob([t.generateAss()],{type:"text/plain"})}else{return new Blob([i.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const s=$("#danmaku-link");const u=s.attr("href");if(u){URL.revokeObjectURL(u)}clearTimeout(n);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";s.attr("download",`${a}.${t?"ass":"xml"}`).attr("href",c).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let n=await SpinQuery.condition(()=>(unsafeWindow||window).cid,n=>n!==undefined);return n!==undefined},success:()=>{const n=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",t=>{if(t.target!==n){const n=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{a(n,t.shiftKey)}catch(n){logError(n)}}})}}}}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/danmaku-converter.min.js"] = (()=>{return(t,e)=>{class s{constructor(t,e,s,i,n){this.content=t;this.time=e;this.type=parseInt(s);this.fontSize=parseFloat(i);this.color=parseInt(n)}}class i extends s{constructor({content:t,time:e,type:s,fontSize:i,color:n,timeStamp:o,pool:r,userHash:a,rowId:h}){super(t,e,s,i,n);this.timeStamp=parseInt(o);this.pool=parseInt(r);this.userHash=a;this.rowId=parseInt(h);this.time=parseFloat(this.time);this.pDataArray=[e,s,i,n,o,r,a,h]}text(){const t=this.pDataArray.join(",");return`${this.content}`}static parse(t){const e=t.getAttribute("p");const[s,n,o,r,a,h,l,c]=e.split(",");const u=t.innerHTML;return new i({content:u,time:s,type:n,fontSize:o,color:r,timeStamp:a,pool:h,userHash:l,rowId:c})}}class n{constructor(t){this.xml=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.danmakus=[...e.querySelectorAll("d[p]")].map(t=>i.parse(t))}}class o extends s{constructor({content:t,time:e,type:s,fontSize:i,color:n,typeTag:o,colorTag:r,endTime:a}){super(t,e,s,i,n);this.typeTag=o;this.colorTag=r;this.endTime=a}text(t){const e=t[this.fontSize].match(/Style:(.*?),/)[1].trim();return`Dialogue: 0,${this.time},${this.endTime},${e},,0,0,0,,{${this.typeTag}${this.colorTag}}${this.content}`}}class r{constructor({danmakus:t,title:e,fontStyles:s,blockTypes:i,resolution:n}){this.danmakus=t;this.title=e;this.fontStyles=s;this.blockTypes=i;this.resolution=n}generateAss(){const t=`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.title}\nScriptType: v4.00+\nPlayResX: ${this.resolution.x}\nPlayResY: ${this.resolution.y}\nTimer: 10.0000\nWrapStyle: 2\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${Object.values(this.fontStyles).join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n `.trim();return t+"\n"+this.danmakus.map(t=>t.text(this.fontStyles,this.blockTypes)).filter(t=>t!=="").join("\n")}}class a{constructor(t,e,s,i){this.horizontalDanmakus=[];this.horizontalTrack=[];this.verticalDanmakus=[];this.verticalTrack=[];this.resolution=e;this.duration=s;this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.fontSizes={25:`52px ${t}`,18:`36px ${t}`};this.danmakuType={1:"normal",2:"normal",3:"normal",4:"bottom",5:"top",6:"reversed",7:"special",8:"special"};this.bottomMarginPercent=i;this.margin=4;this.nextDanmakuDelay=.05;this.generateTracks()}generateTracks(){const t=52;this.danmakuHeight=t;this.trackHeight=this.margin*2+t;this.trackCount=parseInt(fixed(this.resolution.y*(1-this.bottomMarginPercent)/this.trackHeight,0))}getTextSize(t){this.context.font=this.fontSizes[t.fontSize];const e=this.context.measureText(t.content);const s=e.width/2;return[s,this.danmakuHeight/2]}getHorizonalTags(t){const[e,s]=this.getTextSize(t);const i=e*2;const n=this.duration(t)*i/(this.resolution.x+i)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.widtht.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\pos(0,-999)`}o--;this.horizontalTrack.push({width:i,start:t.time,visible:t.time+n,end:t.time+this.duration(t),track:o});return`\\move(${this.resolution.x+e},${o*this.trackHeight+this.margin+s},${-e},${o*this.trackHeight+this.margin+s},0,${this.duration(t)*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);const s=this.danmakuType[t.type]==="top";let i=null;let n=s?0:this.trackCount-1;const o=s?1:-1;const r=e=>{if(e.track!==n){return false}return e.end>t.time};do{i=this.verticalTrack.find(r);n+=o}while(i&&n<=this.trackCount&&n>=0);if(n>this.trackCount||n<0){return`\\pos(0,-999)`}n-=o;this.verticalTrack.push({start:t.time,end:t.time+this.duration(t),track:n});if(s){return`\\pos(${this.resolution.x/2},${n*this.trackHeight+this.margin+e})`}else{return`\\pos(${this.resolution.x/2},${this.resolution.y-this.margin-e-(this.trackCount-1-n)*this.trackHeight})`}}push(t){let e=null;let s=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);s=this.horizontalDanmakus;break}case"top":case"bottom":{e=this.getVerticalTags(t);s=this.verticalDanmakus;break}case"special":default:{return{tags:`\\pos(0,-999)`}}}const i={tags:e};s.push(i);return i}}class h{constructor({title:t,font:e,alpha:s,duration:i,blockTypes:n,resolution:o,bottomMarginPercent:r}){this.title=t;this.font=e;this.alpha=Math.round(s*100);this.duration=i;this.blockTypes=n;this.resolution=o;this.danmakuStack=new a(e,o,i,r)}get fontStyles(){return{25:`Style: Medium,${this.font},52,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`,18:`Style: Small,${this.font},36,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`}}convertToAssDocument(t){const e=new n(t);const s=[];for(const t of e.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.indexOf(t.type)!==-1){continue}const[e,i]=this.convertTime(t.time,this.duration(t));s.push(new o({content:this.convertText(t.content),time:e,endTime:i,type:t.type,fontSize:t.fontSize,color:t.color,typeTag:this.convertType(t),colorTag:this.convertColor(t.color)}))}return new r({danmakus:s,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}convertText(t){const e={"{":"{","}":"}","&":"&","<":"<",">":">",""":'"',"'":"'"};for(const[s,i]of Object.entries(e)){t=t.replace(new RegExp(s,"g"),i)}return t}convertType(t){return this.danmakuStack.push(t).tags}convertColor(t){const e=16777215;if(t===e){return""}const s=t.toString(16);const i=s.substring(0,2);const n=s.substring(2,4);const o=s.substring(4,6);return`\\c&H${o}${n}${i}&`}convertTime(t,e){function s(t){const[e,s="00"]=String(t).split(".");return`${e.padStart(2,"0")}.${s.substr(0,2).padEnd(2,"0")}`}function i(t){let e=0;let i=0;while(t>=60){t-=60;i++}while(i>=60){i-=60;e++}return`${e}:${String(i).padStart(2,"0")}:${s(t)}`}return[i(t),i(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:s,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:i,XmlDanmakuDocument:n}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(t,e)=>{const{DanmakuInfo:n}=e.import("videoInfo");const{DanmakuConverter:i}=e.import("danmakuConverter");async function o(t,e){const o=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const a=new n((unsafeWindow||window).cid);await a.fetchInfo();const l=await(async()=>{if(e===true){await loadLazyPanel(".bilibili-player-video-danmaku-setting");const t=t=>{const e=parseFloat(document.querySelector(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};const e=document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;const n=parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));const l=(()=>{const e=[10,8,6,4,2][t(".bilibili-player-setting-speedplus .bui-thumb")];return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();const r=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"],".bilibili-player-block-filter-type[ftype=special]":[7,8]};for(const[n,i]in Object.entries(e)){if(document.querySelector(n).classList.contains("disabled")){t=t.concat(i)}}return t})();const c=[2,1.5,1,.75,.5][t(".bilibili-player-setting-fontsize .bui-thumb")];const s=[.75,.5,.25,.15,.15][t(".bilibili-player-setting-area .bui-thumb")];const u=new i({title:o,font:e,alpha:n,duration:l,blockTypes:r,resolution:{x:1920*c,y:1080*c},bottomMarginPercent:s});const d=u.convertToAssDocument(a.rawXML);return new Blob([d.generateAss()],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const r=URL.createObjectURL(l);const c=$("#danmaku-link");const s=c.attr("href");if(s){URL.revokeObjectURL(s)}clearTimeout(t);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";c.attr("download",`${o}.${e?"ass":"xml"}`).attr("href",r).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let t=await SpinQuery.condition(()=>(unsafeWindow||window).cid,t=>t!==undefined);return t!==undefined},success:()=>{const t=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",e=>{if(e.target!==t){const t=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{o(t,e.shiftKey)}catch(t){logError(t)}}})}}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/danmaku-converter.min.js"] = (()=>{return(t,e)=>{class i{constructor(t,e,i,s,n){this.content=t;this.time=e;this.type=parseInt(i);this.fontSize=parseFloat(s);this.color=parseInt(n)}}class s extends i{constructor({content:t,time:e,type:i,fontSize:s,color:n,timeStamp:o,pool:r,userHash:a,rowId:h}){super(t,e,i,s,n);this.timeStamp=parseInt(o);this.pool=parseInt(r);this.userHash=a;this.rowId=parseInt(h);this.time=parseFloat(this.time);this.pDataArray=[e,i,s,n,o,r,a,h]}text(){const t=this.pDataArray.join(",");return`${this.content}`}static parse(t){const e=t.getAttribute("p");const[i,n,o,r,a,h,l,c]=e.split(",");const u=t.innerHTML;return new s({content:u,time:i,type:n,fontSize:o,color:r,timeStamp:a,pool:h,userHash:l,rowId:c})}}class n{constructor(t){this.xml=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.danmakus=[...e.querySelectorAll("d[p]")].map(t=>s.parse(t))}}class o extends i{constructor({content:t,time:e,type:i,fontSize:s,color:n,typeTag:o,colorTag:r,endTime:a}){super(t,e,i,s,n);this.typeTag=o;this.colorTag=r;this.endTime=a}text(t){const e=t[this.fontSize].match(/Style:(.*?),/)[1].trim();return`Dialogue: 0,${this.time},${this.endTime},${e},,0,0,0,,{${this.typeTag}${this.colorTag}}${this.content}`}}class r{constructor({danmakus:t,title:e,fontStyles:i,blockTypes:s,resolution:n}){this.danmakus=t;this.title=e;this.fontStyles=i;this.blockTypes=s;this.resolution=n}generateAss(){const t=`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.title}\nScriptType: v4.00+\nPlayResX: ${this.resolution.x}\nPlayResY: ${this.resolution.y}\nTimer: 10.0000\nWrapStyle: 2\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${Object.values(this.fontStyles).join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n `.trim();return t+"\n"+this.danmakus.map(t=>t.text(this.fontStyles,this.blockTypes)).filter(t=>t!=="").join("\n")}}class a{constructor(t,e,i,s){this.horizontalDanmakus=[];this.horizontalTrack=[];this.verticalDanmakus=[];this.verticalTrack=[];this.resolution=e;this.duration=i;this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.fontSizes={25:`52px ${t}`,18:`36px ${t}`};this.danmakuType={1:"normal",2:"normal",3:"normal",4:"bottom",5:"top",6:"reversed",7:"special",8:"special"};this.bottomMarginPercent=s;this.margin=4;this.nextDanmakuDelay=.05;this.generateTracks()}generateTracks(){const t=52;this.danmakuHeight=t;this.trackHeight=this.margin*2+t;this.trackCount=parseInt(fixed(this.resolution.y*(1-this.bottomMarginPercent)/this.trackHeight,0))}getTextSize(t){this.context.font=this.fontSizes[t.fontSize];const e=this.context.measureText(t.content);const i=e.width/2;return[i,this.danmakuHeight/2]}getHorizonalTags(t){const[e,i]=this.getTextSize(t);const s=e*2;const n=this.duration(t)*s/(this.resolution.x+s)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.widtht.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\pos(0,-999)`}o--;this.horizontalTrack.push({width:s,start:t.time,visible:t.time+n,end:t.time+this.duration(t),track:o});return`\\move(${this.resolution.x+e},${o*this.trackHeight+this.margin+i},${-e},${o*this.trackHeight+this.margin+i},0,${this.duration(t)*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);const i=this.danmakuType[t.type]==="top";let s=null;let n=i?0:this.trackCount-1;const o=i?1:-1;const r=e=>{if(e.track!==n){return false}return e.end>t.time};do{s=this.verticalTrack.find(r);n+=o}while(s&&n<=this.trackCount&&n>=0);if(n>this.trackCount||n<0){return`\\pos(0,-999)`}n-=o;this.verticalTrack.push({start:t.time,end:t.time+this.duration(t),track:n});if(i){return`\\pos(${this.resolution.x/2},${n*this.trackHeight+this.margin+e})`}else{return`\\pos(${this.resolution.x/2},${this.resolution.y-this.margin-e-(this.trackCount-1-n)*this.trackHeight})`}}push(t){let e=null;let i=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);i=this.horizontalDanmakus;break}case"top":case"bottom":{e=this.getVerticalTags(t);i=this.verticalDanmakus;break}case"special":default:{return{tags:`\\pos(0,-999)`}}}const s={tags:e};i.push(s);return s}}class h{constructor({title:t,font:e,alpha:i,duration:s,blockTypes:n,resolution:o,bottomMarginPercent:r}){this.title=t;this.font=e;this.alpha=Math.round(i*100);this.duration=s;this.blockTypes=n;this.resolution=o;this.white=16777215;this.danmakuStack=new a(e,o,s,r)}get fontStyles(){return{25:`Style: Medium,${this.font},52,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`,18:`Style: Small,${this.font},36,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`}}convertToAssDocument(t){const e=new n(t);const i=[];for(const t of e.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.indexOf(t.type)!==-1||this.blockTypes.indexOf("color")!==-1&&t.color!==this.white){continue}const[e,s]=this.convertTime(t.time,this.duration(t));i.push(new o({content:this.convertText(t.content),time:e,endTime:s,type:t.type,fontSize:t.fontSize,color:t.color,typeTag:this.convertType(t),colorTag:this.convertColor(t.color)}))}return new r({danmakus:i,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}convertText(t){const e={"{":"{","}":"}","&":"&","<":"<",">":">",""":'"',"'":"'"};for(const[i,s]of Object.entries(e)){t=t.replace(new RegExp(i,"g"),s)}return t}convertType(t){return this.danmakuStack.push(t).tags}convertColor(t){if(t===this.white){return""}const e=t.toString(16);const i=e.substring(0,2);const s=e.substring(2,4);const n=e.substring(4,6);return`\\c&H${n}${s}${i}&`}convertTime(t,e){function i(t){const[e,i="00"]=String(t).split(".");return`${e.padStart(2,"0")}.${i.substr(0,2).padEnd(2,"0")}`}function s(t){let e=0;let s=0;while(t>=60){t-=60;s++}while(s>=60){s-=60;e++}return`${e}:${String(s).padStart(2,"0")}:${i(t)}`}return[s(t),s(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:i,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:s,XmlDanmakuDocument:n}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-info.min.js"] = (()=>{return()=>{class t{constructor(t){this.aid=t}async fetchInfo(){const t=JSON.parse(await downloadText(`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`));if(t.code!==0){throw new Error(t.message)}const i=t.data;this.cid=i.cid;this.pageCount=i.videos;this.coverUrl=i.pic;this.tagId=i.tid;this.tagName=i.tname;this.title=i.title;this.description=i.desc;this.up={uid:i.owner.mid,name:i.owner.name,faceUrl:i.owner.face};this.pages=i.pages.map(t=>{return{cid:t.cid,title:t.part,pageNumber:t.page}});return this}async fetchDanmaku(){this.danmaku=new e(this.cid);return this.danmaku.fetchInfo()}}class i{constructor(t,i){this.text=t;this.p=i}}class e{constructor(t){this.cid=t}async fetchInfo(){const t=await downloadText(`https://api.bilibili.com/x/v1/dm/list.so?oid=${this.cid}`);this.rawXML=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.xml=e;this.danmakus=[].map.call(e.querySelectorAll("d[p]"),t=>{return new i(t.innerHTML,t.getAttribute("p"))})}}class a{constructor(t){this.ep=t;this.videos=[]}async fetchInfo(){const i=await downloadText(`https://www.bilibili.com/bangumi/play/ep${this.ep}/`);const e=JSON.parse(i.match(/window\.__INITIAL_STATE__=(.*);\(function\(\){/)[1]);this.title=e.mediaInfo.title;this.cover=e.mediaInfo.cover;this.squareCover=e.mediaInfo.square_cover;this.aid=e.epInfo.aid;this.cid=e.epInfo.cid;this.videos=e.epList.map(async i=>{return{title:i.index_title,aid:i.aid,cid:i.cid,info:await new t(i.aid).fetchInfo()}});return this}}return{export:{VideoInfo:t,BangumiInfo:a,Danmaku:i,DanmakuInfo:e}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/about.min.html"] = `

    Bilibili Evolved

    开源组件

      `; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/about.min.css"] = `.about.gui-settings-footer{height:24px;font-size:14px;justify-content:space-between;padding:6px 24px;border-top:1px dashed #8884}.about.gui-settings-footer>span{opacity:.2}.bilibili-evolved-about{display:flex;width:400px;height:70vh;background-color:#fff;position:fixed;top:15%;left:calc(50% - 200px);z-index:100000;box-shadow:0 3px 20px 2px #0004;border-top:4px solid var(--theme-color);flex-direction:column;transition:.2s ease-out;transform-origin:center;transform:scale(0)}.bilibili-evolved-about.opened{transform:scale(1)}.bilibili-evolved-info a{margin:0 4px}.bilibili-evolved-info>p{margin:8px 0}.bilibili-evolved-about>div{flex:1 0 0;display:flex;align-items:center;justify-content:space-between;flex-direction:column;padding:8px}.bilibili-evolved-about>div.about-block{flex:4 0 0;padding:32px;align-items:stretch}.bilibili-evolved-about h1{font-size:36px;margin-bottom:16px}.bilibili-evolved-about h2{font-size:18px;margin-bottom:8px}.open-source-components>li{margin:12px 0;padding:12px 24px;background:rgba(0,0,0,.2);border-left:4px solid var(--theme-color);cursor:pointer;transition:.2s ease-out}.open-source-components>li:hover{opacity:.8}.component-name{font-size:18px;font-weight:700}.component-info{margin-top:8px}#about-link{cursor:pointer;transition:.2s}.bilibili-evolved-about a{color:var(--theme-color)}#about-link:hover{opacity:1;color:var(--theme-color)}#about-close{background-color:#8884;border-color:transparent;opacity:1;transition:.2s ease-out;width:80px;height:32px;color:inherit;cursor:pointer}#about-close:hover{opacity:.8}#about-close:active{outline:0;opacity:.6}`; diff --git a/bilibili-evolved.preview-offline.user.js b/bilibili-evolved.preview-offline.user.js index b08ef5c08..cfc9aa7c9 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 191.84 +// @version 191.89 // @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中. // @author Grant Howard, Coulomb-G // @copyright 2019, Grant Howrad (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) @@ -747,6 +747,12 @@ event.initEvent(eventName, true, true); element.dispatchEvent(event); } + async function loadLazyPanel(selector) + { + await SpinQuery.unsafeJquery(); + const panel = await SpinQuery.any(() => unsafeWindow.$(selector)); + panel.mouseover().mouseout(); + } function contentLoaded(callback) { if (/complete|interactive|loaded/.test(document.readyState)) @@ -1190,8 +1196,8 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/dark-schedule.min.js"] = (()=>{return(e,t)=>{class s{constructor(...e){if(e.length===0){const e=new Date;this.hour=e.getHours();this.minute=e.getMinutes()}else if(e.length===1){const[t]=e;[this.hour,this.minute]=t.split(":").slice(0,2).map(e=>this.validatePart(e));this.normalize()}else if(v.length===2){[this.hour,this.minute]=e}}validatePart(e){const t=parseInt(e);if(!isNaN(t)&&0<=t&&t<=59){return t}else{return null}}normalize(){while(this.minute<0){this.minute+=60;this.hour-=1}while(this.minute>=60){this.minute-=60;this.hour+=1}while(this.hour<0){this.hour+=24}while(this.hour>=24){this.hour-=24}}lessThan(e){if(this.houre.hour||this.hour===e.hour&&this.minute>e.minute){return true}return false}equals(e){return this.hour===e.hour&&this.minute===e.minute}isInRange(e,t){if(e.equals(t)){return false}let s=this.greaterThan(e)&&this.lessThan(t);if(e.greaterThan(t)){s=this.greaterThan(e)||this.lessThan(t)}const i=s||this.equals(e);return i}static millisecondsBefore(e){const t=new s;const i=(new Date).getSeconds();const r=1e3*(t.hour*3600+t.minute*60+i);const n=1e3*(e.hour*3600+e.minute*60);let h=n-r;if(t.greaterThan(e)||t.equals(e)&&i!==0){h+=24*3600*1e3}return h}}function i(){if(e.darkSchedule){const t=new s(e.darkScheduleStart);const r=new s(e.darkScheduleEnd);const n=new s;const h=n.isInRange(t,r);if(e.useDarkStyle!==h){e.useDarkStyle=h;saveSettings(e)}let u=0;if(h){u=s.millisecondsBefore(r)}else{u=s.millisecondsBefore(t)}if(u!==0){setTimeout(()=>i(),u)}}}i();return{export:s}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/clear-cache.min.js"] = (()=>{return(n,c)=>{return{widget:{content:`\n \n \n 清除缓存\n `,condition:()=>typeof offlineData==="undefined",success:()=>{$("#clear-cache").on("click",()=>{n.cache={};saveSettings(n);Toast.success("已删除全部缓存.","清除缓存",5e3)})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-video.min.js"] = (()=>{return(e,t)=>{const s={entity:null,aid:undefined,cid:undefined,isOldBangumi:false,isStardustBangumi:false};const n=[];class i{constructor(){this.menuPanel=document.querySelector(".download-video-panel");this.menuClasses=["quality","action","progress"];this.currentMenuClass="quality"}addMenuClass(){this.menuPanel.classList.remove(...this.menuClasses);this.menuPanel.classList.add(this.currentMenuClass);return this.currentMenuClass}resetMenuClass(){[this.currentMenuClass]=this.menuClasses;this.addMenuClass()}nextMenuClass(){const e=this.menuClasses.indexOf(this.currentMenuClass)+1;const t=this.menuClasses[e>=this.menuClasses.length?0:e];this.currentMenuClass=t;this.addMenuClass();return t}addError(){this.menuPanel.classList.add("error")}removeError(){this.menuPanel.classList.remove("error");this.resetMenuClass()}async getUrl(e){if(e){return`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/x/player/playurl?avid=${s.aid}&cid=${s.cid}&otype=json`}}}class o extends i{constructor(){super();this.menuClasses=["action","progress"];this.currentMenuClass="action"}async getUrl(){const e=await SpinQuery.select(()=>n[0]).catch(()=>logError("获取番剧下载链接失败."));return e}}class a extends i{async getUrl(e){if(e){return`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=${e}&otype=json`}else{return`https://api.bilibili.com/pgc/player/web/playurl?avid=${s.aid}&cid=${s.cid}&qn=&otype=json`}}}class r{constructor(e,t,s){this.quality=e;this.internalName=t;this.displayName=s}async downloadInfo(){const e=new c(this);await e.fetchVideoInfo();return e}static get availableFormats(){return new Promise((e,t)=>{s.entity.getUrl().then(s=>{const n=new XMLHttpRequest;n.addEventListener("load",()=>{const s=JSON.parse(n.responseText);if(s.code!==0){t("获取清晰度信息失败.")}const i=s.data||s.result||s;const o=i.accept_quality;const a=i.accept_format.split(",");const l=i.accept_description;const c=[];while(o.length>0){const e=new r(o.pop(),a.pop(),l.pop());c.push(e)}e(c)});n.addEventListener("error",()=>t(`获取清晰度信息失败.`));n.withCredentials=true;n.open("GET",s);n.send()})})}}class l{constructor(e,t,s,n){this.length=e;this.size=t;this.url=s;this.backupUrls=n}}class c{constructor(e,t){this.format=e;this.fragments=t||[];this.progress=null;this.loaded=0;this.totalSize=null;this.workingXhr=null;this.fragmentSplitFactor=6*5}fetchVideoInfo(){return new Promise((e,t)=>{s.entity.getUrl(this.format.quality).then(n=>{const i=new XMLHttpRequest;i.addEventListener("load",()=>{const n=JSON.parse(i.responseText.replace(/http:/g,"https:"));const o=n.data||n.result||n;if(!s.isOldBangumi&&o.quality!==this.format.quality){t("获取下载链接失败, 请确认当前账号有下载权限后重试.")}const a=o.durl;this.fragments=a.map(e=>new l(e.length,e.size,e.url,e.backup_url));e(this.fragments)});i.withCredentials=true;i.open("GET",n);i.send()})})}cancelDownload(){if("forEach"in this.workingXhr){this.workingXhr.forEach(e=>e.abort())}else{logError("Cancel Download Failed: forEach in this.workingXhr not found.")}}downloadFragment(e){const t=[];this.workingXhr=[];const s=Math.round(e.size/this.fragmentSplitFactor);let n=0;while(n{let n=0;const o=new XMLHttpRequest;o.open("GET",e.url);o.responseType="arraybuffer";o.withCredentials=false;o.addEventListener("progress",e=>{this.loaded+=e.loaded-n;n=e.loaded;this.progress&&this.progress(this.loaded/this.totalSize)});o.addEventListener("load",()=>{if((""+o.status)[0]==="2"){t(o.response)}else{s(`请求失败.`)}});o.addEventListener("abort",()=>s("下载已取消."));o.addEventListener("error",()=>s(`下载失败.`));o.setRequestHeader("Range",i);o.send();this.workingXhr.push(o)}));n=Math.round(n+s)+1}return Promise.all(t)}copyUrl(){const e=this.fragments.map(e=>e.url).reduce((e,t)=>e+"\r\n"+t);GM_setClipboard(e,"text")}extension(e){return(e||this.fragments[0]).url.indexOf(".flv")!==-1?".flv":".mp4"}makeBlob(e,t=null){return new Blob(Array.isArray(e)?e:[e],{type:this.extension(t)===".flv"?"video/x-flv":"video/mp4"})}cleanUpOldBlobUrl(){const e=$("a#video-complete").attr("href");if(e&&$(`.link[href=${e}]`).length===0){URL.revokeObjectURL(e)}}downloadSingle(e){const[t]=e;const s=this.makeBlob(t);const n=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","")+this.extension();return[s,n]}async downloadMultiple(e){const t=new JSZip;const s=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");if(e.length>1){e.forEach((e,n)=>{const i=this.fragments[n];t.file(`${s} - ${n+1}${this.extension(i)}`,this.makeBlob(e,i))})}else{const[n]=e;t.file(`${s}${this.extension()}`,this.makeBlob(n))}const n=await t.generateAsync({type:"blob"});const i=s+".zip";return[n,i]}async download(){const e=[];this.loaded=0;this.totalSize=this.fragments.map(e=>e.size).reduce((e,t)=>e+t);for(const t of this.fragments){const s=await this.downloadFragment(t);e.push(s)}if(e.length<1){throw new Error("下载失败.")}let t=null;let s=null;if(e.length===1){[t,s]=this.downloadSingle(e)}else{[t,s]=await this.downloadMultiple(e)}const n=URL.createObjectURL(t);this.cleanUpOldBlobUrl();this.progress&&this.progress(0);return{url:n,filename:s}}}async function d(){const e=await SpinQuery.select(()=>(unsafeWindow||window).aid);const t=await SpinQuery.select(()=>(unsafeWindow||window).cid);s.aid=e;s.cid=t;if(document.URL.indexOf("bangumi")!==-1){const e=await SpinQuery.select(()=>document.querySelector("#bofqi"));if(!e.classList.contains("stardust-player")){s.isOldBangumi=true;s.entity=new o;await SpinQuery.unsafeJquery();unsafeWindow.$(unsafeWindow.document).ajaxSend((e,t,s)=>{if(s.url.indexOf("https://bangumi.bilibili.com/player/web_api/v2/playurl")!==-1){n.unshift(s.url)}})}else{s.isStardustBangumi=true;s.entity=new a}}else{s.entity=new i}return e!==undefined&&t!==undefined}async function u(){await d();const e=await r.availableFormats;let[n]=e;const i=()=>n.downloadInfo().catch(e=>{s.entity.addError();$(".video-error").text(e)});async function o(){if(!n){return}s.entity.nextMenuClass();const e=await i();e.progress=(e=>{$(".download-progress-value").text(`${fixed(e*100)}`);$(".download-progress-foreground").css("transform",`scaleX(${e})`)});document.querySelector(".download-progress-cancel>span").onclick=(()=>e.cancelDownload());const t=await e.download().catch(e=>{s.entity.addError();$(".video-error").text(e)});if(!t){return}const o=document.getElementById("video-complete");o.setAttribute("href",t.url);o.setAttribute("download",t.filename);o.click();const a=`下载完成. 再次保存`;Toast.success(a,"下载视频");s.entity.resetMenuClass()}async function a(){if(!n){return}const e=await i();e.copyUrl();Toast.success("已复制链接到剪贴板.","复制链接",3e3);s.entity.resetMenuClass()}$(".video-action>#video-action-download").on("click",o);$(".video-action>#video-action-copy").on("click",a);e.forEach(e=>{$(`
    • ${e.displayName}
    • `).on("click",()=>{n=e;s.entity.nextMenuClass()}).prependTo("ol.video-quality")});t.applyStyle("downloadVideoStyle");const l=document.querySelector(".download-video-panel");const c=()=>$(".download-video-panel").toggleClass("opened");$("#download-video").on("click",e=>{if(!l.contains(e.target)){c()}});$(".video-error").on("click",()=>{$(".video-error").text("");s.entity.removeError()});s.entity.addMenuClass()}return{widget:{content:t.data.downloadVideoDom.text,condition:d,success:u}}}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(n,t)=>{const{DanmakuInfo:e}=t.import("videoInfo");const{DanmakuConverter:o}=t.import("danmakuConverter");async function a(n,t){const a=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const i=new e((unsafeWindow||window).cid);await i.fetchInfo();const r=(()=>{if(t===true){const n=new o({title:a,font:"Microsoft YaHei UI",alpha:.6,duration(n){switch(n.type){case 4:case 5:return 4;default:return 6}},blockTypes:[],resolution:{x:1920,y:1080},bottomMarginPercent:.15});const t=n.convertToAssDocument(i.rawXML);return new Blob([t.generateAss()],{type:"text/plain"})}else{return new Blob([i.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const s=$("#danmaku-link");const u=s.attr("href");if(u){URL.revokeObjectURL(u)}clearTimeout(n);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";s.attr("download",`${a}.${t?"ass":"xml"}`).attr("href",c).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let n=await SpinQuery.condition(()=>(unsafeWindow||window).cid,n=>n!==undefined);return n!==undefined},success:()=>{const n=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",t=>{if(t.target!==n){const n=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{a(n,t.shiftKey)}catch(n){logError(n)}}})}}}}})(); -offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/danmaku-converter.min.js"] = (()=>{return(t,e)=>{class s{constructor(t,e,s,i,n){this.content=t;this.time=e;this.type=parseInt(s);this.fontSize=parseFloat(i);this.color=parseInt(n)}}class i extends s{constructor({content:t,time:e,type:s,fontSize:i,color:n,timeStamp:o,pool:r,userHash:a,rowId:h}){super(t,e,s,i,n);this.timeStamp=parseInt(o);this.pool=parseInt(r);this.userHash=a;this.rowId=parseInt(h);this.time=parseFloat(this.time);this.pDataArray=[e,s,i,n,o,r,a,h]}text(){const t=this.pDataArray.join(",");return`${this.content}`}static parse(t){const e=t.getAttribute("p");const[s,n,o,r,a,h,l,c]=e.split(",");const u=t.innerHTML;return new i({content:u,time:s,type:n,fontSize:o,color:r,timeStamp:a,pool:h,userHash:l,rowId:c})}}class n{constructor(t){this.xml=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.danmakus=[...e.querySelectorAll("d[p]")].map(t=>i.parse(t))}}class o extends s{constructor({content:t,time:e,type:s,fontSize:i,color:n,typeTag:o,colorTag:r,endTime:a}){super(t,e,s,i,n);this.typeTag=o;this.colorTag=r;this.endTime=a}text(t){const e=t[this.fontSize].match(/Style:(.*?),/)[1].trim();return`Dialogue: 0,${this.time},${this.endTime},${e},,0,0,0,,{${this.typeTag}${this.colorTag}}${this.content}`}}class r{constructor({danmakus:t,title:e,fontStyles:s,blockTypes:i,resolution:n}){this.danmakus=t;this.title=e;this.fontStyles=s;this.blockTypes=i;this.resolution=n}generateAss(){const t=`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.title}\nScriptType: v4.00+\nPlayResX: ${this.resolution.x}\nPlayResY: ${this.resolution.y}\nTimer: 10.0000\nWrapStyle: 2\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${Object.values(this.fontStyles).join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n `.trim();return t+"\n"+this.danmakus.map(t=>t.text(this.fontStyles,this.blockTypes)).filter(t=>t!=="").join("\n")}}class a{constructor(t,e,s,i){this.horizontalDanmakus=[];this.horizontalTrack=[];this.verticalDanmakus=[];this.verticalTrack=[];this.resolution=e;this.duration=s;this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.fontSizes={25:`52px ${t}`,18:`36px ${t}`};this.danmakuType={1:"normal",2:"normal",3:"normal",4:"bottom",5:"top",6:"reversed",7:"special",8:"special"};this.bottomMarginPercent=i;this.margin=4;this.nextDanmakuDelay=.05;this.generateTracks()}generateTracks(){const t=52;this.danmakuHeight=t;this.trackHeight=this.margin*2+t;this.trackCount=parseInt(fixed(this.resolution.y*(1-this.bottomMarginPercent)/this.trackHeight,0))}getTextSize(t){this.context.font=this.fontSizes[t.fontSize];const e=this.context.measureText(t.content);const s=e.width/2;return[s,this.danmakuHeight/2]}getHorizonalTags(t){const[e,s]=this.getTextSize(t);const i=e*2;const n=this.duration(t)*i/(this.resolution.x+i)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.widtht.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\pos(0,-999)`}o--;this.horizontalTrack.push({width:i,start:t.time,visible:t.time+n,end:t.time+this.duration(t),track:o});return`\\move(${this.resolution.x+e},${o*this.trackHeight+this.margin+s},${-e},${o*this.trackHeight+this.margin+s},0,${this.duration(t)*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);const s=this.danmakuType[t.type]==="top";let i=null;let n=s?0:this.trackCount-1;const o=s?1:-1;const r=e=>{if(e.track!==n){return false}return e.end>t.time};do{i=this.verticalTrack.find(r);n+=o}while(i&&n<=this.trackCount&&n>=0);if(n>this.trackCount||n<0){return`\\pos(0,-999)`}n-=o;this.verticalTrack.push({start:t.time,end:t.time+this.duration(t),track:n});if(s){return`\\pos(${this.resolution.x/2},${n*this.trackHeight+this.margin+e})`}else{return`\\pos(${this.resolution.x/2},${this.resolution.y-this.margin-e-(this.trackCount-1-n)*this.trackHeight})`}}push(t){let e=null;let s=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);s=this.horizontalDanmakus;break}case"top":case"bottom":{e=this.getVerticalTags(t);s=this.verticalDanmakus;break}case"special":default:{return{tags:`\\pos(0,-999)`}}}const i={tags:e};s.push(i);return i}}class h{constructor({title:t,font:e,alpha:s,duration:i,blockTypes:n,resolution:o,bottomMarginPercent:r}){this.title=t;this.font=e;this.alpha=Math.round(s*100);this.duration=i;this.blockTypes=n;this.resolution=o;this.danmakuStack=new a(e,o,i,r)}get fontStyles(){return{25:`Style: Medium,${this.font},52,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`,18:`Style: Small,${this.font},36,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`}}convertToAssDocument(t){const e=new n(t);const s=[];for(const t of e.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.indexOf(t.type)!==-1){continue}const[e,i]=this.convertTime(t.time,this.duration(t));s.push(new o({content:this.convertText(t.content),time:e,endTime:i,type:t.type,fontSize:t.fontSize,color:t.color,typeTag:this.convertType(t),colorTag:this.convertColor(t.color)}))}return new r({danmakus:s,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}convertText(t){const e={"{":"{","}":"}","&":"&","<":"<",">":">",""":'"',"'":"'"};for(const[s,i]of Object.entries(e)){t=t.replace(new RegExp(s,"g"),i)}return t}convertType(t){return this.danmakuStack.push(t).tags}convertColor(t){const e=16777215;if(t===e){return""}const s=t.toString(16);const i=s.substring(0,2);const n=s.substring(2,4);const o=s.substring(4,6);return`\\c&H${o}${n}${i}&`}convertTime(t,e){function s(t){const[e,s="00"]=String(t).split(".");return`${e.padStart(2,"0")}.${s.substr(0,2).padEnd(2,"0")}`}function i(t){let e=0;let i=0;while(t>=60){t-=60;i++}while(i>=60){i-=60;e++}return`${e}:${String(i).padStart(2,"0")}:${s(t)}`}return[i(t),i(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:s,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:i,XmlDanmakuDocument:n}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-danmaku.min.js"] = (()=>{return(t,e)=>{const{DanmakuInfo:n}=e.import("videoInfo");const{DanmakuConverter:i}=e.import("danmakuConverter");async function o(t,e){const o=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const a=new n((unsafeWindow||window).cid);await a.fetchInfo();const l=await(async()=>{if(e===true){await loadLazyPanel(".bilibili-player-video-danmaku-setting");const t=t=>{const e=parseFloat(document.querySelector(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};const e=document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;const n=parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));const l=(()=>{const e=[10,8,6,4,2][t(".bilibili-player-setting-speedplus .bui-thumb")];return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();const r=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"],".bilibili-player-block-filter-type[ftype=special]":[7,8]};for(const[n,i]in Object.entries(e)){if(document.querySelector(n).classList.contains("disabled")){t=t.concat(i)}}return t})();const c=[2,1.5,1,.75,.5][t(".bilibili-player-setting-fontsize .bui-thumb")];const s=[.75,.5,.25,.15,.15][t(".bilibili-player-setting-area .bui-thumb")];const u=new i({title:o,font:e,alpha:n,duration:l,blockTypes:r,resolution:{x:1920*c,y:1080*c},bottomMarginPercent:s});const d=u.convertToAssDocument(a.rawXML);return new Blob([d.generateAss()],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const r=URL.createObjectURL(l);const c=$("#danmaku-link");const s=c.attr("href");if(s){URL.revokeObjectURL(s)}clearTimeout(t);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";c.attr("download",`${o}.${e?"ass":"xml"}`).attr("href",r).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let t=await SpinQuery.condition(()=>(unsafeWindow||window).cid,t=>t!==undefined);return t!==undefined},success:()=>{const t=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",e=>{if(e.target!==t){const t=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{o(t,e.shiftKey)}catch(t){logError(t)}}})}}}}})(); +offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/danmaku-converter.min.js"] = (()=>{return(t,e)=>{class i{constructor(t,e,i,s,n){this.content=t;this.time=e;this.type=parseInt(i);this.fontSize=parseFloat(s);this.color=parseInt(n)}}class s extends i{constructor({content:t,time:e,type:i,fontSize:s,color:n,timeStamp:o,pool:r,userHash:a,rowId:h}){super(t,e,i,s,n);this.timeStamp=parseInt(o);this.pool=parseInt(r);this.userHash=a;this.rowId=parseInt(h);this.time=parseFloat(this.time);this.pDataArray=[e,i,s,n,o,r,a,h]}text(){const t=this.pDataArray.join(",");return`${this.content}`}static parse(t){const e=t.getAttribute("p");const[i,n,o,r,a,h,l,c]=e.split(",");const u=t.innerHTML;return new s({content:u,time:i,type:n,fontSize:o,color:r,timeStamp:a,pool:h,userHash:l,rowId:c})}}class n{constructor(t){this.xml=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.danmakus=[...e.querySelectorAll("d[p]")].map(t=>s.parse(t))}}class o extends i{constructor({content:t,time:e,type:i,fontSize:s,color:n,typeTag:o,colorTag:r,endTime:a}){super(t,e,i,s,n);this.typeTag=o;this.colorTag=r;this.endTime=a}text(t){const e=t[this.fontSize].match(/Style:(.*?),/)[1].trim();return`Dialogue: 0,${this.time},${this.endTime},${e},,0,0,0,,{${this.typeTag}${this.colorTag}}${this.content}`}}class r{constructor({danmakus:t,title:e,fontStyles:i,blockTypes:s,resolution:n}){this.danmakus=t;this.title=e;this.fontStyles=i;this.blockTypes=s;this.resolution=n}generateAss(){const t=`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.title}\nScriptType: v4.00+\nPlayResX: ${this.resolution.x}\nPlayResY: ${this.resolution.y}\nTimer: 10.0000\nWrapStyle: 2\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${Object.values(this.fontStyles).join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n `.trim();return t+"\n"+this.danmakus.map(t=>t.text(this.fontStyles,this.blockTypes)).filter(t=>t!=="").join("\n")}}class a{constructor(t,e,i,s){this.horizontalDanmakus=[];this.horizontalTrack=[];this.verticalDanmakus=[];this.verticalTrack=[];this.resolution=e;this.duration=i;this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.fontSizes={25:`52px ${t}`,18:`36px ${t}`};this.danmakuType={1:"normal",2:"normal",3:"normal",4:"bottom",5:"top",6:"reversed",7:"special",8:"special"};this.bottomMarginPercent=s;this.margin=4;this.nextDanmakuDelay=.05;this.generateTracks()}generateTracks(){const t=52;this.danmakuHeight=t;this.trackHeight=this.margin*2+t;this.trackCount=parseInt(fixed(this.resolution.y*(1-this.bottomMarginPercent)/this.trackHeight,0))}getTextSize(t){this.context.font=this.fontSizes[t.fontSize];const e=this.context.measureText(t.content);const i=e.width/2;return[i,this.danmakuHeight/2]}getHorizonalTags(t){const[e,i]=this.getTextSize(t);const s=e*2;const n=this.duration(t)*s/(this.resolution.x+s)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.widtht.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\pos(0,-999)`}o--;this.horizontalTrack.push({width:s,start:t.time,visible:t.time+n,end:t.time+this.duration(t),track:o});return`\\move(${this.resolution.x+e},${o*this.trackHeight+this.margin+i},${-e},${o*this.trackHeight+this.margin+i},0,${this.duration(t)*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);const i=this.danmakuType[t.type]==="top";let s=null;let n=i?0:this.trackCount-1;const o=i?1:-1;const r=e=>{if(e.track!==n){return false}return e.end>t.time};do{s=this.verticalTrack.find(r);n+=o}while(s&&n<=this.trackCount&&n>=0);if(n>this.trackCount||n<0){return`\\pos(0,-999)`}n-=o;this.verticalTrack.push({start:t.time,end:t.time+this.duration(t),track:n});if(i){return`\\pos(${this.resolution.x/2},${n*this.trackHeight+this.margin+e})`}else{return`\\pos(${this.resolution.x/2},${this.resolution.y-this.margin-e-(this.trackCount-1-n)*this.trackHeight})`}}push(t){let e=null;let i=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);i=this.horizontalDanmakus;break}case"top":case"bottom":{e=this.getVerticalTags(t);i=this.verticalDanmakus;break}case"special":default:{return{tags:`\\pos(0,-999)`}}}const s={tags:e};i.push(s);return s}}class h{constructor({title:t,font:e,alpha:i,duration:s,blockTypes:n,resolution:o,bottomMarginPercent:r}){this.title=t;this.font=e;this.alpha=Math.round(i*100);this.duration=s;this.blockTypes=n;this.resolution=o;this.white=16777215;this.danmakuStack=new a(e,o,s,r)}get fontStyles(){return{25:`Style: Medium,${this.font},52,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`,18:`Style: Small,${this.font},36,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`}}convertToAssDocument(t){const e=new n(t);const i=[];for(const t of e.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.indexOf(t.type)!==-1||this.blockTypes.indexOf("color")!==-1&&t.color!==this.white){continue}const[e,s]=this.convertTime(t.time,this.duration(t));i.push(new o({content:this.convertText(t.content),time:e,endTime:s,type:t.type,fontSize:t.fontSize,color:t.color,typeTag:this.convertType(t),colorTag:this.convertColor(t.color)}))}return new r({danmakus:i,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}convertText(t){const e={"{":"{","}":"}","&":"&","<":"<",">":">",""":'"',"'":"'"};for(const[i,s]of Object.entries(e)){t=t.replace(new RegExp(i,"g"),s)}return t}convertType(t){return this.danmakuStack.push(t).tags}convertColor(t){if(t===this.white){return""}const e=t.toString(16);const i=e.substring(0,2);const s=e.substring(2,4);const n=e.substring(4,6);return`\\c&H${n}${s}${i}&`}convertTime(t,e){function i(t){const[e,i="00"]=String(t).split(".");return`${e.padStart(2,"0")}.${i.substr(0,2).padEnd(2,"0")}`}function s(t){let e=0;let s=0;while(t>=60){t-=60;s++}while(s>=60){s-=60;e++}return`${e}:${String(s).padStart(2,"0")}:${i(t)}`}return[s(t),s(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:i,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:s,XmlDanmakuDocument:n}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/video-info.min.js"] = (()=>{return()=>{class t{constructor(t){this.aid=t}async fetchInfo(){const t=JSON.parse(await downloadText(`https://api.bilibili.com/x/web-interface/view?aid=${this.aid}`));if(t.code!==0){throw new Error(t.message)}const i=t.data;this.cid=i.cid;this.pageCount=i.videos;this.coverUrl=i.pic;this.tagId=i.tid;this.tagName=i.tname;this.title=i.title;this.description=i.desc;this.up={uid:i.owner.mid,name:i.owner.name,faceUrl:i.owner.face};this.pages=i.pages.map(t=>{return{cid:t.cid,title:t.part,pageNumber:t.page}});return this}async fetchDanmaku(){this.danmaku=new e(this.cid);return this.danmaku.fetchInfo()}}class i{constructor(t,i){this.text=t;this.p=i}}class e{constructor(t){this.cid=t}async fetchInfo(){const t=await downloadText(`https://api.bilibili.com/x/v1/dm/list.so?oid=${this.cid}`);this.rawXML=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.xml=e;this.danmakus=[].map.call(e.querySelectorAll("d[p]"),t=>{return new i(t.innerHTML,t.getAttribute("p"))})}}class a{constructor(t){this.ep=t;this.videos=[]}async fetchInfo(){const i=await downloadText(`https://www.bilibili.com/bangumi/play/ep${this.ep}/`);const e=JSON.parse(i.match(/window\.__INITIAL_STATE__=(.*);\(function\(\){/)[1]);this.title=e.mediaInfo.title;this.cover=e.mediaInfo.cover;this.squareCover=e.mediaInfo.square_cover;this.aid=e.epInfo.aid;this.cid=e.epInfo.cid;this.videos=e.epList.map(async i=>{return{title:i.index_title,aid:i.aid,cid:i.cid,info:await new t(i.aid).fetchInfo()}});return this}}return{export:{VideoInfo:t,BangumiInfo:a,Danmaku:i,DanmakuInfo:e}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/about.min.html"] = `

      Bilibili Evolved

      开源组件

        `; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/about.min.css"] = `.about.gui-settings-footer{height:24px;font-size:14px;justify-content:space-between;padding:6px 24px;border-top:1px dashed #8884}.about.gui-settings-footer>span{opacity:.2}.bilibili-evolved-about{display:flex;width:400px;height:70vh;background-color:#fff;position:fixed;top:15%;left:calc(50% - 200px);z-index:100000;box-shadow:0 3px 20px 2px #0004;border-top:4px solid var(--theme-color);flex-direction:column;transition:.2s ease-out;transform-origin:center;transform:scale(0)}.bilibili-evolved-about.opened{transform:scale(1)}.bilibili-evolved-info a{margin:0 4px}.bilibili-evolved-info>p{margin:8px 0}.bilibili-evolved-about>div{flex:1 0 0;display:flex;align-items:center;justify-content:space-between;flex-direction:column;padding:8px}.bilibili-evolved-about>div.about-block{flex:4 0 0;padding:32px;align-items:stretch}.bilibili-evolved-about h1{font-size:36px;margin-bottom:16px}.bilibili-evolved-about h2{font-size:18px;margin-bottom:8px}.open-source-components>li{margin:12px 0;padding:12px 24px;background:rgba(0,0,0,.2);border-left:4px solid var(--theme-color);cursor:pointer;transition:.2s ease-out}.open-source-components>li:hover{opacity:.8}.component-name{font-size:18px;font-weight:700}.component-info{margin-top:8px}#about-link{cursor:pointer;transition:.2s}.bilibili-evolved-about a{color:var(--theme-color)}#about-link:hover{opacity:1;color:var(--theme-color)}#about-close{background-color:#8884;border-color:transparent;opacity:1;transition:.2s ease-out;width:80px;height:32px;color:inherit;cursor:pointer}#about-close:hover{opacity:.8}#about-close:active{outline:0;opacity:.6}`; diff --git a/bilibili-evolved.preview.user.js b/bilibili-evolved.preview.user.js index efd29e5d0..3acb01ff6 100644 --- a/bilibili-evolved.preview.user.js +++ b/bilibili-evolved.preview.user.js @@ -746,6 +746,12 @@ event.initEvent(eventName, true, true); element.dispatchEvent(event); } + async function loadLazyPanel(selector) + { + await SpinQuery.unsafeJquery(); + const panel = await SpinQuery.any(() => unsafeWindow.$(selector)); + panel.mouseover().mouseout(); + } function contentLoaded(callback) { if (/complete|interactive|loaded/.test(document.readyState)) diff --git a/bilibili-evolved.user.js b/bilibili-evolved.user.js index 604473fb7..927101771 100644 --- a/bilibili-evolved.user.js +++ b/bilibili-evolved.user.js @@ -746,6 +746,12 @@ event.initEvent(eventName, true, true); element.dispatchEvent(event); } + async function loadLazyPanel(selector) + { + await SpinQuery.unsafeJquery(); + const panel = await SpinQuery.any(() => unsafeWindow.$(selector)); + panel.mouseover().mouseout(); + } function contentLoaded(callback) { if (/complete|interactive|loaded/.test(document.readyState)) diff --git a/min/danmaku-converter.min.js b/min/danmaku-converter.min.js index 0de1159d7..55049de39 100644 --- a/min/danmaku-converter.min.js +++ b/min/danmaku-converter.min.js @@ -1 +1 @@ -(()=>{return(t,e)=>{class s{constructor(t,e,s,i,n){this.content=t;this.time=e;this.type=parseInt(s);this.fontSize=parseFloat(i);this.color=parseInt(n)}}class i extends s{constructor({content:t,time:e,type:s,fontSize:i,color:n,timeStamp:o,pool:r,userHash:a,rowId:h}){super(t,e,s,i,n);this.timeStamp=parseInt(o);this.pool=parseInt(r);this.userHash=a;this.rowId=parseInt(h);this.time=parseFloat(this.time);this.pDataArray=[e,s,i,n,o,r,a,h]}text(){const t=this.pDataArray.join(",");return`${this.content}`}static parse(t){const e=t.getAttribute("p");const[s,n,o,r,a,h,l,c]=e.split(",");const u=t.innerHTML;return new i({content:u,time:s,type:n,fontSize:o,color:r,timeStamp:a,pool:h,userHash:l,rowId:c})}}class n{constructor(t){this.xml=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.danmakus=[...e.querySelectorAll("d[p]")].map(t=>i.parse(t))}}class o extends s{constructor({content:t,time:e,type:s,fontSize:i,color:n,typeTag:o,colorTag:r,endTime:a}){super(t,e,s,i,n);this.typeTag=o;this.colorTag=r;this.endTime=a}text(t){const e=t[this.fontSize].match(/Style:(.*?),/)[1].trim();return`Dialogue: 0,${this.time},${this.endTime},${e},,0,0,0,,{${this.typeTag}${this.colorTag}}${this.content}`}}class r{constructor({danmakus:t,title:e,fontStyles:s,blockTypes:i,resolution:n}){this.danmakus=t;this.title=e;this.fontStyles=s;this.blockTypes=i;this.resolution=n}generateAss(){const t=`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.title}\nScriptType: v4.00+\nPlayResX: ${this.resolution.x}\nPlayResY: ${this.resolution.y}\nTimer: 10.0000\nWrapStyle: 2\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${Object.values(this.fontStyles).join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n `.trim();return t+"\n"+this.danmakus.map(t=>t.text(this.fontStyles,this.blockTypes)).filter(t=>t!=="").join("\n")}}class a{constructor(t,e,s,i){this.horizontalDanmakus=[];this.horizontalTrack=[];this.verticalDanmakus=[];this.verticalTrack=[];this.resolution=e;this.duration=s;this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.fontSizes={25:`52px ${t}`,18:`36px ${t}`};this.danmakuType={1:"normal",2:"normal",3:"normal",4:"bottom",5:"top",6:"reversed",7:"special",8:"special"};this.bottomMarginPercent=i;this.margin=4;this.nextDanmakuDelay=.05;this.generateTracks()}generateTracks(){const t=52;this.danmakuHeight=t;this.trackHeight=this.margin*2+t;this.trackCount=parseInt(fixed(this.resolution.y*(1-this.bottomMarginPercent)/this.trackHeight,0))}getTextSize(t){this.context.font=this.fontSizes[t.fontSize];const e=this.context.measureText(t.content);const s=e.width/2;return[s,this.danmakuHeight/2]}getHorizonalTags(t){const[e,s]=this.getTextSize(t);const i=e*2;const n=this.duration(t)*i/(this.resolution.x+i)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.widtht.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\pos(0,-999)`}o--;this.horizontalTrack.push({width:i,start:t.time,visible:t.time+n,end:t.time+this.duration(t),track:o});return`\\move(${this.resolution.x+e},${o*this.trackHeight+this.margin+s},${-e},${o*this.trackHeight+this.margin+s},0,${this.duration(t)*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);const s=this.danmakuType[t.type]==="top";let i=null;let n=s?0:this.trackCount-1;const o=s?1:-1;const r=e=>{if(e.track!==n){return false}return e.end>t.time};do{i=this.verticalTrack.find(r);n+=o}while(i&&n<=this.trackCount&&n>=0);if(n>this.trackCount||n<0){return`\\pos(0,-999)`}n-=o;this.verticalTrack.push({start:t.time,end:t.time+this.duration(t),track:n});if(s){return`\\pos(${this.resolution.x/2},${n*this.trackHeight+this.margin+e})`}else{return`\\pos(${this.resolution.x/2},${this.resolution.y-this.margin-e-(this.trackCount-1-n)*this.trackHeight})`}}push(t){let e=null;let s=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);s=this.horizontalDanmakus;break}case"top":case"bottom":{e=this.getVerticalTags(t);s=this.verticalDanmakus;break}case"special":default:{return{tags:`\\pos(0,-999)`}}}const i={tags:e};s.push(i);return i}}class h{constructor({title:t,font:e,alpha:s,duration:i,blockTypes:n,resolution:o,bottomMarginPercent:r}){this.title=t;this.font=e;this.alpha=Math.round(s*100);this.duration=i;this.blockTypes=n;this.resolution=o;this.danmakuStack=new a(e,o,i,r)}get fontStyles(){return{25:`Style: Medium,${this.font},52,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`,18:`Style: Small,${this.font},36,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`}}convertToAssDocument(t){const e=new n(t);const s=[];for(const t of e.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.indexOf(t.type)!==-1){continue}const[e,i]=this.convertTime(t.time,this.duration(t));s.push(new o({content:this.convertText(t.content),time:e,endTime:i,type:t.type,fontSize:t.fontSize,color:t.color,typeTag:this.convertType(t),colorTag:this.convertColor(t.color)}))}return new r({danmakus:s,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}convertText(t){const e={"{":"{","}":"}","&":"&","<":"<",">":">",""":'"',"'":"'"};for(const[s,i]of Object.entries(e)){t=t.replace(new RegExp(s,"g"),i)}return t}convertType(t){return this.danmakuStack.push(t).tags}convertColor(t){const e=16777215;if(t===e){return""}const s=t.toString(16);const i=s.substring(0,2);const n=s.substring(2,4);const o=s.substring(4,6);return`\\c&H${o}${n}${i}&`}convertTime(t,e){function s(t){const[e,s="00"]=String(t).split(".");return`${e.padStart(2,"0")}.${s.substr(0,2).padEnd(2,"0")}`}function i(t){let e=0;let i=0;while(t>=60){t-=60;i++}while(i>=60){i-=60;e++}return`${e}:${String(i).padStart(2,"0")}:${s(t)}`}return[i(t),i(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:s,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:i,XmlDanmakuDocument:n}}}})(); \ No newline at end of file +(()=>{return(t,e)=>{class i{constructor(t,e,i,s,n){this.content=t;this.time=e;this.type=parseInt(i);this.fontSize=parseFloat(s);this.color=parseInt(n)}}class s extends i{constructor({content:t,time:e,type:i,fontSize:s,color:n,timeStamp:o,pool:r,userHash:a,rowId:h}){super(t,e,i,s,n);this.timeStamp=parseInt(o);this.pool=parseInt(r);this.userHash=a;this.rowId=parseInt(h);this.time=parseFloat(this.time);this.pDataArray=[e,i,s,n,o,r,a,h]}text(){const t=this.pDataArray.join(",");return`${this.content}`}static parse(t){const e=t.getAttribute("p");const[i,n,o,r,a,h,l,c]=e.split(",");const u=t.innerHTML;return new s({content:u,time:i,type:n,fontSize:o,color:r,timeStamp:a,pool:h,userHash:l,rowId:c})}}class n{constructor(t){this.xml=t;const e=(new DOMParser).parseFromString(t,"application/xml").documentElement;this.danmakus=[...e.querySelectorAll("d[p]")].map(t=>s.parse(t))}}class o extends i{constructor({content:t,time:e,type:i,fontSize:s,color:n,typeTag:o,colorTag:r,endTime:a}){super(t,e,i,s,n);this.typeTag=o;this.colorTag=r;this.endTime=a}text(t){const e=t[this.fontSize].match(/Style:(.*?),/)[1].trim();return`Dialogue: 0,${this.time},${this.endTime},${e},,0,0,0,,{${this.typeTag}${this.colorTag}}${this.content}`}}class r{constructor({danmakus:t,title:e,fontStyles:i,blockTypes:s,resolution:n}){this.danmakus=t;this.title=e;this.fontStyles=i;this.blockTypes=s;this.resolution=n}generateAss(){const t=`\n[Script Info]\n; Script generated by Bilibili Evolved Danmaku Converter\n; https://github.com/the1812/Bilibili-Evolved/\nTitle: ${this.title}\nScriptType: v4.00+\nPlayResX: ${this.resolution.x}\nPlayResY: ${this.resolution.y}\nTimer: 10.0000\nWrapStyle: 2\nScaledBorderAndShadow: no\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n${Object.values(this.fontStyles).join("\n")}\n\n[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n `.trim();return t+"\n"+this.danmakus.map(t=>t.text(this.fontStyles,this.blockTypes)).filter(t=>t!=="").join("\n")}}class a{constructor(t,e,i,s){this.horizontalDanmakus=[];this.horizontalTrack=[];this.verticalDanmakus=[];this.verticalTrack=[];this.resolution=e;this.duration=i;this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.fontSizes={25:`52px ${t}`,18:`36px ${t}`};this.danmakuType={1:"normal",2:"normal",3:"normal",4:"bottom",5:"top",6:"reversed",7:"special",8:"special"};this.bottomMarginPercent=s;this.margin=4;this.nextDanmakuDelay=.05;this.generateTracks()}generateTracks(){const t=52;this.danmakuHeight=t;this.trackHeight=this.margin*2+t;this.trackCount=parseInt(fixed(this.resolution.y*(1-this.bottomMarginPercent)/this.trackHeight,0))}getTextSize(t){this.context.font=this.fontSizes[t.fontSize];const e=this.context.measureText(t.content);const i=e.width/2;return[i,this.danmakuHeight/2]}getHorizonalTags(t){const[e,i]=this.getTextSize(t);const s=e*2;const n=this.duration(t)*s/(this.resolution.x+s)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.widtht.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\pos(0,-999)`}o--;this.horizontalTrack.push({width:s,start:t.time,visible:t.time+n,end:t.time+this.duration(t),track:o});return`\\move(${this.resolution.x+e},${o*this.trackHeight+this.margin+i},${-e},${o*this.trackHeight+this.margin+i},0,${this.duration(t)*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);const i=this.danmakuType[t.type]==="top";let s=null;let n=i?0:this.trackCount-1;const o=i?1:-1;const r=e=>{if(e.track!==n){return false}return e.end>t.time};do{s=this.verticalTrack.find(r);n+=o}while(s&&n<=this.trackCount&&n>=0);if(n>this.trackCount||n<0){return`\\pos(0,-999)`}n-=o;this.verticalTrack.push({start:t.time,end:t.time+this.duration(t),track:n});if(i){return`\\pos(${this.resolution.x/2},${n*this.trackHeight+this.margin+e})`}else{return`\\pos(${this.resolution.x/2},${this.resolution.y-this.margin-e-(this.trackCount-1-n)*this.trackHeight})`}}push(t){let e=null;let i=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);i=this.horizontalDanmakus;break}case"top":case"bottom":{e=this.getVerticalTags(t);i=this.verticalDanmakus;break}case"special":default:{return{tags:`\\pos(0,-999)`}}}const s={tags:e};i.push(s);return s}}class h{constructor({title:t,font:e,alpha:i,duration:s,blockTypes:n,resolution:o,bottomMarginPercent:r}){this.title=t;this.font=e;this.alpha=Math.round(i*100);this.duration=s;this.blockTypes=n;this.resolution=o;this.white=16777215;this.danmakuStack=new a(e,o,s,r)}get fontStyles(){return{25:`Style: Medium,${this.font},52,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`,18:`Style: Small,${this.font},36,&H${this.alpha}FFFFFF,&H${this.alpha}FFFFFF,&H${this.alpha}000000,&H${this.alpha}000000,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,0`}}convertToAssDocument(t){const e=new n(t);const i=[];for(const t of e.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.indexOf(t.type)!==-1||this.blockTypes.indexOf("color")!==-1&&t.color!==this.white){continue}const[e,s]=this.convertTime(t.time,this.duration(t));i.push(new o({content:this.convertText(t.content),time:e,endTime:s,type:t.type,fontSize:t.fontSize,color:t.color,typeTag:this.convertType(t),colorTag:this.convertColor(t.color)}))}return new r({danmakus:i,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}convertText(t){const e={"{":"{","}":"}","&":"&","<":"<",">":">",""":'"',"'":"'"};for(const[i,s]of Object.entries(e)){t=t.replace(new RegExp(i,"g"),s)}return t}convertType(t){return this.danmakuStack.push(t).tags}convertColor(t){if(t===this.white){return""}const e=t.toString(16);const i=e.substring(0,2);const s=e.substring(2,4);const n=e.substring(4,6);return`\\c&H${n}${s}${i}&`}convertTime(t,e){function i(t){const[e,i="00"]=String(t).split(".");return`${e.padStart(2,"0")}.${i.substr(0,2).padEnd(2,"0")}`}function s(t){let e=0;let s=0;while(t>=60){t-=60;s++}while(s>=60){s-=60;e++}return`${e}:${String(s).padStart(2,"0")}:${i(t)}`}return[s(t),s(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:i,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:s,XmlDanmakuDocument:n}}}})(); \ No newline at end of file diff --git a/min/download-danmaku.min.js b/min/download-danmaku.min.js index c0f8591df..7f0792fa8 100644 --- a/min/download-danmaku.min.js +++ b/min/download-danmaku.min.js @@ -1 +1 @@ -(()=>{return(n,t)=>{const{DanmakuInfo:e}=t.import("videoInfo");const{DanmakuConverter:o}=t.import("danmakuConverter");async function a(n,t){const a=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const i=new e((unsafeWindow||window).cid);await i.fetchInfo();const r=(()=>{if(t===true){const n=new o({title:a,font:"Microsoft YaHei UI",alpha:.6,duration(n){switch(n.type){case 4:case 5:return 4;default:return 6}},blockTypes:[],resolution:{x:1920,y:1080},bottomMarginPercent:.15});const t=n.convertToAssDocument(i.rawXML);return new Blob([t.generateAss()],{type:"text/plain"})}else{return new Blob([i.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const s=$("#danmaku-link");const u=s.attr("href");if(u){URL.revokeObjectURL(u)}clearTimeout(n);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";s.attr("download",`${a}.${t?"ass":"xml"}`).attr("href",c).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let n=await SpinQuery.condition(()=>(unsafeWindow||window).cid,n=>n!==undefined);return n!==undefined},success:()=>{const n=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",t=>{if(t.target!==n){const n=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{a(n,t.shiftKey)}catch(n){logError(n)}}})}}}}})(); \ No newline at end of file +(()=>{return(t,e)=>{const{DanmakuInfo:n}=e.import("videoInfo");const{DanmakuConverter:i}=e.import("danmakuConverter");async function o(t,e){const o=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const a=new n((unsafeWindow||window).cid);await a.fetchInfo();const l=await(async()=>{if(e===true){await loadLazyPanel(".bilibili-player-video-danmaku-setting");const t=t=>{const e=parseFloat(document.querySelector(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};const e=document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;const n=parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));const l=(()=>{const e=[10,8,6,4,2][t(".bilibili-player-setting-speedplus .bui-thumb")];return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();const r=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"],".bilibili-player-block-filter-type[ftype=special]":[7,8]};for(const[n,i]in Object.entries(e)){if(document.querySelector(n).classList.contains("disabled")){t=t.concat(i)}}return t})();const c=[2,1.5,1,.75,.5][t(".bilibili-player-setting-fontsize .bui-thumb")];const s=[.75,.5,.25,.15,.15][t(".bilibili-player-setting-area .bui-thumb")];const u=new i({title:o,font:e,alpha:n,duration:l,blockTypes:r,resolution:{x:1920*c,y:1080*c},bottomMarginPercent:s});const d=u.convertToAssDocument(a.rawXML);return new Blob([d.generateAss()],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const r=URL.createObjectURL(l);const c=$("#danmaku-link");const s=c.attr("href");if(s){URL.revokeObjectURL(s)}clearTimeout(t);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";c.attr("download",`${o}.${e?"ass":"xml"}`).attr("href",r).get(0).click()}return{widget:{content:`\n \n \n 下载弹幕\n \n `,condition:async()=>{let t=await SpinQuery.condition(()=>(unsafeWindow||window).cid,t=>t!==undefined);return t!==undefined},success:()=>{const t=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",e=>{if(e.target!==t){const t=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{o(t,e.shiftKey)}catch(t){logError(t)}}})}}}}})(); \ No newline at end of file diff --git a/video/danmaku-converter/danmaku-converter.js b/video/danmaku-converter/danmaku-converter.js index dbb24d78f..5d7157798 100644 --- a/video/danmaku-converter/danmaku-converter.js +++ b/video/danmaku-converter/danmaku-converter.js @@ -277,6 +277,7 @@ Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text this.duration = duration; this.blockTypes = blockTypes; this.resolution = resolution; + this.white = 16777215; // Dec color of white danmaku this.danmakuStack = new DanmakuStack(font, resolution, duration, bottomMarginPercent); } get fontStyles() @@ -293,7 +294,8 @@ Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text for (const xmlDanmaku of xmlDanmakuDocument.danmakus.sort((a, b) => a.time - b.time)) { // 跳过设置为屏蔽的弹幕类型 - if (this.blockTypes.indexOf(xmlDanmaku.type) !== -1) + if (this.blockTypes.indexOf(xmlDanmaku.type) !== -1 || + this.blockTypes.indexOf("color") !== -1 && xmlDanmaku.color !== this.white) { continue; } @@ -340,8 +342,7 @@ Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text } convertColor(decColor) { - const white = 16777215; - if (decColor === white) + if (decColor === this.white) { return ""; } diff --git a/video/download-danmaku.js b/video/download-danmaku.js index 4557ee732..96a09d467 100644 --- a/video/download-danmaku.js +++ b/video/download-danmaku.js @@ -11,32 +11,73 @@ .replace("_番剧_bilibili_哔哩哔哩", ""); const danmaku = new DanmakuInfo((unsafeWindow || window).cid); await danmaku.fetchInfo(); - const blob = (() => + const blob = await (async () => { if (ass === true) { - // TODO: 从播放器里获取弹幕偏好 - const converter = new DanmakuConverter({ - title, - font: "Microsoft YaHei UI", - alpha: 0.6, - duration(danmaku) + await loadLazyPanel(".bilibili-player-video-danmaku-setting"); + const getSliderIndex = (selector) => + { + const transform = parseFloat(document.querySelector(selector).style.transform.replace(/translateX\(([\d\.]+)/, "$1")); + const index = { + 0: 0, + 44: 1, + 94: 2, + 144: 3, + 188: 4, + }[transform]; + return index; + }; + const font = document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText; + const alpha = parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/, "$1")); + const duration = (() => + { + const scrollDuration = [10, 8, 6, 4, 2][getSliderIndex(".bilibili-player-setting-speedplus .bui-thumb")]; + return danmaku => { switch (danmaku.type) { case 4: case 5: - return 4; + return 4; // stickyDuration default: - return 6; + return scrollDuration; } - }, - blockTypes: [], + }; + })(); + const blockTypes = (() => + { + let result = []; + const blockValues = { + ".bilibili-player-block-filter-type[ftype=scroll]": [1, 2, 3], + ".bilibili-player-block-filter-type[ftype=top]": [5], + ".bilibili-player-block-filter-type[ftype=bottom]": [4], + ".bilibili-player-block-filter-type[ftype=color]": ["color"], + ".bilibili-player-block-filter-type[ftype=special]": [7, 8], + }; + + for (const [type, value] in Object.entries(blockValues)) + { + if (document.querySelector(type).classList.contains("disabled")) + { + result = result.concat(value); + } + } + return result; + })(); + const resolutionFactor = [2, 1.5, 1, 0.75, 0.5][getSliderIndex(".bilibili-player-setting-fontsize .bui-thumb")]; // 改变分辨率来调整字体大小 + const bottomMarginPercent = [0.75, 0.5, 0.25, 0.15, 0.15][getSliderIndex(".bilibili-player-setting-area .bui-thumb")]; + const converter = new DanmakuConverter({ + title, + font, + alpha, + duration, + blockTypes, resolution: { - x: 1920, - y: 1080, + x: 1920 * resolutionFactor, + y: 1080 * resolutionFactor, }, - bottomMarginPercent: 0.15, + bottomMarginPercent, }); const assDocument = converter.convertToAssDocument(danmaku.rawXML); return new Blob([assDocument.generateAss()], {