mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
5.7 KiB
JavaScript
1 line
5.7 KiB
JavaScript
(()=>{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`<d p="${t}">${this.content}</d>`}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){this.horizontal=[];this.horizontalTrack=[];this.vertical=[];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.margin=10;this.nextDanmakuDelay=.1;this.generateTracks()}generateTracks(){this.context.font=this.fontSizes[25];const t=this.context.measureText("Lorem ipsum");const e=t.emHeightAscent+t.emHeightDescent;this.danmakuHeight=e;this.trackHeight=this.margin*2+e;this.trackCount=parseInt(fixed(this.resolution.y/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*i/(this.resolution.x+i)+this.nextDanmakuDelay;let o=0;let r=null;const a=e=>{if(e.track!==o){return false}if(e.width<i){return e.end>t.time}else{return e.visible>t.time}};do{r=this.horizontalTrack.find(a);o++}while(r&&o<=this.trackCount);if(o>this.trackCount){return`\\alpha&HFF`}o--;this.horizontalTrack.push({width:i,start:t.time,visible:t.time+n,end:t.time+this.duration,track:o});return`\\move(${this.resolution.x+e}, ${o*this.trackHeight+this.margin+s}, ${-e}, ${o*this.trackHeight+this.margin+s}, 0, ${this.duration*1e3})`}getVerticalTags(t){const[,e]=this.getTextSize(t);if(this.danmakuType[t.type]==="top"){return`\\pos(${this.resolution.x/2}, ${this.margin+e})`}else{return`\\pos(${this.resolution.x/2}, ${this.resolution.y-this.margin-e})`}}push(t){let e=null;let s=null;switch(this.danmakuType[t.type]){case"normal":case"reversed":{e=this.getHorizonalTags(t);s=this.horizontal;break}case"top":case"bottom":{e=this.getVerticalTags(t);s=this.vertical;break}case"special":default:{throw new Error("Danmaku type not supported")}}const i={tags:e};s.push(i);return i}}class h{constructor({title:t,font:e,alpha:s,duration:i,blockTypes:n,resolution:o}){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)}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=[];for(const s of t.danmakus.sort((t,e)=>t.time-e.time)){if(this.blockTypes.concat(7,8).indexOf(s.type)!==-1){continue}const[t,i]=this.convertTime(s.time,this.duration);e.push(new o({content:s.content,time:t,endTime:i,type:s.type,fontSize:s.fontSize,color:s.color,typeTag:this.convertType(s),colorTag:this.convertColor(s.color)}))}return new r({danmakus:e,title:this.title,blockTypes:this.blockTypes,fontStyles:this.fontStyles,resolution:this.resolution})}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(4,6);const n=s.substring(2,4);const o=s.substring(0,2);return`\\c&H${o}${n}${i}&`}convertTime(t,e){function s(t){let e=0;let s=0;while(t>=60){t-=60;s++}while(s>=60){s-=60;e++}return`${e}:${s}:${t}`}return[s(t),s(t+e)]}}return{export:{AssDanmaku:o,AssDanmakuDocument:r,Danmaku:s,DanmakuConverter:h,DanmakuStack:a,XmlDanmaku:i,XmlDanmakuDocument:n}}}})(); |