Compare commits

...

49 Commits

Author SHA1 Message Date
27f4c0393e Bump version to 3.6.2 2024-10-16 20:43:19 +09:00
9bc42f836f fix: trustedTypes issue
- Close #2339
2024-10-16 20:40:35 +09:00
11b11ed966 fix(deps): update dependency serve to v14.2.4 (#2515)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-16 20:15:01 +09:00
5f79b7e788 chore(i18n): Translated using Weblate (Icelandic)
Currently translated at 94.7% (376 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/is/
2024-10-15 22:15:39 +02:00
7d1d806797 chore(i18n): Translated using Weblate (Indonesian)
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/id/
2024-10-15 22:15:39 +02:00
836cedb0f3 chore(i18n): Translated using Weblate (Ukrainian)
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/
2024-10-15 22:15:39 +02:00
70349e13cc chore(i18n): Translated using Weblate (Russian)
Currently translated at 99.7% (396 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ru/
2024-10-15 22:15:39 +02:00
6d16b74471 fix(deps): update dependency hono to v4.6.5 (#2509)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 22:33:46 +09:00
c211780c33 chore(deps): update dependency vite to v5.4.9 (#2500)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 13:46:51 +09:00
2173ba0234 fix(api-server): properly implement next api call (#2505) 2024-10-15 13:34:19 +09:00
3a4cbc543b chore(deps): update dependency electron to v33 (#2507)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 13:30:11 +09:00
2fef7f0246 chore(deps): update dependency typescript-eslint to v8.9.0 (#2503)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-15 05:03:21 +09:00
12d693921e chore(i18n): Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hant/
2024-10-14 19:24:56 +02:00
d1b4879f51 chore(deps): update dependency discord-api-types to v0.37.102 (#2501)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 23:32:47 +09:00
f14939fcd2 Update changelog for v3.6.1 2024-10-14 13:42:17 +00:00
4e66b0cedd fix: remove snap arm 2024-10-14 22:23:37 +09:00
11fe54d640 fix(style): fix youtube music player layout not aligned issue 2024-10-14 22:01:26 +09:00
446529f738 fix: remove pacman 2024-10-14 21:59:56 +09:00
ac6e9deeb9 chore(i18n): Translated using Weblate (Spanish)
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/es/
2024-10-14 14:42:58 +02:00
100873163f fix: remove "compression": "maximum" 2024-10-14 21:34:33 +09:00
e141e18bac fix: fix build 2024-10-14 21:27:42 +09:00
f4da0c2c95 fix: enum value must be one of xz,lzo, got 'maximum' 2024-10-14 21:17:15 +09:00
7507bce3cc fix: fix org.electronjs.Electron2.BaseApp/x86_64/20.08 2024-10-14 21:03:10 +09:00
2b970fade8 fix: fix org.freedesktop.Sdk/x86_64/20.08 2024-10-14 20:51:36 +09:00
35f0e43082 fix: remove duplicate flatpak 2024-10-14 20:38:25 +09:00
ae4410a613 fix(flatpak): remove armhf/arm64 2024-10-14 20:32:05 +09:00
5534174016 fix: fix flatpak build 2024-10-14 20:27:33 +09:00
15cf6c77c3 fix: fix flatpak release 2024-10-14 20:12:54 +09:00
18a8fc462d fix: fix pnpm-lock 2024-10-14 20:01:02 +09:00
d3acb4945a chore(flatpak-builder): Add more details when failing 2024-10-14 19:57:41 +09:00
32d3c58b44 fix: fix release workflow 2024-10-14 19:33:37 +09:00
bd8c2eb390 fix: configuration has an unknown property 'AppImage' 2024-10-14 19:26:24 +09:00
a81fa9c0d1 fix: apt update 2024-10-14 19:22:02 +09:00
1d0f7d7a48 fix: fix release 2024-10-14 19:20:04 +09:00
b6687307df Bump version to 3.6.1 2024-10-14 19:16:25 +09:00
7e07a44f68 fix(downloader): fix #2371 2024-10-14 18:27:04 +09:00
5ca66530ee fix(ytm-bugs): incorrect video ratio
- Close #2459
2024-10-14 18:16:22 +09:00
95acbe2b65 fix: fix conflict with adguard 2024-10-14 18:06:08 +09:00
534aeb163a fix(api-server): fix init/authentication error
- Close #2497
2024-10-14 17:51:59 +09:00
6abcbee290 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-10-14 09:54:33 +02:00
4457a043a4 chore(i18n): Translated using Weblate (English)
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/en/
2024-10-14 09:54:05 +02:00
410a052fea chore(i18n): Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (397 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/pt_BR/
2024-10-14 09:51:36 +02:00
e4287085a1 chore(i18n): Translated using Weblate (Filipino)
Currently translated at 87.1% (346 of 397 strings)

Translation: th-ch/youtube-music/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fil/
2024-10-14 09:51:36 +02:00
b6cefef8fb fix(api-server): Various fixes and improvements (#2496) 2024-10-14 16:48:11 +09:00
9d7e2a06bc fix(deps): update dependency electron-debug to v4.1.0 (#2499)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 16:45:19 +09:00
d516fc2153 fix(renderer): fix force like buttons display logic (#2493) 2024-10-14 04:27:23 +09:00
77bfe8e218 fix: RSS feed CORS issue
- Close #1620
2024-10-14 04:04:17 +09:00
0fcbe38837 fix(deps): update dependency i18next to v23.16.0 (#2492)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 03:46:38 +09:00
b85a40f683 Update changelog for v3.6.0 2024-10-13 13:57:28 +00:00
28 changed files with 867 additions and 304 deletions

View File

@ -62,6 +62,12 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
sudo snap install snapcraft --classic sudo snap install snapcraft --classic
sudo apt update
sudo apt install -y flatpak flatpak-builder
sudo flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
sudo flatpak install -y flathub org.freedesktop.Platform/x86_64/20.08
sudo flatpak install -y flathub org.freedesktop.Sdk/x86_64/20.08
sudo flatpak install -y flathub org.electronjs.Electron2.BaseApp/x86_64/20.08
pnpm release:linux pnpm release:linux
- name: Build and release on Windows - name: Build and release on Windows

View File

@ -2,8 +2,72 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [v3.6.1](https://github.com/th-ch/youtube-music/compare/v3.6.0...v3.6.1)
- fix(api-server): Various fixes and improvements [`#2496`](https://github.com/th-ch/youtube-music/pull/2496)
- fix(deps): update dependency electron-debug to v4.1.0 [`#2499`](https://github.com/th-ch/youtube-music/pull/2499)
- fix(renderer): fix force like buttons display logic [`#2493`](https://github.com/th-ch/youtube-music/pull/2493)
- fix(deps): update dependency i18next to v23.16.0 [`#2492`](https://github.com/th-ch/youtube-music/pull/2492)
- fix(downloader): fix #2371 [`#2371`](https://github.com/th-ch/youtube-music/issues/2371)
- fix(ytm-bugs): incorrect video ratio [`#2459`](https://github.com/th-ch/youtube-music/issues/2459)
- fix(api-server): fix init/authentication error [`#2497`](https://github.com/th-ch/youtube-music/issues/2497)
- fix: RSS feed CORS issue [`#1620`](https://github.com/th-ch/youtube-music/issues/1620)
- chore(flatpak-builder): Add more details when failing [`d3acb49`](https://github.com/th-ch/youtube-music/commit/d3acb4945a8dcde6598c53d8207bbf16eda8c739)
- chore(i18n): Translated using Weblate (Filipino) [`e428708`](https://github.com/th-ch/youtube-music/commit/e4287085a11f30d141148ab0432cc684819fd0d0)
- Bump version to 3.6.1 [`b668730`](https://github.com/th-ch/youtube-music/commit/b6687307dfe7ef765517019093c8db3c2ad14417)
#### [v3.6.0](https://github.com/th-ch/youtube-music/compare/v3.5.3...v3.6.0)
> 13 October 2024
- feat(api-server): remote control api [`#1909`](https://github.com/th-ch/youtube-music/pull/1909)
- chore(deps): update playwright monorepo to v1.48.0 [`#2489`](https://github.com/th-ch/youtube-music/pull/2489)
- fix(`synced-lyrics`): Fix 2 issues [`#2441`](https://github.com/th-ch/youtube-music/pull/2441)
- chore(deps): update dependency typescript to v5.6.3 [`#2486`](https://github.com/th-ch/youtube-music/pull/2486)
- chore(deps): update dependency electron to v32.2.0 [`#2487`](https://github.com/th-ch/youtube-music/pull/2487)
- chore(deps): update dependency del-cli to v6 [`#2475`](https://github.com/th-ch/youtube-music/pull/2475)
- chore(deps): update dependency typescript-eslint to v8.8.1 [`#2477`](https://github.com/th-ch/youtube-music/pull/2477)
- fix(deps): update dependency solid-js to v1.9.2 [`#2480`](https://github.com/th-ch/youtube-music/pull/2480)
- Revert "chore(deps): update dependency electron-builder to v25" [`#2488`](https://github.com/th-ch/youtube-music/pull/2488)
- chore(deps): update dependency electron-builder to v25 [`#2406`](https://github.com/th-ch/youtube-music/pull/2406)
- fix(deps): update dependency deepmerge-ts to v7.1.3 [`#2481`](https://github.com/th-ch/youtube-music/pull/2481)
- fix(deps): update dependency ts-morph to v24 [`#2474`](https://github.com/th-ch/youtube-music/pull/2474)
- fix(deps): update dependency i18next to v23.15.2 [`#2471`](https://github.com/th-ch/youtube-music/pull/2471)
- chore(deps): update eslint monorepo to v9.12.0 [`#2470`](https://github.com/th-ch/youtube-music/pull/2470)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.9.0 [`#2469`](https://github.com/th-ch/youtube-music/pull/2469)
- chore(deps): bump micromatch from 4.0.5 to 4.0.8 [`#2465`](https://github.com/th-ch/youtube-music/pull/2465)
- chore(deps): bump braces from 3.0.2 to 3.0.3 [`#2466`](https://github.com/th-ch/youtube-music/pull/2466)
- fix(deps): update dependency electron-updater to v6.3.9 [`#2468`](https://github.com/th-ch/youtube-music/pull/2468)
- fix(deps): update dependency deepmerge-ts to v7.1.1 [`#2467`](https://github.com/th-ch/youtube-music/pull/2467)
- chore(deps): update dependency typescript-eslint to v8.8.0 [`#2457`](https://github.com/th-ch/youtube-music/pull/2457)
- chore(deps): update dependency @babel/runtime to v7.25.7 [`#2462`](https://github.com/th-ch/youtube-music/pull/2462)
- chore(deps): update dependency rollup to v4.24.0 [`#2458`](https://github.com/th-ch/youtube-music/pull/2458)
- chore(deps): update dependency eslint-plugin-import to v2.31.0 [`#2464`](https://github.com/th-ch/youtube-music/pull/2464)
- chore(deps): update dependency rollup to v4.22.5 [`#2448`](https://github.com/th-ch/youtube-music/pull/2448)
- chore(deps): update dependency typescript-eslint to v8.7.0 [`#2450`](https://github.com/th-ch/youtube-music/pull/2450)
- fix(deps): update dependency solid-js to v1.9.1 [`#2451`](https://github.com/th-ch/youtube-music/pull/2451)
- chore(deps): update dependency vite to v5.4.8 [`#2449`](https://github.com/th-ch/youtube-music/pull/2449)
- chore(deps): update dependency discord-api-types to v0.37.101 [`#2440`](https://github.com/th-ch/youtube-music/pull/2440)
- chore(deps): update dependency esbuild to v0.24.0 [`#2439`](https://github.com/th-ch/youtube-music/pull/2439)
- chore(deps): update eslint monorepo to v9.11.1 [`#2442`](https://github.com/th-ch/youtube-music/pull/2442)
- chore(deps): update dependency @types/howler to v2.2.12 [`#2443`](https://github.com/th-ch/youtube-music/pull/2443)
- chore(deps): update dependency vite to v5.4.7 [`#2434`](https://github.com/th-ch/youtube-music/pull/2434)
- chore(deps): update playwright monorepo to v1.47.2 [`#2436`](https://github.com/th-ch/youtube-music/pull/2436)
- chore(deps): update eslint monorepo to v9.11.0 [`#2437`](https://github.com/th-ch/youtube-music/pull/2437)
- fix(deps): update dependency youtubei.js to v10.5.0 [`#2431`](https://github.com/th-ch/youtube-music/pull/2431)
- chore(deps): update dependency rollup to v4.22.4 [`#2430`](https://github.com/th-ch/youtube-music/pull/2430)
- chore(deps): update dependency electron to v32.1.2 [`#2433`](https://github.com/th-ch/youtube-music/pull/2433)
- feat: ESLint Flat Config (v9 support #2229) [`#2426`](https://github.com/th-ch/youtube-music/pull/2426)
- fix(taskbar-mediacontrol): fix icon color [`#2485`](https://github.com/th-ch/youtube-music/issues/2485)
- chore(eslint): apply eslint-plugin-prettier [`#2438`](https://github.com/th-ch/youtube-music/issues/2438)
- fix: apply fix from eslint [`cb1381b`](https://github.com/th-ch/youtube-music/commit/cb1381bbb394e2bbb404f44817ef96411dabc8a9)
- chore(i18n): Translated using Weblate (Portuguese (Brazil)) [`bcff26c`](https://github.com/th-ch/youtube-music/commit/bcff26c85b18258806f3960309776bc860c3a54e)
- chore(i18n): Translated using Weblate (Persian) [`ead448e`](https://github.com/th-ch/youtube-music/commit/ead448ed98095339557903eb0f84c4a6d0f32058)
#### [v3.5.3](https://github.com/th-ch/youtube-music/compare/v3.5.2...v3.5.3) #### [v3.5.3](https://github.com/th-ch/youtube-music/compare/v3.5.2...v3.5.3)
> 17 September 2024
- fix: fix `trustedHTML` issue [`#2339`](https://github.com/th-ch/youtube-music/issues/2339) - fix: fix `trustedHTML` issue [`#2339`](https://github.com/th-ch/youtube-music/issues/2339)
- chore(deps): update dependency rollup to v4.21.3 [`6edc84a`](https://github.com/th-ch/youtube-music/commit/6edc84a8bd6c7e009041117ba0d2004783eb3a47) - chore(deps): update dependency rollup to v4.21.3 [`6edc84a`](https://github.com/th-ch/youtube-music/commit/6edc84a8bd6c7e009041117ba0d2004783eb3a47)
- chore(deps): update typescript-eslint monorepo to v8.6.0 [`d4c8a43`](https://github.com/th-ch/youtube-music/commit/d4c8a4320d733f7bddc4dcd1de93644790e71d66) - chore(deps): update typescript-eslint monorepo to v8.6.0 [`d4c8a43`](https://github.com/th-ch/youtube-music/commit/d4c8a4320d733f7bddc4dcd1de93644790e71d66)

View File

@ -1,7 +1,7 @@
{ {
"name": "youtube-music", "name": "youtube-music",
"productName": "YouTube Music", "productName": "YouTube Music",
"version": "3.6.0", "version": "3.6.2",
"description": "YouTube Music Desktop App - including custom plugins", "description": "YouTube Music Desktop App - including custom plugins",
"main": "./dist/main/index.js", "main": "./dist/main/index.js",
"license": "MIT", "license": "MIT",
@ -40,7 +40,8 @@
] ]
} }
], ],
"icon": "assets/generated/icons/mac/icon.icns" "icon": "assets/generated/icons/mac/icon.icns",
"compression": "maximum"
}, },
"win": { "win": {
"icon": "assets/generated/icons/win/icon.ico", "icon": "assets/generated/icons/win/icon.ico",
@ -61,7 +62,8 @@
"arm64" "arm64"
] ]
} }
] ],
"compression": "maximum"
}, },
"nsisWeb": { "nsisWeb": {
"runAfterFinish": false "runAfterFinish": false
@ -70,13 +72,67 @@
"icon": "assets/generated/icons/png", "icon": "assets/generated/icons/png",
"category": "AudioVideo", "category": "AudioVideo",
"target": [ "target": [
"AppImage", {
"snap", "target": "AppImage",
"freebsd", "arch": [
"deb", "x64",
"rpm" "arm64",
"armv7l"
]
},
{
"target": "flatpak",
"arch": [
"x64"
]
},
{
"target": "deb",
"arch": [
"x64",
"arm64",
"armv7l"
]
},
{
"target": "rpm",
"arch": [
"x64",
"arm64"
]
},
{
"target": "snap",
"arch": [
"x64"
]
},
{
"target": "freebsd",
"arch": [
"x64",
"arm64",
"armv7l"
]
},
{
"target": "tar.gz",
"arch": [
"x64",
"arm64",
"armv7l"
]
}
] ]
}, },
"appImage": {
"description": "YouTube Music Desktop App bundled with custom plugins (and built-in ad blocker / downloader)",
"category": "AudioVideo"
},
"flatpak": {
"description": "YouTube Music Desktop App bundled with custom plugins (and built-in ad blocker / downloader)",
"category": "AudioVideo"
},
"deb": { "deb": {
"depends": [ "depends": [
"libgtk-3-0", "libgtk-3-0",
@ -139,7 +195,7 @@
"typecheck": "tsc -p tsconfig.json --noEmit" "typecheck": "tsc -p tsconfig.json --noEmit"
}, },
"engines": { "engines": {
"node": ">=18.0.0", "node": ">=18",
"pnpm": ">=8" "pnpm": ">=8"
}, },
"pnpm": { "pnpm": {
@ -153,7 +209,8 @@
}, },
"patchedDependencies": { "patchedDependencies": {
"vudio@2.1.1": "patches/vudio@2.1.1.patch", "vudio@2.1.1": "patches/vudio@2.1.1.patch",
"app-builder-lib@24.13.3": "patches/app-builder-lib@24.13.3.patch" "app-builder-lib@24.13.3": "patches/app-builder-lib@24.13.3.patch",
"@malept/flatpak-bundler": "patches/@malept__flatpak-bundler.patch"
} }
}, },
"dependencies": { "dependencies": {
@ -182,7 +239,7 @@
"custom-electron-prompt": "1.5.8", "custom-electron-prompt": "1.5.8",
"dbus-next": "0.10.2", "dbus-next": "0.10.2",
"deepmerge-ts": "7.1.3", "deepmerge-ts": "7.1.3",
"electron-debug": "4.0.1", "electron-debug": "4.1.0",
"electron-is": "3.0.0", "electron-is": "3.0.0",
"electron-localshortcut": "3.2.1", "electron-localshortcut": "3.2.1",
"electron-store": "10.0.0", "electron-store": "10.0.0",
@ -191,10 +248,10 @@
"fast-average-color": "9.4.0", "fast-average-color": "9.4.0",
"fast-equals": "5.0.1", "fast-equals": "5.0.1",
"filenamify": "6.0.0", "filenamify": "6.0.0",
"hono": "4.6.4", "hono": "4.6.5",
"howler": "2.2.4", "howler": "2.2.4",
"html-to-text": "9.0.5", "html-to-text": "9.0.5",
"i18next": "23.15.2", "i18next": "23.16.0",
"jimp": "1.6.0", "jimp": "1.6.0",
"keyboardevent-from-electron-accelerator": "2.0.0", "keyboardevent-from-electron-accelerator": "2.0.0",
"keyboardevents-areequal": "0.2.2", "keyboardevents-areequal": "0.2.2",
@ -202,7 +259,7 @@
"node-id3": "0.2.6", "node-id3": "0.2.6",
"peerjs": "1.5.4", "peerjs": "1.5.4",
"semver": "7.6.3", "semver": "7.6.3",
"serve": "14.2.3", "serve": "14.2.4",
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9", "simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
"solid-floating-ui": "0.3.1", "solid-floating-ui": "0.3.1",
"solid-js": "1.9.2", "solid-js": "1.9.2",
@ -230,8 +287,8 @@
"builtin-modules": "4.0.0", "builtin-modules": "4.0.0",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"del-cli": "6.0.0", "del-cli": "6.0.0",
"discord-api-types": "0.37.101", "discord-api-types": "0.37.102",
"electron": "32.2.0", "electron": "33.0.0",
"electron-builder": "24.13.3", "electron-builder": "24.13.3",
"electron-devtools-installer": "3.2.0", "electron-devtools-installer": "3.2.0",
"electron-vite": "2.3.0", "electron-vite": "2.3.0",
@ -247,9 +304,9 @@
"playwright": "1.48.0", "playwright": "1.48.0",
"rollup": "4.24.0", "rollup": "4.24.0",
"typescript": "5.6.3", "typescript": "5.6.3",
"typescript-eslint": "8.8.1", "typescript-eslint": "8.9.0",
"utf-8-validate": "6.0.4", "utf-8-validate": "6.0.4",
"vite": "5.4.8", "vite": "5.4.9",
"vite-plugin-inspect": "0.8.7", "vite-plugin-inspect": "0.8.7",
"vite-plugin-resolve": "2.5.2", "vite-plugin-resolve": "2.5.2",
"vite-plugin-solid": "2.10.2", "vite-plugin-solid": "2.10.2",

View File

@ -0,0 +1,29 @@
diff --git a/index.js b/index.js
index 5968fcf47b69094993b0f861c03f5560e4a6a9b7..0fe16d4f40612c0abfa57898909ce0083f56944c 100644
--- a/index.js
+++ b/index.js
@@ -56,19 +56,23 @@ function getOptionsWithDefaults (options, manifest) {
async function spawnWithLogging (options, command, args, allowFail) {
return new Promise((resolve, reject) => {
logger(`$ ${command} ${args.join(' ')}`)
+ const output = []
const child = childProcess.spawn(command, args, { cwd: options['working-dir'] })
child.stdout.on('data', (data) => {
+ output.push(data)
logger(`1> ${data}`)
})
child.stderr.on('data', (data) => {
+ output.push(data)
logger(`2> ${data}`)
})
child.on('error', (error) => {
+ logger(`error - ${error.message} ${error.stack}`)
reject(error)
})
child.on('close', (code) => {
if (!allowFail && code !== 0) {
- reject(new Error(`${command} failed with status code ${code}`))
+ reject(new Error(`${command} ${args.join(' ')} failed with status code ${code} ${output.join(' ')}`))
}
resolve(code === 0)
})

316
pnpm-lock.yaml generated
View File

@ -13,6 +13,9 @@ overrides:
'@babel/runtime': 7.25.7 '@babel/runtime': 7.25.7
patchedDependencies: patchedDependencies:
'@malept/flatpak-bundler':
hash: vli4xtu6rndz3xtsscixhngsxa
path: patches/@malept__flatpak-bundler.patch
app-builder-lib@24.13.3: app-builder-lib@24.13.3:
hash: zcnm2qnjaggm2keyecnhiglkke hash: zcnm2qnjaggm2keyecnhiglkke
path: patches/app-builder-lib@24.13.3.patch path: patches/app-builder-lib@24.13.3.patch
@ -26,16 +29,16 @@ importers:
dependencies: dependencies:
'@cliqz/adblocker-electron': '@cliqz/adblocker-electron':
specifier: 1.27.1 specifier: 1.27.1
version: 1.27.1(electron@32.2.0) version: 1.27.1(electron@33.0.0)
'@cliqz/adblocker-electron-preload': '@cliqz/adblocker-electron-preload':
specifier: 1.27.1 specifier: 1.27.1
version: 1.27.1(electron@32.2.0) version: 1.27.1(electron@33.0.0)
'@electron-toolkit/tsconfig': '@electron-toolkit/tsconfig':
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1(@types/node@20.12.5) version: 1.0.1(@types/node@20.12.5)
'@electron/remote': '@electron/remote':
specifier: 2.1.2 specifier: 2.1.2
version: 2.1.2(electron@32.2.0) version: 2.1.2(electron@33.0.0)
'@ffmpeg.wasm/core-mt': '@ffmpeg.wasm/core-mt':
specifier: 0.12.0 specifier: 0.12.0
version: 0.12.0 version: 0.12.0
@ -50,16 +53,16 @@ importers:
version: 2.0.5 version: 2.0.5
'@hono/node-server': '@hono/node-server':
specifier: 1.13.2 specifier: 1.13.2
version: 1.13.2(hono@4.6.4) version: 1.13.2(hono@4.6.5)
'@hono/swagger-ui': '@hono/swagger-ui':
specifier: 0.4.1 specifier: 0.4.1
version: 0.4.1(hono@4.6.4) version: 0.4.1(hono@4.6.5)
'@hono/zod-openapi': '@hono/zod-openapi':
specifier: 0.16.4 specifier: 0.16.4
version: 0.16.4(hono@4.6.4)(zod@3.23.8) version: 0.16.4(hono@4.6.5)(zod@3.23.8)
'@hono/zod-validator': '@hono/zod-validator':
specifier: 0.4.1 specifier: 0.4.1
version: 0.4.1(hono@4.6.4)(zod@3.23.8) version: 0.4.1(hono@4.6.5)(zod@3.23.8)
'@jellybrick/electron-better-web-request': '@jellybrick/electron-better-web-request':
specifier: 1.0.4 specifier: 1.0.4
version: 1.0.4 version: 1.0.4
@ -92,7 +95,7 @@ importers:
version: 13.0.1 version: 13.0.1
custom-electron-prompt: custom-electron-prompt:
specifier: 1.5.8 specifier: 1.5.8
version: 1.5.8(electron@32.2.0) version: 1.5.8(electron@33.0.0)
dbus-next: dbus-next:
specifier: 0.10.2 specifier: 0.10.2
version: 0.10.2 version: 0.10.2
@ -100,8 +103,8 @@ importers:
specifier: 7.1.3 specifier: 7.1.3
version: 7.1.3 version: 7.1.3
electron-debug: electron-debug:
specifier: 4.0.1 specifier: 4.1.0
version: 4.0.1 version: 4.1.0
electron-is: electron-is:
specifier: 3.0.0 specifier: 3.0.0
version: 3.0.0 version: 3.0.0
@ -127,8 +130,8 @@ importers:
specifier: 6.0.0 specifier: 6.0.0
version: 6.0.0 version: 6.0.0
hono: hono:
specifier: 4.6.4 specifier: 4.6.5
version: 4.6.4 version: 4.6.5
howler: howler:
specifier: 2.2.4 specifier: 2.2.4
version: 2.2.4 version: 2.2.4
@ -136,8 +139,8 @@ importers:
specifier: 9.0.5 specifier: 9.0.5
version: 9.0.5 version: 9.0.5
i18next: i18next:
specifier: 23.15.2 specifier: 23.16.0
version: 23.15.2 version: 23.16.0
jimp: jimp:
specifier: 1.6.0 specifier: 1.6.0
version: 1.6.0 version: 1.6.0
@ -160,8 +163,8 @@ importers:
specifier: 7.6.3 specifier: 7.6.3
version: 7.6.3 version: 7.6.3
serve: serve:
specifier: 14.2.3 specifier: 14.2.4
version: 14.2.3 version: 14.2.4
simple-youtube-age-restriction-bypass: simple-youtube-age-restriction-bypass:
specifier: github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9 specifier: github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9
version: https://codeload.github.com/organization/Simple-YouTube-Age-Restriction-Bypass/tar.gz/4e2db89ccb2fb880c5110add9ff3f1dfb78d0ff6 version: https://codeload.github.com/organization/Simple-YouTube-Age-Restriction-Bypass/tar.gz/4e2db89ccb2fb880c5110add9ff3f1dfb78d0ff6
@ -239,11 +242,11 @@ importers:
specifier: 6.0.0 specifier: 6.0.0
version: 6.0.0 version: 6.0.0
discord-api-types: discord-api-types:
specifier: 0.37.101 specifier: 0.37.102
version: 0.37.101 version: 0.37.102
electron: electron:
specifier: 32.2.0 specifier: 33.0.0
version: 32.2.0 version: 33.0.0
electron-builder: electron-builder:
specifier: 24.13.3 specifier: 24.13.3
version: 24.13.3(electron-builder-squirrel-windows@24.13.3) version: 24.13.3(electron-builder-squirrel-windows@24.13.3)
@ -252,7 +255,7 @@ importers:
version: 3.2.0 version: 3.2.0
electron-vite: electron-vite:
specifier: 2.3.0 specifier: 2.3.0
version: 2.3.0(vite@5.4.8(@types/node@20.12.5)) version: 2.3.0(vite@5.4.9(@types/node@20.12.5))
esbuild: esbuild:
specifier: 0.24.0 specifier: 0.24.0
version: 0.24.0 version: 0.24.0
@ -267,10 +270,10 @@ importers:
version: 1.0.0-beta.5(eslint-plugin-import@2.31.0)(eslint@9.12.0) version: 1.0.0-beta.5(eslint-plugin-import@2.31.0)(eslint@9.12.0)
eslint-import-resolver-typescript: eslint-import-resolver-typescript:
specifier: 3.6.3 specifier: 3.6.3
version: 3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0) version: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0)
eslint-plugin-import: eslint-plugin-import:
specifier: 2.31.0 specifier: 2.31.0
version: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) version: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0)
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: 5.2.1 specifier: 5.2.1
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3) version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3)
@ -290,23 +293,23 @@ importers:
specifier: 5.6.3 specifier: 5.6.3
version: 5.6.3 version: 5.6.3
typescript-eslint: typescript-eslint:
specifier: 8.8.1 specifier: 8.9.0
version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) version: 8.9.0(eslint@9.12.0)(typescript@5.6.3)
utf-8-validate: utf-8-validate:
specifier: 6.0.4 specifier: 6.0.4
version: 6.0.4 version: 6.0.4
vite: vite:
specifier: 5.4.8 specifier: 5.4.9
version: 5.4.8(@types/node@20.12.5) version: 5.4.9(@types/node@20.12.5)
vite-plugin-inspect: vite-plugin-inspect:
specifier: 0.8.7 specifier: 0.8.7
version: 0.8.7(rollup@4.24.0)(vite@5.4.8(@types/node@20.12.5)) version: 0.8.7(rollup@4.24.0)(vite@5.4.9(@types/node@20.12.5))
vite-plugin-resolve: vite-plugin-resolve:
specifier: 2.5.2 specifier: 2.5.2
version: 2.5.2 version: 2.5.2
vite-plugin-solid: vite-plugin-solid:
specifier: 2.10.2 specifier: 2.10.2
version: 2.10.2(solid-js@1.9.2)(vite@5.4.8(@types/node@20.12.5)) version: 2.10.2(solid-js@1.9.2)(vite@5.4.9(@types/node@20.12.5))
ws: ws:
specifier: 8.18.0 specifier: 8.18.0
version: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) version: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
@ -1384,8 +1387,8 @@ packages:
'@types/yauzl@2.10.3': '@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@typescript-eslint/eslint-plugin@8.8.1': '@typescript-eslint/eslint-plugin@8.9.0':
resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} resolution: {integrity: sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@ -1395,8 +1398,8 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/parser@8.8.1': '@typescript-eslint/parser@8.9.0':
resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} resolution: {integrity: sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@ -1405,12 +1408,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/scope-manager@8.8.1': '@typescript-eslint/scope-manager@8.9.0':
resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@8.8.1': '@typescript-eslint/type-utils@8.9.0':
resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} resolution: {integrity: sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -1418,12 +1421,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/types@8.8.1': '@typescript-eslint/types@8.9.0':
resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.8.1': '@typescript-eslint/typescript-estree@8.9.0':
resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} resolution: {integrity: sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -1431,14 +1434,14 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/utils@8.8.1': '@typescript-eslint/utils@8.9.0':
resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
'@typescript-eslint/visitor-keys@8.8.1': '@typescript-eslint/visitor-keys@8.9.0':
resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vladfrangu/async_event_emitter@2.4.4': '@vladfrangu/async_event_emitter@2.4.4':
@ -2027,8 +2030,8 @@ packages:
dir-compare@4.2.0: dir-compare@4.2.0:
resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}
discord-api-types@0.37.101: discord-api-types@0.37.102:
resolution: {integrity: sha512-2wizd94t7G3A8U5Phr3AiuL4gSvhqistDwWnlk1VLTit8BI1jWUncFqFQNdPbHqS3661+Nx/iEyIwtVjPuBP3w==} resolution: {integrity: sha512-5+m5twqG8n77rLhKuh2c/971UWszEL/c3KbdvVLUBTPXuS8PbYC/7W7NYhwP02qowjj6CHoKYZbD0ppOUCsT6g==}
discord-api-types@0.37.83: discord-api-types@0.37.83:
resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==}
@ -2095,8 +2098,8 @@ packages:
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
hasBin: true hasBin: true
electron-debug@4.0.1: electron-debug@4.1.0:
resolution: {integrity: sha512-PdUG3SvcK70P05z99PFLUzn0+lPZl5c4quG1bXI7OtPaXxidwh8UONcdRLsr+6J9kf5y1FycJD5nBd80dYrcsA==} resolution: {integrity: sha512-rdbvmotqbaNcSuinPe1tzB5zK+JKal+4LSDbguBcqTLARNqWrGoRS/TkR1gGH4+63boYH3HUaf9r9ECAxgIe9g==}
engines: {node: '>=18'} engines: {node: '>=18'}
electron-devtools-installer@3.2.0: electron-devtools-installer@3.2.0:
@ -2148,8 +2151,8 @@ packages:
'@swc/core': '@swc/core':
optional: true optional: true
electron@32.2.0: electron@33.0.0:
resolution: {integrity: sha512-Xy82QBQrEiQysoxsv6lnhHAcWNNe6vV6QqH3OPFXhEj/T9oAsBHEhZuuYHINSSsUE7zRSj+J9sNwJYOjisT0Vw==} resolution: {integrity: sha512-OdLLR/zAVuNfKahSSYokZmSi7uK2wEYTbCoiIdqWLsOWmCqO9j0JC2XkYQmXQcAk2BJY0ri4lxwAfc5pzPDYsA==}
engines: {node: '>= 12.20.55'} engines: {node: '>= 12.20.55'}
hasBin: true hasBin: true
@ -2416,9 +2419,6 @@ packages:
fast-levenshtein@2.0.6: fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fast-url-parser@1.1.3:
resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
fastq@1.16.0: fastq@1.16.0:
resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==}
@ -2669,8 +2669,8 @@ packages:
resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==} resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==}
hasBin: true hasBin: true
hono@4.6.4: hono@4.6.5:
resolution: {integrity: sha512-T5WqBkTOcIQblqBKB5mpzaH/A+dSpvVe938xZJCHOmOuYfF7DSwE/9/10+BMvwSPq9N/f6LiQ38HxrZSQOsXKw==} resolution: {integrity: sha512-qsmN3V5fgtwdKARGLgwwHvcdLKursMd+YOt69eGpl1dUCJb8mCd7hZfyZnBYjxCegBG7qkJRQRUy2oO25yHcyQ==}
engines: {node: '>=16.9.0'} engines: {node: '>=16.9.0'}
hosted-git-info@4.1.0: hosted-git-info@4.1.0:
@ -2717,8 +2717,8 @@ packages:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'} engines: {node: '>=10.17.0'}
i18next@23.15.2: i18next@23.16.0:
resolution: {integrity: sha512-zcPSWzCvw6uKnuYHIqs4W7hTuB9e3AFcSdZgvCWoPXIZsBjBd4djN2/2uOHIB+1DFFkQnMBXvhNg7J3WyCuywQ==} resolution: {integrity: sha512-Ni3CG6c14teOogY19YNRl+kYaE/Rb59khy0VyHVn4uOZ97E2E/Yziyi6r3C3s9+wacjdLZiq/LLYyx+Cgd+FCw==}
iconv-corefoundation@1.1.7: iconv-corefoundation@1.1.7:
resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==}
@ -3453,8 +3453,8 @@ packages:
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
engines: {node: 20 || >=22} engines: {node: 20 || >=22}
path-to-regexp@2.2.1: path-to-regexp@3.3.0:
resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
path-type@5.0.0: path-type@5.0.0:
resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
@ -3568,9 +3568,6 @@ packages:
pump@3.0.0: pump@3.0.0:
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
punycode@1.4.1:
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
punycode@2.3.1: punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3746,11 +3743,11 @@ packages:
resolution: {integrity: sha512-74Wpe+hhPx4V8NFe00I2Fu9gTJopKoH5vE7nCqFzVgKOXV8AnN23T58K79QLYQotzGpH93UZ+UN2Y11j9huZJg==} resolution: {integrity: sha512-74Wpe+hhPx4V8NFe00I2Fu9gTJopKoH5vE7nCqFzVgKOXV8AnN23T58K79QLYQotzGpH93UZ+UN2Y11j9huZJg==}
engines: {node: '>=10'} engines: {node: '>=10'}
serve-handler@6.1.5: serve-handler@6.1.6:
resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==}
serve@14.2.3: serve@14.2.4:
resolution: {integrity: sha512-VqUFMC7K3LDGeGnJM9h56D3XGKb6KGgOw0cVNtA26yYXHCcpxf3xwCTUaQoWlVS7i8Jdh3GjQkOB23qsXyjoyQ==} resolution: {integrity: sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==}
engines: {node: '>= 14'} engines: {node: '>= 14'}
hasBin: true hasBin: true
@ -4071,8 +4068,8 @@ packages:
resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
typescript-eslint@8.8.1: typescript-eslint@8.9.0:
resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} resolution: {integrity: sha512-AuD/FXGYRQyqyOBCpNLldMlsCGvmDNxptQ3Dp58/NXeB+FqyvTfXmMyba3PYa0Vi9ybnj7G8S/yd/4Cw8y47eA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -4192,8 +4189,8 @@ packages:
'@testing-library/jest-dom': '@testing-library/jest-dom':
optional: true optional: true
vite@5.4.8: vite@5.4.9:
resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} resolution: {integrity: sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==}
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -4535,16 +4532,16 @@ snapshots:
dependencies: dependencies:
'@cliqz/adblocker-extended-selectors': 1.27.6 '@cliqz/adblocker-extended-selectors': 1.27.6
'@cliqz/adblocker-electron-preload@1.27.1(electron@32.2.0)': '@cliqz/adblocker-electron-preload@1.27.1(electron@33.0.0)':
dependencies: dependencies:
'@cliqz/adblocker-content': 1.27.6 '@cliqz/adblocker-content': 1.27.6
electron: 32.2.0 electron: 33.0.0
'@cliqz/adblocker-electron@1.27.1(electron@32.2.0)': '@cliqz/adblocker-electron@1.27.1(electron@33.0.0)':
dependencies: dependencies:
'@cliqz/adblocker': 1.27.6 '@cliqz/adblocker': 1.27.6
'@cliqz/adblocker-electron-preload': 1.27.1(electron@32.2.0) '@cliqz/adblocker-electron-preload': 1.27.1(electron@33.0.0)
electron: 32.2.0 electron: 33.0.0
tldts-experimental: 6.1.2 tldts-experimental: 6.1.2
'@cliqz/adblocker-extended-selectors@1.27.6': {} '@cliqz/adblocker-extended-selectors@1.27.6': {}
@ -4624,9 +4621,9 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@electron/remote@2.1.2(electron@32.2.0)': '@electron/remote@2.1.2(electron@33.0.0)':
dependencies: dependencies:
electron: 32.2.0 electron: 33.0.0
'@electron/universal@2.0.1': '@electron/universal@2.0.1':
dependencies: dependencies:
@ -4843,29 +4840,29 @@ snapshots:
'@foobar404/wave@2.0.5': {} '@foobar404/wave@2.0.5': {}
'@hono/node-server@1.13.2(hono@4.6.4)': '@hono/node-server@1.13.2(hono@4.6.5)':
dependencies: dependencies:
hono: 4.6.4 hono: 4.6.5
'@hono/swagger-ui@0.4.1(hono@4.6.4)': '@hono/swagger-ui@0.4.1(hono@4.6.5)':
dependencies: dependencies:
hono: 4.6.4 hono: 4.6.5
'@hono/zod-openapi@0.16.4(hono@4.6.4)(zod@3.23.8)': '@hono/zod-openapi@0.16.4(hono@4.6.5)(zod@3.23.8)':
dependencies: dependencies:
'@asteasolutions/zod-to-openapi': 7.2.0(zod@3.23.8) '@asteasolutions/zod-to-openapi': 7.2.0(zod@3.23.8)
'@hono/zod-validator': 0.3.0(hono@4.6.4)(zod@3.23.8) '@hono/zod-validator': 0.3.0(hono@4.6.5)(zod@3.23.8)
hono: 4.6.4 hono: 4.6.5
zod: 3.23.8 zod: 3.23.8
'@hono/zod-validator@0.3.0(hono@4.6.4)(zod@3.23.8)': '@hono/zod-validator@0.3.0(hono@4.6.5)(zod@3.23.8)':
dependencies: dependencies:
hono: 4.6.4 hono: 4.6.5
zod: 3.23.8 zod: 3.23.8
'@hono/zod-validator@0.4.1(hono@4.6.4)(zod@3.23.8)': '@hono/zod-validator@0.4.1(hono@4.6.5)(zod@3.23.8)':
dependencies: dependencies:
hono: 4.6.4 hono: 4.6.5
zod: 3.23.8 zod: 3.23.8
'@humanfs/core@0.19.0': {} '@humanfs/core@0.19.0': {}
@ -5135,7 +5132,7 @@ snapshots:
dependencies: dependencies:
cross-spawn: 7.0.3 cross-spawn: 7.0.3
'@malept/flatpak-bundler@0.4.0': '@malept/flatpak-bundler@0.4.0(patch_hash=vli4xtu6rndz3xtsscixhngsxa)':
dependencies: dependencies:
debug: 4.3.7 debug: 4.3.7
fs-extra: 9.1.0 fs-extra: 9.1.0
@ -5361,7 +5358,7 @@ snapshots:
'@types/electron-localshortcut@3.1.3': '@types/electron-localshortcut@3.1.3':
dependencies: dependencies:
electron: 32.2.0 electron: 33.0.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5434,14 +5431,14 @@ snapshots:
'@types/node': 20.12.5 '@types/node': 20.12.5
optional: true optional: true
'@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.11.1 '@eslint-community/regexpp': 4.11.1
'@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
'@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/scope-manager': 8.9.0
'@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.8.1 '@typescript-eslint/visitor-keys': 8.9.0
eslint: 9.12.0 eslint: 9.12.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
@ -5452,12 +5449,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)': '@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/scope-manager': 8.9.0
'@typescript-eslint/types': 8.8.1 '@typescript-eslint/types': 8.9.0
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.8.1 '@typescript-eslint/visitor-keys': 8.9.0
debug: 4.3.7 debug: 4.3.7
eslint: 9.12.0 eslint: 9.12.0
optionalDependencies: optionalDependencies:
@ -5465,15 +5462,15 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.8.1': '@typescript-eslint/scope-manager@8.9.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.8.1 '@typescript-eslint/types': 8.9.0
'@typescript-eslint/visitor-keys': 8.8.1 '@typescript-eslint/visitor-keys': 8.9.0
'@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': '@typescript-eslint/type-utils@8.9.0(eslint@9.12.0)(typescript@5.6.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3)
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
debug: 4.3.7 debug: 4.3.7
ts-api-utils: 1.3.0(typescript@5.6.3) ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies: optionalDependencies:
@ -5482,12 +5479,12 @@ snapshots:
- eslint - eslint
- supports-color - supports-color
'@typescript-eslint/types@8.8.1': {} '@typescript-eslint/types@8.9.0': {}
'@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': '@typescript-eslint/typescript-estree@8.9.0(typescript@5.6.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.8.1 '@typescript-eslint/types': 8.9.0
'@typescript-eslint/visitor-keys': 8.8.1 '@typescript-eslint/visitor-keys': 8.9.0
debug: 4.3.7 debug: 4.3.7
fast-glob: 3.3.2 fast-glob: 3.3.2
is-glob: 4.0.3 is-glob: 4.0.3
@ -5499,20 +5496,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': '@typescript-eslint/utils@8.9.0(eslint@9.12.0)(typescript@5.6.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
'@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/scope-manager': 8.9.0
'@typescript-eslint/types': 8.8.1 '@typescript-eslint/types': 8.9.0
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3)
eslint: 9.12.0 eslint: 9.12.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
'@typescript-eslint/visitor-keys@8.8.1': '@typescript-eslint/visitor-keys@8.9.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.8.1 '@typescript-eslint/types': 8.9.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@vladfrangu/async_event_emitter@2.4.4': {} '@vladfrangu/async_event_emitter@2.4.4': {}
@ -5521,7 +5518,7 @@ snapshots:
dependencies: dependencies:
'@discordjs/rest': 2.3.0 '@discordjs/rest': 2.3.0
'@vladfrangu/async_event_emitter': 2.4.4 '@vladfrangu/async_event_emitter': 2.4.4
discord-api-types: 0.37.101 discord-api-types: 0.37.102
ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
@ -5618,7 +5615,7 @@ snapshots:
'@electron/notarize': 2.2.1 '@electron/notarize': 2.2.1
'@electron/osx-sign': 1.0.5 '@electron/osx-sign': 1.0.5
'@electron/universal': 2.0.1 '@electron/universal': 2.0.1
'@malept/flatpak-bundler': 0.4.0 '@malept/flatpak-bundler': 0.4.0(patch_hash=vli4xtu6rndz3xtsscixhngsxa)
'@types/fs-extra': 9.0.13 '@types/fs-extra': 9.0.13
async-exit-hook: 2.0.1 async-exit-hook: 2.0.1
bluebird-lst: 1.0.9 bluebird-lst: 1.0.9
@ -6118,9 +6115,9 @@ snapshots:
csstype@3.1.3: {} csstype@3.1.3: {}
custom-electron-prompt@1.5.8(electron@32.2.0): custom-electron-prompt@1.5.8(electron@33.0.0):
dependencies: dependencies:
electron: 32.2.0 electron: 33.0.0
data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@4.0.1: {}
@ -6252,7 +6249,7 @@ snapshots:
minimatch: 3.1.2 minimatch: 3.1.2
p-limit: 3.1.0 p-limit: 3.1.0
discord-api-types@0.37.101: {} discord-api-types@0.37.102: {}
discord-api-types@0.37.83: {} discord-api-types@0.37.83: {}
@ -6351,7 +6348,7 @@ snapshots:
- electron-builder-squirrel-windows - electron-builder-squirrel-windows
- supports-color - supports-color
electron-debug@4.0.1: electron-debug@4.1.0:
dependencies: dependencies:
electron-is-dev: 3.0.1 electron-is-dev: 3.0.1
electron-localshortcut: 3.2.1 electron-localshortcut: 3.2.1
@ -6427,7 +6424,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
electron-vite@2.3.0(vite@5.4.8(@types/node@20.12.5)): electron-vite@2.3.0(vite@5.4.9(@types/node@20.12.5)):
dependencies: dependencies:
'@babel/core': 7.24.7 '@babel/core': 7.24.7
'@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7)
@ -6435,11 +6432,11 @@ snapshots:
esbuild: 0.21.5 esbuild: 0.21.5
magic-string: 0.30.10 magic-string: 0.30.10
picocolors: 1.0.1 picocolors: 1.0.1
vite: 5.4.8(@types/node@20.12.5) vite: 5.4.9(@types/node@20.12.5)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
electron@32.2.0: electron@33.0.0:
dependencies: dependencies:
'@electron/get': 2.0.3 '@electron/get': 2.0.3
'@types/node': 20.12.5 '@types/node': 20.12.5
@ -6633,7 +6630,7 @@ snapshots:
eslint-import-resolver-exports@1.0.0-beta.5(eslint-plugin-import@2.31.0)(eslint@9.12.0): eslint-import-resolver-exports@1.0.0-beta.5(eslint-plugin-import@2.31.0)(eslint@9.12.0):
dependencies: dependencies:
eslint: 9.12.0 eslint: 9.12.0
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0)
resolve.exports: 2.0.2 resolve.exports: 2.0.2
eslint-import-resolver-node@0.3.9: eslint-import-resolver-node@0.3.9:
@ -6644,37 +6641,37 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0): eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.3.7 debug: 4.3.7
enhanced-resolve: 5.15.0 enhanced-resolve: 5.15.0
eslint: 9.12.0 eslint: 9.12.0
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0)
fast-glob: 3.3.2 fast-glob: 3.3.2
get-tsconfig: 4.8.0 get-tsconfig: 4.8.0
is-bun-module: 1.1.0 is-bun-module: 1.1.0
is-glob: 4.0.3 is-glob: 4.0.3
optionalDependencies: optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@typescript-eslint/parser' - '@typescript-eslint/parser'
- eslint-import-resolver-node - eslint-import-resolver-node
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0): eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
eslint: 9.12.0 eslint: 9.12.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@9.12.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0): eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.8 array-includes: 3.1.8
@ -6685,7 +6682,7 @@ snapshots:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.12.0 eslint: 9.12.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0) eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0)
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.15.1 is-core-module: 2.15.1
is-glob: 4.0.3 is-glob: 4.0.3
@ -6697,7 +6694,7 @@ snapshots:
string.prototype.trimend: 1.0.8 string.prototype.trimend: 1.0.8
tsconfig-paths: 3.15.0 tsconfig-paths: 3.15.0
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
@ -6845,10 +6842,6 @@ snapshots:
fast-levenshtein@2.0.6: {} fast-levenshtein@2.0.6: {}
fast-url-parser@1.1.3:
dependencies:
punycode: 1.4.1
fastq@1.16.0: fastq@1.16.0:
dependencies: dependencies:
reusify: 1.0.4 reusify: 1.0.4
@ -7127,7 +7120,7 @@ snapshots:
hexy@0.2.11: {} hexy@0.2.11: {}
hono@4.6.4: {} hono@4.6.5: {}
hosted-git-info@4.1.0: hosted-git-info@4.1.0:
dependencies: dependencies:
@ -7190,7 +7183,7 @@ snapshots:
human-signals@2.1.0: {} human-signals@2.1.0: {}
i18next@23.15.2: i18next@23.16.0:
dependencies: dependencies:
'@babel/runtime': 7.25.7 '@babel/runtime': 7.25.7
@ -7887,7 +7880,7 @@ snapshots:
lru-cache: 11.0.0 lru-cache: 11.0.0
minipass: 7.1.2 minipass: 7.1.2
path-to-regexp@2.2.1: {} path-to-regexp@3.3.0: {}
path-type@5.0.0: {} path-type@5.0.0: {}
@ -7978,8 +7971,6 @@ snapshots:
end-of-stream: 1.4.4 end-of-stream: 1.4.4
once: 1.4.0 once: 1.4.0
punycode@1.4.1: {}
punycode@2.3.1: {} punycode@2.3.1: {}
queue-microtask@1.2.3: {} queue-microtask@1.2.3: {}
@ -8171,18 +8162,17 @@ snapshots:
seroval@1.1.0: {} seroval@1.1.0: {}
serve-handler@6.1.5: serve-handler@6.1.6:
dependencies: dependencies:
bytes: 3.0.0 bytes: 3.0.0
content-disposition: 0.5.2 content-disposition: 0.5.2
fast-url-parser: 1.1.3
mime-types: 2.1.18 mime-types: 2.1.18
minimatch: 3.1.2 minimatch: 3.1.2
path-is-inside: 1.0.2 path-is-inside: 1.0.2
path-to-regexp: 2.2.1 path-to-regexp: 3.3.0
range-parser: 1.2.0 range-parser: 1.2.0
serve@14.2.3: serve@14.2.4:
dependencies: dependencies:
'@zeit/schemas': 2.36.0 '@zeit/schemas': 2.36.0
ajv: 8.12.0 ajv: 8.12.0
@ -8193,7 +8183,7 @@ snapshots:
clipboardy: 3.0.0 clipboardy: 3.0.0
compression: 1.7.4 compression: 1.7.4
is-port-reachable: 4.0.0 is-port-reachable: 4.0.0
serve-handler: 6.1.5 serve-handler: 6.1.6
update-check: 1.5.4 update-check: 1.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -8548,11 +8538,11 @@ snapshots:
is-typed-array: 1.1.13 is-typed-array: 1.1.13
possible-typed-array-names: 1.0.0 possible-typed-array-names: 1.0.0
typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3): typescript-eslint@8.9.0(eslint@9.12.0)(typescript@5.6.3):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)
'@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3)
optionalDependencies: optionalDependencies:
typescript: 5.6.3 typescript: 5.6.3
transitivePeerDependencies: transitivePeerDependencies:
@ -8648,7 +8638,7 @@ snapshots:
extsprintf: 1.4.1 extsprintf: 1.4.1
optional: true optional: true
vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.8(@types/node@20.12.5)): vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.9(@types/node@20.12.5)):
dependencies: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0(rollup@4.24.0) '@rollup/pluginutils': 5.1.0(rollup@4.24.0)
@ -8659,7 +8649,7 @@ snapshots:
perfect-debounce: 1.0.0 perfect-debounce: 1.0.0
picocolors: 1.0.1 picocolors: 1.0.1
sirv: 2.0.4 sirv: 2.0.4
vite: 5.4.8(@types/node@20.12.5) vite: 5.4.9(@types/node@20.12.5)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
@ -8668,7 +8658,7 @@ snapshots:
dependencies: dependencies:
lib-esm: 0.4.2 lib-esm: 0.4.2
vite-plugin-solid@2.10.2(solid-js@1.9.2)(vite@5.4.8(@types/node@20.12.5)): vite-plugin-solid@2.10.2(solid-js@1.9.2)(vite@5.4.9(@types/node@20.12.5)):
dependencies: dependencies:
'@babel/core': 7.24.7 '@babel/core': 7.24.7
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
@ -8676,12 +8666,12 @@ snapshots:
merge-anything: 5.1.7 merge-anything: 5.1.7
solid-js: 1.9.2 solid-js: 1.9.2
solid-refresh: 0.6.3(solid-js@1.9.2) solid-refresh: 0.6.3(solid-js@1.9.2)
vite: 5.4.8(@types/node@20.12.5) vite: 5.4.9(@types/node@20.12.5)
vitefu: 0.2.5(vite@5.4.8(@types/node@20.12.5)) vitefu: 0.2.5(vite@5.4.9(@types/node@20.12.5))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vite@5.4.8(@types/node@20.12.5): vite@5.4.9(@types/node@20.12.5):
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
postcss: 8.4.44 postcss: 8.4.44
@ -8690,9 +8680,9 @@ snapshots:
'@types/node': 20.12.5 '@types/node': 20.12.5
fsevents: 2.3.3 fsevents: 2.3.3
vitefu@0.2.5(vite@5.4.8(@types/node@20.12.5)): vitefu@0.2.5(vite@5.4.9(@types/node@20.12.5)):
optionalDependencies: optionalDependencies:
vite: 5.4.8(@types/node@20.12.5) vite: 5.4.9(@types/node@20.12.5)
vudio@2.1.1(patch_hash=7iux5msqpgl3octdmwy4uspwoe): {} vudio@2.1.1(patch_hash=7iux5msqpgl3octdmwy4uspwoe): {}

View File

@ -281,24 +281,17 @@
}, },
"api-server": { "api-server": {
"description": "Adds an API server to control the player", "description": "Adds an API server to control the player",
"name": "API Server [Beta]",
"dialog": { "dialog": {
"request": { "request": {
"title": "API authorization request",
"message": "Allow {{ID}} ({{origin}}) to access the API?",
"buttons": { "buttons": {
"allow": "Allow", "allow": "Allow",
"deny": "Deny" "deny": "Deny"
} },
"message": "Allow {{ID}} ({{origin}}) to access the API?",
"title": "API authorization request"
} }
}, },
"menu": { "menu": {
"hostname": {
"label": "Hostname"
},
"port": {
"label": "Port"
},
"auth-strategy": { "auth-strategy": {
"label": "Authorization strategy", "label": "Authorization strategy",
"submenu": { "submenu": {
@ -309,16 +302,23 @@
"label": "No authorization" "label": "No authorization"
} }
} }
} },
},
"prompt": {
"hostname": { "hostname": {
"title": "Hostname", "label": "Hostname"
"label": "Enter the hostname (like 0.0.0.0) for the API server:"
}, },
"port": { "port": {
"title": "Port", "label": "Port"
"label": "Enter the port for the API server:" }
},
"name": "API Server [Beta]",
"prompt": {
"hostname": {
"label": "Enter the hostname (like 0.0.0.0) for the API server:",
"title": "Hostname"
},
"port": {
"label": "Enter the port for the API server:",
"title": "Port"
} }
} }
}, },

View File

@ -293,6 +293,7 @@
}, },
"menu": { "menu": {
"auth-strategy": { "auth-strategy": {
"label": "Estrategia de autorización",
"submenu": { "submenu": {
"auth-at-first": { "auth-at-first": {
"label": "Autorizar la primera solicitud" "label": "Autorizar la primera solicitud"

View File

@ -201,6 +201,7 @@
"restart": "I-restart ang App", "restart": "I-restart ang App",
"show": "Ipakita ang window", "show": "Ipakita ang window",
"tooltip": { "tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}" "with-song-info": "YouTube Music: {{artist}} - {{title}}"
} }
} }
@ -212,6 +213,9 @@
}, },
"adblocker": { "adblocker": {
"description": "I-block ang lahat ng ad at tracking", "description": "I-block ang lahat ng ad at tracking",
"menu": {
"blocker": "Blocker"
},
"name": "Pag-block ng Ad" "name": "Pag-block ng Ad"
}, },
"album-actions": { "album-actions": {
@ -222,7 +226,10 @@
"description": "Naglalapat ng dynamic na tema at visual effect batay sa color palette ng album", "description": "Naglalapat ng dynamic na tema at visual effect batay sa color palette ng album",
"menu": { "menu": {
"color-mix-ratio": { "color-mix-ratio": {
"label": "Ratio ng paghahalo ng kulay" "label": "Ratio ng paghahalo ng kulay",
"submenu": {
"percent": "{{ratio}}%"
}
} }
}, },
"name": "Tema ng Kulay ng Album" "name": "Tema ng Kulay ng Album"
@ -261,6 +268,7 @@
} }
}, },
"smoothness-transition": { "smoothness-transition": {
"label": "Ayos ng Transisyon",
"submenu": { "submenu": {
"during": "Habang {{interpolationTime}} s" "during": "Habang {{interpolationTime}} s"
} }
@ -268,6 +276,50 @@
"use-fullscreen": { "use-fullscreen": {
"label": "Gumamit ng fullscreen" "label": "Gumamit ng fullscreen"
} }
},
"name": "Ambient Mode"
},
"api-server": {
"description": "Nagdadagdag ng API Server upang kontrolin ang player",
"dialog": {
"request": {
"buttons": {
"allow": "Payagan",
"deny": "Tanggihan"
},
"message": "Payagan ang {{ID}} ({{origin}}) upang ma-access ang API?",
"title": "Awtorisasyon ng API request"
}
},
"menu": {
"auth-strategy": {
"label": "Estratehiya ng awtorisasyon",
"submenu": {
"auth-at-first": {
"label": "Mag-autorisa sa unang request"
},
"none": {
"label": "Walang awtorisasyon"
}
}
},
"hostname": {
"label": "Hostname"
},
"port": {
"label": "Port"
}
},
"name": "API Server [Beta]",
"prompt": {
"hostname": {
"label": "Itala ang hostname (tulad ng 0.0.0.0) para sa API server:",
"title": "Hostname"
},
"port": {
"label": "Itala ang port para sa API server:",
"title": "Port"
}
} }
}, },
"audio-compressor": { "audio-compressor": {
@ -301,7 +353,8 @@
} }
}, },
"compact-sidebar": { "compact-sidebar": {
"description": "Laging i-set ang sidebar sa compact mode" "description": "Laging i-set ang sidebar sa compact mode",
"name": "Pinaliit na Sidebar"
}, },
"crossfade": { "crossfade": {
"description": "I-crossfade kada kanta", "description": "I-crossfade kada kanta",
@ -425,7 +478,8 @@
} }
}, },
"lumiastream": { "lumiastream": {
"description": "Nabibigay suporta sa Lumia Stream" "description": "Nabibigay suporta sa Lumia Stream",
"name": "Lumia Stream [Beta]"
}, },
"lyrics-genius": { "lyrics-genius": {
"description": "Nagdaragdag ng suporta sa lyrics para sa karamihan ng kanta", "description": "Nagdaragdag ng suporta sa lyrics para sa karamihan ng kanta",
@ -582,7 +636,8 @@
}, },
"listenbrainz": { "listenbrainz": {
"token": { "token": {
"label": "Ilagay ang ListenBrainz user token:" "label": "Ilagay ang ListenBrainz user token:",
"title": "Token ng ListenBrainz"
} }
} }
} }
@ -696,7 +751,10 @@
} }
}, },
"visualizer": { "visualizer": {
"description": "Idaragdag ng visualizer sa player" "description": "Idaragdag ng visualizer sa player",
"menu": {
"visualizer-type": "Uri ng Visualizer"
}
} }
} }
} }

View File

@ -202,7 +202,7 @@
"show": "Tampilkan jendela", "show": "Tampilkan jendela",
"tooltip": { "tooltip": {
"default": "YouTube Musik", "default": "YouTube Musik",
"with-song-info": "YouTube Music: {{artist}} - {{title}}" "with-song-info": "YouTube Musik: {{artist}} - {{title}}"
} }
} }
}, },
@ -279,6 +279,49 @@
}, },
"name": "Mode ambient" "name": "Mode ambient"
}, },
"api-server": {
"description": "Menambahkan server API untuk mengontrol pemutar",
"dialog": {
"request": {
"buttons": {
"allow": "Izinkan",
"deny": "Menolak"
},
"message": "Izinkan {{ID}} ({{origin}}) untuk mengakses API?",
"title": "Permintaan otorisasi API"
}
},
"menu": {
"auth-strategy": {
"label": "Strategi otorisasi",
"submenu": {
"auth-at-first": {
"label": "Otorisasi pada permintaan pertama"
},
"none": {
"label": "Tidak ada otorisasi"
}
}
},
"hostname": {
"label": "Nama host"
},
"port": {
"label": "Port"
}
},
"name": "API Server [Beta]",
"prompt": {
"hostname": {
"label": "Masukkan nama host (seperti 0.0.0.0) untuk server API:",
"title": "Nama host"
},
"port": {
"label": "Masukkan port untuk server API:",
"title": "Port"
}
}
},
"audio-compressor": { "audio-compressor": {
"description": "Menerapkan kompresi pada audio (mengurangi volume pada bagian paling keras dari sinyal dan meningkatkan volume pada bagian paling lembut)", "description": "Menerapkan kompresi pada audio (mengurangi volume pada bagian paling keras dari sinyal dan meningkatkan volume pada bagian paling lembut)",
"name": "Kompresi suara" "name": "Kompresi suara"

View File

@ -279,6 +279,49 @@
}, },
"name": "Umhverfishamur" "name": "Umhverfishamur"
}, },
"api-server": {
"description": "Bætir API netþjóni til að stjórna spilaranum",
"dialog": {
"request": {
"buttons": {
"allow": "Leyfa",
"deny": "Óleyfa"
},
"message": "Leyfa {{ID}} ({{origin}}) að aðganga API-ið?",
"title": "API heimildarbeiðni"
}
},
"menu": {
"auth-strategy": {
"label": "Heimildarstefna",
"submenu": {
"auth-at-first": {
"label": "Heimila á fyrst beiðni"
},
"none": {
"label": "Nei heimild"
}
}
},
"hostname": {
"label": "Hýsitölvunafn"
},
"port": {
"label": "Tengi"
}
},
"name": "API-Netþjónn [Beta]",
"prompt": {
"hostname": {
"label": "Sláðu inn hýsitölvunafnið (eins og 0.0.0.0) fyrir API-netþjónninn:",
"title": "Hýsitölvunafn"
},
"port": {
"label": "Sláðu inn tengið fyrir API-netþjónninn:",
"title": "Tengi"
}
}
},
"audio-compressor": { "audio-compressor": {
"description": "Notaðu þjöppun á hljóð (lækkar hljóðstyrk háværustu hluta merkis og hækkar hljóðstyrk í mýkstu hlutunum)", "description": "Notaðu þjöppun á hljóð (lækkar hljóðstyrk háværustu hluta merkis og hækkar hljóðstyrk í mýkstu hlutunum)",
"name": "Hljóðþjöppu" "name": "Hljóðþjöppu"
@ -670,7 +713,34 @@
}, },
"synced-lyrics": { "synced-lyrics": {
"description": "Veitir samstillta texta við lög, með því að nota veitur eins og LRClib.", "description": "Veitir samstillta texta við lög, með því að nota veitur eins og LRClib.",
"name": "Samstilltur texti" "errors": {
"not-found": "⚠️ - Enginn texti fannst við þetta lag."
},
"menu": {
"line-effect": {
"label": "Línuafleiðing",
"submenu": {
"focus": {
"label": "Brennidepill",
"tooltip": "Gerðu aðeins núverandi línu hvíta"
},
"offset": {
"label": "Fararbyrjun"
},
"scale": {
"label": "Skali",
"tooltip": "Skala núverandi línu"
}
}
},
"show-time-codes": {
"label": "Sýna tímikóðar"
}
},
"name": "Samstilltur texti",
"warnings": {
"instrumental": "⚠️ - Þetta er hljóðfærilegt lag"
}
}, },
"taskbar-mediacontrol": { "taskbar-mediacontrol": {
"description": "Stjórnaðu spilun frá Windows verkefnastikunni þinni", "description": "Stjórnaðu spilun frá Windows verkefnastikunni þinni",

View File

@ -279,6 +279,49 @@
}, },
"name": "Modo ambiente" "name": "Modo ambiente"
}, },
"api-server": {
"description": "Adiciona um servidor API para controlar o player",
"dialog": {
"request": {
"buttons": {
"allow": "Permitir",
"deny": "Negar"
},
"message": "Permitir que {{ID}} {{origin}} acesse o API?",
"title": "Pedido de autorização API"
}
},
"menu": {
"auth-strategy": {
"label": "Estratégia de autorização",
"submenu": {
"auth-at-first": {
"label": "Autorizar na primeira solicitação"
},
"none": {
"label": "Não autorizar"
}
}
},
"hostname": {
"label": "Nome do anfitrião"
},
"port": {
"label": "Porta"
}
},
"name": "Servidor API [Beta]",
"prompt": {
"hostname": {
"label": "Entre o nome do host (como 0.0.0.0) para o servidor API:",
"title": "Nome do anfitrião"
},
"port": {
"label": "Entre a porta do servidor API:",
"title": "Porta"
}
}
},
"audio-compressor": { "audio-compressor": {
"description": "Aplicar compressão ao áudio (reduz o volume das partes mais altas e aumenta o volume das partes mais baixas)", "description": "Aplicar compressão ao áudio (reduz o volume das partes mais altas e aumenta o volume das partes mais baixas)",
"name": "Compressor de áudio" "name": "Compressor de áudio"

View File

@ -279,6 +279,49 @@
}, },
"name": "Режим Ambient" "name": "Режим Ambient"
}, },
"api-server": {
"description": "Добавляет API сервер для контроля за плеером",
"dialog": {
"request": {
"buttons": {
"allow": "Разрешить",
"deny": "Отказать"
},
"message": "Разрешить {{ID}} ({{origin}}) доступ к API?",
"title": "Запрос на авторизацию в API"
}
},
"menu": {
"auth-strategy": {
"label": "Способ авторизации",
"submenu": {
"auth-at-first": {
"label": "Авторизация при первом запросе"
},
"none": {
"label": "Без авторизации"
}
}
},
"hostname": {
"label": "Имя хоста"
},
"port": {
"label": "Порт"
}
},
"name": "API Сервер [БЕТА]",
"prompt": {
"hostname": {
"label": "Введите имя хоста (на подобии 0.0.0.0) для API сервера:",
"title": "Имя хоста"
},
"port": {
"label": "Введите порт для API сервера:",
"title": "Порт"
}
}
},
"audio-compressor": { "audio-compressor": {
"description": "Применяет компрессию к аудио (уменьшает громкость самых громких частей сигнала и повышает громкость самых тихих частей)", "description": "Применяет компрессию к аудио (уменьшает громкость самых громких частей сигнала и повышает громкость самых тихих частей)",
"name": "Нормализация аудио" "name": "Нормализация аудио"
@ -414,6 +457,21 @@
"description": "Скачивать MP3 / исходное аудио напрямую из интерфейса", "description": "Скачивать MP3 / исходное аудио напрямую из интерфейса",
"menu": { "menu": {
"choose-download-folder": "Выберите папку для загрузок", "choose-download-folder": "Выберите папку для загрузок",
"download-finish-settings": {
"label": "Скачать по завершении",
"prompt": {
"last-percent": "После х процентов",
"last-seconds": "Осталось x сек",
"title": "Условия скачивания"
},
"submenu": {
"advanced": "Расширенные настройки",
"enabled": "Включено",
"mode": "Врмеменной режим",
"percent": "Проценты",
"seconds": "Секунды"
}
},
"download-playlist": "Скачать плейлист", "download-playlist": "Скачать плейлист",
"presets": "Пресеты", "presets": "Пресеты",
"skip-existing": "Пропускать уже существующие файлы" "skip-existing": "Пропускать уже существующие файлы"

View File

@ -207,6 +207,10 @@
} }
}, },
"plugins": { "plugins": {
"ad-speedup": {
"description": "При програванні реклами звук вимикається і встановлюється швидкість відтворення 16х",
"name": "Прискорення реклами"
},
"adblocker": { "adblocker": {
"description": "Блокувати всю рекламу та відстеження з коробки", "description": "Блокувати всю рекламу та відстеження з коробки",
"menu": { "menu": {
@ -275,6 +279,49 @@
}, },
"name": "Режим навколишнього середовища" "name": "Режим навколишнього середовища"
}, },
"api-server": {
"description": "Додає API сервер для контролю плеєра",
"dialog": {
"request": {
"buttons": {
"allow": "Дозволити",
"deny": "Відмінити"
},
"message": "Дозволити {{ID}} ({{origin}}) доступ до API?",
"title": "Запит авторизації до API"
}
},
"menu": {
"auth-strategy": {
"label": "Стратегія авторизації",
"submenu": {
"auth-at-first": {
"label": "Авторизувати при першому запиті"
},
"none": {
"label": "Немає авторизації"
}
}
},
"hostname": {
"label": "Назва серверу"
},
"port": {
"label": "Порт"
}
},
"name": "API сервер [Бета]",
"prompt": {
"hostname": {
"label": "Введіть ім'я хоста (наприклад 0.0.0.0) для API серверу:",
"title": "Ім'я хоста"
},
"port": {
"label": "Введіть порт API серверу:",
"title": "Порт"
}
}
},
"audio-compressor": { "audio-compressor": {
"description": "Застосувати стиснення аудіо (зменшити гучність найгучніших фрагментів сигналу та збільшити гучність тихих фрагментів)", "description": "Застосувати стиснення аудіо (зменшити гучність найгучніших фрагментів сигналу та збільшити гучність тихих фрагментів)",
"name": "Аудіокомпресор" "name": "Аудіокомпресор"
@ -411,13 +458,17 @@
"menu": { "menu": {
"choose-download-folder": "Оберіть папку для завантаження", "choose-download-folder": "Оберіть папку для завантаження",
"download-finish-settings": { "download-finish-settings": {
"label": "Скачати по завершенню",
"prompt": { "prompt": {
"last-percent": "Після Х відсотків", "last-percent": "Після Х відсотків",
"last-seconds": "Останні Х секунд" "last-seconds": "Останні Х секунд",
"title": "Налаштувати коли завантажувати"
}, },
"submenu": { "submenu": {
"advanced": "Розширені",
"enabled": "Увімкнено", "enabled": "Увімкнено",
"percent": "Відсотків", "mode": "Режим часу",
"percent": "Відсоток",
"seconds": "Секунди" "seconds": "Секунди"
} }
}, },
@ -661,6 +712,7 @@
"name": "SponsorBlock" "name": "SponsorBlock"
}, },
"synced-lyrics": { "synced-lyrics": {
"description": "Додає синхронізовані тексти до пісень використовуючи провайдери, такі як LRClib.",
"errors": { "errors": {
"fetch": "⚠️ - При завантаженні тексту сталась помилка. Спробуйте ще раз пізніше.", "fetch": "⚠️ - При завантаженні тексту сталась помилка. Спробуйте ще раз пізніше.",
"not-found": "⚠️ - До цієї пісні текст не знайдено." "not-found": "⚠️ - До цієї пісні текст не знайдено."
@ -677,6 +729,10 @@
"label": "Зосереджитись", "label": "Зосереджитись",
"tooltip": "Зробити білим лише поточний рядок" "tooltip": "Зробити білим лише поточний рядок"
}, },
"offset": {
"label": "Офсет",
"tooltip": "Офсет з права від нинішньої лінії"
},
"scale": { "scale": {
"label": "Масштабувати", "label": "Масштабувати",
"tooltip": "Масштабуваты поточну лінію" "tooltip": "Масштабуваты поточну лінію"
@ -685,7 +741,8 @@
"tooltip": "Виберіть ефект, який потрібно застосувати до поточної лінії" "tooltip": "Виберіть ефект, який потрібно застосувати до поточної лінії"
}, },
"precise-timing": { "precise-timing": {
"label": "Зробити текст пісні ідеально синхронізованим" "label": "Зробити текст пісні ідеально синхронізованим",
"tooltip": "Обчисли до мілісекунд відображення наступного рядка (може мати невеликий вплив на продуктивність)"
}, },
"show-lyrics-even-if-inexact": { "show-lyrics-even-if-inexact": {
"label": "Показувати текст пісні, навіть якщо він неточний", "label": "Показувати текст пісні, навіть якщо він неточний",
@ -698,7 +755,7 @@
}, },
"name": "Синхронізовані тексти", "name": "Синхронізовані тексти",
"refetch-btn": { "refetch-btn": {
"fetching": "Отримання...", "fetching": "Завантаження...",
"normal": "Перезавантажити текст" "normal": "Перезавантажити текст"
}, },
"warnings": { "warnings": {

View File

@ -279,6 +279,49 @@
}, },
"name": "微光效果" "name": "微光效果"
}, },
"api-server": {
"description": "新增伺服器以使用 API 控制播放器",
"dialog": {
"request": {
"buttons": {
"allow": "允許",
"deny": "拒絕"
},
"message": "允許 {{ID}} ({{origin}}) 訪問 API 嗎?",
"title": "API 驗證請求"
}
},
"menu": {
"auth-strategy": {
"label": "驗證策略",
"submenu": {
"auth-at-first": {
"label": "首次請求時驗證"
},
"none": {
"label": "不要驗證"
}
}
},
"hostname": {
"label": "主機名稱"
},
"port": {
"label": "接口"
}
},
"name": "API 伺服器 [Beta]",
"prompt": {
"hostname": {
"label": "輸入 API 伺服器的主機名稱 例 (0.0.0.0)",
"title": "主機名稱"
},
"port": {
"label": "輸入 API 伺服器接口:",
"title": "接口"
}
}
},
"audio-compressor": { "audio-compressor": {
"description": "使用音效壓縮 (大聲部份的音量降低, 柔和部份的音量提高)", "description": "使用音效壓縮 (大聲部份的音量降低, 柔和部份的音量提高)",
"name": "音效壓縮器" "name": "音效壓縮器"
@ -300,7 +343,7 @@
"name": "標題選擇器", "name": "標題選擇器",
"prompt": { "prompt": {
"selector": { "selector": {
"label": "目前標題語言: {{language}}", "label": "目前標題語言{{language}}",
"none": "無", "none": "無",
"title": "選擇標題語言" "title": "選擇標題語言"
} }
@ -363,7 +406,7 @@
"name": "Discord 狀態", "name": "Discord 狀態",
"prompt": { "prompt": {
"set-inactivity-timeout": { "set-inactivity-timeout": {
"label": "設定多少秒後清除狀態:", "label": "設定多少秒後清除狀態",
"title": "設定閒置狀態時長" "title": "設定閒置狀態時長"
} }
} }
@ -388,11 +431,11 @@
} }
}, },
"feedback": { "feedback": {
"conversion-progress": "轉檔進度: {{percent}}%", "conversion-progress": "轉檔進度{{percent}}%",
"converting": "轉檔中…", "converting": "轉檔中…",
"done": "完成下載: {{filePath}}", "done": "完成下載{{filePath}}",
"download-info": "正在下載 {{artist}} - {{title}} [{{videoId}}", "download-info": "正在下載 {{artist}} - {{title}} [{{videoId}}",
"download-progress": "下載進度: {{percent}}%", "download-progress": "下載進度{{percent}}%",
"downloading": "下載中…", "downloading": "下載中…",
"downloading-counter": "正在下載第 {{current}}/{{total}}…", "downloading-counter": "正在下載第 {{current}}/{{total}}…",
"downloading-playlist": "正在下載播放清單 \"{{playlistTitle}}\" - 共 {{playlistSize}} 首歌 ({{playlistId}})", "downloading-playlist": "正在下載播放清單 \"{{playlistTitle}}\" - 共 {{playlistSize}} 首歌 ({{playlistId}})",
@ -403,10 +446,10 @@
"playlist-has-only-one-song": "播放清單內只有一首歌曲, 將直接下載", "playlist-has-only-one-song": "播放清單內只有一首歌曲, 將直接下載",
"playlist-id-not-found": "沒有找到播放清單 ID", "playlist-id-not-found": "沒有找到播放清單 ID",
"playlist-is-empty": "播放清單是空的", "playlist-is-empty": "播放清單是空的",
"playlist-is-mix-or-private": "獲取播放清單資訊時發生錯誤: 請確認非私人播放清單或是\"為你推薦的合輯\"\n\n{{error}}", "playlist-is-mix-or-private": "獲取播放清單資訊時發生錯誤請確認非私人播放清單或是\"為你推薦的合輯\"\n\n{{error}}",
"preparing-file": "正在準備檔案…", "preparing-file": "正在準備檔案…",
"saving": "儲存中…", "saving": "儲存中…",
"trying-to-get-playlist-id": "正在嘗試獲取播放清單 ID: {{playlistId}}", "trying-to-get-playlist-id": "正在嘗試獲取播放清單 ID{{playlistId}}",
"video-id-not-found": "未能找到該影片", "video-id-not-found": "未能找到該影片",
"writing-id3": "正在寫入 ID3 標籤…" "writing-id3": "正在寫入 ID3 標籤…"
} }
@ -582,7 +625,7 @@
"decrease": "降低音量", "decrease": "降低音量",
"increase": "增加音量" "increase": "增加音量"
}, },
"label": "選擇全域音量控制快捷鍵:", "label": "選擇全域音量控制快捷鍵",
"title": "全域音量控制快捷鍵" "title": "全域音量控制快捷鍵"
}, },
"volume-steps": { "volume-steps": {
@ -595,8 +638,8 @@
"backend": { "backend": {
"dialog": { "dialog": {
"quality-changer": { "quality-changer": {
"detail": "目前畫質: {{quality}}", "detail": "目前畫質{{quality}}",
"message": "選擇影片畫質:", "message": "選擇影片畫質",
"title": "選擇影片畫質" "title": "選擇影片畫質"
} }
} }
@ -651,7 +694,7 @@
"play-pause": "播放/暫停", "play-pause": "播放/暫停",
"previous": "上一首" "previous": "上一首"
}, },
"label": "選擇全域音樂控制快捷鍵:", "label": "選擇全域音樂控制快捷鍵",
"title": "全域快捷鍵" "title": "全域快捷鍵"
} }
} }
@ -703,7 +746,7 @@
}, },
"show-lyrics-even-if-inexact": { "show-lyrics-even-if-inexact": {
"label": "即使不精確依然強制顯示歌詞", "label": "即使不精確依然強制顯示歌詞",
"tooltip": "當找不到符合該歌曲的歌詞時,該功能會嘗試不同的搜尋方式\n使用不同的搜尋方式會導致不精確的結果。" "tooltip": "當找不到符合該歌曲的歌詞時,該功能會嘗試不同的搜尋方式\n使用不同的搜尋方式會導致不精確的結果。"
}, },
"show-time-codes": { "show-time-codes": {
"label": "顯示時間線", "label": "顯示時間線",

View File

@ -11,6 +11,7 @@ import {
shell, shell,
dialog, dialog,
ipcMain, ipcMain,
protocol,
type BrowserWindowConstructorOptions, type BrowserWindowConstructorOptions,
} from 'electron'; } from 'electron';
import enhanceWebRequest, { import enhanceWebRequest, {
@ -83,6 +84,34 @@ if (!gotTheLock) {
app.exit(); app.exit();
} }
protocol.registerSchemesAsPrivileged([
{
scheme: 'http',
privileges: {
standard: true,
bypassCSP: true,
allowServiceWorkers: true,
supportFetchAPI: true,
corsEnabled: true,
stream: true,
codeCache: true,
},
},
{
scheme: 'https',
privileges: {
standard: true,
bypassCSP: true,
allowServiceWorkers: true,
supportFetchAPI: true,
corsEnabled: true,
stream: true,
codeCache: true,
},
},
{ scheme: 'mailto', privileges: { standard: true } },
]);
// Ozone platform hint: Required for Wayland support // Ozone platform hint: Required for Wayland support
app.commandLine.appendSwitch('ozone-platform-hint', 'auto'); app.commandLine.appendSwitch('ozone-platform-hint', 'auto');
// SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt) // SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt)
@ -531,7 +560,11 @@ app.once('browser-window-created', (_event, win) => {
console.log(log); console.log(log);
} }
if (errorCode !== -3) { if (
errorCode !== -3 &&
// Workaround for #2435
!new URL(validatedURL).hostname.includes('doubleclick.net')
) {
// -3 is a false positive // -3 is a false positive
win.webContents.send('log', log); win.webContents.send('log', log);
win.webContents.loadFile(ErrorHtmlAsset); win.webContents.loadFile(ErrorHtmlAsset);

View File

@ -10,14 +10,15 @@ import { createBackend } from '@/utils';
import { JWTPayloadSchema } from './scheme'; import { JWTPayloadSchema } from './scheme';
import { registerAuth, registerControl } from './routes'; import { registerAuth, registerControl } from './routes';
import type { APIServerConfig } from '../config'; import { type APIServerConfig, AuthStrategy } from '../config';
import type { BackendType } from './types'; import type { BackendType } from './types';
export const backend = createBackend<BackendType, APIServerConfig>({ export const backend = createBackend<BackendType, APIServerConfig>({
async start(ctx) { async start(ctx) {
const config = await ctx.getConfig(); const config = await ctx.getConfig();
this.init(ctx); await this.init(ctx);
registerCallback((songInfo) => { registerCallback((songInfo) => {
this.songInfo = songInfo; this.songInfo = songInfo;
}); });
@ -49,17 +50,20 @@ export const backend = createBackend<BackendType, APIServerConfig>({
this.app.use('*', cors()); this.app.use('*', cors());
// middlewares // middlewares
this.app.use( this.app.use('/api/*', async (ctx, next) => {
'/api/*', if (config.authStrategy !== AuthStrategy.NONE) {
jwt({ return await jwt({
secret: config.secret, secret: config.secret,
}), })(ctx, next);
); }
await next();
});
this.app.use('/api/*', async (ctx, next) => { this.app.use('/api/*', async (ctx, next) => {
const result = await JWTPayloadSchema.spa(await ctx.get('jwtPayload')); const result = await JWTPayloadSchema.spa(await ctx.get('jwtPayload'));
const isAuthorized = const isAuthorized =
result.success && config.authorizedClients.includes(result.data.id); config.authStrategy === AuthStrategy.NONE ||
(result.success && config.authorizedClients.includes(result.data.id));
if (!isAuthorized) { if (!isAuthorized) {
ctx.status(401); ctx.status(401);
return ctx.body('Unauthorized'); return ctx.body('Unauthorized');
@ -73,12 +77,26 @@ export const backend = createBackend<BackendType, APIServerConfig>({
registerAuth(this.app, ctx); registerAuth(this.app, ctx);
// swagger // swagger
this.app.openAPIRegistry.registerComponent(
'securitySchemes',
'bearerAuth',
{
type: 'http',
scheme: 'bearer',
bearerFormat: 'JWT',
},
);
this.app.doc('/doc', { this.app.doc('/doc', {
openapi: '3.1.0', openapi: '3.1.0',
info: { info: {
version: '1.0.0', version: '1.0.0',
title: 'Youtube Music API Server', title: 'Youtube Music API Server',
}, },
security: [
{
bearerAuth: [],
},
],
}); });
this.app.get('/swagger', swaggerUI({ url: '/doc' })); this.app.get('/swagger', swaggerUI({ url: '/doc' }));

View File

@ -6,9 +6,9 @@ import { getConnInfo } from '@hono/node-server/conninfo';
import { t } from '@/i18n'; import { t } from '@/i18n';
import { APIServerConfig } from '../../config'; import { type APIServerConfig, AuthStrategy } from '../../config';
import { JWTPayload } from '../scheme';
import type { JWTPayload } from '../scheme';
import type { HonoApp } from '../types'; import type { HonoApp } from '../types';
import type { BackendContext } from '@/types/contexts'; import type { BackendContext } from '@/types/contexts';
@ -18,6 +18,7 @@ const routes = {
path: '/auth/{id}', path: '/auth/{id}',
summary: '', summary: '',
description: '', description: '',
security: [],
request: { request: {
params: z.object({ params: z.object({
id: z.string(), id: z.string(),
@ -51,16 +52,16 @@ export const register = (
if (config.authorizedClients.includes(id)) { if (config.authorizedClients.includes(id)) {
// SKIP CHECK // SKIP CHECK
} else if (config.authStrategy === 'AUTH_AT_FIRST') { } else if (config.authStrategy === AuthStrategy.AUTH_AT_FIRST) {
const result = await dialog.showMessageBox({ const result = await dialog.showMessageBox({
title: t('plugins.api-server.dialog.request.title'), title: t('plugins.api-server.dialog.request.title'),
message: t('plugins.api-server.dialog.request.message', { message: t('plugins.api-server.dialog.request.message', {
origin: getConnInfo(ctx).remote.address, origin: getConnInfo(ctx).remote.address,
id, ID: id,
}), }),
buttons: [ buttons: [
t('plugins.api-server.dialog.request.buttons.allow'), t('plugins.api-server.dialog.request.buttons.allow'),
t('plugins.api-server.dialog.request.deny'), t('plugins.api-server.dialog.request.buttons.deny'),
], ],
defaultId: 1, defaultId: 1,
cancelId: 1, cancelId: 1,
@ -70,7 +71,7 @@ export const register = (
ctx.status(403); ctx.status(403);
return ctx.body(null); return ctx.body(null);
} }
} else if (config.authStrategy === 'NONE') { } else if (config.authStrategy === AuthStrategy.NONE) {
// SKIP CHECK // SKIP CHECK
} }

View File

@ -29,9 +29,6 @@ const routes = {
path: `/api/${API_VERSION}/previous`, path: `/api/${API_VERSION}/previous`,
summary: 'play previous song', summary: 'play previous song',
description: 'Plays the previous song in the queue', description: 'Plays the previous song in the queue',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -43,9 +40,6 @@ const routes = {
path: `/api/${API_VERSION}/next`, path: `/api/${API_VERSION}/next`,
summary: 'play next song', summary: 'play next song',
description: 'Plays the next song in the queue', description: 'Plays the next song in the queue',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -57,9 +51,6 @@ const routes = {
path: `/api/${API_VERSION}/play`, path: `/api/${API_VERSION}/play`,
summary: 'Play', summary: 'Play',
description: 'Change the state of the player to play', description: 'Change the state of the player to play',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -71,9 +62,6 @@ const routes = {
path: `/api/${API_VERSION}/pause`, path: `/api/${API_VERSION}/pause`,
summary: 'Pause', summary: 'Pause',
description: 'Change the state of the player to pause', description: 'Change the state of the player to pause',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -86,9 +74,6 @@ const routes = {
summary: 'Toggle play/pause', summary: 'Toggle play/pause',
description: description:
'Change the state of the player to play if paused, or pause if playing', 'Change the state of the player to play if paused, or pause if playing',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -100,9 +85,6 @@ const routes = {
path: `/api/${API_VERSION}/like`, path: `/api/${API_VERSION}/like`,
summary: 'like song', summary: 'like song',
description: 'Set the current song as liked', description: 'Set the current song as liked',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -114,9 +96,6 @@ const routes = {
path: `/api/${API_VERSION}/dislike`, path: `/api/${API_VERSION}/dislike`,
summary: 'dislike song', summary: 'dislike song',
description: 'Set the current song as disliked', description: 'Set the current song as disliked',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -175,9 +154,6 @@ const routes = {
path: `/api/${API_VERSION}/shuffle`, path: `/api/${API_VERSION}/shuffle`,
summary: 'shuffle', summary: 'shuffle',
description: 'Shuffle the queue', description: 'Shuffle the queue',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -255,9 +231,6 @@ const routes = {
path: `/api/${API_VERSION}/toggle-mute`, path: `/api/${API_VERSION}/toggle-mute`,
summary: 'toggle mute', summary: 'toggle mute',
description: 'Toggle the mute state of the player', description: 'Toggle the mute state of the player',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
204: { 204: {
description: 'Success', description: 'Success',
@ -270,9 +243,6 @@ const routes = {
path: `/api/${API_VERSION}/fullscreen`, path: `/api/${API_VERSION}/fullscreen`,
summary: 'get fullscreen state', summary: 'get fullscreen state',
description: 'Get the current fullscreen state', description: 'Get the current fullscreen state',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
200: { 200: {
description: 'Success', description: 'Success',
@ -291,9 +261,6 @@ const routes = {
path: `/api/${API_VERSION}/queue-info`, path: `/api/${API_VERSION}/queue-info`,
summary: 'get current queue info', summary: 'get current queue info',
description: 'Get the current queue info', description: 'Get the current queue info',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
200: { 200: {
description: 'Success', description: 'Success',
@ -313,9 +280,6 @@ const routes = {
path: `/api/${API_VERSION}/song-info`, path: `/api/${API_VERSION}/song-info`,
summary: 'get current song info', summary: 'get current song info',
description: 'Get the current song info', description: 'Get the current song info',
request: {
headers: AuthHeadersSchema,
},
responses: { responses: {
200: { 200: {
description: 'Success', description: 'Success',
@ -345,8 +309,8 @@ export const register = (
ctx.status(204); ctx.status(204);
return ctx.body(null); return ctx.body(null);
}); });
app.openapi(routes.previous, (ctx) => { app.openapi(routes.next, (ctx) => {
controller.previous(); controller.next();
ctx.status(204); ctx.status(204);
return ctx.body(null); return ctx.body(null);

View File

@ -12,7 +12,7 @@ export type BackendType = {
oldConfig?: APIServerConfig; oldConfig?: APIServerConfig;
songInfo?: SongInfo; songInfo?: SongInfo;
init: (ctx: BackendContext<APIServerConfig>) => void; init: (ctx: BackendContext<APIServerConfig>) => Promise<void>;
run: (hostname: string, port: number) => void; run: (hostname: string, port: number) => void;
end: () => void; end: () => void;
}; };

View File

@ -1,8 +1,13 @@
export enum AuthStrategy {
AUTH_AT_FIRST = 'AUTH_AT_FIRST',
NONE = 'NONE',
}
export interface APIServerConfig { export interface APIServerConfig {
enabled: boolean; enabled: boolean;
hostname: string; hostname: string;
port: number; port: number;
authStrategy: 'AUTH_AT_FIRST' | 'NONE'; authStrategy: AuthStrategy;
secret: string; secret: string;
authorizedClients: string[]; authorizedClients: string[];
@ -12,7 +17,7 @@ export const defaultAPIServerConfig: APIServerConfig = {
enabled: true, enabled: true,
hostname: '0.0.0.0', hostname: '0.0.0.0',
port: 26538, port: 26538,
authStrategy: 'AUTH_AT_FIRST', authStrategy: AuthStrategy.AUTH_AT_FIRST,
secret: Date.now().toString(36), secret: Date.now().toString(36),
authorizedClients: [], authorizedClients: [],

View File

@ -3,7 +3,11 @@ import prompt from 'custom-electron-prompt';
import { t } from '@/i18n'; import { t } from '@/i18n';
import promptOptions from '@/providers/prompt-options'; import promptOptions from '@/providers/prompt-options';
import { APIServerConfig, defaultAPIServerConfig } from './config'; import {
type APIServerConfig,
AuthStrategy,
defaultAPIServerConfig,
} from './config';
import type { MenuContext } from '@/types/contexts'; import type { MenuContext } from '@/types/contexts';
import type { MenuTemplate } from '@/menu'; import type { MenuTemplate } from '@/menu';
@ -74,17 +78,17 @@ export const onMenu = async ({
'plugins.api-server.menu.auth-strategy.submenu.auth-at-first.label', 'plugins.api-server.menu.auth-strategy.submenu.auth-at-first.label',
), ),
type: 'radio', type: 'radio',
checked: config.authStrategy === 'AUTH_AT_FIRST', checked: config.authStrategy === AuthStrategy.AUTH_AT_FIRST,
click() { click() {
setConfig({ ...config, authStrategy: 'AUTH_AT_FIRST' }); setConfig({ ...config, authStrategy: AuthStrategy.AUTH_AT_FIRST });
}, },
}, },
{ {
label: t('plugins.api-server.menu.auth-strategy.submenu.none.label'), label: t('plugins.api-server.menu.auth-strategy.submenu.none.label'),
type: 'radio', type: 'radio',
checked: config.authStrategy === 'NONE', checked: config.authStrategy === AuthStrategy.NONE,
click() { click() {
setConfig({ ...config, authStrategy: 'NONE' }); setConfig({ ...config, authStrategy: AuthStrategy.NONE });
}, },
}, },
], ],

View File

@ -172,6 +172,8 @@ function downloadSongOnFinishSetup({
let duration: number | undefined; let duration: number | undefined;
let time = 0; let time = 0;
const defaultDownloadFolder = app.getPath('downloads');
registerCallback((songInfo: SongInfo) => { registerCallback((songInfo: SongInfo) => {
if ( if (
!songInfo.isPaused && !songInfo.isPaused &&
@ -185,7 +187,9 @@ function downloadSongOnFinishSetup({
) { ) {
downloadSong( downloadSong(
currentUrl, currentUrl,
config.downloadOnFinish.folder ?? config.downloadFolder, config.downloadOnFinish.folder ??
config.downloadFolder ??
defaultDownloadFolder,
); );
} else if ( } else if (
config.downloadOnFinish.mode === 'percent' && config.downloadOnFinish.mode === 'percent' &&
@ -193,7 +197,9 @@ function downloadSongOnFinishSetup({
) { ) {
downloadSong( downloadSong(
currentUrl, currentUrl,
config.downloadOnFinish.folder ?? config.downloadFolder, config.downloadOnFinish.folder ??
config.downloadFolder ??
defaultDownloadFolder,
); );
} }
} }

View File

@ -107,7 +107,8 @@ export const onRendererLoad = ({
ipc.on('downloader-feedback', (feedback: string) => { ipc.on('downloader-feedback', (feedback: string) => {
if (progress) { if (progress) {
progress.innerHTML = feedback || t('plugins.downloader.templates.button'); const targetHtml = feedback || t('plugins.downloader.templates.button');
progress.innerHTML = window.trustedTypes?.defaultPolicy ? window.trustedTypes.defaultPolicy.createHTML(targetHtml) : targetHtml;
} else { } else {
console.warn( console.warn(
LoggerPrefix, LoggerPrefix,

View File

@ -10,7 +10,7 @@ export const onRendererLoad = ({
ipc: { invoke, on }, ipc: { invoke, on },
}: RendererContext<LyricsGeniusPluginConfig>) => { }: RendererContext<LyricsGeniusPluginConfig>) => {
const setLyrics = (lyricsContainer: Element, lyrics: string | null) => { const setLyrics = (lyricsContainer: Element, lyrics: string | null) => {
lyricsContainer.innerHTML = ` const targetHtml = `
<div id="contents" class="style-scope ytmusic-section-list-renderer description ytmusic-description-shelf-renderer genius-lyrics"> <div id="contents" class="style-scope ytmusic-section-list-renderer description ytmusic-description-shelf-renderer genius-lyrics">
${ ${
lyrics?.replaceAll(/\r\n|\r|\n/g, '<br/>') ?? lyrics?.replaceAll(/\r\n|\r|\n/g, '<br/>') ??
@ -20,6 +20,7 @@ export const onRendererLoad = ({
<yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer" style="align-self: baseline"> <yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer" style="align-self: baseline">
</yt-formatted-string> </yt-formatted-string>
`; `;
lyricsContainer.innerHTML = window.trustedTypes?.defaultPolicy ? window.trustedTypes.defaultPolicy.createHTML(targetHtml) : targetHtml;
if (lyrics) { if (lyrics) {
const footer = lyricsContainer.querySelector('.footer'); const footer = lyricsContainer.querySelector('.footer');

View File

@ -22,7 +22,8 @@ const updatePlayBackSpeed = () => {
const playbackSpeedElement = document.querySelector('#playback-speed-value'); const playbackSpeedElement = document.querySelector('#playback-speed-value');
if (playbackSpeedElement) { if (playbackSpeedElement) {
playbackSpeedElement.innerHTML = String(playbackSpeed); const targetHtml = String(playbackSpeed);
playbackSpeedElement.innerHTML = window.trustedTypes?.defaultPolicy ? trustedTypes.defaultPolicy.createHTML(targetHtml) : targetHtml;
} }
}; };

View File

@ -6,7 +6,7 @@
export const ElementFromHtml = (html: string): HTMLElement => { export const ElementFromHtml = (html: string): HTMLElement => {
const template = document.createElement('template'); const template = document.createElement('template');
html = html.trim(); // Never return a text node of whitespace as the result html = html.trim(); // Never return a text node of whitespace as the result
template.innerHTML = html; template.innerHTML = window.trustedTypes?.defaultPolicy ? window.trustedTypes.defaultPolicy.createHTML(html) : html;
return template.content.firstElementChild as HTMLElement; return template.content.firstElementChild as HTMLElement;
}; };

View File

@ -51,6 +51,13 @@ interface YouTubeMusicAppElement extends HTMLElement {
} }
async function onApiLoaded() { async function onApiLoaded() {
// Workaround for #2459
document
.querySelector('button.video-button.ytmusic-av-toggle')
?.addEventListener('click', () =>
window.dispatchEvent(new Event('resize')),
);
window.ipcRenderer.on('ytmd:previous-video', () => { window.ipcRenderer.on('ytmd:previous-video', () => {
document document
.querySelector<HTMLElement>('.previous-button.ytmusic-player-bar') .querySelector<HTMLElement>('.previous-button.ytmusic-player-bar')
@ -129,8 +136,8 @@ async function onApiLoaded() {
} }
}; };
window.ipcRenderer.on('ytmd:get-fullscreen', (event) => { window.ipcRenderer.on('ytmd:get-fullscreen', () => {
event.sender.send('ytmd:set-fullscreen', isFullscreen()); window.ipcRenderer.send('ytmd:set-fullscreen', isFullscreen());
}); });
window.ipcRenderer.on( window.ipcRenderer.on(
@ -148,9 +155,9 @@ async function onApiLoaded() {
?.onVolumeTap(); ?.onVolumeTap();
}); });
window.ipcRenderer.on('ytmd:get-queue', (event) => { window.ipcRenderer.on('ytmd:get-queue', () => {
const queue = document.querySelector<QueueElement>('#queue'); const queue = document.querySelector<QueueElement>('#queue');
event.sender.send('ytmd:get-queue-response', { window.ipcRenderer.send('ytmd:get-queue-response', {
items: queue?.queue.getItems(), items: queue?.queue.getItems(),
autoPlaying: queue?.queue.autoPlaying, autoPlaying: queue?.queue.autoPlaying,
continuation: queue?.queue.continuation, continuation: queue?.queue.continuation,
@ -237,16 +244,16 @@ async function onApiLoaded() {
'options.likeButtons', 'options.likeButtons',
); );
if (likeButtonsOptions) { if (likeButtonsOptions) {
const likeButtons: HTMLElement | null = document.querySelector( const style = document.createElement('style');
'ytmusic-like-button-renderer', style.textContent = `
); ytmusic-player-bar[is-mweb-player-bar-modernization-enabled] .middle-controls-buttons.ytmusic-player-bar, #like-button-renderer {
if (likeButtons) { display: ${likeButtonsOptions === 'hide' ? 'none' : 'inherit'} !important;
likeButtons.style.display = }
{ ytmusic-player-bar[is-mweb-player-bar-modernization-enabled] .middle-controls.ytmusic-player-bar {
hide: 'none', justify-content: ${likeButtonsOptions === 'hide' ? 'flex-start' : 'space-between'} !important;
force: 'inherit', }`;
}[likeButtonsOptions] || '';
} document.head.appendChild(style);
} }
} }
@ -262,7 +269,8 @@ const defineYTMDTransElements = () => {
const that = this as HTMLElement; const that = this as HTMLElement;
const key = that.getAttribute('key'); const key = that.getAttribute('key');
if (key) { if (key) {
that.innerHTML = i18t(key); const targetHtml = i18t(key);
that.innerHTML = window.trustedTypes?.defaultPolicy ? window.trustedTypes.defaultPolicy.createHTML(targetHtml) : targetHtml;
} }
}; };
customElements.define( customElements.define(

View File

@ -73,6 +73,8 @@ tp-yt-paper-item.ytmusic-guide-entry-renderer::before {
#av-id ~ #player.ytmusic-player-page:not([player-ui-state="FULLSCREEN"]) { #av-id ~ #player.ytmusic-player-page:not([player-ui-state="FULLSCREEN"]) {
margin-top: auto !important; margin-top: auto !important;
margin-bottom: auto !important; margin-bottom: auto !important;
margin-left: var(--ytmusic-player-page-vertical-padding);
margin-right: var(--ytmusic-player-page-vertical-padding);
max-height: calc(100% - (var(--ytmusic-player-page-vertical-padding) * 2)); max-height: calc(100% - (var(--ytmusic-player-page-vertical-padding) * 2));
max-width: calc(100% - var(--ytmusic-player-page-vertical-padding) * 2); max-width: calc(100% - var(--ytmusic-player-page-vertical-padding) * 2);
} }