@applemusic-like-lyrics/core 0.0.11 → 0.0.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"amll-core.js","sources":["../src/lyric/ttml.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { LyricLine, LyricWord } from \"../interfaces\";\n\nconst timeRegexp =\n\t/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\\.:]([0-9]+))?)/;\nfunction parseTimespan(timeSpan: string): number {\n\tconst matches = timeRegexp.exec(timeSpan);\n\tif (matches) {\n\t\tconst hour = Number(matches.groups?.hour || \"0\");\n\t\tconst min = Number(matches.groups?.min || \"0\");\n\t\tconst sec = Number(matches.groups?.sec.replace(/:/, \".\") || \"0\");\n\t\treturn Math.floor((hour * 3600 + min * 60 + sec) * 1000);\n\t} else {\n\t\tthrow new TypeError(\"时间戳字符串解析失败\");\n\t}\n}\n\nexport function parseTTML(ttmlText: string): LyricLine[] {\n\tconst domParser = new DOMParser();\n\tconst ttmlDoc: XMLDocument = domParser.parseFromString(\n\t\tttmlText,\n\t\t\"application/xml\",\n\t);\n\n\tlet mainAgentId = \"v1\";\n\n\tfor (const agent of ttmlDoc.querySelectorAll(\"ttm\\\\:agent\")) {\n\t\tif (agent.getAttribute(\"type\") === \"person\") {\n\t\t\tconst id = agent.getAttribute(\"xml:id\");\n\t\t\tif (id) {\n\t\t\t\tmainAgentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: LyricLine[] = [];\n\n\tfor (const lineEl of ttmlDoc.querySelectorAll(\"body p[begin][end]\")) {\n\t\tconst line: LyricLine = {\n\t\t\twords: [],\n\t\t\tstartTime: parseTimespan(lineEl.getAttribute(\"begin\") ?? \"0:0\"),\n\t\t\tendTime: parseTimespan(lineEl.getAttribute(\"end\") ?? \"0:0\"),\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tisBG: false,\n\t\t\tisDuet: lineEl.getAttribute(\"ttm:agent\") !== mainAgentId,\n\t\t};\n\t\tlet curBGLine: LyricLine | null = null;\n\n\t\tfor (const wordNode of lineEl.childNodes) {\n\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: word,\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\n\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\tif (role === \"x-bg\") {\n\t\t\t\t\t\tconst bgLine: LyricLine = {\n\t\t\t\t\t\t\twords: [],\n\t\t\t\t\t\t\tstartTime: line.startTime,\n\t\t\t\t\t\t\tendTime: line.endTime,\n\t\t\t\t\t\t\ttranslatedLyric: \"\",\n\t\t\t\t\t\t\tromanLyric: \"\",\n\t\t\t\t\t\t\tisBG: true,\n\t\t\t\t\t\t\tisDuet: line.isDuet,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfor (const wordNode of wordEl.childNodes) {\n\t\t\t\t\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\t\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: word,\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\t\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\t\t\t\t\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\t\t\t\t\tif (role === \"x-translation\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.translatedLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.romanLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"begin\") &&\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"end\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst word = {\n\t\t\t\t\t\t\t\t\t\tword: wordNode.textContent,\n\t\t\t\t\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t\t\t\t\t} as LyricWord;\n\t\t\t\t\t\t\t\t\tbgLine.words.push(word);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst firstWord = bgLine.words[0];\n\t\t\t\t\t\tbgLine.startTime = firstWord.startTime;\n\t\t\t\t\t\tif (firstWord?.word.startsWith(\"(\")) {\n\t\t\t\t\t\t\tfirstWord.word = firstWord.word.substring(1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lastWord = bgLine.words[bgLine.words.length - 1];\n\t\t\t\t\t\tbgLine.endTime = lastWord.endTime;\n\t\t\t\t\t\tif (lastWord?.word.endsWith(\")\")) {\n\t\t\t\t\t\t\tlastWord.word = lastWord.word.substring(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tlastWord.word.length - 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurBGLine = bgLine;\n\t\t\t\t\t} else if (role === \"x-translation\") {\n\t\t\t\t\t\tline.translatedLyric = wordEl.innerHTML;\n\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\tline.romanLyric = wordEl.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordEl.hasAttribute(\"begin\") && wordEl.hasAttribute(\"end\")) {\n\t\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\t\tword: wordNode.textContent ?? \"\",\n\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t};\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tresult.push(line);\n\t\tif (curBGLine) {\n\t\t\t// line.startTime = Math.min(line.startTime, curBGLine.startTime);\n\t\t\t// line.endTime = Math.max(line.endTime, curBGLine.endTime);\n\t\t\t// curBGLine.startTime = line.startTime;\n\t\t\t// curBGLine.endTime = line.endTime;\n\t\t\tresult.push(curBGLine);\n\t\t}\n\t}\n\n\treturn result;\n}\n","import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { Disposable } from \"../interfaces\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer implements Disposable {\n\tprivate observer: ResizeObserver;\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tprivate flowSpeed = 2;\n\tprivate currerntRenderScale = 0.75;\n\tconstructor(private canvas: HTMLCanvasElement) {\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tthis.canvas.width = bounds.width * this.currerntRenderScale;\n\t\tthis.canvas.height = bounds.height * this.currerntRenderScale;\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst bounds = canvas.getBoundingClientRect();\n\t\t\tthis.canvas.width = Math.max(1, bounds.width);\n\t\t\tthis.canvas.height = Math.max(1, bounds.height);\n\t\t\tthis.app.renderer.resize(\n\t\t\t\tthis.canvas.width * this.currerntRenderScale,\n\t\t\t\tthis.canvas.height * this.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.app.ticker.start();\n\t\t\tthis.rebuildFilters();\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 0,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tconst bounds = this.canvas.getBoundingClientRect();\n\t\tthis.canvas.width = Math.max(1, bounds.width);\n\t\tthis.canvas.height = Math.max(1, bounds.height);\n\t\tthis.app.renderer.resize(\n\t\t\tthis.canvas.width * this.currerntRenderScale,\n\t\t\tthis.canvas.height * this.currerntRenderScale,\n\t\t);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tif (minBorder > 512) this.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tsetStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tsetFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tpause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tresume() {\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tasync setAlbumImage(albumUrl: string) {\n\t\tconst tex = await Texture.fromURL(albumUrl);\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(this.curContainer);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { HasElement, Disposable } from \"../interfaces\";\nimport { PixiRenderer } from \"./pixi-renderer\";\n\nexport class BackgroundRender\n\textends PixiRenderer\n\timplements HasElement, Disposable\n{\n\tprivate element: HTMLCanvasElement;\n\tconstructor() {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tsuper(canvas);\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tsuper.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t} else {\n\t\tconst damping_frequency = Math.sqrt(\n\t\t\t4.0 * mass * stiffness - damping ** 2.0,\n\t\t);\n\t\tconst leftover =\n\t\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\t\tconst dfm = (0.5 * damping_frequency) / mass;\n\t\tconst dm = -(0.5 * damping) / mass;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn (\n\t\t\t\tto -\n\t\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\t\tMath.E ** (t * dm)\n\t\t\t);\n\t\t};\n\t}\n}\n\nfunction derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nfunction getVelocity(f: (t: seconds) => number): (t: seconds) => number {\n\treturn derivative(f);\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pl = this.lyricPlayer.pos[0];\n\t\tconst pt = this.lyricPlayer.pos[1];\n\t\tconst pr = this.lyricPlayer.pos[0] + this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.pos[1] + this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < pl || b < pt);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left}px, ${this.top}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t10 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - Math.pow((1000 - currentDuration) / 1000, 2);\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tscale = Math.max(0, scale);\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / interludeDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - interludeDuration / 3) * 3) /\n\t\t\t\t\t\tinterludeDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (interludeDuration / 3) * 2) * 3) /\n\t\t\t\t\t\tinterludeDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\telements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tshouldEmphasize: boolean;\n}\n\nfunction generateFadeGradient(\n\twidth: number,\n\tbright = \"rgba(0,0,0,1)\",\n\tdark = \"rgba(0,0,0,0.5)\",\n): [string, number, number] {\n\tconst totalAspect = 2 + width;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\twidthInTotal,\n\t\ttotalAspect,\n\t];\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn word.endTime - word.startTime >= 1000 && word.word.length <= 7;\n}\n\nexport class LyricLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate isEnabled = false;\n\tenable() {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tword.elementAnimations.forEach((a) => {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t});\n\t\t});\n\t\tmain.classList.add(\"active\");\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tdisable() {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tword.elementAnimations.forEach((a) => {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tmain.classList.remove(\"active\");\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = `transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\twhile (main.firstChild) {\n\t\t\t\tmain.removeChild(main.firstChild);\n\t\t\t\tcollectNodes(main.firstChild);\n\t\t\t}\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tthis.splittedWords = [];\n\t\tthis.lyricLine.words.forEach((word) => {\n\t\t\tconst splited = word.word.split(/\\s+/);\n\t\t\tconst trimmedLength = splited.reduce((pv, cv) => pv + cv.length, 0);\n\t\t\tlet pos = 0;\n\t\t\tsplited.forEach((sub, i) => {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\telements: [],\n\t\t\t\t\t\telementAnimations: [],\n\t\t\t\t\t\tshouldEmphasize: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\tword: sub,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) * pos,\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) *\n\t\t\t\t\t\t\t(pos + sub.length),\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\telements: [],\n\t\t\t\t\telementAnimations: [],\n\t\t\t\t\tshouldEmphasize: shouldEmphasize(word),\n\t\t\t\t});\n\t\t\t\tpos += sub.length;\n\t\t\t});\n\t\t});\n\t\t// 回收元素以复用\n\t\tconst reusableElements: HTMLElement[] = [];\n\t\tconst reusableTextNodes: Text[] = [];\n\t\tfunction collectNodes(curNode: Node) {\n\t\t\twhile (curNode.firstChild) {\n\t\t\t\tif (curNode.firstChild.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\treusableElements.push(main.firstChild as HTMLElement);\n\t\t\t\telse if (curNode.firstChild.nodeType === Node.TEXT_NODE)\n\t\t\t\t\treusableTextNodes.push(main.firstChild as Text);\n\t\t\t\tcurNode.removeChild(curNode.firstChild);\n\t\t\t\tcollectNodes(curNode.firstChild);\n\t\t\t}\n\t\t}\n\t\tcollectNodes(main);\n\t\tlet lastWordEl: HTMLSpanElement | null = null;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tif (word.word.trim().length > 0) {\n\t\t\t\tif (word.shouldEmphasize) {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"emphasize\";\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tfor (const c of word.word) {\n\t\t\t\t\t\tconst charEl =\n\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.className = \"\";\n\t\t\t\t\t\tcharEl.innerText = c;\n\t\t\t\t\t\twordEl.appendChild(charEl);\n\t\t\t\t\t\tword.elements.push(charEl);\n\t\t\t\t\t}\n\t\t\t\t\tword.elementAnimations = this.initEmphasizeAnimation(word);\n\t\t\t\t\tif (lastWordEl && !CJKEXP.test(word.word)) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = CJKEXP.test(word.word) ? null : wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"\";\n\t\t\t\t\twordEl.innerText = word.word;\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tword.elementAnimations.push(this.initFloatAnimation(word, wordEl));\n\t\t\t\t\tif (lastWordEl) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (word.word.length > 0) {\n\t\t\t\tconst wordEl = reusableTextNodes.pop() ?? document.createTextNode(\" \");\n\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\tlastWordEl = null;\n\t\t\t} else {\n\t\t\t\tlastWordEl = null;\n\t\t\t}\n\t\t});\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(-3%)\",\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\tprivate initEmphasizeAnimation(word: RealWord): Animation[] {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = word.endTime - word.startTime;\n\t\treturn word.elements.map((el, i, arr) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn this.initFloatAnimation(word, el);\n\t\t\t} else {\n\t\t\t\tconst du = Math.max(1000, word.endTime - word.startTime);\n\t\t\t\tconst de = delay + (duration / (arr.length - 1)) * (i - 1);\n\t\t\t\tconst a = el.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, -2%, 20px)\",\n\t\t\t\t\t\t\tfilter:\n\t\t\t\t\t\t\t\t\"drop-shadow(0 0 0.05em var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: isFinite(du) ? du : 0,\n\t\t\t\t\t\tdelay: isFinite(de) ? de : 0,\n\t\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t\treturn a;\n\t\t\t}\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tconst wordEl = word.elements[0];\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\t16 / word.width,\n\t\t\t\t\t\"rgba(0,0,0,0.75)\",\n\t\t\t\t\t\"rgba(0,0,0,0.25)\",\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + 16;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t});\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tthis.blur = Math.min(32, blur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, blur)) {\n\t\t\t\tthis.blur = Math.min(32, blur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, blur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pl = this.lyricPlayer.pos[0];\n\t\tconst pt = this.lyricPlayer.pos[1];\n\t\tconst pr = this.lyricPlayer.pos[0] + this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.pos[1] + this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < pl || b < pt);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport { LyricLineEl, shouldEmphasize } from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\nexport class LyricLineClickedEvent extends MouseEvent {}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: Map<LyricLineEl, [number, number]> = new Map();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tthis.pos[0] = rect.left;\n\t\tthis.pos[1] = rect.top;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 15,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate enableBlur = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\treadonly pos: [number, number] = [0, 0];\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(5vh, 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\tmaxWidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\tminWidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\tpadding: \"2vh 0.05em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s\",\n\t\t\tboxSizing: \"border-box\",\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 0\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.75,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twordBreak: \"keep-all\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t// willChange: \"transform,display,mask-image\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition: \"filter 0.25s, transform 0.5s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"100%\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate onPageShow = () => {\n\t\tthis.calcLayout(true, true);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.allowScroll) {\n\t\t\t\tthis.isScrolled = true;\n\t\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\t\tthis.isScrolled = false;\n\t\t\t\t\tthis.scrollOffset = 0;\n\t\t\t\t}, 5000);\n\t\t\t\tthis.invokedByScrollEvent = true;\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.invokedByScrollEvent = false;\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tthis.processedLines[0].startTime,\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0];\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1];\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-player-time:\";\n\t\tstyle += this.currentTime;\n\t\tstyle += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\telse {\n\t\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tconst prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line, i) => {\n\t\t\treturn this.lyricLinesEl[i] ?? new LyricLineEl(this, line);\n\t\t});\n\t\twhile (prevLinesEl.length > this.processedLines.length) {\n\t\t\tprevLinesEl.pop()?.dispose();\n\t\t}\n\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其​设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = 0.95;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(32, curPos);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1];\n\t\t\t}\n\t\t\tel.setTransform(\n\t\t\t\t0,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\thasBuffered ? 1 : 1 / 3,\n\t\t\t\t!this.invokedByScrollEvent && this.enableBlur\n\t\t\t\t\t? isActive\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\t\t\t\t\t\t\t: Math.abs(i - Math.max(this.scrollToIndex, latestIndex)))\n\t\t\t\t\t: 0,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\tthis.bottomLine.setTransform(0, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.max(line.endTime, nextLine?.endTime);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable();\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable();\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable();\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable();\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable();\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable();\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable();\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t}\n\t\t\tthis.calcLayout();\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["timeRegexp","parseTimespan","timeSpan","matches","hour","min","sec","parseTTML","ttmlText","ttmlDoc","mainAgentId","agent","id","result","lineEl","line","curBGLine","wordNode","word","wordEl","role","bgLine","firstWord","lastWord","TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","c0","ColorMatrixFilter","c1","c2","BlurFilter","enable","fps","albumUrl","tex","Texture","container","Sprite","BackgroundRender","eqSet","xs","ys","x","Spring","currentPosition","curV","solveSpring","getVelocity","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","t","damping_frequency","dfm","dm","derivative","f","BottomLineEl","lyricPlayer","style","left","top","force","l","r","b","pl","pt","pr","pb","easeInOutBack","clamp","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","shouldEmphasize","LyricLineEl","lyricLine","main","trans","roman","a","size","collectNodes","w","splited","trimmedLength","pv","cv","pos","sub","i","reusableElements","reusableTextNodes","curNode","lastWordEl","charEl","wholeWordEl","duration","el","arr","du","de","maskImage","_widthInTotal","totalAspectStr","maskPos","opacity","blur","jss","create","preset","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","currentTime","lines","timeOffset","lastLine","pastLine","nextLine","prevLinesEl","reflow","curPos","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","alignAnchor","alignPosition","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","v","deltaS"],"mappings":"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"}
1
+ {"version":3,"file":"amll-core.js","sources":["../src/lyric/ttml.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { LyricLine, LyricWord } from \"../interfaces\";\n\nconst timeRegexp =\n\t/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\\.:]([0-9]+))?)/;\nfunction parseTimespan(timeSpan: string): number {\n\tconst matches = timeRegexp.exec(timeSpan);\n\tif (matches) {\n\t\tconst hour = Number(matches.groups?.hour || \"0\");\n\t\tconst min = Number(matches.groups?.min || \"0\");\n\t\tconst sec = Number(matches.groups?.sec.replace(/:/, \".\") || \"0\");\n\t\treturn Math.floor((hour * 3600 + min * 60 + sec) * 1000);\n\t} else {\n\t\tthrow new TypeError(\"时间戳字符串解析失败\");\n\t}\n}\n\nexport function parseTTML(ttmlText: string): LyricLine[] {\n\tconst domParser = new DOMParser();\n\tconst ttmlDoc: XMLDocument = domParser.parseFromString(\n\t\tttmlText,\n\t\t\"application/xml\",\n\t);\n\n\tlet mainAgentId = \"v1\";\n\n\tfor (const agent of ttmlDoc.querySelectorAll(\"ttm\\\\:agent\")) {\n\t\tif (agent.getAttribute(\"type\") === \"person\") {\n\t\t\tconst id = agent.getAttribute(\"xml:id\");\n\t\t\tif (id) {\n\t\t\t\tmainAgentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: LyricLine[] = [];\n\n\tfor (const lineEl of ttmlDoc.querySelectorAll(\"body p[begin][end]\")) {\n\t\tconst line: LyricLine = {\n\t\t\twords: [],\n\t\t\tstartTime: parseTimespan(lineEl.getAttribute(\"begin\") ?? \"0:0\"),\n\t\t\tendTime: parseTimespan(lineEl.getAttribute(\"end\") ?? \"0:0\"),\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tisBG: false,\n\t\t\tisDuet: lineEl.getAttribute(\"ttm:agent\") !== mainAgentId,\n\t\t};\n\t\tlet curBGLine: LyricLine | null = null;\n\n\t\tfor (const wordNode of lineEl.childNodes) {\n\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: word,\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\n\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\tif (role === \"x-bg\") {\n\t\t\t\t\t\tconst bgLine: LyricLine = {\n\t\t\t\t\t\t\twords: [],\n\t\t\t\t\t\t\tstartTime: line.startTime,\n\t\t\t\t\t\t\tendTime: line.endTime,\n\t\t\t\t\t\t\ttranslatedLyric: \"\",\n\t\t\t\t\t\t\tromanLyric: \"\",\n\t\t\t\t\t\t\tisBG: true,\n\t\t\t\t\t\t\tisDuet: line.isDuet,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfor (const wordNode of wordEl.childNodes) {\n\t\t\t\t\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\t\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: word,\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\t\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\t\t\t\t\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\t\t\t\t\tif (role === \"x-translation\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.translatedLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.romanLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"begin\") &&\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"end\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst word = {\n\t\t\t\t\t\t\t\t\t\tword: wordNode.textContent,\n\t\t\t\t\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t\t\t\t\t} as LyricWord;\n\t\t\t\t\t\t\t\t\tbgLine.words.push(word);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst firstWord = bgLine.words[0];\n\t\t\t\t\t\tbgLine.startTime = firstWord.startTime;\n\t\t\t\t\t\tif (firstWord?.word.startsWith(\"(\")) {\n\t\t\t\t\t\t\tfirstWord.word = firstWord.word.substring(1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lastWord = bgLine.words[bgLine.words.length - 1];\n\t\t\t\t\t\tbgLine.endTime = lastWord.endTime;\n\t\t\t\t\t\tif (lastWord?.word.endsWith(\")\")) {\n\t\t\t\t\t\t\tlastWord.word = lastWord.word.substring(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tlastWord.word.length - 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurBGLine = bgLine;\n\t\t\t\t\t} else if (role === \"x-translation\") {\n\t\t\t\t\t\tline.translatedLyric = wordEl.innerHTML;\n\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\tline.romanLyric = wordEl.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordEl.hasAttribute(\"begin\") && wordEl.hasAttribute(\"end\")) {\n\t\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\t\tword: wordNode.textContent ?? \"\",\n\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t};\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tresult.push(line);\n\t\tif (curBGLine) {\n\t\t\t// line.startTime = Math.min(line.startTime, curBGLine.startTime);\n\t\t\t// line.endTime = Math.max(line.endTime, curBGLine.endTime);\n\t\t\t// curBGLine.startTime = line.startTime;\n\t\t\t// curBGLine.endTime = line.endTime;\n\t\t\tresult.push(curBGLine);\n\t\t}\n\t}\n\n\treturn result;\n}\n","import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { BulgePinchFilter } from \"@pixi/filter-bulge-pinch\";\nimport { Disposable } from \"../interfaces\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer implements Disposable {\n\tprivate observer: ResizeObserver;\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t\tlastContainer.destroy(true);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tprivate flowSpeed = 2;\n\tprivate currerntRenderScale = 0.75;\n\tconstructor(private canvas: HTMLCanvasElement) {\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tthis.canvas.width = bounds.width * this.currerntRenderScale;\n\t\tthis.canvas.height = bounds.height * this.currerntRenderScale;\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst bounds = canvas.getBoundingClientRect();\n\t\t\tthis.canvas.width = Math.max(1, bounds.width);\n\t\t\tthis.canvas.height = Math.max(1, bounds.height);\n\t\t\tthis.app.renderer.resize(\n\t\t\t\tthis.canvas.width * this.currerntRenderScale,\n\t\t\t\tthis.canvas.height * this.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.app.ticker.start();\n\t\t\tthis.rebuildFilters();\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 0,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tconst bounds = this.canvas.getBoundingClientRect();\n\t\tthis.canvas.width = Math.max(1, bounds.width);\n\t\tthis.canvas.height = Math.max(1, bounds.height);\n\t\tthis.app.renderer.resize(\n\t\t\tthis.canvas.width * this.currerntRenderScale,\n\t\t\tthis.canvas.height * this.currerntRenderScale,\n\t\t);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst maxBorder = Math.max(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters?.forEach((filter) => {\n\t\t\tfilter.destroy();\n\t\t});\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tif (Math.random() > 0.5) {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tsetStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tsetFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tpause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tresume() {\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tasync setAlbumImage(albumUrl: string) {\n\t\tconst img = new Image();\n\t\timg.src = albumUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tawait img.decode();\n\t\t\t\ttex = Texture.from(img, {\n\t\t\t\t\tresourceOptions: {\n\t\t\t\t\t\tautoLoad: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait tex.baseTexture.resource.load();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumUrl,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = undefined;\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!tex) return;\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(this.curContainer);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { HasElement, Disposable } from \"../interfaces\";\nimport { PixiRenderer } from \"./pixi-renderer\";\n\nexport class BackgroundRender\n\textends PixiRenderer\n\timplements HasElement, Disposable\n{\n\tprivate element: HTMLCanvasElement;\n\tconstructor() {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tsuper(canvas);\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tsuper.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate getV2: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t\tthis.getV2 = getVelocity(this.getV);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.getV2(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t} else {\n\t\tconst damping_frequency = Math.sqrt(\n\t\t\t4.0 * mass * stiffness - damping ** 2.0,\n\t\t);\n\t\tconst leftover =\n\t\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\t\tconst dfm = (0.5 * damping_frequency) / mass;\n\t\tconst dm = -(0.5 * damping) / mass;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn (\n\t\t\t\tto -\n\t\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\t\tMath.E ** (t * dm)\n\t\t\t);\n\t\t};\n\t}\n}\n\nfunction derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nfunction getVelocity(f: (t: seconds) => number): (t: seconds) => number {\n\treturn derivative(f);\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < 0 || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left}px, ${this.top}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t10 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - Math.pow((1000 - currentDuration) / 1000, 2);\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tscale = Math.max(0, scale);\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / interludeDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - interludeDuration / 3) * 3) /\n\t\t\t\t\t\tinterludeDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (interludeDuration / 3) * 2) * 3) /\n\t\t\t\t\t\tinterludeDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tshouldEmphasize: boolean;\n}\n\nfunction generateFadeGradient(\n\twidth: number,\n\tbright = \"rgba(0,0,0,1)\",\n\tdark = \"rgba(0,0,0,0.5)\",\n): [string, number, number] {\n\tconst totalAspect = 2 + width;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\twidthInTotal,\n\t\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"]]\nfunction chunkLyricWords<T>(\n\twords: T[],\n\twordGetter: (word: T) => string,\n): (T | T[])[] {\n\tlet wordChunk: string[] = [];\n\tlet wChunk: T[] = [];\n\tconst result: (T | T[])[] = [];\n\n\tfor (const w of words) {\n\t\tconst word = wordGetter(w);\n\t\twordChunk.push(word);\n\t\twChunk.push(w);\n\t\tif (word.length > 0 && word.trim().length === 0) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\tresult.push(w);\n\t\t\twordChunk = [];\n\t\t\twChunk = [];\n\t\t} else if (\n\t\t\t!/^\\s*[^\\s]*\\s*$/.test(wordChunk.join(\"\")) ||\n\t\t\tCJKEXP.test(word)\n\t\t) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\twordChunk = [word];\n\t\t\twChunk = [w];\n\t\t}\n\t}\n\n\tif (wChunk.length === 1) {\n\t\tresult.push(wChunk[0]);\n\t} else {\n\t\tresult.push(wChunk);\n\t}\n\n\treturn result;\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn word.endTime - word.startTime >= 1000 && word.word.length <= 7;\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(public readonly line: LyricLineEl, event: MouseEvent) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in\n\t\tkeyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent\n\t\t? evt\n\t\t: never;\n};\ntype MouseEventTypes = MouseEventMap[keyof MouseEventMap];\ntype MouseEventListener = (\n\tthis: LyricLineEl,\n\tev: RawLyricLineMouseEvent,\n) => void;\n\nexport class LyricLineEl extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\t// rome-ignore lint/correctness/noUnreachableSuper: <explanation>\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate listenersMap = new Map<string, Set<MouseEventListener>>();\n\tprivate readonly onMouseEvent = (e: MouseEvent) => {\n\t\tif (!this.dispatchEvent(new RawLyricLineMouseEvent(this, e))) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn false;\n\t\t}\n\t};\n\toverride addEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | AddEventListenerOptions | undefined,\n\t): void {\n\t\tsuper.addEventListener(type, callback, options);\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type) ?? new Set();\n\t\t\tif (listeners.size === 0)\n\t\t\t\tthis.element.addEventListener(type, this.onMouseEvent);\n\t\t\tlisteners.add(callback);\n\t\t\tthis.listenersMap.set(type, listeners);\n\t\t}\n\t}\n\toverride removeEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | EventListenerOptions | undefined,\n\t): void {\n\t\tsuper.removeEventListener(type, callback, options);\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t\tif (listeners.size === 0)\n\t\t\t\t\tthis.element.removeEventListener(type, this.onMouseEvent);\n\t\t\t}\n\t\t}\n\t}\n\tprivate isEnabled = false;\n\tenable() {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tword.elementAnimations.forEach((a) => {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t});\n\t\t});\n\t\tmain.classList.add(\"active\");\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tdisable() {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tword.elementAnimations.forEach((a) => {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tmain.classList.remove(\"active\");\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = `transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\t// 如果是非动态歌词,那么就不需要分词了\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tconst chunkedWords = chunkLyricWords(this.lyricLine.words, (w) => w.word);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (chunk instanceof Array) {\n\t\t\t\tconst emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, false);\n\t\t\t\tconst merged = chunk.reduce(\n\t\t\t\t\t(a, b) => {\n\t\t\t\t\t\ta.endTime = Math.max(a.endTime, b.endTime);\n\t\t\t\t\t\ta.startTime = Math.min(a.startTime, b.startTime);\n\t\t\t\t\t\ta.word += b.word;\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t},\n\t\t\t\t\t{ word: \"\", startTime: Infinity, endTime: -Infinity },\n\t\t\t\t);\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\tconst mainWordFloatAnimation = this.initFloatAnimation(\n\t\t\t\t\t\tmerged,\n\t\t\t\t\t\tmainWordEl,\n\t\t\t\t\t);\n\t\t\t\t\tif (emp) {\n\t\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\t\tfor (const char of word.word.trim().split(\"\")) {\n\t\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: charEls,\n\t\t\t\t\t\t\telementAnimations: [mainWordFloatAnimation],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t\t...this.initEmphasizeAnimation(realWord),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmainWordEl.innerText = word.word;\n\t\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: [],\n\t\t\t\t\t\t\telementAnimations: [mainWordFloatAnimation],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\twrapperWordEl.appendChild(mainWordEl);\n\t\t\t\t}\n\t\t\t\tif (merged.word.trimStart() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(wrapperWordEl);\n\t\t\t\tif (merged.word.trimEnd() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t} else if (chunk.word.trim().length === 0) {\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\tconst emp = shouldEmphasize(chunk);\n\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t...chunk,\n\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\tsubElements: [],\n\t\t\t\t\telementAnimations: [this.initFloatAnimation(chunk, mainWordEl)],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t};\n\t\t\t\tif (emp) {\n\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\tfor (const char of chunk.word.trim().split(\"\")) {\n\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t}\n\t\t\t\t\trealWord.subElements = charEls;\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(realWord),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tmainWordEl.innerText = chunk.word.trim();\n\t\t\t\t}\n\t\t\t\tif (chunk.word.trimStart() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(mainWordEl);\n\t\t\t\tif (chunk.word.trimEnd() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t}\n\t\t}\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(-3%)\",\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\tprivate initEmphasizeAnimation(word: RealWord): Animation[] {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = word.endTime - word.startTime;\n\t\treturn word.subElements.map((el, i, arr) => {\n\t\t\tconst du = Math.max(1000, word.endTime - word.startTime);\n\t\t\tconst de = delay + (duration / arr.length) * i;\n\t\t\tconst a = el.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\ttransform: \"translate3d(0, 0, 0px)\",\n\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\ttransform: \"translate3d(0, -0.02em, 20px)\",\n\t\t\t\t\t\tfilter:\n\t\t\t\t\t\t\t\"drop-shadow(0 0 0.05em var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\ttransform: \"translate3d(0, 0, 0)\",\n\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: isFinite(du) ? du : 0,\n\t\t\t\t\tdelay: isFinite(de) ? de : 0,\n\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\titerations: 1,\n\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\teasing: \"ease-in-out\",\n\t\t\t\t\tfill: \"both\",\n\t\t\t\t},\n\t\t\t);\n\t\t\ta.pause();\n\t\t\treturn a;\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\n\t\t\t\t\t\"rgba(0,0,0,1)\",\n\t\t\t\t\t\"rgba(0,0,0,0.25)\",\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + fadeWidth;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t});\n\t\tif (this._hide) {\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tconst beforeInSight = this.isInSight;\n\t\tconst enableSpring = this.lyricPlayer.getEnableSpring();\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\ttrans.style.opacity = `${opacity / 2}`;\n\t\troman.style.opacity = `${opacity / 2}`;\n\t\tif (force || !enableSpring) {\n\t\t\tthis.blur = Math.min(32, blur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!enableSpring) {\n\t\t\t\tconst afterInSight = this.isInSight;\n\t\t\t\tif (beforeInSight || afterInSight) {\n\t\t\t\t\tthis.show();\n\t\t\t\t} else {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t} else this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, blur)) {\n\t\t\t\tthis.blur = Math.min(32, blur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, blur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t_getDebugTargetPos(): string {\n\t\treturn `[位移: ${this.left}, ${this.top}; 缩放: ${this.scale}; 延时: ${this.delay}]`;\n\t}\n\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || r < 0 || t > pb || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport {\n\tLyricLineEl,\n\tRawLyricLineMouseEvent,\n\tshouldEmphasize,\n} from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\n/**\n * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素\n */\nexport class LyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\t/**\n\t\t * 歌词行索引\n\t\t */\n\t\tpublic readonly lineIndex: number,\n\t\t/**\n\t\t * 歌词行元素\n\t\t */\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(`line-${event.type}`, event);\n\t}\n}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: WeakMap<LyricLineEl, [number, number]> =\n\t\tnew WeakMap();\n\tprivate lyricLinesIndexes: WeakMap<LyricLineEl, number> = new WeakMap();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate hidePassedLines = false;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 15,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate emUnit = Math.max(Math.min(innerHeight * 0.05, innerWidth * 0.1), 12);\n\tprivate padding = this.emUnit;\n\tprivate enableBlur = true;\n\tprivate enableScale = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\tprivate readonly onLineClickedHandler = (e: RawLyricLineMouseEvent) => {\n\t\tconst evt = new LyricLineMouseEvent(\n\t\t\tthis.lyricLinesIndexes.get(e.line) ?? -1,\n\t\t\te.line,\n\t\t\te,\n\t\t);\n\t\tif (!this.dispatchEvent(evt)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\t/**\n\t * 是否启用歌词行缩放效果,默认启用\n\t *\n\t * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果\n\t *\n\t * 此效果对性能影响微乎其微,推荐启用\n\t * @param enable 是否启用歌词行缩放效果\n\t */\n\tsetEnableScale(enable = true) {\n\t\tthis.enableScale = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 获取当前是否启用了歌词行缩放效果\n\t * @returns 是否启用歌词行缩放效果\n\t */\n\tgetEnableScale() {\n\t\treturn this.enableScale;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(min(5vh, 10vw), 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t\t\"&:hover\": {\n\t\t\t\t\"& $lyricLine\": {\n\t\t\t\t\tfilter: \"unset !important\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\tmaxWidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\tminWidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\tpadding: \"2vh 1.05em\",\n\t\t\tmargin: \"0 -1em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tborderRadius: \"8px\",\n\t\t\t\"&:hover\": {\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t\tboxShadow: \"0 0 0 8px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t\t\"&:active\": {\n\t\t\t\tboxShadow: \"0 0 0 4px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 1em\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.75,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t// willChange: \"transform,display,mask-image\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(0.5em, 10px)\",\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition:\n\t\t\t\t\t\"filter 0.25s, transform 0.5s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate onPageShow = () => {\n\t\tthis.calcLayout(true, true);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.allowScroll) {\n\t\t\t\tthis.isScrolled = true;\n\t\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\t\tthis.isScrolled = false;\n\t\t\t\t\tthis.scrollOffset = 0;\n\t\t\t\t}, 5000);\n\t\t\t\tthis.invokedByScrollEvent = true;\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.invokedByScrollEvent = false;\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tthis.processedLines[0].startTime,\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-player-time:\";\n\t\tstyle += this.currentTime;\n\t\tstyle += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否隐藏已经播放过的歌词行,默认不隐藏\n\t * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏\n\t */\n\tsetHidePassedLines(hide: boolean) {\n\t\tthis.hidePassedLines = hide;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\telse {\n\t\t\t\t\tif (i === 0) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tthis.lyricLinesEl.forEach((line) => {\n\t\t\tline.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tline.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\tline.dispose();\n\t\t});\n\t\t// const prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line) => {\n\t\t\t// if (this.lyricLinesEl[i]) {\n\t\t\t// \tthis.lyricLinesEl[i].setLine(line);\n\t\t\t// \treturn this.lyricLinesEl[i];\n\t\t\t// } else {\n\t\t\tconst lineEl = new LyricLineEl(this, line);\n\t\t\tlineEl.addEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tlineEl.addEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\treturn lineEl;\n\t\t\t// }\n\t\t});\n\t\t// while (prevLinesEl.length > this.processedLines.length) {\n\t\t// \tconst rest = prevLinesEl.pop();\n\t\t// \trest?.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t// \trest?.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t// \trest?.dispose();\n\t\t// }\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tthis.lyricLinesIndexes.set(el, i);\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重置用户滚动状态\n\t *\n\t * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置\n\t */\n\tresetScroll() {\n\t\tthis.isScrolled = false;\n\t\tthis.scrollOffset = 0;\n\t\tthis.invokedByScrollEvent = false;\n\t\tclearTimeout(this.scrolledHandler);\n\t\tthis.scrolledHandler = 0;\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其​设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.emUnit = parseFloat(getComputedStyle(this.element).fontSize);\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = this.enableScale ? 0.95 : 1;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\t// console.groupCollapsed(\"calcLayout\");\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(this.padding, curPos);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1];\n\t\t\t}\n\t\t\tconst targetOpacity = this.hidePassedLines\n\t\t\t\t? i < (interlude ? interlude[2] + 1 : this.scrollToIndex)\n\t\t\t\t\t? 0\n\t\t\t\t\t: hasBuffered\n\t\t\t\t\t? 1\n\t\t\t\t\t: 1 / 3\n\t\t\t\t: hasBuffered\n\t\t\t\t? 1\n\t\t\t\t: 1 / 3;\n\t\t\tel.setTransform(\n\t\t\t\tthis.padding,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\ttargetOpacity,\n\t\t\t\t!this.invokedByScrollEvent && this.enableBlur\n\t\t\t\t\t? isActive\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\t\t\t\t\t\t\t: Math.abs(i - Math.max(this.scrollToIndex, latestIndex)))\n\t\t\t\t\t: 0,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\t// console.log(i, el._getDebugTargetPos());\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\t// console.groupEnd();\n\t\tthis.bottomLine.setTransform(this.padding, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.max(line.endTime, nextLine?.endTime);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable();\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable();\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable();\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable();\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\t// function debugLog() {\n\t\t\t// \tconsole.groupCollapsed(\"setCurrentTime\", time);\n\t\t\t// \tconsole.log(\"removedIds\", removedIds);\n\t\t\t// \tconsole.log(\"addedIds\", addedIds);\n\t\t\t// \tconsole.groupEnd();\n\t\t\t// }\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable();\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\t// debugLog();\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.calcLayout();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable();\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable();\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["timeRegexp","parseTimespan","timeSpan","matches","hour","min","sec","parseTTML","ttmlText","ttmlDoc","mainAgentId","agent","id","result","lineEl","line","curBGLine","wordNode","word","wordEl","role","bgLine","firstWord","lastWord","TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","filter","BlurFilter","BulgePinchFilter","enable","fps","albumUrl","img","remainRetryTimes","tex","Texture","error","container","Sprite","BackgroundRender","eqSet","xs","ys","x","Spring","currentPosition","curV","solveSpring","getVelocity","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","t","damping_frequency","dfm","dm","derivative","f","BottomLineEl","lyricPlayer","style","left","top","force","l","r","b","pr","pb","easeInOutBack","clamp","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","chunkLyricWords","words","wordGetter","wordChunk","wChunk","w","shouldEmphasize","RawLyricLineMouseEvent","event","LyricLineEl","lyricLine","main","trans","roman","type","callback","options","listeners","a","size","chunkedWords","chunk","emp","merged","wrapperWordEl","mainWordEl","mainWordFloatAnimation","charEls","char","charEl","realWord","duration","el","i","arr","du","de","fadeWidth","maskImage","_widthInTotal","totalAspectStr","maskPos","opacity","blur","beforeInSight","enableSpring","afterInSight","jss","create","preset","LyricLineMouseEvent","lineIndex","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","currentTime","hide","lines","timeOffset","pv","cv","lastLine","pastLine","nextLine","reflow","curPos","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","alignAnchor","alignPosition","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","v","deltaS"],"mappings":"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"}