diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 528ca356..afdde9fc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,11 +37,10 @@ jobs: - name: Install dependencies run: | - yarn config set ignore-engines true - yarn + pnpm i - name: Build Electron release - run: yarn release + run: pnpm release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} VUE_APP_SENTRY_DSN: ${{ secrets.SENTRY_DSN }} diff --git a/package.json b/package.json index 56e8d153..15e3eafc 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,8 @@ "vue-router": "^4.0.5", "winston": "^3.3.3", "winston-daily-rotate-file": "^4.5.2", - "winston-transport": "^4.4.0" + "winston-transport": "^4.4.0", + "xosms": "^0.6.0" }, "devDependencies": { "@types/electron-devtools-installer": "^2.2.0", @@ -94,12 +95,8 @@ }, "license": "MIT", "optionalDependencies": { - "@nodert-win10-rs4/windows.foundation": "^0.4.4", - "@nodert-win10-rs4/windows.media": "^0.4.4", - "@nodert-win10-rs4/windows.storage.streams": "^0.4.4", "@types/discord-rpc": "^4.0.3", "bufferutil": "^4.0.6", - "mpris-service": "^2.1.2", "utf-8-validate": "^5.0.8" }, "repository": "https://github.com/Venipa/ytmdesktop2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67b5acf5..8a6c73da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,26 +107,17 @@ dependencies: winston-transport: specifier: ^4.4.0 version: 4.5.0 + xosms: + specifier: ^0.6.0 + version: 0.6.0 optionalDependencies: - '@nodert-win10-rs4/windows.foundation': - specifier: ^0.4.4 - version: 0.4.4 - '@nodert-win10-rs4/windows.media': - specifier: ^0.4.4 - version: 0.4.4 - '@nodert-win10-rs4/windows.storage.streams': - specifier: ^0.4.4 - version: 0.4.4 '@types/discord-rpc': specifier: ^4.0.3 version: 4.0.3 bufferutil: specifier: ^4.0.6 version: 4.0.8 - mpris-service: - specifier: ^2.1.2 - version: 2.1.2 utf-8-validate: specifier: ^5.0.8 version: 5.0.10 @@ -2134,36 +2125,6 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 - /@nodert-win10-rs4/windows.foundation@0.4.4: - resolution: {integrity: sha512-gA/jMwvKkEm+AFyIc9L6TZvP+DjcL54gkTOY0Izvcfmj3ctUiLFUqs1MdBJ5fjhTi0COPRhoq2eDSNl6t3IWEg==} - requiresBuild: true - dependencies: - nan: 2.18.0 - dev: false - optional: true - - /@nodert-win10-rs4/windows.media@0.4.4: - resolution: {integrity: sha512-y5oGRVOBLlFVHP65LuG8YHhkfC8tR/o3USfsiAkTDyky6mXkba8wzthlVACMWpxJ7cRpFloznELpwnci75rocA==} - requiresBuild: true - dependencies: - nan: 2.18.0 - dev: false - optional: true - - /@nodert-win10-rs4/windows.storage.streams@0.4.4: - resolution: {integrity: sha512-xoK6sTG4FxyLYfD/oW9NuElBwKiWFS6wmegQunSPaFpv+j6FYU6olfSqgvqu1/rSMzPV5aZ68JkrPu8uKqZo3Q==} - requiresBuild: true - dependencies: - nan: 2.18.0 - dev: false - optional: true - - /@nornagon/put@0.0.8: - resolution: {integrity: sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==} - engines: {node: '>=0.3.0'} - dev: false - optional: true - /@npmcli/fs@2.1.1: resolution: {integrity: sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3777,6 +3738,68 @@ packages: requiresBuild: true dev: true + /@xosms/xosms-darwin-arm64@0.6.0: + resolution: {integrity: sha512-Hm1ldrnJel2r446VlomntiRyf6m1pOBS6sy6uNpj/nnoBPQY0ZbVNQwplIIAoTpqz2NM6U0o7k4oU/pBWZgP9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@xosms/xosms-darwin-universal@0.6.0: + resolution: {integrity: sha512-IGXzdk/eEPGI7P+4AO5s455/Fg71H87KzuzPF8AB+YQu6dX4JKDfkhQTP3VlijMuMTAYDF//HKLD9HMW+kYpvg==} + engines: {node: '>= 10'} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@xosms/xosms-darwin-x64@0.6.0: + resolution: {integrity: sha512-zPCxyPmhIAKWlV46OdzEAL3IZflTWser8lxaIAp8JjgcYKGWz8he+ZOX+/gTXCkWq7mr2Y8+I3oZE/vHoGQ5/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@xosms/xosms-linux-arm64-gnu@0.6.0: + resolution: {integrity: sha512-5H8yXS8iH6s+9ffvGDGbKa3r0NkNbp29lc7+WoqbFFIF8CczJm/oU4IG+AHEsD3ERi6cbvzrJQipYIkpwNomRg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@xosms/xosms-linux-x64-gnu@0.6.0: + resolution: {integrity: sha512-pWMkd7QXXVkIOsOD5RP0/QerSeYm4wyB8CMn8BLmmyGJ0V19KNmXLDUZOOZb4tWncjZnwhbua5oDE0iOLj1dpw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@xosms/xosms-win32-arm64-msvc@0.6.0: + resolution: {integrity: sha512-cizMv++zfxqlK9E3psyWRCaALz8sxDQe5ZD4P3KV75zswq5WydX+6oKGVtOyVVDdzpzp4hat9EUMgUCMuLdy2w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@xosms/xosms-win32-x64-msvc@0.6.0: + resolution: {integrity: sha512-kj6yxqBViJg/LUwh0TPSzTqRACmlPbwui5yRHzwHQYsNxiFsU0cdKgJdWty+eUzvhEeA304Zd9Oyim8aV8ATHw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true @@ -3789,17 +3812,6 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /abstract-socket@2.1.1: - resolution: {integrity: sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==} - engines: {node: '>=4.0.0'} - os: [linux] - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.18.0 - dev: false - optional: true - /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -4340,14 +4352,6 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true - dependencies: - file-uri-to-path: 1.0.0 - dev: false - optional: true - /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -4491,6 +4495,7 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -5634,21 +5639,6 @@ packages: engines: {node: '>=0.11'} dev: false - /dbus-next@0.9.2: - resolution: {integrity: sha512-tzQq/+wrTZ2yU+U5PoeXc97KABhX2v55C/T0finH3tSKYuI8H/SqppIFymBBrUHcK13LvEGY3vdj3ikPPenL5g==} - dependencies: - '@nornagon/put': 0.0.8 - event-stream: 3.3.4 - hexy: 0.2.11 - jsbi: 2.0.5 - long: 4.0.0 - safe-buffer: 5.2.1 - xml2js: 0.4.23 - optionalDependencies: - abstract-socket: 2.1.1 - dev: false - optional: true - /debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} engines: {node: '>=10'} @@ -5702,19 +5692,6 @@ packages: mimic-response: 3.1.0 dev: false - /deep-equal@1.1.2: - resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} - engines: {node: '>= 0.4'} - dependencies: - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object-keys: 1.1.1 - regexp.prototype.flags: 1.5.1 - dev: false - optional: true - /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -5774,6 +5751,7 @@ packages: define-data-property: 1.1.1 has-property-descriptors: 1.0.0 object-keys: 1.1.1 + dev: true /defined@1.0.0: resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} @@ -6017,6 +5995,7 @@ packages: /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -6605,19 +6584,6 @@ packages: engines: {node: '>=4.0.0'} dev: true - /event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: false - optional: true - /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true @@ -6820,12 +6786,6 @@ packages: engines: {node: '>=6'} dev: false - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true - dev: false - optional: true - /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: @@ -6984,11 +6944,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - /from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: false - optional: true - /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -7065,6 +7020,7 @@ packages: /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} @@ -7361,6 +7317,7 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: true /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} @@ -7402,12 +7359,6 @@ packages: tslib: 2.4.0 dev: false - /hexy@0.2.11: - resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==} - hasBin: true - dev: false - optional: true - /highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true @@ -7715,15 +7666,6 @@ packages: engines: {node: '>= 10'} dev: true - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: false - optional: true - /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -7788,6 +7730,7 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 + dev: true /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -7897,6 +7840,7 @@ packages: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 + dev: true /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} @@ -8062,11 +8006,6 @@ packages: dependencies: argparse: 2.0.1 - /jsbi@2.0.5: - resolution: {integrity: sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ==} - dev: false - optional: true - /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -8374,11 +8313,6 @@ packages: triple-beam: 1.3.0 dev: false - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - optional: true - /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: @@ -8463,11 +8397,6 @@ packages: - supports-color dev: true - /map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - dev: false - optional: true - /matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -8703,16 +8632,6 @@ packages: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: false - /mpris-service@2.1.2: - resolution: {integrity: sha512-AC6WepCnFWwOME9OWplHZ8ps/BB+g9QrEpUKCv7wX82fDPzR3nPrypOFmL/Fm0JloEAu6QTWSfDLLc6mM/jinw==} - requiresBuild: true - dependencies: - dbus-next: 0.9.2 - deep-equal: 1.1.2 - source-map-support: 0.5.21 - dev: false - optional: true - /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} @@ -8743,11 +8662,6 @@ packages: thenify-all: 1.6.0 dev: true - /nan@2.18.0: - resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} - dev: false - optional: true - /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -8957,18 +8871,10 @@ packages: /object-inspect@1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - dev: false - optional: true - /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + dev: true /object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} @@ -9281,13 +9187,6 @@ packages: engines: {node: '>=8'} dev: true - /pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - dependencies: - through: 2.3.8 - dev: false - optional: true - /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true @@ -10108,6 +10007,7 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 + dev: true /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} @@ -10535,6 +10435,7 @@ packages: define-data-property: 1.1.1 functions-have-names: 1.2.3 has-property-descriptors: 1.0.0 + dev: true /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -10718,6 +10619,7 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -10775,13 +10677,6 @@ packages: - supports-color dev: true - /split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - dependencies: - through: 2.3.8 - dev: false - optional: true - /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -10832,13 +10727,6 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - dependencies: - duplexer: 0.1.2 - dev: false - optional: true - /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} @@ -11249,11 +11137,6 @@ packages: webpack: 5.74.0 dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false - optional: true - /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} dev: true @@ -12451,6 +12334,19 @@ packages: requiresBuild: true dev: true + /xosms@0.6.0: + resolution: {integrity: sha512-dhQ0/l2lXd+Ut5O7eWjsaK/JcWIxxx3byobjBR4UNJOX/vbMwGbI1I5XrCGbdoL0JWje4o/EhSob8IDOFnxp1g==} + engines: {node: '>= 10'} + optionalDependencies: + '@xosms/xosms-darwin-arm64': 0.6.0 + '@xosms/xosms-darwin-universal': 0.6.0 + '@xosms/xosms-darwin-x64': 0.6.0 + '@xosms/xosms-linux-arm64-gnu': 0.6.0 + '@xosms/xosms-linux-x64-gnu': 0.6.0 + '@xosms/xosms-win32-arm64-msvc': 0.6.0 + '@xosms/xosms-win32-x64-msvc': 0.6.0 + dev: false + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/src/app/plugins/mediaControlProvider.plugin.ts b/src/app/plugins/mediaControlProvider.plugin.ts index e365564d..cfa877c0 100644 --- a/src/app/plugins/mediaControlProvider.plugin.ts +++ b/src/app/plugins/mediaControlProvider.plugin.ts @@ -1,15 +1,15 @@ -import { AfterInit, BaseProvider, BeforeStart } from '@/app/utils/baseProvider'; +import { AfterInit, BaseProvider, BeforeStart, OnDestroy } from '@/app/utils/baseProvider'; import { IpcContext, IpcOn } from '@/app/utils/onIpcEvent'; import { TrackData } from '@/app/utils/trackData'; import { XOSMS } from '@/app/utils/xosms-types'; import { App } from 'electron'; -import { MediaServiceProvider } from 'xosms'; +import { MediaPlayerMediaType, MediaPlayerPlaybackStatus, MediaPlayerThumbnail, MediaPlayerThumbnailType, MediaPlayer as MediaServiceProvider } from 'xosms'; import IPC_EVENT_NAMES from '../utils/eventNames'; @IpcContext export default class MediaControlProvider extends BaseProvider - implements AfterInit, BeforeStart { + implements AfterInit, BeforeStart, OnDestroy { private _mediaProvider: MediaServiceProvider; private xosmsLog = this.logger.child("xosms"); constructor(private app: App) { @@ -20,18 +20,20 @@ export default class MediaControlProvider extends BaseProvider app.commandLine.appendSwitch("in-progress-gpu"); // gpu paint not working on some devices, todo: workaround/await fix app.commandLine.appendSwitch("no-sandbox"); // avoid freeze, todo: workaround/await fix } + private onKeyPressed(keyName, ...args) { + this.xosmsLog.debug(["button press", keyName, ...args]); + const trackProvider = this.getProvider("api"); + if (keyName === "pause") trackProvider.pauseTrack(); + else if (keyName === "play") trackProvider.playTrack(); + else if (keyName === "next") trackProvider.nextTrack(); + else if (keyName === "previous") trackProvider.prevTrack(); + }; + async AfterInit() { this._mediaProvider = new MediaServiceProvider(this.app.name, this.app.name); - this._mediaProvider.isEnabled = true; + this._mediaProvider.seekEnabled = false; // to be added if (this._mediaProvider) { - this._mediaProvider.buttonPressed = (keyName, ...args) => { - this.xosmsLog.debug(["button press", keyName, ...args]); - const trackProvider = this.getProvider("api"); - if (keyName === "pause") trackProvider.pauseTrack(); - else if (keyName === "play") trackProvider.playTrack(); - else if (keyName === "next") trackProvider.nextTrack(); - else if (keyName === "previous") trackProvider.prevTrack(); - }; + this._mediaProvider.addEventListener("buttonpressed", this.onKeyPressed); } if (!this.mediaProviderEnabled()) this.xosmsLog.warn( @@ -43,45 +45,46 @@ export default class MediaControlProvider extends BaseProvider ].join(", ") ); } - + get instance() { + return this._mediaProvider; + } @IpcOn(IPC_EVENT_NAMES.TRACK_PLAYSTATE) private __handleTrackMediaOSControl(_ev, isPlaying: boolean) { if (!this.mediaProviderEnabled()) return; const { trackData } = this.getProvider("track"); if (!trackData) { - this._mediaProvider.playbackStatus = XOSMS.PlaybackStatus.Stopped; + this._mediaProvider.playbackStatus = MediaPlayerPlaybackStatus.Stopped; this._mediaProvider.playButtonEnabled = true; this._mediaProvider.pauseButtonEnabled = false; } else { this._mediaProvider.playbackStatus = isPlaying - ? XOSMS.PlaybackStatus.Playing - : XOSMS.PlaybackStatus.Paused; + ? MediaPlayerPlaybackStatus.Playing + : MediaPlayerPlaybackStatus.Paused; this._mediaProvider.playButtonEnabled = !isPlaying; this._mediaProvider.pauseButtonEnabled = isPlaying; } } private mediaProviderEnabled() { - return this._mediaProvider && this._mediaProvider.isEnabled; + return !!this._mediaProvider; } - handleTrackMediaOSControlChange(trackData: TrackData) { + async handleTrackMediaOSControlChange(trackData: TrackData) { const isEnabled = this.mediaProviderEnabled(); if (!isEnabled || !trackData?.video) return; const albumThumbnail = trackData.meta.thumbnail; try { this._mediaProvider.mediaType = { - ["Video"]: XOSMS.MediaType.Video, - ["Music"]: XOSMS.MediaType.Music, - ["Image"]: XOSMS.MediaType.Image, - }[trackData.context.category] ?? XOSMS.MediaType.Video; - this._mediaProvider.playbackStatus = XOSMS.PlaybackStatus.Playing; - this._mediaProvider.albumArtist = trackData.video.author; + ["Video"]: MediaPlayerMediaType.Music, + ["Music"]: MediaPlayerMediaType.Music + }[trackData.context.category] ?? MediaPlayerMediaType.Unknown; + this._mediaProvider.playbackStatus = MediaPlayerPlaybackStatus.Playing; + this._mediaProvider.artist = trackData.video.author; this._mediaProvider.albumTitle = trackData.context.pageOwnerDetails.name; this._mediaProvider.artist = trackData.video.author; if (albumThumbnail) - this._mediaProvider.setThumbnail(XOSMS.ThumbnailType.Uri, albumThumbnail); + this._mediaProvider.setThumbnail(await MediaPlayerThumbnail.create(MediaPlayerThumbnailType.Uri, albumThumbnail)); this._mediaProvider.title = trackData.video.title; this._mediaProvider.trackId = trackData.video.videoId; this._mediaProvider.previousButtonEnabled = true; @@ -95,4 +98,7 @@ export default class MediaControlProvider extends BaseProvider this._mediaProvider.trackId, ].join(", ")); } + OnDestroy(): void | Promise { + this._mediaProvider?.removeEventListener("buttonpressed", this.onKeyPressed); + } } diff --git a/src/app/plugins/miniPlayerProvider.plugin.ts b/src/app/plugins/miniPlayerProvider.plugin.ts index 6d9930aa..ca8a43ef 100644 --- a/src/app/plugins/miniPlayerProvider.plugin.ts +++ b/src/app/plugins/miniPlayerProvider.plugin.ts @@ -14,6 +14,19 @@ export default class MiniPlayerProvider extends BaseProvider implements AfterIni } async AfterInit() { } + @IpcHandle("action:miniplayer.stayOnTop") + private async __onPlayerTop() { + const window = this.windowContext.views.miniPlayerWindow as any as BrowserWindow; + const isOnTop = !window.isAlwaysOnTop(); + window.setAlwaysOnTop(isOnTop); + return isOnTop; + } + @IpcHandle("miniplayer.stayOnTop") + private async __isPlayerTop() { + const window = this.windowContext.views.miniPlayerWindow as any as BrowserWindow; + const isOnTop = window.isAlwaysOnTop(); + return isOnTop; + } @IpcHandle("action:app.miniPlayer") @IpcHandle("app.miniPlayer") private async __playerWindow() { diff --git a/src/app/plugins/trackProvider.plugin.ts b/src/app/plugins/trackProvider.plugin.ts index 25011060..20626275 100644 --- a/src/app/plugins/trackProvider.plugin.ts +++ b/src/app/plugins/trackProvider.plugin.ts @@ -144,7 +144,9 @@ export default class TrackProvider extends BaseProvider implements AfterInit { this.views.toolbarView.webContents.send("track:title", track?.video?.title); this.views.youtubeView.webContents.send("track.change", track.video.videoId); this.windowContext.sendToAllViews(IPC_EVENT_NAMES.TRACK_CHANGE, track); - this.getProvider("mediaController")?.handleTrackMediaOSControlChange(track); + const media = this.getProvider("mediaController"); + if (media) + await media.handleTrackMediaOSControlChange(track); const api = this.getProvider("api") as ApiProvider; api.sendMessage("track:change", track); const lastfm = this.getProvider("lastfm"); @@ -181,10 +183,11 @@ export default class TrackProvider extends BaseProvider implements AfterInit { if (isPlaying && !discordProvider.isConnected && discordProvider.enabled && discordProvider.settingsEnabled) await discordProvider.enable(); const isUIViewRequired = uiTimeInfo?.[1] && progressSeconds > uiTimeInfo?.[1]; - - const [currentUIProgress] = isUIViewRequired ? uiTimeInfo : [progressSeconds]; + const [currentUIProgress, currentUIDuration] = isUIViewRequired ? uiTimeInfo : [progressSeconds, uiTimeInfo[1]]; if (isUIViewRequired) await discordProvider.updatePlayState(isPlaying, currentUIProgress); else await discordProvider.updatePlayState(isPlaying, progressSeconds); + + this.getProvider("mediaController")?.instance?.setTimeline(currentUIDuration, currentUIProgress); const [isLiked, isDLiked] = await this.currentSongLikeState(); if (this._trackState) { this.setTrackState((state) => { @@ -193,7 +196,7 @@ export default class TrackProvider extends BaseProvider implements AfterInit { state.uiProgress = uiTimeInfo[0]; state.liked = isLiked; state.disliked = isDLiked; - state.duration = uiTimeInfo[1]; + state.duration = currentUIDuration; }); } else { this.setTrackState({ @@ -202,7 +205,7 @@ export default class TrackProvider extends BaseProvider implements AfterInit { uiProgress: uiTimeInfo[0], liked: isLiked, disliked: isDLiked, - duration: uiTimeInfo[1], + duration: currentUIDuration, id: this._activeTrackId, }); } diff --git a/src/assets/icons/layers.svg b/src/assets/icons/layers.svg new file mode 100644 index 00000000..ea788c22 --- /dev/null +++ b/src/assets/icons/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/lock.svg b/src/assets/icons/lock.svg new file mode 100644 index 00000000..8862c1ee --- /dev/null +++ b/src/assets/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/unlock.svg b/src/assets/icons/unlock.svg new file mode 100644 index 00000000..9c721d40 --- /dev/null +++ b/src/assets/icons/unlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/views/mini-player/index.vue b/src/views/mini-player/index.vue index a78471cd..5bb188b6 100644 --- a/src/views/mini-player/index.vue +++ b/src/views/mini-player/index.vue @@ -6,7 +6,7 @@ }" >
- + @@ -17,6 +17,15 @@ > Beta + +