@applemusic-like-lyrics/core 0.0.7 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # AMLL Core
2
2
 
3
+ > 警告:此为个人项目,且尚未完成开发,可能仍有大量问题,所以请勿直接用于生产环境!
4
+
3
5
  AMLL 的纯 JS 核心组件框架,包括歌词显示组件和背景组件等其它可以复用的组件。
4
6
 
5
7
  此处的东西都是 UI 框架无关的,所以可以间接在各种动态页面框架下引用。
package/dist/amll-core.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("@pixi/display"),M=require("@pixi/app"),y=require("@pixi/filter-blur"),w=require("@pixi/filter-color-matrix"),C=require("@pixi/core"),L=require("@pixi/sprite"),z=require("jss"),A=require("jss-preset-default"),B=/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\.:]([0-9]+))?)/;function T(c){const e=B.exec(c);if(e){const t=Number(e.groups?.hour||"0"),i=Number(e.groups?.min||"0"),n=Number(e.groups?.sec.replace(/:/,".")||"0");return Math.floor((t*3600+i*60+n)*1e3)}else throw new TypeError("时间戳字符串解析失败")}function D(c){const t=new DOMParser().parseFromString(c,"application/xml");let i="v1";for(const h of t.querySelectorAll("ttm\\:agent"))if(h.getAttribute("type")==="person"){const s=h.getAttribute("xml:id");s&&(i=s)}const n=[];for(const h of t.querySelectorAll("body p[begin][end]")){const s={words:[],startTime:T(h.getAttribute("begin")??"0:0"),endTime:T(h.getAttribute("end")??"0:0"),translatedLyric:"",romanLyric:"",isBG:!1,isDuet:h.getAttribute("ttm:agent")!==i};let r=null;for(const a of h.childNodes)if(a.nodeType===Node.TEXT_NODE){const l=a.textContent??"";/^(\s+)$/.test(l)?s.words.push({word:" ",startTime:0,endTime:0}):s.words.push({word:l,startTime:0,endTime:0})}else if(a.nodeType===Node.ELEMENT_NODE){const l=a,o=l.getAttribute("ttm:role");if(l.nodeName==="span"&&o)if(o==="x-bg"){const d={words:[],startTime:s.startTime,endTime:s.endTime,translatedLyric:"",romanLyric:"",isBG:!0,isDuet:s.isDuet};for(const p of l.childNodes)if(p.nodeType===Node.TEXT_NODE){const f=p.textContent??"";/^(\s+)$/.test(f)?d.words.push({word:" ",startTime:0,endTime:0}):d.words.push({word:f,startTime:0,endTime:0})}else if(p.nodeType===Node.ELEMENT_NODE){const f=p,E=f.getAttribute("ttm:role");if(f.nodeName==="span"&&E)E==="x-translation"?d.translatedLyric=f.innerHTML.trim():E==="x-roman"&&(d.romanLyric=f.innerHTML.trim());else if(f.hasAttribute("begin")&&f.hasAttribute("end")){const x={word:p.textContent,startTime:T(f.getAttribute("begin")),endTime:T(f.getAttribute("end"))};d.words.push(x)}}const m=d.words[0];d.startTime=m.startTime,m?.word.startsWith("(")&&(m.word=m.word.substring(1));const u=d.words[d.words.length-1];d.endTime=u.endTime,u?.word.endsWith(")")&&(u.word=u.word.substring(0,u.word.length-1)),r=d}else o==="x-translation"?s.translatedLyric=l.innerHTML:o==="x-roman"&&(s.romanLyric=l.innerHTML);else if(l.hasAttribute("begin")&&l.hasAttribute("end")){const d={word:a.textContent??"",startTime:T(l.getAttribute("begin")),endTime:T(l.getAttribute("end"))};s.words.push(d)}}n.push(s),r&&n.push(r)}return console.log(n),n}const I=Object.freeze(Object.defineProperty({__proto__:null,parseTTML:D},Symbol.toStringTag,{value:"Module"}));class k extends v.Container{time=0}class q{constructor(e){this.canvas=e;const t=e.getBoundingClientRect();this.canvas.width=t.width*this.currerntRenderScale,this.canvas.height=t.height*this.currerntRenderScale,this.observer=new ResizeObserver(()=>{const i=e.getBoundingClientRect();this.canvas.width=Math.max(1,i.width),this.canvas.height=Math.max(1,i.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}),this.observer.observe(e),this.app=new M.Application({view:e,resizeTo:this.canvas,powerPreference:"low-power",backgroundAlpha:0}),this.rebuildFilters(),this.app.ticker.add(this.onTick),this.app.ticker.start()}observer;app;curContainer;lastContainer=new Set;onTick=e=>{for(const t of this.lastContainer)t.alpha=Math.max(0,t.alpha-e/60),t.alpha<=0&&(this.app.stage.removeChild(t),this.lastContainer.delete(t));if(this.curContainer){this.curContainer.alpha=Math.min(1,this.curContainer.alpha+e/60);const[t,i,n,h]=this.curContainer.children,s=Math.max(this.app.screen.width,this.app.screen.height);t.position.set(this.app.screen.width/2,this.app.screen.height/2),i.position.set(this.app.screen.width/2.5,this.app.screen.height/2.5),n.position.set(this.app.screen.width/2,this.app.screen.height/2),h.position.set(this.app.screen.width/2,this.app.screen.height/2),t.width=s*Math.sqrt(2),t.height=t.width,i.width=s*.8,i.height=i.width,n.width=s*.5,n.height=n.width,h.width=s*.25,h.height=h.width,this.curContainer.time+=e*this.flowSpeed,t.rotation+=e/1e3*this.flowSpeed,i.rotation-=e/500*this.flowSpeed,n.rotation+=e/1e3*this.flowSpeed,h.rotation-=e/750*this.flowSpeed,n.x=this.app.screen.width/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),n.y=this.app.screen.height/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),h.x=this.app.screen.width/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75),h.y=this.app.screen.height/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75)}};flowSpeed=2;currerntRenderScale=.75;setFlowSpeed(e){this.flowSpeed=e}setRenderScale(e){this.currerntRenderScale=e;const t=this.canvas.getBoundingClientRect();this.canvas.width=Math.max(1,t.width),this.canvas.height=Math.max(1,t.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}rebuildFilters(){const e=Math.min(this.canvas.width,this.canvas.height),t=new w.ColorMatrixFilter;t.saturate(1.2,!1);const i=new w.ColorMatrixFilter;i.brightness(.6,!1);const n=new w.ColorMatrixFilter;n.contrast(.3,!0),this.app.stage.filters=[],this.app.stage.filters.push(new y.BlurFilter(5,1)),this.app.stage.filters.push(new y.BlurFilter(10,1)),this.app.stage.filters.push(new y.BlurFilter(20,2)),this.app.stage.filters.push(new y.BlurFilter(40,2)),e>512&&this.app.stage.filters.push(new y.BlurFilter(80,2)),e>768&&this.app.stage.filters.push(new y.BlurFilter(160,4)),e>768*2&&this.app.stage.filters.push(new y.BlurFilter(320,4)),this.app.stage.filters.push(t,i,n),this.app.stage.filters.push(new y.BlurFilter(5,1))}setFPS(e){this.app.ticker.maxFPS=e}pause(){this.app.ticker.stop(),this.app.render()}resume(){this.app.ticker.start()}async setAlbumImage(e){const t=await C.Texture.fromURL(e),i=new k,n=new L.Sprite(t),h=new L.Sprite(t),s=new L.Sprite(t),r=new L.Sprite(t);n.anchor.set(.5,.5),h.anchor.set(.5,.5),s.anchor.set(.5,.5),r.anchor.set(.5,.5),n.rotation=Math.random()*Math.PI*2,h.rotation=Math.random()*Math.PI*2,s.rotation=Math.random()*Math.PI*2,r.rotation=Math.random()*Math.PI*2,i.addChild(n,h,s,r),this.curContainer&&this.lastContainer.add(this.curContainer),this.curContainer=i,this.app.stage.addChild(this.curContainer),this.curContainer.alpha=0}dispose(){this.observer.disconnect(),this.app.ticker.remove(this.onTick)}}class F extends q{element;constructor(){const e=document.createElement("canvas");super(e),this.element=e,e.style.pointerEvents="none",e.style.zIndex="-1"}getElement(){return this.element}dispose(){super.dispose(),this.element.remove()}}const O=(c,e)=>c.size===e.size&&[...c].every(t=>e.has(t));function N(c){const t=2.5949095;return c<.5?Math.pow(2*c,2)*((t+1)*2*c-t)/2:(Math.pow(2*c-2,2)*((t+1)*(c*2-2)+t)+2)/2}const g=(c,e,t)=>Math.max(c,Math.min(e,t));class ${constructor(e){this.lyricPlayer=e,this.element.className=this.lyricPlayer.style.classes.interludeDots,this.element.appendChild(this.dot0),this.element.appendChild(this.dot1),this.element.appendChild(this.dot2)}element=document.createElement("div");dot0=document.createElement("span");dot1=document.createElement("span");dot2=document.createElement("span");left=0;top=0;scale=1;lastStyle="";currentInterlude;currentTime=0;targetBreatheDuration=1500;getElement(){return this.element}setTransform(e=this.left,t=this.top){this.left=e,this.top=t,this.update()}setInterlude(e){this.currentInterlude=e,this.currentTime=e?.[0]??0}update(e=0){this.currentTime+=e;let t="";if(t+=`transform:translate(${this.left}px, ${this.top}px)`,this.currentInterlude){const i=this.currentInterlude[1]-this.currentInterlude[0],n=this.currentTime-this.currentInterlude[0];if(n<=i){const h=i/Math.ceil(i/this.targetBreatheDuration);let s=1,r=1;s*=Math.sin(1.5*Math.PI-n/h*2)/10+1,n<1e3&&(s*=1-Math.pow((1e3-n)/1e3,2)),n<500?r=0:n<1e3&&(r*=(n-500)/500),i-n<750&&(s*=1-N((750-(i-n))/750/2)),i-n<375&&(r*=g(0,(i-n)/375,1)),s=Math.max(0,s),t+=` scale(${s})`;const a=g(.25,n*3/i*.75,1),l=g(.25,(n-i/3)*3/i*.75,1),o=g(.25,(n-i/3*2)*3/i*.75,1);this.dot0.style.opacity=`${g(0,Math.max(0,r*a),1)}`,this.dot1.style.opacity=`${g(0,Math.max(0,r*l),1)}`,this.dot2.style.opacity=`${g(0,Math.max(0,r*o),1)}`}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0"}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0";t+=";",this.lastStyle!==t&&(this.element.setAttribute("style",t),this.lastStyle=t)}dispose(){this.element.remove()}}class P{currentPosition=0;targetPosition=0;currentTime=0;params={};currentSolver;getV;queueParams;queuePosition;constructor(e=0){this.targetPosition=e,this.currentPosition=this.targetPosition,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}resetSolver(){const e=this.getV(this.currentTime);this.currentTime=0,this.currentSolver=W(this.currentPosition,e,this.targetPosition,0,this.params),this.getV=_(this.currentSolver)}arrived(){return Math.abs(this.targetPosition-this.currentPosition)<.01&&this.getV(this.currentTime)<.01&&this.queueParams===void 0&&this.queuePosition===void 0}setPosition(e){this.targetPosition=e,this.currentPosition=e,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}update(e=0){this.currentTime+=e,this.currentPosition=this.currentSolver(this.currentTime),this.queueParams&&(this.queueParams.time-=e,this.queueParams.time<=0&&this.updateParams({...this.queueParams})),this.queuePosition&&(this.queuePosition.time-=e,this.queuePosition.time<=0&&this.setTargetPosition(this.queuePosition.position)),this.arrived()&&this.setPosition(this.targetPosition)}updateParams(e,t=0){t>0?this.queueParams={...e,time:t}:(this.params={...this.params,...e},this.resetSolver())}setTargetPosition(e,t=0){t>0?this.queuePosition={position:e,time:t}:(this.queuePosition=void 0,this.targetPosition=e,this.resetSolver())}getCurrentPosition(){return this.currentPosition}}function W(c,e,t,i=0,n){const h=n?.soft??!1,s=n?.stiffness??100,r=n?.damping??10,a=n?.mass??1,l=t-c;if(h||1<=r/(2*Math.sqrt(s*a))){const o=-Math.sqrt(s/a),d=-o*l-e;return m=>(m-=i,m<0?c:t-(l+m*d)*Math.E**(m*o))}else{const o=Math.sqrt(4*a*s-r**2),d=(r*l-2*a*e)/o,m=.5*o/a,u=-(.5*r)/a;return p=>(p-=i,p<0?c:t-(Math.cos(p*m)*l+Math.sin(p*m)*d)*Math.E**(p*u))}}function R(c){return t=>(c(t+.001)-c(t-.001))/(2*.001)}function _(c){return R(c)}const b=/^[\p{Unified_Ideograph}\u0800-\u9FFC]+$/u;function G(c,e="rgba(0,0,0,1)",t="rgba(0,0,0,0.5)"){const i=2+c,n=c/i,h=(1-n)/2;return[`linear-gradient(to right,${e} ${h*100}%,${t} ${(h+n)*100}%)`,n,i]}function S(c){return c.endTime-c.startTime>=1e3&&c.word.length<=7}class X{constructor(e,t={words:[],translatedLyric:"",romanLyric:"",startTime:0,endTime:0,isBG:!1,isDuet:!1}){this.lyricPlayer=e,this.lyricLine=t,this.element.setAttribute("class",this.lyricPlayer.style.classes.lyricLine),this.lyricLine.isBG&&this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet&&this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div"));const i=this.element.children[0],n=this.element.children[1],h=this.element.children[2];i.setAttribute("class",this.lyricPlayer.style.classes.lyricMainLine),n.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),h.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),this.rebuildElement(),this.rebuildStyle()}element=document.createElement("div");left=0;top=0;scale=1;blur=0;delay=0;splittedWords=[];lineSize=[0,0];lineTransforms={posX:new P(0),posY:new P(0),scale:new P(1)};isEnabled=!1;enable(){this.isEnabled=!0,this.element.classList.add("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.currentTime=0,i.playbackRate=1,i.play()})}),e.classList.add("active")}measureSize(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden");const e=[this.element.clientWidth,this.element.clientHeight];return this._hide&&(this.element.style.display="none",this.element.style.visibility=""),e}disable(){this.isEnabled=!1,this.element.classList.remove("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.id==="float-word"&&(i.playbackRate=-1,i.play())})}),e.classList.remove("active")}setLine(e){this.lyricLine=e,this.lyricLine.isBG?this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet?this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricDuetLine),this.rebuildElement(),this.rebuildStyle()}getLine(){return this.lyricLine}_hide=!0;lastStyle="";show(){this._hide=!1,this.rebuildStyle()}hide(){this._hide=!0,this.rebuildStyle()}rebuildStyle(){if(this._hide){this.lastStyle!=="display:none;transform:translate(0,-10000px);"&&(this.lastStyle="display:none;transform:translate(0,-10000px);",this.element.setAttribute("style","display:none;transform:translate(0,-10000px);"));return}let e=`transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;!this.lyricPlayer.getEnableSpring()&&this.isInSight&&(e+=`transition-delay:${this.delay}ms;`),e+=`filter:blur(${Math.min(32,this.blur)}px);`,e!==this.lastStyle&&(this.lastStyle=e,this.element.setAttribute("style",e))}rebuildElement(){const e=this.element.children[0],t=this.element.children[1],i=this.element.children[2];this.splittedWords=[],this.lyricLine.words.forEach(a=>{if(b.test(a.word))this.splittedWords.push({...a,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:S(a)});else{const l=/^(\s*)(\S*)(\s*)$/.exec(a.word);l?(l[1].length>0&&this.splittedWords.push({word:" ",startTime:0,endTime:0,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:!1}),this.splittedWords.push({word:l[2],startTime:a.startTime,endTime:a.endTime,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:S(a)}),l[3].length>0&&this.splittedWords.push({word:" ",startTime:0,endTime:0,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:!1})):a.word.trim().length>0&&this.splittedWords.push({word:a.word.trim(),startTime:a.startTime,endTime:a.endTime,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:S(a)})}});const n=[],h=[];function s(a){for(;a.firstChild;)a.firstChild.nodeType===Node.ELEMENT_NODE?n.push(e.firstChild):a.firstChild.nodeType===Node.TEXT_NODE&&h.push(e.firstChild),a.removeChild(a.firstChild),s(a.firstChild)}s(e);let r=null;this.splittedWords.forEach(a=>{if(a.word.trim().length>0)if(a.shouldEmphasize){const l=n.pop()??document.createElement("span");l.className="emphasize",a.elements=[l];for(const o of a.word){const d=n.pop()??document.createElement("span");d.className="",d.innerText=o,l.appendChild(d),a.elements.push(d)}if(a.elementAnimations=this.initEmphasizeAnimation(a),console.log(a.word,b.test(a.word)),r&&!b.test(a.word))if(r.childElementCount>0)r.appendChild(l);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(l),e.appendChild(o),r=o}else r=b.test(a.word)?null:l,e.appendChild(l)}else{const l=n.pop()??document.createElement("span");if(l.className="",l.innerText=a.word,a.elements=[l],a.elementAnimations.push(this.initFloatAnimation(a,l)),r)if(r.childElementCount>0)r.appendChild(l);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(l),e.appendChild(o),r=o}else r=l,e.appendChild(l)}else if(a.word.length>0){const l=h.pop()??document.createTextNode(" ");e.appendChild(l),r=null}else r=null}),t.innerText=this.lyricLine.translatedLyric,i.innerText=this.lyricLine.romanLyric}initFloatAnimation(e,t){const i=t.animate([{transform:"translateY(0px)"},{transform:"translateY(-3%)"}],{duration:Math.max(1e3,e.endTime-e.startTime),delay:e.startTime-this.lyricLine.startTime,id:"float-word",composite:"add",fill:"both"});return i.pause(),i}initEmphasizeAnimation(e){const t=e.startTime-this.lyricLine.startTime,i=e.endTime-e.startTime;return e.elements.map((n,h,s)=>{if(h===0)return this.initFloatAnimation(e,n);{const r=n.animate([{offset:0,transform:"translate3d(0, 0px, 0px)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"},{offset:.5,transform:"translate3d(0, -2%, 20px)",filter:"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))"},{offset:1,transform:"translate3d(0, 0px, 0)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"}],{duration:Math.max(1e3,e.endTime-e.startTime),delay:t+i/(s.length-1)*(h-1),id:"glow-word",iterations:1,composite:"replace",fill:"both"});return r.pause(),r}})}updateMaskImage(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden"),this.splittedWords.forEach(e=>{const t=e.elements[0];if(t){e.width=t.clientWidth,e.height=t.clientHeight;const[i,n,h]=G(16/e.width,"rgba(0,0,0,0.75)","rgba(0,0,0,0.25)"),s=`${h*100}% 100%`;this.lyricPlayer.supportMaskImage?(t.style.maskImage=i,t.style.maskOrigin="left",t.style.maskSize=s):(t.style.webkitMaskImage=i,t.style.webkitMaskOrigin="left",t.style.webkitMaskSize=s);const r=e.width+16,a=`clamp(${-r}px,calc(${-r}px + (var(--amll-player-time) - ${e.startTime})*${r/Math.abs(e.endTime-e.startTime)}px),0px) 0px, left top`;t.style.maskPosition=a,t.style.webkitMaskPosition=a}}),this._hide&&(this.element.style.display="none",this.element.style.visibility="")}getElement(){return this.element}setTransform(e=this.left,t=this.top,i=this.scale,n=1,h=0,s=!1,r=0){this.left=e,this.top=t,this.scale=i,this.delay=r*1e3|0;const a=this.element.children[0];a.style.opacity=`${n}`,s||!this.lyricPlayer.getEnableSpring()?(this.blur=Math.min(32,h),s&&this.element.classList.add(this.lyricPlayer.style.classes.tmpDisableTransition),this.lineTransforms.posX.setPosition(e),this.lineTransforms.posY.setPosition(t),this.lineTransforms.scale.setPosition(i),this.lyricPlayer.getEnableSpring()?this.rebuildStyle():this.show(),s&&requestAnimationFrame(()=>{this.element.classList.remove(this.lyricPlayer.style.classes.tmpDisableTransition)})):(this.lineTransforms.posX.setTargetPosition(e,r),this.lineTransforms.posY.setTargetPosition(t,r),this.lineTransforms.scale.setTargetPosition(i),this.blur!==Math.min(32,h)&&(this.blur=Math.min(32,h),this.element.style.filter=`blur(${Math.min(32,h)}px)`))}update(e=0){this.lyricPlayer.getEnableSpring()&&(this.lineTransforms.posX.update(e),this.lineTransforms.posY.update(e),this.lineTransforms.scale.update(e),this.isInSight?this.show():this.hide())}get isInSight(){const e=this.lineTransforms.posX.getCurrentPosition(),t=this.lineTransforms.posY.getCurrentPosition(),i=e+this.lineSize[0],n=t+this.lineSize[1],h=this.lyricPlayer.pos[0],s=this.lyricPlayer.pos[1],r=this.lyricPlayer.pos[0]+this.lyricPlayer.size[0],a=this.lyricPlayer.pos[1]+this.lyricPlayer.size[1];return!(e>r||t>a||i<h||n<s)}dispose(){this.element.remove()}}const Y=z.create(A());class V extends EventTarget{element=document.createElement("div");currentTime=0;lyricLines=[];processedLines=[];lyricLinesEl=[];lyricLinesSize=new Map;hotLines=new Set;bufferedLines=new Set;scrollToIndex=0;resizeObserver=new ResizeObserver(e=>{const t=e[0].contentRect;this.size[0]=t.width,this.size[1]=t.height,this.pos[0]=t.left,this.pos[1]=t.top,this.rebuildStyle(),this.calcLayout(!0),this.lyricLinesEl.forEach(i=>i.updateMaskImage())});posXSpringParams={mass:1,damping:10,stiffness:100};posYSpringParams={mass:1,damping:15,stiffness:100};scaleSpringParams={mass:1,damping:20,stiffness:100};enableBlur=!0;interludeDots;interludeDotsSize=[0,0];supportPlusLighter=CSS.supports("mix-blend-mode","plus-lighter");supportMaskImage=CSS.supports("mask-image","none");disableSpring=!1;alignAnchor=.5;size=[0,0];pos=[0,0];setEnableSpring(e=!0){this.disableSpring=!e,e?this.element.classList.remove(this.style.classes.disableSpring):this.element.classList.add(this.style.classes.disableSpring),this.calcLayout(!0)}getEnableSpring(){return!this.disableSpring}style=Y.createStyleSheet({lyricPlayer:{userSelect:"none",padding:"1rem",boxSizing:"border-box",fontSize:"max(5vh, 12px)",fontWeight:"bold",width:"100%",height:"100%",overflow:"hidden",maxWidth:"100%",maxHeight:"100%",zIndex:1,color:"var(--amll-lyric-line-color)",mixBlendMode:"plus-lighter",contain:"strict"},lyricLine:{position:"absolute",transformOrigin:"left",maxWidth:"65%",padding:"max(2vh, 1rem) 1rem",contain:"content",transition:"filter 0.25s",margin:"max(2vh, 1rem) -1rem"},"@media (max-width: 1024px)":{lyricLine:{maxWidth:"75%",padding:"max(1vh, 1rem) 1rem",margin:"0 -1rem"}},lyricDuetLine:{textAlign:"right",transformOrigin:"right"},lyricBgLine:{opacity:0,fontSize:"max(50%, 10px)",transition:"opacity 0.25s","&.active":{transition:"opacity 0.25s 0.25s",opacity:1}},lyricMainLine:{transition:"opacity 0.3s 0.25s",margin:"-1rem",padding:"1rem","& span":{display:"inline-block",margin:"-1rem",padding:"1rem"},"& > span":{whiteSpace:"pre-wrap",wordBreak:"keep-all",maxLines:"1","&.emphasize":{margin:"-1rem",padding:"1rem",transformStyle:"preserve-3d",perspective:"50vw"}}},lyricSubLine:{fontSize:"max(50%, 10px)",opacity:.5},disableSpring:{"& > *":{transition:"filter 0.25s, transform 0.5s"}},interludeDots:{height:"min(1rem,2.5vh)",transformOrigin:"center",width:"fit-content",padding:"2.5% 0",position:"absolute",display:"flex",gap:"0.5rem","& > *":{width:"100%",display:"inline-block",borderRadius:"50%",aspectRatio:"1 / 1",backgroundColor:"var(--amll-lyric-line-color)",marginRight:"4px"},"&.duet":{right:"1rem",transformOrigin:"center"}},"@supports (mix-blend-mode: plus-lighter)":{lyricSubLine:{opacity:.3}},tmpDisableTransition:{transition:"none !important"}});onPageShow=()=>{this.calcLayout(!0)};constructor(){super(),this.interludeDots=new $(this),this.element.setAttribute("class",this.style.classes.lyricPlayer),this.disableSpring&&this.element.classList.add(this.style.classes.disableSpring),this.rebuildStyle(),this.resizeObserver.observe(this.element),this.element.appendChild(this.interludeDots.getElement()),this.style.attach(),this.interludeDots.setTransform(0,200),window.addEventListener("pageshow",this.onPageShow)}getCurrentInterlude(){if(this.bufferedLines.size>0)return;const e=this.currentTime+20,t=this.scrollToIndex;if(t===0){if(this.processedLines[0]?.startTime&&this.processedLines[0].startTime>e)return[0,this.processedLines[0].startTime]}else if(this.processedLines[t]?.endTime&&this.processedLines[t+1]?.startTime&&this.processedLines[t+1].startTime>e&&this.processedLines[t].endTime<e)return[this.processedLines[t].endTime,this.processedLines[t+1].startTime]}rebuildStyle(){let e="";e+="--amll-lyric-player-width:",e+=this.element.clientWidth,e+="px;",e+="--amll-lyric-player-height:",e+=this.element.clientHeight,e+="px;",e+="--amll-lyric-line-color:",e+="#FFFFFF;",e+="--amll-player-time:",e+=this.currentTime,e+=";",this.element.setAttribute("style",e)}setEnableBlur(e){this.enableBlur!==e&&(this.enableBlur=e,this.calcLayout())}setLyricLines(e){this.lyricLines=e;const t=750;this.processedLines=e.map((i,n,h)=>{if(i.isBG)return{...i};{const s=h[n-1],r=h[n-2];if(s?.isBG&&r){if(r.endTime<i.startTime)return{...i,startTime:Math.max(r.endTime,i.startTime-t)||i.startTime}}else if(s?.endTime&&s.endTime<i.startTime)return{...i,startTime:Math.max(s?.endTime,i.startTime-t)||i.startTime};return{...i}}}),this.processedLines.forEach((i,n,h)=>{const s=h[n+1],r=i.words[i.words.length-1];r&&S(r)&&(s?s.startTime>i.endTime&&(i.endTime=Math.min(i.endTime+1500,s.startTime)):i.endTime=i.endTime+1500)}),this.processedLines.forEach((i,n,h)=>{if(i.isBG)return;const s=h[n+1];s?.isBG&&(s.startTime=Math.min(s.startTime,i.startTime))}),this.lyricLinesEl.forEach(i=>i.dispose()),this.lyricLinesEl=this.processedLines.map(i=>new X(this,i)),this.lyricLinesEl.forEach(i=>{this.element.appendChild(i.getElement()),i.updateMaskImage()}),this.setLinePosXSpringParams({}),this.setLinePosYSpringParams({}),this.setLineScaleSpringParams({}),this.setCurrentTime(0,!0),this.calcLayout(!0)}calcLayout(e=!1){e&&(this.lyricLinesEl.forEach(l=>{const o=l.measureSize();this.lyricLinesSize.set(l,o),l.lineSize=o}),this.interludeDotsSize[0]=this.interludeDots.getElement().clientWidth,this.interludeDotsSize[1]=this.interludeDots.getElement().clientHeight);const t=.95;let n=-this.lyricLinesEl.slice(0,this.scrollToIndex).reduce((l,o)=>l+(o.getLine().isBG?0:this.lyricLinesSize.get(o)?.[1]??0),0);if(this.alignAnchor==="bottom"){n+=this.element.clientHeight/2;const l=this.lyricLinesEl[this.scrollToIndex];if(l){const o=this.lyricLinesSize.get(l)?.[1]??0;n-=o/2}}else if(typeof this.alignAnchor=="number"){n+=this.element.clientHeight*this.alignAnchor;const l=this.lyricLinesEl[this.scrollToIndex];if(l){const o=this.lyricLinesSize.get(l)?.[1]??0;n-=o/2}}const h=this.currentTime===0?void 0:this.getCurrentInterlude();let s=0;if(h&&(s=h[1]-h[0],s>=5e3)){const l=this.currentTime===0?this.lyricLinesEl[0]:this.lyricLinesEl[this.scrollToIndex+1];l&&(n-=this.lyricLinesSize.get(l)?.[1]??0)}const r=Math.max(...this.bufferedLines);let a=0;this.lyricLinesEl.forEach((l,o)=>{const d=this.bufferedLines.has(o),m=d||o>=this.scrollToIndex&&o<r,u=l.getLine();let p=0;u.isDuet&&(p=this.size[0]-(this.lyricLinesSize.get(l)?.[0]??0)),o===this.scrollToIndex+1&&s>=5e3&&(this.interludeDots.setTransform(0,n),this.interludeDots.setInterlude(this.getCurrentInterlude()),n+=this.interludeDotsSize[1]),l.setTransform(p,n,m?1:t,d?1:1/3,this.enableBlur?3*(m?0:1+(o<this.scrollToIndex?Math.abs(this.scrollToIndex-o):Math.abs(o-Math.max(this.scrollToIndex,r)))):0,e,a),u.isBG&&m?n+=this.lyricLinesSize.get(l)?.[1]??0:u.isBG||(n+=this.lyricLinesSize.get(l)?.[1]??0),n>=0&&(a+=.05)})}getCurrentTime(){return this.currentTime}getLyricLines(){return this.lyricLines}getElement(){return this.element}setAlignAnchor(e){this.alignAnchor=e}setCurrentTime(e,t=!1){this.currentTime=e,this.element.style.setProperty("--amll-player-time",`${e}`);const i=new Set,n=new Set,h=new Set;this.hotLines.forEach(s=>{const r=this.processedLines[s];if(!r.isBG)if(r){const a=this.processedLines[s+1];if(a?.isBG){const l=Math.min(r.startTime,a?.startTime),o=Math.max(r.endTime,a?.endTime);(l>e||o<=e)&&(this.hotLines.delete(s),i.add(s),this.hotLines.delete(s+1),i.add(s+1),t&&(this.lyricLinesEl[s].disable(),this.lyricLinesEl[s+1].disable()))}else(r.startTime>e||r.endTime<=e)&&(this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable())}else this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable()}),this.processedLines.forEach((s,r,a)=>{!s.isBG&&s.startTime<=e&&s.endTime>e&&(this.hotLines.has(r)||(this.hotLines.add(r),h.add(r),t&&this.lyricLinesEl[r].enable(),a[r+1]?.isBG&&(this.hotLines.add(r+1),h.add(r+1),t&&this.lyricLinesEl[r+1].enable())))}),this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(n.add(s),t&&this.lyricLinesEl[s].disable())}),t?(this.bufferedLines.size>0?this.scrollToIndex=Math.min(...this.bufferedLines):this.scrollToIndex=this.processedLines.findIndex(s=>s.startTime>=e),this.bufferedLines.clear(),this.hotLines.forEach(s=>this.bufferedLines.add(s)),this.calcLayout(!0)):(n.size>0||h.size>0)&&(n.size===0&&h.size>0?(h.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),this.scrollToIndex=Math.min(...this.bufferedLines)):h.size===0&&n.size>0?O(n,this.bufferedLines)&&this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(this.bufferedLines.delete(s),this.lyricLinesEl[s].disable())}):(h.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),n.forEach(s=>{this.bufferedLines.delete(s),this.lyricLinesEl[s].disable()}),this.bufferedLines.size>0&&(this.scrollToIndex=Math.min(...this.bufferedLines))),this.calcLayout())}update(e=0){const t=e/1e3;this.interludeDots.update(e),this.lyricLinesEl.forEach(i=>i.update(t))}setLinePosXSpringParams(e){this.posXSpringParams={...this.posXSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posX.updateParams(this.posXSpringParams))}setLinePosYSpringParams(e){this.posYSpringParams={...this.posYSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posY.updateParams(this.posYSpringParams))}setLineScaleSpringParams(e){this.scaleSpringParams={...this.scaleSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.scale.updateParams(this.scaleSpringParams))}dispose(){this.element.remove(),this.resizeObserver.disconnect(),this.style.detach(),this.lyricLinesEl.forEach(e=>e.dispose()),window.removeEventListener("pageshow",this.onPageShow)}}exports.BackgroundRender=F;exports.LyricPlayer=V;exports.ttml=I;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("@pixi/display"),M=require("@pixi/app"),y=require("@pixi/filter-blur"),S=require("@pixi/filter-color-matrix"),C=require("@pixi/core"),L=require("@pixi/sprite"),z=require("jss"),A=require("jss-preset-default"),B=/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\.:]([0-9]+))?)/;function T(d){const e=B.exec(d);if(e){const t=Number(e.groups?.hour||"0"),i=Number(e.groups?.min||"0"),n=Number(e.groups?.sec.replace(/:/,".")||"0");return Math.floor((t*3600+i*60+n)*1e3)}else throw new TypeError("时间戳字符串解析失败")}function D(d){const t=new DOMParser().parseFromString(d,"application/xml");let i="v1";for(const a of t.querySelectorAll("ttm\\:agent"))if(a.getAttribute("type")==="person"){const s=a.getAttribute("xml:id");s&&(i=s)}const n=[];for(const a of t.querySelectorAll("body p[begin][end]")){const s={words:[],startTime:T(a.getAttribute("begin")??"0:0"),endTime:T(a.getAttribute("end")??"0:0"),translatedLyric:"",romanLyric:"",isBG:!1,isDuet:a.getAttribute("ttm:agent")!==i};let r=null;for(const l of a.childNodes)if(l.nodeType===Node.TEXT_NODE){const h=l.textContent??"";/^(\s+)$/.test(h)?s.words.push({word:" ",startTime:0,endTime:0}):s.words.push({word:h,startTime:0,endTime:0})}else if(l.nodeType===Node.ELEMENT_NODE){const h=l,o=h.getAttribute("ttm:role");if(h.nodeName==="span"&&o)if(o==="x-bg"){const c={words:[],startTime:s.startTime,endTime:s.endTime,translatedLyric:"",romanLyric:"",isBG:!0,isDuet:s.isDuet};for(const u of h.childNodes)if(u.nodeType===Node.TEXT_NODE){const f=u.textContent??"";/^(\s+)$/.test(f)?c.words.push({word:" ",startTime:0,endTime:0}):c.words.push({word:f,startTime:0,endTime:0})}else if(u.nodeType===Node.ELEMENT_NODE){const f=u,b=f.getAttribute("ttm:role");if(f.nodeName==="span"&&b)b==="x-translation"?c.translatedLyric=f.innerHTML.trim():b==="x-roman"&&(c.romanLyric=f.innerHTML.trim());else if(f.hasAttribute("begin")&&f.hasAttribute("end")){const x={word:u.textContent,startTime:T(f.getAttribute("begin")),endTime:T(f.getAttribute("end"))};c.words.push(x)}}const m=c.words[0];c.startTime=m.startTime,m?.word.startsWith("(")&&(m.word=m.word.substring(1));const p=c.words[c.words.length-1];c.endTime=p.endTime,p?.word.endsWith(")")&&(p.word=p.word.substring(0,p.word.length-1)),r=c}else o==="x-translation"?s.translatedLyric=h.innerHTML:o==="x-roman"&&(s.romanLyric=h.innerHTML);else if(h.hasAttribute("begin")&&h.hasAttribute("end")){const c={word:l.textContent??"",startTime:T(h.getAttribute("begin")),endTime:T(h.getAttribute("end"))};s.words.push(c)}}n.push(s),r&&n.push(r)}return console.log(n),n}const I=Object.freeze(Object.defineProperty({__proto__:null,parseTTML:D},Symbol.toStringTag,{value:"Module"}));class k extends v.Container{time=0}class F{constructor(e){this.canvas=e;const t=e.getBoundingClientRect();this.canvas.width=t.width*this.currerntRenderScale,this.canvas.height=t.height*this.currerntRenderScale,this.observer=new ResizeObserver(()=>{const i=e.getBoundingClientRect();this.canvas.width=Math.max(1,i.width),this.canvas.height=Math.max(1,i.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}),this.observer.observe(e),this.app=new M.Application({view:e,resizeTo:this.canvas,powerPreference:"low-power",backgroundAlpha:0}),this.rebuildFilters(),this.app.ticker.add(this.onTick),this.app.ticker.start()}observer;app;curContainer;lastContainer=new Set;onTick=e=>{for(const t of this.lastContainer)t.alpha=Math.max(0,t.alpha-e/60),t.alpha<=0&&(this.app.stage.removeChild(t),this.lastContainer.delete(t));if(this.curContainer){this.curContainer.alpha=Math.min(1,this.curContainer.alpha+e/60);const[t,i,n,a]=this.curContainer.children,s=Math.max(this.app.screen.width,this.app.screen.height);t.position.set(this.app.screen.width/2,this.app.screen.height/2),i.position.set(this.app.screen.width/2.5,this.app.screen.height/2.5),n.position.set(this.app.screen.width/2,this.app.screen.height/2),a.position.set(this.app.screen.width/2,this.app.screen.height/2),t.width=s*Math.sqrt(2),t.height=t.width,i.width=s*.8,i.height=i.width,n.width=s*.5,n.height=n.width,a.width=s*.25,a.height=a.width,this.curContainer.time+=e*this.flowSpeed,t.rotation+=e/1e3*this.flowSpeed,i.rotation-=e/500*this.flowSpeed,n.rotation+=e/1e3*this.flowSpeed,a.rotation-=e/750*this.flowSpeed,n.x=this.app.screen.width/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),n.y=this.app.screen.height/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),a.x=this.app.screen.width/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75),a.y=this.app.screen.height/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75)}};flowSpeed=2;currerntRenderScale=.75;setFlowSpeed(e){this.flowSpeed=e}setRenderScale(e){this.currerntRenderScale=e;const t=this.canvas.getBoundingClientRect();this.canvas.width=Math.max(1,t.width),this.canvas.height=Math.max(1,t.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}rebuildFilters(){const e=Math.min(this.canvas.width,this.canvas.height),t=new S.ColorMatrixFilter;t.saturate(1.2,!1);const i=new S.ColorMatrixFilter;i.brightness(.6,!1);const n=new S.ColorMatrixFilter;n.contrast(.3,!0),this.app.stage.filters=[],this.app.stage.filters.push(new y.BlurFilter(5,1)),this.app.stage.filters.push(new y.BlurFilter(10,1)),this.app.stage.filters.push(new y.BlurFilter(20,2)),this.app.stage.filters.push(new y.BlurFilter(40,2)),e>512&&this.app.stage.filters.push(new y.BlurFilter(80,2)),e>768&&this.app.stage.filters.push(new y.BlurFilter(160,4)),e>768*2&&this.app.stage.filters.push(new y.BlurFilter(320,4)),this.app.stage.filters.push(t,i,n),this.app.stage.filters.push(new y.BlurFilter(5,1))}setFPS(e){this.app.ticker.maxFPS=e}pause(){this.app.ticker.stop(),this.app.render()}resume(){this.app.ticker.start()}async setAlbumImage(e){const t=await C.Texture.fromURL(e),i=new k,n=new L.Sprite(t),a=new L.Sprite(t),s=new L.Sprite(t),r=new L.Sprite(t);n.anchor.set(.5,.5),a.anchor.set(.5,.5),s.anchor.set(.5,.5),r.anchor.set(.5,.5),n.rotation=Math.random()*Math.PI*2,a.rotation=Math.random()*Math.PI*2,s.rotation=Math.random()*Math.PI*2,r.rotation=Math.random()*Math.PI*2,i.addChild(n,a,s,r),this.curContainer&&this.lastContainer.add(this.curContainer),this.curContainer=i,this.app.stage.addChild(this.curContainer),this.curContainer.alpha=0}dispose(){this.observer.disconnect(),this.app.ticker.remove(this.onTick)}}class q extends F{element;constructor(){const e=document.createElement("canvas");super(e),this.element=e,e.style.pointerEvents="none",e.style.zIndex="-1"}getElement(){return this.element}dispose(){super.dispose(),this.element.remove()}}const O=(d,e)=>d.size===e.size&&[...d].every(t=>e.has(t));function N(d){const t=2.5949095;return d<.5?Math.pow(2*d,2)*((t+1)*2*d-t)/2:(Math.pow(2*d-2,2)*((t+1)*(d*2-2)+t)+2)/2}const g=(d,e,t)=>Math.max(d,Math.min(e,t));class ${constructor(e){this.lyricPlayer=e,this.element.className=this.lyricPlayer.style.classes.interludeDots,this.element.appendChild(this.dot0),this.element.appendChild(this.dot1),this.element.appendChild(this.dot2)}element=document.createElement("div");dot0=document.createElement("span");dot1=document.createElement("span");dot2=document.createElement("span");left=0;top=0;scale=1;lastStyle="";currentInterlude;currentTime=0;targetBreatheDuration=1500;getElement(){return this.element}setTransform(e=this.left,t=this.top){this.left=e,this.top=t,this.update()}setInterlude(e){this.currentInterlude=e,this.currentTime=e?.[0]??0}update(e=0){this.currentTime+=e;let t="";if(t+=`transform:translate(${this.left}px, ${this.top}px)`,this.currentInterlude){const i=this.currentInterlude[1]-this.currentInterlude[0],n=this.currentTime-this.currentInterlude[0];if(n<=i){const a=i/Math.ceil(i/this.targetBreatheDuration);let s=1,r=1;s*=Math.sin(1.5*Math.PI-n/a*2)/10+1,n<1e3&&(s*=1-Math.pow((1e3-n)/1e3,2)),n<500?r=0:n<1e3&&(r*=(n-500)/500),i-n<750&&(s*=1-N((750-(i-n))/750/2)),i-n<375&&(r*=g(0,(i-n)/375,1)),s=Math.max(0,s),t+=` scale(${s})`;const l=g(.25,n*3/i*.75,1),h=g(.25,(n-i/3)*3/i*.75,1),o=g(.25,(n-i/3*2)*3/i*.75,1);this.dot0.style.opacity=`${g(0,Math.max(0,r*l),1)}`,this.dot1.style.opacity=`${g(0,Math.max(0,r*h),1)}`,this.dot2.style.opacity=`${g(0,Math.max(0,r*o),1)}`}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0"}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0";t+=";",this.lastStyle!==t&&(this.element.setAttribute("style",t),this.lastStyle=t)}dispose(){this.element.remove()}}class E{currentPosition=0;targetPosition=0;currentTime=0;params={};currentSolver;getV;queueParams;queuePosition;constructor(e=0){this.targetPosition=e,this.currentPosition=this.targetPosition,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}resetSolver(){const e=this.getV(this.currentTime);this.currentTime=0,this.currentSolver=R(this.currentPosition,e,this.targetPosition,0,this.params),this.getV=_(this.currentSolver)}arrived(){return Math.abs(this.targetPosition-this.currentPosition)<.01&&this.getV(this.currentTime)<.01&&this.queueParams===void 0&&this.queuePosition===void 0}setPosition(e){this.targetPosition=e,this.currentPosition=e,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}update(e=0){this.currentTime+=e,this.currentPosition=this.currentSolver(this.currentTime),this.queueParams&&(this.queueParams.time-=e,this.queueParams.time<=0&&this.updateParams({...this.queueParams})),this.queuePosition&&(this.queuePosition.time-=e,this.queuePosition.time<=0&&this.setTargetPosition(this.queuePosition.position)),this.arrived()&&this.setPosition(this.targetPosition)}updateParams(e,t=0){t>0?this.queueParams={...e,time:t}:(this.params={...this.params,...e},this.resetSolver())}setTargetPosition(e,t=0){t>0?this.queuePosition={position:e,time:t}:(this.queuePosition=void 0,this.targetPosition=e,this.resetSolver())}getCurrentPosition(){return this.currentPosition}}function R(d,e,t,i=0,n){const a=n?.soft??!1,s=n?.stiffness??100,r=n?.damping??10,l=n?.mass??1,h=t-d;if(a||1<=r/(2*Math.sqrt(s*l))){const o=-Math.sqrt(s/l),c=-o*h-e;return m=>(m-=i,m<0?d:t-(h+m*c)*Math.E**(m*o))}else{const o=Math.sqrt(4*l*s-r**2),c=(r*h-2*l*e)/o,m=.5*o/l,p=-(.5*r)/l;return u=>(u-=i,u<0?d:t-(Math.cos(u*m)*h+Math.sin(u*m)*c)*Math.E**(u*p))}}function W(d){return t=>(d(t+.001)-d(t-.001))/(2*.001)}function _(d){return W(d)}const w=/^[\p{Unified_Ideograph}\u0800-\u9FFC]+$/u;function G(d,e="rgba(0,0,0,1)",t="rgba(0,0,0,0.5)"){const i=2+d,n=d/i,a=(1-n)/2;return[`linear-gradient(to right,${e} ${a*100}%,${t} ${(a+n)*100}%)`,n,i]}function P(d){return d.endTime-d.startTime>=1e3&&d.word.length<=7}class X{constructor(e,t={words:[],translatedLyric:"",romanLyric:"",startTime:0,endTime:0,isBG:!1,isDuet:!1}){this.lyricPlayer=e,this.lyricLine=t,this.element.setAttribute("class",this.lyricPlayer.style.classes.lyricLine),this.lyricLine.isBG&&this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet&&this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div"));const i=this.element.children[0],n=this.element.children[1],a=this.element.children[2];i.setAttribute("class",this.lyricPlayer.style.classes.lyricMainLine),n.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),a.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),this.rebuildElement(),this.rebuildStyle()}element=document.createElement("div");left=0;top=0;scale=1;blur=0;delay=0;splittedWords=[];lineSize=[0,0];lineTransforms={posX:new E(0),posY:new E(0),scale:new E(1)};isEnabled=!1;enable(){this.isEnabled=!0,this.element.classList.add("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.currentTime=0,i.playbackRate=1,i.play()})}),e.classList.add("active")}measureSize(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden");const e=[this.element.clientWidth,this.element.clientHeight];return this._hide&&(this.element.style.display="none",this.element.style.visibility=""),e}disable(){this.isEnabled=!1,this.element.classList.remove("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.id==="float-word"&&(i.playbackRate=-1,i.play())})}),e.classList.remove("active")}setLine(e){this.lyricLine=e,this.lyricLine.isBG?this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet?this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricDuetLine),this.rebuildElement(),this.rebuildStyle()}getLine(){return this.lyricLine}_hide=!0;lastStyle="";show(){this._hide=!1,this.rebuildStyle()}hide(){this._hide=!0,this.rebuildStyle()}rebuildStyle(){if(this._hide){this.lastStyle!=="display:none;transform:translate(0,-10000px);"&&(this.lastStyle="display:none;transform:translate(0,-10000px);",this.element.setAttribute("style","display:none;transform:translate(0,-10000px);"));return}let e=`transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;!this.lyricPlayer.getEnableSpring()&&this.isInSight&&(e+=`transition-delay:${this.delay}ms;`),e+=`filter:blur(${Math.min(32,this.blur)}px);`,e!==this.lastStyle&&(this.lastStyle=e,this.element.setAttribute("style",e))}rebuildElement(){const e=this.element.children[0],t=this.element.children[1],i=this.element.children[2];this.splittedWords=[],this.lyricLine.words.forEach(l=>{const h=l.word.split(/\s+/),o=h.reduce((m,p)=>m+p.length,0);let c=0;h.forEach((m,p)=>{p>0&&this.splittedWords.push({word:" ",startTime:0,endTime:0,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:!1}),this.splittedWords.push({word:m,startTime:l.startTime+(l.endTime-l.startTime)/o*c,endTime:l.startTime+(l.endTime-l.startTime)/o*(c+m.length),width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:P(l)}),c+=m.length})});const n=[],a=[];function s(l){for(;l.firstChild;)l.firstChild.nodeType===Node.ELEMENT_NODE?n.push(e.firstChild):l.firstChild.nodeType===Node.TEXT_NODE&&a.push(e.firstChild),l.removeChild(l.firstChild),s(l.firstChild)}s(e);let r=null;this.splittedWords.forEach(l=>{if(l.word.trim().length>0)if(l.shouldEmphasize){const h=n.pop()??document.createElement("span");h.className="emphasize",l.elements=[h];for(const o of l.word){const c=n.pop()??document.createElement("span");c.className="",c.innerText=o,h.appendChild(c),l.elements.push(c)}if(l.elementAnimations=this.initEmphasizeAnimation(l),console.log(l.word,w.test(l.word)),r&&!w.test(l.word))if(r.childElementCount>0)r.appendChild(h);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(h),e.appendChild(o),r=o}else r=w.test(l.word)?null:h,e.appendChild(h)}else{const h=n.pop()??document.createElement("span");if(h.className="",h.innerText=l.word,l.elements=[h],l.elementAnimations.push(this.initFloatAnimation(l,h)),r)if(r.childElementCount>0)r.appendChild(h);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(h),e.appendChild(o),r=o}else r=h,e.appendChild(h)}else if(l.word.length>0){const h=a.pop()??document.createTextNode(" ");e.appendChild(h),r=null}else r=null}),t.innerText=this.lyricLine.translatedLyric,i.innerText=this.lyricLine.romanLyric}initFloatAnimation(e,t){const i=e.startTime-this.lyricLine.startTime,n=Math.max(1e3,e.endTime-e.startTime),a=t.animate([{transform:"translateY(0px)"},{transform:"translateY(-3%)"}],{duration:isFinite(n)?n:0,delay:isFinite(i)?i:0,id:"float-word",composite:"add",fill:"both"});return a.pause(),a}initEmphasizeAnimation(e){const t=e.startTime-this.lyricLine.startTime,i=e.endTime-e.startTime;return e.elements.map((n,a,s)=>{if(a===0)return this.initFloatAnimation(e,n);{const r=n.animate([{offset:0,transform:"translate3d(0, 0px, 0px)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"},{offset:.5,transform:"translate3d(0, -2%, 20px)",filter:"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))"},{offset:1,transform:"translate3d(0, 0px, 0)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"}],{duration:Math.max(1e3,e.endTime-e.startTime),delay:t+i/(s.length-1)*(a-1),id:"glow-word",iterations:1,composite:"replace",fill:"both"});return r.pause(),r}})}updateMaskImage(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden"),this.splittedWords.forEach(e=>{const t=e.elements[0];if(t){e.width=t.clientWidth,e.height=t.clientHeight;const[i,n,a]=G(16/e.width,"rgba(0,0,0,0.75)","rgba(0,0,0,0.25)"),s=`${a*100}% 100%`;this.lyricPlayer.supportMaskImage?(t.style.maskImage=i,t.style.maskOrigin="left",t.style.maskSize=s):(t.style.webkitMaskImage=i,t.style.webkitMaskOrigin="left",t.style.webkitMaskSize=s);const r=e.width+16,l=`clamp(${-r}px,calc(${-r}px + (var(--amll-player-time) - ${e.startTime})*${r/Math.abs(e.endTime-e.startTime)}px),0px) 0px, left top`;t.style.maskPosition=l,t.style.webkitMaskPosition=l}}),this._hide&&(this.element.style.display="none",this.element.style.visibility="")}getElement(){return this.element}setTransform(e=this.left,t=this.top,i=this.scale,n=1,a=0,s=!1,r=0){this.left=e,this.top=t,this.scale=i,this.delay=r*1e3|0;const l=this.element.children[0];l.style.opacity=`${n}`,s||!this.lyricPlayer.getEnableSpring()?(this.blur=Math.min(32,a),s&&this.element.classList.add(this.lyricPlayer.style.classes.tmpDisableTransition),this.lineTransforms.posX.setPosition(e),this.lineTransforms.posY.setPosition(t),this.lineTransforms.scale.setPosition(i),this.lyricPlayer.getEnableSpring()?this.rebuildStyle():this.show(),s&&requestAnimationFrame(()=>{this.element.classList.remove(this.lyricPlayer.style.classes.tmpDisableTransition)})):(this.lineTransforms.posX.setTargetPosition(e,r),this.lineTransforms.posY.setTargetPosition(t,r),this.lineTransforms.scale.setTargetPosition(i),this.blur!==Math.min(32,a)&&(this.blur=Math.min(32,a),this.element.style.filter=`blur(${Math.min(32,a)}px)`))}update(e=0){this.lyricPlayer.getEnableSpring()&&(this.lineTransforms.posX.update(e),this.lineTransforms.posY.update(e),this.lineTransforms.scale.update(e),this.isInSight?this.show():this.hide())}get isInSight(){const e=this.lineTransforms.posX.getCurrentPosition(),t=this.lineTransforms.posY.getCurrentPosition(),i=e+this.lineSize[0],n=t+this.lineSize[1],a=this.lyricPlayer.pos[0],s=this.lyricPlayer.pos[1],r=this.lyricPlayer.pos[0]+this.lyricPlayer.size[0],l=this.lyricPlayer.pos[1]+this.lyricPlayer.size[1];return!(e>r||t>l||i<a||n<s)}dispose(){this.element.remove()}}const Y=z.create(A());class V extends EventTarget{element=document.createElement("div");currentTime=0;lyricLines=[];processedLines=[];lyricLinesEl=[];lyricLinesSize=new Map;hotLines=new Set;bufferedLines=new Set;scrollToIndex=0;resizeObserver=new ResizeObserver(e=>{const t=e[0].contentRect;this.size[0]=t.width,this.size[1]=t.height,this.pos[0]=t.left,this.pos[1]=t.top,this.rebuildStyle(),this.calcLayout(!0),this.lyricLinesEl.forEach(i=>i.updateMaskImage())});posXSpringParams={mass:1,damping:10,stiffness:100};posYSpringParams={mass:1,damping:15,stiffness:100};scaleSpringParams={mass:1,damping:20,stiffness:100};enableBlur=!0;interludeDots;interludeDotsSize=[0,0];supportPlusLighter=CSS.supports("mix-blend-mode","plus-lighter");supportMaskImage=CSS.supports("mask-image","none");disableSpring=!1;alignAnchor=.5;size=[0,0];pos=[0,0];setEnableSpring(e=!0){this.disableSpring=!e,e?this.element.classList.remove(this.style.classes.disableSpring):this.element.classList.add(this.style.classes.disableSpring),this.calcLayout(!0)}getEnableSpring(){return!this.disableSpring}style=Y.createStyleSheet({lyricPlayer:{userSelect:"none",padding:"1rem",boxSizing:"border-box",fontSize:"max(5vh, 12px)",fontWeight:"bold",width:"100%",height:"100%",overflow:"hidden",maxWidth:"100%",maxHeight:"100%",zIndex:1,color:"var(--amll-lyric-line-color)",mixBlendMode:"plus-lighter",contain:"strict"},lyricLine:{position:"absolute",transformOrigin:"left",maxWidth:"65%",padding:"max(2vh, 1rem) 1rem",contain:"content",transition:"filter 0.25s",margin:"max(2vh, 1rem) -1rem"},"@media (max-width: 1024px)":{lyricLine:{maxWidth:"75%",padding:"max(1vh, 1rem) 1rem",margin:"0 -1rem"}},lyricDuetLine:{textAlign:"right",transformOrigin:"right"},lyricBgLine:{opacity:0,fontSize:"max(50%, 10px)",transition:"opacity 0.25s","&.active":{transition:"opacity 0.25s 0.25s",opacity:1}},lyricMainLine:{transition:"opacity 0.3s 0.25s",margin:"-1rem",padding:"1rem","& span":{display:"inline-block",margin:"-1rem",padding:"1rem"},"& > span":{whiteSpace:"pre-wrap",wordBreak:"keep-all",maxLines:"1","&.emphasize":{margin:"-1rem",padding:"1rem",transformStyle:"preserve-3d",perspective:"50vw"}}},lyricSubLine:{fontSize:"max(50%, 10px)",opacity:.5},disableSpring:{"& > *":{transition:"filter 0.25s, transform 0.5s"}},interludeDots:{height:"min(1rem,2.5vh)",transformOrigin:"center",width:"fit-content",padding:"2.5% 0",position:"absolute",display:"flex",gap:"0.5rem","& > *":{width:"100%",display:"inline-block",borderRadius:"50%",aspectRatio:"1 / 1",backgroundColor:"var(--amll-lyric-line-color)",marginRight:"4px"},"&.duet":{right:"1rem",transformOrigin:"center"}},"@supports (mix-blend-mode: plus-lighter)":{lyricSubLine:{opacity:.3}},tmpDisableTransition:{transition:"none !important"}});onPageShow=()=>{this.calcLayout(!0)};constructor(){super(),this.interludeDots=new $(this),this.element.setAttribute("class",this.style.classes.lyricPlayer),this.disableSpring&&this.element.classList.add(this.style.classes.disableSpring),this.rebuildStyle(),this.resizeObserver.observe(this.element),this.element.appendChild(this.interludeDots.getElement()),this.style.attach(),this.interludeDots.setTransform(0,200),window.addEventListener("pageshow",this.onPageShow)}getCurrentInterlude(){if(this.bufferedLines.size>0)return;const e=this.currentTime+20,t=this.scrollToIndex;if(t===0){if(this.processedLines[0]?.startTime&&this.processedLines[0].startTime>e)return[0,this.processedLines[0].startTime,-2]}else if(this.processedLines[t]?.endTime&&this.processedLines[t+1]?.startTime&&this.processedLines[t+1].startTime>e&&this.processedLines[t].endTime<e)return[this.processedLines[t].endTime,this.processedLines[t+1].startTime,t]}rebuildStyle(){let e="";e+="--amll-lyric-player-width:",e+=this.element.clientWidth,e+="px;",e+="--amll-lyric-player-height:",e+=this.element.clientHeight,e+="px;",e+="--amll-lyric-line-color:",e+="#FFFFFF;",e+="--amll-player-time:",e+=this.currentTime,e+=";",this.element.setAttribute("style",e)}setEnableBlur(e){this.enableBlur!==e&&(this.enableBlur=e,this.calcLayout())}setLyricLines(e){this.lyricLines=e;const t=750;this.processedLines=e.filter(i=>i.words.reduce((n,a)=>n+a.word.trim().length,0)>0).map((i,n,a)=>{if(i.isBG)return{...i};{const s=a[n-1],r=a[n-2];if(s?.isBG&&r){if(r.endTime<i.startTime)return{...i,startTime:Math.max(r.endTime,i.startTime-t)||i.startTime}}else if(s?.endTime&&s.endTime<i.startTime)return{...i,startTime:Math.max(s?.endTime,i.startTime-t)||i.startTime};return{...i}}}),this.processedLines.forEach((i,n,a)=>{const s=a[n+1],r=i.words[i.words.length-1];r&&P(r)&&(s?s.startTime>i.endTime&&(i.endTime=Math.min(i.endTime+1500,s.startTime)):i.endTime=i.endTime+1500)}),this.processedLines.forEach((i,n,a)=>{if(i.isBG)return;const s=a[n+1];s?.isBG&&(s.startTime=Math.min(s.startTime,i.startTime))}),this.lyricLinesEl.forEach(i=>i.dispose()),this.lyricLinesEl=this.processedLines.map(i=>new X(this,i)),this.lyricLinesEl.forEach(i=>{this.element.appendChild(i.getElement()),i.updateMaskImage()}),this.hotLines.clear(),this.bufferedLines.clear(),this.setLinePosXSpringParams({}),this.setLinePosYSpringParams({}),this.setLineScaleSpringParams({}),this.setCurrentTime(0,!0),this.calcLayout(!0)}calcLayout(e=!1){e&&(this.lyricLinesEl.forEach(o=>{const c=o.measureSize();this.lyricLinesSize.set(o,c),o.lineSize=c}),this.interludeDotsSize[0]=this.interludeDots.getElement().clientWidth,this.interludeDotsSize[1]=this.interludeDots.getElement().clientHeight);const t=.95;let n=-this.lyricLinesEl.slice(0,this.scrollToIndex).reduce((o,c)=>o+(c.getLine().isBG?0:this.lyricLinesSize.get(c)?.[1]??0),0);if(this.alignAnchor==="bottom"){n+=this.element.clientHeight/2;const o=this.lyricLinesEl[this.scrollToIndex];if(o){const c=this.lyricLinesSize.get(o)?.[1]??0;n-=c/2}}else if(typeof this.alignAnchor=="number"){n+=this.element.clientHeight*this.alignAnchor;const o=this.lyricLinesEl[this.scrollToIndex];if(o){const c=this.lyricLinesSize.get(o)?.[1]??0;n-=c/2}}const a=this.getCurrentInterlude();let s=0;if(a&&(s=a[1]-a[0],s>=5e3)){const o=this.lyricLinesEl[a[2]+1];o&&(n-=this.lyricLinesSize.get(o)?.[1]??0)}const r=Math.max(...this.bufferedLines);let l=0,h=!1;this.lyricLinesEl.forEach((o,c)=>{const m=this.bufferedLines.has(c),p=m||c>=this.scrollToIndex&&c<r,u=o.getLine();let f=0;u.isDuet&&(f=this.size[0]-(this.lyricLinesSize.get(o)?.[0]??0)),!h&&s>=5e3&&(c===this.scrollToIndex&&a?.[2]===-2||c===this.scrollToIndex+1)&&(h=!0,this.interludeDots.setTransform(0,n),a&&this.interludeDots.setInterlude([a[0],a[1]]),n+=this.interludeDotsSize[1]),o.setTransform(f,n,p?1:t,m?1:1/3,this.enableBlur?3*(p?0:1+(c<this.scrollToIndex?Math.abs(this.scrollToIndex-c):Math.abs(c-Math.max(this.scrollToIndex,r)))):0,e,l),u.isBG&&p?n+=this.lyricLinesSize.get(o)?.[1]??0:u.isBG||(n+=this.lyricLinesSize.get(o)?.[1]??0),n>=0&&(l+=.05)})}getCurrentTime(){return this.currentTime}getLyricLines(){return this.lyricLines}getElement(){return this.element}setAlignAnchor(e){this.alignAnchor=e}setCurrentTime(e,t=!1){this.currentTime=e,this.element.style.setProperty("--amll-player-time",`${e}`);const i=new Set,n=new Set,a=new Set;this.hotLines.forEach(s=>{const r=this.processedLines[s];if(r){if(r.isBG)return;const l=this.processedLines[s+1];if(l?.isBG){const h=Math.min(r.startTime,l?.startTime),o=Math.max(r.endTime,l?.endTime);(h>e||o<=e)&&(this.hotLines.delete(s),i.add(s),this.hotLines.delete(s+1),i.add(s+1),t&&(this.lyricLinesEl[s].disable(),this.lyricLinesEl[s+1].disable()))}else(r.startTime>e||r.endTime<=e)&&(this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable())}else this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable()}),this.processedLines.forEach((s,r,l)=>{!s.isBG&&s.startTime<=e&&s.endTime>e&&(this.hotLines.has(r)||(this.hotLines.add(r),a.add(r),t&&this.lyricLinesEl[r].enable(),l[r+1]?.isBG&&(this.hotLines.add(r+1),a.add(r+1),t&&this.lyricLinesEl[r+1].enable())))}),this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(n.add(s),t&&this.lyricLinesEl[s].disable())}),t?(this.bufferedLines.size>0?this.scrollToIndex=Math.min(...this.bufferedLines):this.scrollToIndex=this.processedLines.findIndex(s=>s.startTime>=e),this.bufferedLines.clear(),this.hotLines.forEach(s=>this.bufferedLines.add(s)),this.calcLayout(!0)):(n.size>0||a.size>0)&&(n.size===0&&a.size>0?(a.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),this.scrollToIndex=Math.min(...this.bufferedLines)):a.size===0&&n.size>0?O(n,this.bufferedLines)&&this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(this.bufferedLines.delete(s),this.lyricLinesEl[s].disable())}):(a.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),n.forEach(s=>{this.bufferedLines.delete(s),this.lyricLinesEl[s].disable()}),this.bufferedLines.size>0&&(this.scrollToIndex=Math.min(...this.bufferedLines))),this.calcLayout())}update(e=0){const t=e/1e3;this.interludeDots.update(e),this.lyricLinesEl.forEach(i=>i.update(t))}setLinePosXSpringParams(e){this.posXSpringParams={...this.posXSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posX.updateParams(this.posXSpringParams))}setLinePosYSpringParams(e){this.posYSpringParams={...this.posYSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posY.updateParams(this.posYSpringParams))}setLineScaleSpringParams(e){this.scaleSpringParams={...this.scaleSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.scale.updateParams(this.scaleSpringParams))}dispose(){this.element.remove(),this.resizeObserver.disconnect(),this.style.detach(),this.lyricLinesEl.forEach(e=>e.dispose()),window.removeEventListener("pageshow",this.onPageShow)}}exports.BackgroundRender=q;exports.LyricPlayer=V;exports.ttml=I;
2
2
  //# sourceMappingURL=amll-core.js.map