diff --git a/.electron-builder.config.js b/.electron-builder.config.js index cbb6310..72bb482 100644 --- a/.electron-builder.config.js +++ b/.electron-builder.config.js @@ -33,24 +33,23 @@ module.exports = { target: 'nsis', arch: ['arm64'], }, - { - target: 'nsis', - arch: ['ia32'], - }, { target: 'portable', arch: ['x64'], }, ], - artifactName: '${productName}-${os}-${version}-${arch}-Setup.${ext}', publisherName: 'qier222', icon: 'build/icons/icon.ico', }, nsis: { oneClick: false, - perMachine: false, + perMachine: true, allowToChangeInstallationDirectory: true, deleteAppDataOnUninstall: true, + artifactName: '${productName}-${version}-${os}-${arch}-Setup.${ext}', + }, + portable: { + artifactName: '${productName}-${version}-${os}-${arch}-Portable.${ext}', }, mac: { target: [ @@ -59,7 +58,7 @@ module.exports = { arch: ['x64', 'arm64', 'universal'], }, ], - artifactName: '${productName}-${os}-${version}-${arch}.${ext}', + artifactName: '${productName}-${version}-${os}-${arch}.${ext}', darkModeSupport: true, category: 'public.app-category.music', }, @@ -93,7 +92,7 @@ module.exports = { arch: ['x64'], }, ], - artifactName: '${productName}-${os}-${version}.${ext}', + artifactName: '${productName}-${version}-${os}.${ext}', category: 'Music', icon: './build/icon.icns', }, diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8b24e70..1e41104 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -32,10 +32,15 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile false - - name: Electron rebuild - run: pnpm electron-rebuild + - name: Build sqlite3 binaries (macOS, Windows) + if: runner.os == 'macOS' + run: node ./scripts/build.sqlite3.mjs --arm64 --x64 - - name: Install RPM & Pacman (on Ubuntu) + - name: Build sqlite3 binaries (Linux) + if: runner.os == 'Linux' + run: node ./scripts/build.sqlite3.mjs --arm64 --arm --x64 + + - name: Install RPM & Pacman (Linux) if: runner.os == 'Linux' run: | sudo apt-get update && @@ -43,7 +48,7 @@ jobs: sudo apt-get install --no-install-recommends -y bsdtar && sudo apt-get install --no-install-recommends -y libopenjp2-tools - - name: Install Snapcraft (on Ubuntu) + - name: Install Snapcraft (Linux) uses: samuelmeuli/action-snapcraft@v1 if: startsWith(matrix.os, 'ubuntu') # with: @@ -79,7 +84,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: YesPlayMusic-win - path: release/*-Setup.exe + path: release/*x64-Setup.exe if-no-files-found: ignore - name: Upload Artifact (Linux) diff --git a/package.json b/package.json index a4e7784..6aa41e2 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,9 @@ "build": "npm run typecheck && cross-env-shell IS_ELECTRON=true npm run build:renderer && npm run build:main", "build:app": "npm run build && electron-builder --config .electron-builder.config.js", "build:app-dir": "npm run build && electron-builder --config .electron-builder.config.js --dir", + "build:app-win": "npm run build && electron-builder --config .electron-builder.config.js --win", + "build:app-mac": "npm run build && electron-builder --config .electron-builder.config.js --mac", + "build:app-linux": "npm run build && electron-builder --config .electron-builder.config.js --linux", "typecheck": "tsc --noEmit --project src/renderer/tsconfig.json", "debug": "cross-env-shell NODE_ENV=debug \"npm run typecheck && node scripts/build.mjs && vite ./src/renderer\"", "eslint": "eslint --ext .ts,.js ./", @@ -29,7 +32,7 @@ "@sentry/node": "^6.19.3", "@sentry/tracing": "^6.19.3", "NeteaseCloudMusicApi": "^4.5.10", - "better-sqlite3": "7.4.6", + "better-sqlite3": "7.5.0", "change-case": "^4.1.2", "cookie-parser": "^1.4.6", "electron-log": "^4.4.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb405b2..5c2df35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,7 +21,7 @@ specifiers: NeteaseCloudMusicApi: ^4.5.10 autoprefixer: ^10.4.4 axios: ^0.26.1 - better-sqlite3: 7.4.6 + better-sqlite3: 7.5.0 change-case: ^4.1.2 classnames: ^2.3.1 color.js: ^1.2.0 @@ -80,7 +80,7 @@ dependencies: '@sentry/node': 6.19.3 '@sentry/tracing': 6.19.3 NeteaseCloudMusicApi: 4.5.10 - better-sqlite3: 7.4.6 + better-sqlite3: 7.5.0 change-case: 4.1.2 cookie-parser: 1.4.6 electron-log: 4.4.6 @@ -1541,13 +1541,12 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /better-sqlite3/7.4.6: - resolution: {integrity: sha512-LB/UxnMhcJY12bRCDXl2jTk0lsbXHCHOLn3cPjGhy3GCcVPGq45sCGJPUdfBZnfXGN14tYTJyq0ztUI3lGng8A==} + /better-sqlite3/7.5.0: + resolution: {integrity: sha512-6FdG9DoytYGDhLW7VWW1vxjEz7xHkqK6LnaUQYA8d6GHNgZhu9PFX2xwKEEnSBRoT1J4PjTUPeg217ShxNmuPg==} requiresBuild: true dependencies: bindings: 1.5.0 prebuild-install: 7.0.1 - tar: 6.1.11 dev: false /big-integer/1.6.51: @@ -1990,6 +1989,7 @@ packages: /chownr/2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + dev: true /chromium-pickle-js/0.2.0: resolution: {integrity: sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=} @@ -3694,6 +3694,7 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.1.6 + dev: true /fs.realpath/1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} @@ -5140,6 +5141,7 @@ packages: engines: {node: '>=8'} dependencies: yallist: 4.0.0 + dev: true /minizlib/2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -5147,6 +5149,7 @@ packages: dependencies: minipass: 3.1.6 yallist: 4.0.0 + dev: true /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} @@ -5170,6 +5173,7 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + dev: true /ms/2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} @@ -7076,6 +7080,7 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 + dev: true /temp-file/3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} diff --git a/scripts/build.sqlite3.mjs b/scripts/build.sqlite3.mjs new file mode 100644 index 0000000..aa8f423 --- /dev/null +++ b/scripts/build.sqlite3.mjs @@ -0,0 +1,39 @@ +import { rebuild } from 'electron-rebuild' +import fs from 'fs' +import minimist from 'minimist' +import pc from 'picocolors' + +const pkg = JSON.parse(await fs.readFileSync('./package.json', 'utf8')) +const electronVersion = pkg.devDependencies.electron.replaceAll('^', '') +const argv = minimist(process.argv.slice(2)) + +const build = async arch => { + console.log(pc.blue(`Building for ${arch}...`)) + await rebuild({ + buildPath: process.cwd(), + electronVersion, + arch: arch, + }) + .then(() => { + console.info('Rebuild succeeded') + if (!fs.existsSync('./dist/main')) { + fs.mkdirSync('./dist/main', { recursive: true }) + } + fs.copyFileSync( + './node_modules/better-sqlite3/build/Release/better_sqlite3.node', + `./dist/main/better_sqlite3_${arch}.node` + ) + }) + .catch(e => { + console.error(pc.red('Rebuild failed!')) + console.error(pc.red(e)) + }) +} + +const main = async () => { + if (argv.x64) await build('x64') + if (argv.arm64) await build('arm64') + if (argv.arm) await build('arm') +} + +main() diff --git a/src/main/db.ts b/src/main/db.ts index 01c1a74..e883237 100644 --- a/src/main/db.ts +++ b/src/main/db.ts @@ -27,7 +27,9 @@ const dbFilePath = path.resolve( ) createFileIfNotExist(dbFilePath) -const sqlite = new SQLite3(dbFilePath) +const sqlite = new SQLite3(dbFilePath, { + nativeBinding: path.join(__dirname, `./better_sqlite3_${process.arch}.node`), +}) sqlite.pragma('auto_vacuum = FULL') // Init tables if not exist