diff --git a/build-config/lib/better_sqlite3_electron-v133-linux-arm.node b/build-config/lib/better_sqlite3_electron-v133-linux-arm.node index 7f02e89c..97002b4c 100644 Binary files a/build-config/lib/better_sqlite3_electron-v133-linux-arm.node and b/build-config/lib/better_sqlite3_electron-v133-linux-arm.node differ diff --git a/build-config/lib/better_sqlite3_electron-v133-linux-arm64.node b/build-config/lib/better_sqlite3_electron-v133-linux-arm64.node index ca5413f5..4d62ec1f 100644 Binary files a/build-config/lib/better_sqlite3_electron-v133-linux-arm64.node and b/build-config/lib/better_sqlite3_electron-v133-linux-arm64.node differ diff --git a/build-config/lib/better_sqlite3_electron-v133-linux-x64.node b/build-config/lib/better_sqlite3_electron-v133-linux-x64.node index 0f9b9c95..f06f7a6f 100644 Binary files a/build-config/lib/better_sqlite3_electron-v133-linux-x64.node and b/build-config/lib/better_sqlite3_electron-v133-linux-x64.node differ diff --git a/package-lock.json b/package-lock.json index 2a35ed01..8f6629be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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" diff --git a/package.json b/package.json index ecfc63a5..2aaf662a 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/publish/changeLog.md b/publish/changeLog.md index 6a4e4d48..bf3e5bf2 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -2,6 +2,7 @@ - 新增「设置 → 其他设置 → 主窗口使用软件内置的圆角及阴影」设置(#2360) *默认启用,关闭后将使用系统原生的窗口样式,该设置重启软件后生效* +- 开放API新增播放器声音大小、静音、播放进度控制,详情看接入文档(#2386) ### 变更 diff --git a/src/common/types/player.d.ts b/src/common/types/player.d.ts index 4a67248f..754f1bbe 100644 --- a/src/common/types/player.d.ts +++ b/src/common/types/player.d.ts @@ -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 } } } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index bec3ac91..d9d39423 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -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": "点击打开", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 05e4d913..43ebe1fe 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -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": "點擊開啟", diff --git a/src/main/app.ts b/src/main/app.ts index 15780026..fc04b381 100644 --- a/src/main/app.ts +++ b/src/main/app.ts @@ -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 diff --git a/src/main/modules/openApi/index.ts b/src/main/modules/openApi/index.ts index ce2c59d3..5475c0bb 100644 --- a/src/main/modules/openApi/index.ts +++ b/src/main/modules/openApi/index.ts @@ -142,12 +142,44 @@ const handleStartServer = async(port: number, ip: string) => new Promise(( 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) diff --git a/src/main/modules/winMain/rendererEvent/app.ts b/src/main/modules/winMain/rendererEvent/app.ts index 677f5a11..a4d09102 100644 --- a/src/main/modules/winMain/rendererEvent/app.ts +++ b/src/main/modules/winMain/rendererEvent/app.ts @@ -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) => { sendEvent(WIN_MAIN_RENDERER_EVENT_NAME.on_config_change, setting) diff --git a/src/renderer/components/base/MusicList.vue b/src/renderer/components/base/MusicList.vue index 51b45c3f..9b30af80 100644 --- a/src/renderer/components/base/MusicList.vue +++ b/src/renderer/components/base/MusicList.vue @@ -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 diff --git a/src/renderer/components/base/VirtualizedList.vue b/src/renderer/components/base/VirtualizedList.vue index 643fef37..ee8b627d 100644 --- a/src/renderer/components/base/VirtualizedList.vue +++ b/src/renderer/components/base/VirtualizedList.vue @@ -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 diff --git a/src/renderer/core/useApp/usePlayer/usePlayStatus.ts b/src/renderer/core/useApp/usePlayer/usePlayStatus.ts index f6b185dc..e40a408c 100644 --- a/src/renderer/core/useApp/usePlayer/usePlayStatus.ts +++ b/src/renderer/core/useApp/usePlayer/usePlayStatus.ts @@ -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() diff --git a/src/renderer/utils/ipc.ts b/src/renderer/utils/ipc.ts index 643ef16f..ca4b8a70 100644 --- a/src/renderer/utils/ipc.ts +++ b/src/renderer/utils/ipc.ts @@ -476,7 +476,10 @@ export const hotKeyGetStatus = async() => { } // 主进程操作播放器状态 -export const onPlayerAction = (listener: LX.IpcRendererEventListenerParams): 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)