diff --git a/components.d.ts b/components.d.ts index 50895f26..8c598794 100644 --- a/components.d.ts +++ b/components.d.ts @@ -14,9 +14,11 @@ declare module 'vue' { AbLoopDialog: typeof import('./src/components/modals/AbLoopDialog.vue')['default'] AboutSettings: typeof import('./src/components/settings/custom/AboutSettings.vue')['default'] AmllDbServerConfig: typeof import('./src/components/settings/custom/AmllDbServerConfig.vue')['default'] + AMLLLyrics: typeof import('./src/components/player/Lyrics/AMLLLyrics.vue')['default'] AppBackground: typeof import('./src/components/AppBackground.vue')['default'] AutoCloseDialog: typeof import('./src/components/modals/AutoCloseDialog.vue')['default'] BackgroundImagePicker: typeof import('./src/components/settings/custom/BackgroundImagePicker.vue')['default'] + BackgroundRender: typeof import('./src/components/player/FullPlayer/BackgroundRender.vue')['default'] BottomSpectrum: typeof import('./src/components/player/FullPlayer/BottomSpectrum.vue')['default'] ComboboxAnchor: typeof import('reka-ui')['ComboboxAnchor'] ComboboxContent: typeof import('reka-ui')['ComboboxContent'] diff --git a/electron/main/window/main.ts b/electron/main/window/main.ts index a5920cde..539c7039 100644 --- a/electron/main/window/main.ts +++ b/electron/main/window/main.ts @@ -38,6 +38,7 @@ export const createMainWindow = (): BrowserWindow => { frame: false, webPreferences: { partition: MAIN_PARTITION, + webgl: true, }, }); diff --git a/package.json b/package.json index 42810785..e6c2218d 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,16 @@ "docs:preview": "vitepress preview docs" }, "dependencies": { + "@applemusic-like-lyrics/core": "^0.5.1", "@electron-toolkit/preload": "^3.0.2", "@electron-toolkit/utils": "^4.0.0", + "@pixi/app": "^7.4.3", + "@pixi/core": "^7.4.3", + "@pixi/display": "^7.4.3", + "@pixi/filter-blur": "^7.4.3", + "@pixi/filter-bulge-pinch": "^5.1.1", + "@pixi/filter-color-matrix": "^7.4.3", + "@pixi/sprite": "^7.4.3", "@hono/node-server": "^2.0.2", "@material/material-color-utilities": "^0.4.0", "@vueuse/core": "^14.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6a0af1d..842b9483 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@applemusic-like-lyrics/core': + specifier: ^0.5.1 + version: 0.5.1(@pixi/app@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/filter-blur@7.4.3(@pixi/core@7.4.3))(@pixi/filter-bulge-pinch@5.1.1(@pixi/core@7.4.3))(@pixi/filter-color-matrix@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) '@electron-toolkit/preload': specifier: ^3.0.2 version: 3.0.2(electron@41.6.1) @@ -20,6 +23,27 @@ importers: '@material/material-color-utilities': specifier: ^0.4.0 version: 0.4.0 + '@pixi/app': + specifier: ^7.4.3 + version: 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/core': + specifier: ^7.4.3 + version: 7.4.3 + '@pixi/display': + specifier: ^7.4.3 + version: 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-blur': + specifier: ^7.4.3 + version: 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-bulge-pinch': + specifier: ^5.1.1 + version: 5.1.1(@pixi/core@7.4.3) + '@pixi/filter-color-matrix': + specifier: ^7.4.3 + version: 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': + specifier: ^7.4.3 + version: 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) '@vueuse/core': specifier: ^14.2.1 version: 14.2.1(vue@3.5.32(typescript@5.9.3)) @@ -174,6 +198,17 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@applemusic-like-lyrics/core@0.5.1': + resolution: {integrity: sha512-DAEHmAe2USj/9qH4GKRFr/TuIKCOsNlcjgB2J2Lh4Be65RLU/pWpgnRhpIbV9ppinJzs+dWEsueWZiFTgLvMYQ==} + peerDependencies: + '@pixi/app': '*' + '@pixi/core': '*' + '@pixi/display': '*' + '@pixi/filter-blur': '*' + '@pixi/filter-bulge-pinch': '*' + '@pixi/filter-color-matrix': '*' + '@pixi/sprite': '*' + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -1564,6 +1599,68 @@ packages: resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==} engines: {node: '>=14.18.0'} + '@pixi/app@7.4.3': + resolution: {integrity: sha512-opyWMuO0Ir8pf1DYUR++wAA6ZfNU+nIX2z95R2OD172HbcdhB4/HD7leLIIAny/LciEdMqlWEBhXK7N93YWbdg==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/color@7.4.3': + resolution: {integrity: sha512-a6R+bXKeXMDcRmjYQoBIK+v2EYqxSX49wcjAY579EYM/WrFKS98nSees6lqVUcLKrcQh2DT9srJHX7XMny3voQ==} + + '@pixi/colord@2.9.6': + resolution: {integrity: sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==} + + '@pixi/constants@7.4.3': + resolution: {integrity: sha512-QGmwJUNQy/vVEHzL6VGQvnwawLZ1wceZMI8HwJAT4/I2uAzbBeFDdmCS8WsTpSWLZjF/DszDc1D8BFp4pVJ5UQ==} + + '@pixi/core@7.4.3': + resolution: {integrity: sha512-5YDs11faWgVVTL8VZtLU05/Fl47vaP5Tnsbf+y/WRR0VSW3KhRRGTBU1J3Gdc2xEWbJhUK07KGP7eSZpvtPVgA==} + + '@pixi/display@7.4.3': + resolution: {integrity: sha512-b5m2dAaoNAVdxz1oDaxl3XZ059NEOcNtGkxTOZ4EYCw/jcp9sZXkgSROHRzsGn4k+NugH7+9MP4Id2Z0kkdUhw==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/extensions@7.4.3': + resolution: {integrity: sha512-FhoiYkHQEDYHUE7wXhqfsTRz6KxLXjuMbSiAwnLb9uG1vAgp6q6qd6HEsf4X30YaZbLFY8a4KY6hFZWjF+4Fdw==} + + '@pixi/filter-blur@7.4.3': + resolution: {integrity: sha512-ZFzS9L/whdRbs5A/EUgF3yQaBcxNarmbuwaMgrfnpQ84mRczkGByqDLGToadiufyals07ufTrXBGRle9lbtEDA==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-bulge-pinch@5.1.1': + resolution: {integrity: sha512-80I3g813td7Fnzi7IJSiR3z8gZlKblk6WN+5z6WnscQROcNEpck6lgWS/Lf/IdeHB/FtUKJCbx7RzxkUhiRTvA==} + peerDependencies: + '@pixi/core': ^7.0.0-X + + '@pixi/filter-color-matrix@7.4.3': + resolution: {integrity: sha512-TNu0h20SrzjUWIb5v19dAp1vPpqtG0w2XF9kIHN91bMNaf3R1jzhpWG6TtaVO9eo1IolWcEJLw38jIohyC+KNw==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/math@7.4.3': + resolution: {integrity: sha512-/uJOVhR2DOZ+zgdI6Bs/CwcXT4bNRKsS+TqX3ekRIxPCwaLra+Qdm7aDxT5cTToDzdxbKL5+rwiLu3Y1egILDw==} + + '@pixi/runner@7.4.3': + resolution: {integrity: sha512-TJyfp7y23u5vvRAyYhVSa7ytq0PdKSvPLXu4G3meoFh1oxTLHH6g/RIzLuxUAThPG2z7ftthuW3qWq6dRV+dhw==} + + '@pixi/settings@7.4.3': + resolution: {integrity: sha512-SmGK8smc0PxRB9nr0UJioEtE9hl4gvj9OedCvZx3bxBwA3omA5BmP3CyhQfN8XJ29+o2OUL01r3zAPVol4l4lA==} + + '@pixi/sprite@7.4.3': + resolution: {integrity: sha512-iNBrpOFF9nXDT6m2jcyYy6l/sRzklLDDck1eFHprHZwvNquY2nzRfh+RGBCecxhBcijiLJ3fsZN33fP0LDXkvw==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/ticker@7.4.3': + resolution: {integrity: sha512-tHsAD0iOUb6QSGGw+c8cyRBvxsq/NlfzIFBZLEHhWZ+Bx4a0MmXup6I/yJDGmyPCYE+ctCcAfY13wKAzdiVFgQ==} + + '@pixi/utils@7.4.3': + resolution: {integrity: sha512-NO3Y9HAn2UKS1YdxffqsPp+kDpVm8XWvkZcS/E+rBzY9VTLnNOI7cawSRm+dacdET3a8Jad3aDKEDZ0HmAqAFA==} + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -1763,9 +1860,15 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/css-font-loading-module@0.0.12': + resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/earcut@2.1.4': + resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -2198,6 +2301,9 @@ packages: resolution: {integrity: sha512-RxD2Vd96sQDjQr20kdP+F+dK/1OUNiVOl200vKBZY8u0vTwysfolF6Hq+3ZK2+h8My9YvZhHsF+RSGZW2VYrPQ==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} + bezier-easing@3.0.0: + resolution: {integrity: sha512-lE85voPXiK99T8NHOfhaUqCZpJdP1gBbbTEvdBDdPB+phyvPZPNWalBe42eb6lKOYchP0qZrtBiRCARtT4edRQ==} + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -2277,6 +2383,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2443,6 +2553,9 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + deep-freeze@0.0.1: + resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2509,6 +2622,9 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -2704,6 +2820,9 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -2850,6 +2969,9 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + gl-matrix@4.0.0-beta.2: + resolution: {integrity: sha512-OF6IkQpMkF8p2CZF9EtzYZPlPaW3M41KMsgZGlTKmMv/nWaP6GMJi9V5tI+oPn8FG0io85Q5ZtKpCXP4u6YmDA==} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -3024,6 +3146,9 @@ packages: resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} engines: {node: '>=20'} + ismobilejs@1.1.1: + resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} + jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} @@ -3308,6 +3433,10 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3512,6 +3641,9 @@ packages: pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3528,6 +3660,10 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + engines: {node: '>=0.6'} + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -3807,6 +3943,22 @@ packages: shiki@3.23.0: resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4139,6 +4291,10 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} @@ -4381,6 +4537,20 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.1.1 + '@applemusic-like-lyrics/core@0.5.1(@pixi/app@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/filter-blur@7.4.3(@pixi/core@7.4.3))(@pixi/filter-bulge-pinch@5.1.1(@pixi/core@7.4.3))(@pixi/filter-color-matrix@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/app': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-blur': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-bulge-pinch': 5.1.1(@pixi/core@7.4.3) + '@pixi/filter-color-matrix': 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@ungap/structured-clone': 1.3.1 + bezier-easing: 3.0.0 + deep-freeze: 0.0.1 + gl-matrix: 4.0.0-beta.2 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -5550,6 +5720,79 @@ snapshots: tslib: 2.8.1 webcrypto-core: 1.9.2 + '@pixi/app@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/color@7.4.3': + dependencies: + '@pixi/colord': 2.9.6 + + '@pixi/colord@2.9.6': {} + + '@pixi/constants@7.4.3': {} + + '@pixi/core@7.4.3': + dependencies: + '@pixi/color': 7.4.3 + '@pixi/constants': 7.4.3 + '@pixi/extensions': 7.4.3 + '@pixi/math': 7.4.3 + '@pixi/runner': 7.4.3 + '@pixi/settings': 7.4.3 + '@pixi/ticker': 7.4.3 + '@pixi/utils': 7.4.3 + + '@pixi/display@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/extensions@7.4.3': {} + + '@pixi/filter-blur@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-bulge-pinch@5.1.1(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-color-matrix@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/math@7.4.3': {} + + '@pixi/runner@7.4.3': {} + + '@pixi/settings@7.4.3': + dependencies: + '@pixi/constants': 7.4.3 + '@types/css-font-loading-module': 0.0.12 + ismobilejs: 1.1.1 + + '@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/ticker@7.4.3': + dependencies: + '@pixi/extensions': 7.4.3 + '@pixi/settings': 7.4.3 + '@pixi/utils': 7.4.3 + + '@pixi/utils@7.4.3': + dependencies: + '@pixi/color': 7.4.3 + '@pixi/constants': 7.4.3 + '@pixi/settings': 7.4.3 + '@types/earcut': 2.1.4 + earcut: 2.2.4 + eventemitter3: 4.0.7 + url: 0.11.4 + '@polka/url@1.0.0-next.29': {} '@quansync/fs@1.0.0': @@ -5704,10 +5947,14 @@ snapshots: '@types/node': 22.19.17 '@types/responselike': 1.0.3 + '@types/css-font-loading-module@0.0.12': {} + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 + '@types/earcut@2.1.4': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} @@ -6277,6 +6524,8 @@ snapshots: bindings: 1.5.0 prebuild-install: 7.1.3 + bezier-easing@3.0.0: {} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -6382,6 +6631,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase@5.3.1: @@ -6512,6 +6766,8 @@ snapshots: deep-extend@0.6.0: {} + deep-freeze@0.0.1: {} + deep-is@0.1.4: {} defer-to-connect@2.0.1: {} @@ -6583,6 +6839,8 @@ snapshots: duplexer@0.1.2: {} + earcut@2.2.4: {} + ejs@3.1.10: dependencies: jake: 10.9.4 @@ -6881,6 +7139,8 @@ snapshots: esutils@2.0.3: {} + eventemitter3@4.0.7: {} + expand-template@2.0.3: {} exponential-backoff@3.1.3: {} @@ -7039,6 +7299,8 @@ snapshots: github-from-package@0.0.0: {} + gl-matrix@4.0.0-beta.2: {} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -7219,6 +7481,8 @@ snapshots: isexe@4.0.0: {} + ismobilejs@1.1.1: {} + jake@10.9.4: dependencies: async: 3.2.6 @@ -7487,6 +7751,8 @@ snapshots: dependencies: boolbase: 1.0.0 + object-inspect@1.13.4: {} + object-keys@1.1.1: optional: true @@ -7714,6 +7980,8 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 + punycode@1.4.1: {} + punycode@2.3.1: {} pvtsutils@1.3.6: @@ -7729,6 +7997,10 @@ snapshots: yargs: 15.4.1 optional: true + qs@6.15.2: + dependencies: + side-channel: 1.1.1 + quansync@0.2.11: {} quansync@1.0.0: {} @@ -8019,6 +8291,34 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -8391,6 +8691,11 @@ snapshots: dependencies: punycode: 2.3.1 + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.15.2 + utf8-byte-length@1.0.5: {} util-deprecate@1.0.2: {} diff --git a/src/components/player/FullPlayer/BackgroundRender.vue b/src/components/player/FullPlayer/BackgroundRender.vue new file mode 100644 index 00000000..a5cd10df --- /dev/null +++ b/src/components/player/FullPlayer/BackgroundRender.vue @@ -0,0 +1,241 @@ + + + + + + + diff --git a/src/components/player/FullPlayer/BottomSpectrum.vue b/src/components/player/FullPlayer/BottomSpectrum.vue index eaf2a17c..4a9bce25 100644 --- a/src/components/player/FullPlayer/BottomSpectrum.vue +++ b/src/components/player/FullPlayer/BottomSpectrum.vue @@ -2,6 +2,7 @@ import { useStatusStore } from "@/stores/status"; import { useSettingsStore } from "@/stores/settings"; import { getFftFrame } from "@/services/playback"; +import { acquireFft, releaseFft } from "@/services/fftCapture"; interface Props { /** 是否处于活跃状态 */ @@ -128,14 +129,23 @@ const draw = (): void => { const { resume, pause } = useRafFn(draw, { immediate: false }); +// 本地持有标记,保证 acquire / release 严格配对 +let fftAcquired = false; + const startCapture = (): void => { - window.api.player.setFftEnabled(true); + if (!fftAcquired) { + acquireFft(); + fftAcquired = true; + } resume(); }; const stopCapture = (): void => { pause(); - window.api.player.setFftEnabled(false); + if (fftAcquired) { + releaseFft(); + fftAcquired = false; + } }; // 暂停时停止 FFT 推送 + RAF 重绘 diff --git a/src/components/player/FullPlayer/PlayerBackground.vue b/src/components/player/FullPlayer/PlayerBackground.vue index 5e1f832d..c65c2d9a 100644 --- a/src/components/player/FullPlayer/PlayerBackground.vue +++ b/src/components/player/FullPlayer/PlayerBackground.vue @@ -4,13 +4,21 @@ import { useThemeStore } from "@/stores/theme"; import { useMediaStore } from "@/stores/media"; import { useStatusStore } from "@/stores/status"; import DEFAULT_COVER from "@/assets/images/song.jpg"; +import BackgroundRender from "./BackgroundRender.vue"; const media = useMediaStore(); const settings = useSettingsStore(); const theme = useThemeStore(); const status = useStatusStore(); -const bgType = computed(() => settings.player.playerBgType); +const bgType = computed(() => settings.player.playerBgType as string); + +// 流体背景播放态 +const bgPlaying = computed(() => { + if (!status.isExpanded) return false; + if (!status.isPlaying && settings.player.playerBgFreezeOnPause) return false; + return true; +}); // 封面颜色(纯色模式) const coverColor = computed(() => { @@ -95,6 +103,19 @@ onBeforeUnmount(() => { /> + +