pull/2382/head
lyswhut 2025-05-10 10:34:34 +08:00
commit 8445bfe655
16 changed files with 203 additions and 118 deletions

179
package-lock.json generated
View File

@ -1,17 +1,17 @@
{
"name": "lx-music-desktop",
"version": "2.12.0-beta.1",
"version": "2.12.0-beta.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "lx-music-desktop",
"version": "2.12.0-beta.1",
"version": "2.12.0-beta.2",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@simonwep/pickr": "^1.9.1",
"better-sqlite3": "^11.9.1",
"better-sqlite3": "^11.10.0",
"bufferutil": "^4.0.9",
"comlink": "~4.3.1",
"crypto-js": "^4.2.0",
@ -30,7 +30,7 @@
"utf-8-validate": "^6.0.5",
"vue": "~3.3.13",
"vue-router": "^4.5.1",
"ws": "^8.18.1"
"ws": "^8.18.2"
},
"devDependencies": {
"@babel/core": "^7.27.1",
@ -39,19 +39,19 @@
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.27.1",
"@babel/plugin-transform-runtime": "^7.27.1",
"@babel/preset-env": "^7.27.1",
"@babel/preset-env": "^7.27.2",
"@babel/preset-typescript": "^7.27.1",
"@babel/runtime": "^7.27.1",
"@tsconfig/recommended": "^1.0.8",
"@types/better-sqlite3": "^7.6.13",
"@types/needle": "^3.3.0",
"@types/node": "^20.17.32",
"@types/node": "^20.17.46",
"@types/tunnel": "^0.0.7",
"@types/ws": "8.5.4",
"@volar/vue-language-plugin-pug": "^1.6.5",
"@vue/language-plugin-pug": "^2.2.10",
"babel-loader": "^10.0.0",
"browserslist": "^4.24.4",
"browserslist": "^4.24.5",
"chalk": "^4.1.2",
"changelog-parser": "^3.0.1",
"copy-webpack-plugin": "^13.0.0",
@ -60,12 +60,12 @@
"css-loader": "^7.1.2",
"css-minimizer-webpack-plugin": "^7.0.2",
"del": "^6.1.1",
"electron": "^35.2.2",
"electron-builder": "^26.0.14",
"electron": "^35.3.0",
"electron-builder": "^26.0.15",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "github:lyswhut/electron-devtools-installer#64596d615c1fc891eefd8aef1dfcb2c87aaadf03",
"electron-to-chromium": "^1.5.149",
"electron-updater": "6.6.3",
"electron-to-chromium": "^1.5.151",
"electron-updater": "6.6.4",
"eslint": "^8.57.1",
"eslint-config-standard": "^17.1.0",
"eslint-config-standard-with-typescript": "^43.0.1",
@ -96,7 +96,7 @@
"typescript": "5.8.3",
"vue-eslint-parser": "^9.4.3",
"vue-loader": "^17.4.2",
"webpack": "^5.99.7",
"webpack": "^5.99.8",
"webpack-cli": "^6.0.1",
"webpack-dev-server": "5.2.1",
"webpack-hot-middleware": "github:lyswhut/webpack-hot-middleware#329c4375134b89d39da23a56a94db651247c74a1",
@ -137,9 +137,9 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz",
"integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==",
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz",
"integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==",
"dev": true,
"license": "MIT",
"engines": {
@ -227,13 +227,13 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz",
"integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==",
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.1",
"@babel/compat-data": "^7.27.2",
"@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
@ -1205,14 +1205,15 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz",
"integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==",
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz",
"integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/plugin-transform-destructuring": "^7.27.1",
"@babel/plugin-transform-parameters": "^7.27.1"
},
"engines": {
@ -1578,14 +1579,14 @@
}
},
"node_modules/@babel/preset-env": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz",
"integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==",
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz",
"integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/compat-data": "^7.27.2",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
@ -1627,7 +1628,7 @@
"@babel/plugin-transform-new-target": "^7.27.1",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
"@babel/plugin-transform-numeric-separator": "^7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.27.2",
"@babel/plugin-transform-object-super": "^7.27.1",
"@babel/plugin-transform-optional-catch-binding": "^7.27.1",
"@babel/plugin-transform-optional-chaining": "^7.27.1",
@ -1976,9 +1977,9 @@
}
},
"node_modules/@electron/osx-sign": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz",
"integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz",
"integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@ -2116,13 +2117,13 @@
}
},
"node_modules/@electron/universal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz",
"integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==",
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz",
"integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@electron/asar": "^3.2.7",
"@electron/asar": "^3.3.1",
"@malept/cross-spawn-promise": "^2.0.0",
"debug": "^4.3.1",
"dir-compare": "^4.2.0",
@ -2173,9 +2174,9 @@
}
},
"node_modules/@electron/windows-sign": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.1.tgz",
"integrity": "sha512-YfASnrhJ+ve6Q43ZiDwmpBgYgi2u0bYjeAVi2tDfN7YWAKO8X9EEOuPGtqbJpPLM6TfAHimghICjWe2eaJ8BAg==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
"integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
"dev": true,
"license": "BSD-2-Clause",
"optional": true,
@ -3193,9 +3194,9 @@
}
},
"node_modules/@types/node": {
"version": "20.17.32",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz",
"integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==",
"version": "20.17.46",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.46.tgz",
"integrity": "sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -4288,9 +4289,9 @@
"license": "MIT"
},
"node_modules/app-builder-lib": {
"version": "26.0.14",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.0.14.tgz",
"integrity": "sha512-nc/A9MUd95MCc7bR4yVW7Lhs9FZTA/l8QdV8PE1vZZOOiogK4dupBfCCJG0UqLU81JS62f078/bwAeuMjt3hfQ==",
"version": "26.0.15",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.0.15.tgz",
"integrity": "sha512-KVIsAHkBLaO2fvYVAccGbQPlbGFeGkx7IJXi/nDSBDXaMwHxauIXpAtf/NpopgudG6Ovyixl4QIWeHMPIvx0kg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -4298,9 +4299,9 @@
"@electron/asar": "3.4.1",
"@electron/fuses": "^1.8.0",
"@electron/notarize": "2.5.0",
"@electron/osx-sign": "1.3.1",
"@electron/osx-sign": "1.3.3",
"@electron/rebuild": "3.7.2",
"@electron/universal": "2.0.1",
"@electron/universal": "2.0.3",
"@malept/flatpak-bundler": "^0.4.0",
"@types/fs-extra": "9.0.13",
"async-exit-hook": "^2.0.1",
@ -4332,8 +4333,8 @@
"node": ">=14.0.0"
},
"peerDependencies": {
"dmg-builder": "26.0.14",
"electron-builder-squirrel-windows": "26.0.14"
"dmg-builder": "26.0.15",
"electron-builder-squirrel-windows": "26.0.15"
}
},
"node_modules/app-builder-lib/node_modules/fs-extra": {
@ -4814,9 +4815,9 @@
"license": "MIT"
},
"node_modules/better-sqlite3": {
"version": "11.9.1",
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.9.1.tgz",
"integrity": "sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ==",
"version": "11.10.0",
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz",
"integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@ -4980,9 +4981,9 @@
}
},
"node_modules/browserslist": {
"version": "4.24.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"version": "4.24.5",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz",
"integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
"dev": true,
"funding": [
{
@ -5000,10 +5001,10 @@
],
"license": "MIT",
"dependencies": {
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
"caniuse-lite": "^1.0.30001716",
"electron-to-chromium": "^1.5.149",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.1"
"update-browserslist-db": "^1.1.3"
},
"bin": {
"browserslist": "cli.js"
@ -5409,9 +5410,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001707",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
"integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
"version": "1.0.30001717",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz",
"integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==",
"dev": true,
"funding": [
{
@ -6779,13 +6780,13 @@
}
},
"node_modules/dmg-builder": {
"version": "26.0.14",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.0.14.tgz",
"integrity": "sha512-0l7oEj175hee7NfnaUpb0zf7fsgh1SyHeLjDA0AtOMnBUfTGxPPwrifbUxfd73qzamrGNcyeqza+m/EJx3QUug==",
"version": "26.0.15",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.0.15.tgz",
"integrity": "sha512-RXbDCcrPw2B0q2HIcPI2H7pIFeQiDsLW+ykRVKkW2ke2H3pTgI36r86xLmQZ6397uFCNUjpegRFv6bB+BCWJIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"app-builder-lib": "26.0.14",
"app-builder-lib": "26.0.15",
"builder-util": "26.0.13",
"builder-util-runtime": "9.3.2",
"fs-extra": "^10.1.0",
@ -7055,9 +7056,9 @@
}
},
"node_modules/electron": {
"version": "35.2.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-35.2.2.tgz",
"integrity": "sha512-jZnCOtIgrt28esWP5z/PKndj/vPQ/Zt+cvNRlb/qOGnK/AjW1mASwPMtQ099NlSodf69RR3JrhnZCYbTWeDR4g==",
"version": "35.3.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-35.3.0.tgz",
"integrity": "sha512-6dLslJrQYB1qvqVPYRv1PhAA/uytC66nUeiTcq2JXiBzrmTWCHppqtGUjZhvnSRVatBCT5/SFdizdzcBiEiYUg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@ -7074,17 +7075,17 @@
}
},
"node_modules/electron-builder": {
"version": "26.0.14",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.14.tgz",
"integrity": "sha512-YBxpWLMGj0oS7fbS3LVingeZqFunU0F8s+uB9QTd5+wN4qgrf/rSGRkqoImbWg2+F2yHq11wmaA/Xr9xzvgQ0w==",
"version": "26.0.15",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.15.tgz",
"integrity": "sha512-1nDY/7bbbORdWPQkIyFPfLfEHR4d22QfI5yec+etFL0y/PdmVz/wcxXc2KRpTQeIt75njm2/ocrtgp7LJvZC3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"app-builder-lib": "26.0.14",
"app-builder-lib": "26.0.15",
"builder-util": "26.0.13",
"builder-util-runtime": "9.3.2",
"chalk": "^4.1.2",
"dmg-builder": "26.0.14",
"dmg-builder": "26.0.15",
"fs-extra": "^10.1.0",
"is-ci": "^3.0.0",
"lazy-val": "^1.0.5",
@ -7100,14 +7101,14 @@
}
},
"node_modules/electron-builder-squirrel-windows": {
"version": "26.0.14",
"resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.14.tgz",
"integrity": "sha512-1JvbMXtNJsElDZZaFMa3nIRV/diXBFeP0+JPhLLu1c7b21VWPcPbr3MCCL+lTchVDq+q2v0F5dmHN72CJnOTpg==",
"version": "26.0.15",
"resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.15.tgz",
"integrity": "sha512-NAPShr9weifHIn2JXdnZ8P4DfQg60NCiYPF42S1yR+S9YQQ/8cG3lSeoZ/LGPFO9Cf3MoXlbwqa+SSpEb3xXYw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"app-builder-lib": "26.0.14",
"app-builder-lib": "26.0.15",
"builder-util": "26.0.13",
"electron-winstaller": "5.4.0"
}
@ -7286,16 +7287,16 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.149",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz",
"integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==",
"version": "1.5.151",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz",
"integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==",
"dev": true,
"license": "ISC"
},
"node_modules/electron-updater": {
"version": "6.6.3",
"resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.3.tgz",
"integrity": "sha512-i448/SwMtqxy5wqAcXScnWjiFxZp+hmWA2jZCmojcdfodEGhi/DWTdRP01mE3lCILb8hmdE28SBaHf1oQW3+kw==",
"version": "6.6.4",
"resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.4.tgz",
"integrity": "sha512-RcuWXbXTQkI5X3vir/eJ9S0VZQJ73eaQdlrA2J0mVrb0sbkHtnkjBMGo9umFtX8axn6r/pShN3CORxdmiF4OOw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -17750,9 +17751,9 @@
}
},
"node_modules/webpack": {
"version": "5.99.7",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.7.tgz",
"integrity": "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==",
"version": "5.99.8",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz",
"integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -18215,9 +18216,9 @@
"license": "ISC"
},
"node_modules/ws": {
"version": "8.18.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
"integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
"version": "8.18.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
"integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"

View File

@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
"version": "2.12.0-beta.1",
"version": "2.12.0-beta.2",
"description": "一个免费的音乐查找助手",
"main": "./dist/main.js",
"scripts": {
@ -113,19 +113,19 @@
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.27.1",
"@babel/plugin-transform-runtime": "^7.27.1",
"@babel/preset-env": "^7.27.1",
"@babel/preset-env": "^7.27.2",
"@babel/preset-typescript": "^7.27.1",
"@babel/runtime": "^7.27.1",
"@tsconfig/recommended": "^1.0.8",
"@types/better-sqlite3": "^7.6.13",
"@types/needle": "^3.3.0",
"@types/node": "^20.17.32",
"@types/node": "^20.17.46",
"@types/tunnel": "^0.0.7",
"@types/ws": "8.5.4",
"@volar/vue-language-plugin-pug": "^1.6.5",
"@vue/language-plugin-pug": "^2.2.10",
"babel-loader": "^10.0.0",
"browserslist": "^4.24.4",
"browserslist": "^4.24.5",
"chalk": "^4.1.2",
"changelog-parser": "^3.0.1",
"copy-webpack-plugin": "^13.0.0",
@ -134,12 +134,12 @@
"css-loader": "^7.1.2",
"css-minimizer-webpack-plugin": "^7.0.2",
"del": "^6.1.1",
"electron": "^35.2.2",
"electron-builder": "^26.0.14",
"electron": "^35.3.0",
"electron-builder": "^26.0.15",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "github:lyswhut/electron-devtools-installer#64596d615c1fc891eefd8aef1dfcb2c87aaadf03",
"electron-to-chromium": "^1.5.149",
"electron-updater": "6.6.3",
"electron-to-chromium": "^1.5.151",
"electron-updater": "6.6.4",
"eslint": "^8.57.1",
"eslint-config-standard": "^17.1.0",
"eslint-config-standard-with-typescript": "^43.0.1",
@ -170,7 +170,7 @@
"typescript": "5.8.3",
"vue-eslint-parser": "^9.4.3",
"vue-loader": "^17.4.2",
"webpack": "^5.99.7",
"webpack": "^5.99.8",
"webpack-cli": "^6.0.1",
"webpack-dev-server": "5.2.1",
"webpack-hot-middleware": "github:lyswhut/webpack-hot-middleware#329c4375134b89d39da23a56a94db651247c74a1",
@ -178,7 +178,7 @@
},
"dependencies": {
"@simonwep/pickr": "^1.9.1",
"better-sqlite3": "^11.9.1",
"better-sqlite3": "^11.10.0",
"bufferutil": "^4.0.9",
"comlink": "~4.3.1",
"crypto-js": "^4.2.0",
@ -197,7 +197,7 @@
"utf-8-validate": "^6.0.5",
"vue": "~3.3.13",
"vue-router": "^4.5.1",
"ws": "^8.18.1"
"ws": "^8.18.2"
},
"overrides": {
"got": "^11",

View File

@ -2,6 +2,7 @@
- 新增「设置 → 其他设置 → 主窗口使用软件内置的圆角及阴影」设置(#2360
*默认启用,关闭后将使用系统原生的窗口样式,该设置重启软件后生效*
- 开放API新增播放器声音大小、静音、播放进度控制详情看接入文档#2386
### 变更

View File

@ -11,6 +11,9 @@ declare namespace LX {
| 'pause'
| 'play'
| 'next'
| 'seek'
| 'volume'
| 'mute'
interface LyricInfo extends LX.Music.LyricInfo {
rawlrcInfo: LX.Music.LyricInfo
@ -29,6 +32,8 @@ declare namespace LX {
lyricLineAllText: string
lyric: string
collect: boolean
volume: number
mute: boolean
}
}
}

View File

@ -320,11 +320,11 @@
"setting__basic_control_btn_position_right": "右边",
"setting__basic_font": "字体",
"setting__basic_font_size": "字体大小",
"setting__basic_font_size_14px": "小",
"setting__basic_font_size_14px": "小",
"setting__basic_font_size_15px": "小",
"setting__basic_font_size_16px": "标准",
"setting__basic_font_size_17px": "大",
"setting__basic_font_size_18px": "大",
"setting__basic_font_size_18px": "大",
"setting__basic_font_size_19px": "非常大",
"setting__basic_lang": "语言",
"setting__basic_lang_title": "软件显示的语言",
@ -351,11 +351,11 @@
"setting__basic_window_size": "窗口尺寸",
"setting__basic_window_size_big": "大",
"setting__basic_window_size_huge": "巨大",
"setting__basic_window_size_larger": "大",
"setting__basic_window_size_larger": "大",
"setting__basic_window_size_medium": "中",
"setting__basic_window_size_oversized": "超大",
"setting__basic_window_size_small": "小",
"setting__basic_window_size_smaller": "小",
"setting__basic_window_size_smaller": "小",
"setting__basic_window_size_title": "设置软件窗口尺寸",
"setting__click_copy": "点击复制",
"setting__click_open": "点击打开",

View File

@ -320,11 +320,11 @@
"setting__basic_control_btn_position_right": "右邊",
"setting__basic_font": "字體",
"setting__basic_font_size": "字體大小",
"setting__basic_font_size_14px": "小",
"setting__basic_font_size_14px": "小",
"setting__basic_font_size_15px": "小",
"setting__basic_font_size_16px": "標準",
"setting__basic_font_size_17px": "大",
"setting__basic_font_size_18px": "大",
"setting__basic_font_size_18px": "大",
"setting__basic_font_size_19px": "非常大",
"setting__basic_lang": "語言",
"setting__basic_lang_title": "軟體顯示的語言",
@ -351,11 +351,11 @@
"setting__basic_window_size": "視窗尺寸",
"setting__basic_window_size_big": "大",
"setting__basic_window_size_huge": "巨大",
"setting__basic_window_size_larger": "大",
"setting__basic_window_size_larger": "大",
"setting__basic_window_size_medium": "中",
"setting__basic_window_size_oversized": "超大",
"setting__basic_window_size_small": "小",
"setting__basic_window_size_smaller": "較小",
"setting__basic_window_size_smaller": "更大",
"setting__basic_window_size_title": "設定軟體視窗尺寸",
"setting__click_copy": "點擊複製",
"setting__click_open": "點擊開啟",

View File

@ -65,6 +65,8 @@ export const initGlobalData = () => {
lyricLineAllText: '',
lyric: '',
collect: false,
volume: 0,
mute: false,
},
}
@ -230,6 +232,15 @@ export const listenerAppEvent = (startApp: () => void) => {
global.lx.theme.shouldUseDarkColors = shouldUseDarkColors
global.lx?.event_app.system_theme_change(shouldUseDarkColors)
})
global.lx.event_app.on('updated_config', (config, setting) => {
if (config.includes('player.volume')) {
global.lx.event_app.player_status({ volume: Math.trunc(setting['player.volume']! * 100) })
}
if (config.includes('player.isMute')) {
global.lx.event_app.player_status({ mute: setting['player.isMute'] })
}
})
}
const initTheme = () => {
@ -256,6 +267,20 @@ const initTheme = () => {
})
}
const backupDB = (backupPath: string) => {
const dbPath = path.join(global.lxDataPath, 'lx.data.db')
try {
renameSync(dbPath, backupPath)
} catch {}
try {
renameSync(`${dbPath}-wal`, `${backupPath}-wal`)
} catch {}
try {
renameSync(`${dbPath}-shm`, `${backupPath}-shm`)
} catch {}
openDirInExplorer(backupPath)
}
let isInitialized = false
export const initAppSetting = async() => {
if (!global.lx.inited) {
@ -268,14 +293,13 @@ export const initAppSetting = async() => {
if (!isInitialized) {
let dbFileExists = await global.lx.worker.dbService.init(global.lxDataPath)
if (dbFileExists === null) {
const backPath = path.join(global.lxDataPath, `lx.data.db.${Date.now()}.bak`)
const backupPath = path.join(global.lxDataPath, `lx.data.db.${Date.now()}.bak`)
dialog.showMessageBoxSync({
type: 'warning',
message: 'Database verify failed',
detail: `数据库表结构校验失败,我们将把有问题的数据库备份到:${backPath}\n若此问题导致你的数据丢失你可以尝试从备份文件找回它们。\n\nThe database table structure verification failed, we will back up the problematic database to: ${backPath}\nIf this problem causes your data to be lost, you can try to retrieve them from the backup file.`,
detail: `数据库表结构校验失败,我们将把有问题的数据库备份到:${backupPath}\n若此问题导致你的数据丢失你可以尝试从备份文件找回它们。\n\nThe database table structure verification failed, we will back up the problematic database to: ${backupPath}\nIf this problem causes your data to be lost, you can try to retrieve them from the backup file.`,
})
renameSync(path.join(global.lxDataPath, 'lx.data.db'), backPath)
openDirInExplorer(backPath)
backupDB(backupPath)
dbFileExists = await global.lx.worker.dbService.init(global.lxDataPath)
}
global.lx.appSetting = (await initSetting()).setting

View File

@ -142,12 +142,44 @@ const handleStartServer = async(port: number, ip: string) => new Promise<void>((
case '/skip-prev':
sendTaskbarButtonClick('prev')
break
case '/seek': {
const offset = parseFloat(querystring.parse(query ?? '').offset as string)
if (Number.isNaN(offset) || offset < 0 || offset > global.lx.player_status.duration) {
code = 400
msg = 'Invalid offset'
} else {
sendTaskbarButtonClick('seek', parseFloat(offset.toFixed(3)))
}
break
}
case '/collect':
sendTaskbarButtonClick('collect')
break
case '/uncollect':
sendTaskbarButtonClick('unCollect')
break
case '/volume': {
const volume = parseInt(querystring.parse(query ?? '').volume as string)
if (Number.isNaN(volume) || volume < 0 || volume > 100) {
code = 400
msg = 'Invalid volume'
} else {
sendTaskbarButtonClick('volume', volume / 100)
}
break
}
case '/mute': {
const mute = querystring.parse(query ?? '').mute
if (mute == 'true') {
sendTaskbarButtonClick('mute', true)
} else if (mute == 'false') {
sendTaskbarButtonClick('mute', false)
} else {
code = 400
msg = 'Invalid mute value'
}
break
}
case '/subscribe-player-status':
try {
handleSubscribePlayerStatus(req, res, query)

View File

@ -137,8 +137,8 @@ export const sendFocus = () => {
sendEvent(WIN_MAIN_RENDERER_EVENT_NAME.focus)
}
export const sendTaskbarButtonClick = (action: LX.Player.StatusButtonActions) => {
sendEvent(WIN_MAIN_RENDERER_EVENT_NAME.player_action_on_button_click, action)
export const sendTaskbarButtonClick = (action: LX.Player.StatusButtonActions, data?: unknown) => {
sendEvent(WIN_MAIN_RENDERER_EVENT_NAME.player_action_on_button_click, { action, data })
}
export const sendConfigChange = (setting: Partial<LX.AppSetting>) => {
sendEvent(WIN_MAIN_RENDERER_EVENT_NAME.on_config_change, setting)

View File

@ -259,7 +259,10 @@ export default {
})
onMounted(() => {
dom_scrollContainer.value.addEventListener('scroll', onScroll, false)
dom_scrollContainer.value.addEventListener('scroll', onScroll, {
capture: false,
passive: true,
})
cachedList = Array(props.list.length)
startIndex = -1
endIndex = -1

View File

@ -282,7 +282,10 @@ export default {
})
onMounted(() => {
dom_scrollContainer.value.addEventListener('scroll', onScroll, false)
dom_scrollContainer.value.addEventListener('scroll', onScroll, {
capture: false,
passive: true,
})
cachedList = Array(props.list.length)
startIndex = -1
endIndex = -1

View File

@ -81,7 +81,7 @@ export default () => {
// buttons.lockLrc = setting.desktopLyric.isLock
// setButtons()
// }
const rTaskbarThumbarClick = onPlayerAction(async({ params: action }) => {
const rTaskbarThumbarClick = onPlayerAction(async({ params: { action, data } }) => {
switch (action) {
case 'play':
play()
@ -105,6 +105,19 @@ export default () => {
void removeListMusics({ listId: loveList.id, ids: ['progress' in playMusicInfo.musicInfo ? playMusicInfo.musicInfo.metadata.musicInfo.id : playMusicInfo.musicInfo.id] })
if (await updateCollectStatus()) sendPlayerStatus({ collect })
break
case 'seek': {
let progress = data as number
if (progress < 0) progress = 0
else if (progress > playProgress.maxPlayTime) progress = playProgress.maxPlayTime
window.app_event.setProgress(progress)
break
}
case 'mute':
window.app_event.setVolumeIsMute(data as boolean)
break
case 'volume':
window.app_event.setVolume(data as number)
break
// case 'lrc':
// setVisibleDesktopLyric(true)
// updateSetting()

View File

@ -476,7 +476,10 @@ export const hotKeyGetStatus = async() => {
}
// 主进程操作播放器状态
export const onPlayerAction = (listener: LX.IpcRendererEventListenerParams<LX.Player.StatusButtonActions>): RemoveListener => {
export const onPlayerAction = (listener: LX.IpcRendererEventListenerParams<{
action: LX.Player.StatusButtonActions
data?: unknown
}>): RemoveListener => {
rendererOn(WIN_MAIN_RENDERER_EVENT_NAME.player_action_on_button_click, listener)
return () => {
rendererOff(WIN_MAIN_RENDERER_EVENT_NAME.player_action_on_button_click, listener)