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

View File

@ -281,24 +281,17 @@
},
"api-server": {
"description": "Adds an API server to control the player",
"name": "API Server [Beta]",
"dialog": {
"request": {
"title": "API authorization request",
"message": "Allow {{ID}} ({{origin}}) to access the API?",
"buttons": {
"allow": "Allow",
"deny": "Deny"
}
},
"message": "Allow {{ID}} ({{origin}}) to access the API?",
"title": "API authorization request"
}
},
"menu": {
"hostname": {
"label": "Hostname"
},
"port": {
"label": "Port"
},
"auth-strategy": {
"label": "Authorization strategy",
"submenu": {
@ -309,16 +302,23 @@
"label": "No authorization"
}
}
}
},
"prompt": {
},
"hostname": {
"title": "Hostname",
"label": "Enter the hostname (like 0.0.0.0) for the API server:"
"label": "Hostname"
},
"port": {
"title": "Port",
"label": "Enter the port for the API server:"
"label": "Port"
}
},
"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": {
"auth-strategy": {
"label": "Estrategia de autorización",
"submenu": {
"auth-at-first": {
"label": "Autorizar la primera solicitud"

View File

@ -201,6 +201,7 @@
"restart": "I-restart ang App",
"show": "Ipakita ang window",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
}
}
@ -212,6 +213,9 @@
},
"adblocker": {
"description": "I-block ang lahat ng ad at tracking",
"menu": {
"blocker": "Blocker"
},
"name": "Pag-block ng Ad"
},
"album-actions": {
@ -222,7 +226,10 @@
"description": "Naglalapat ng dynamic na tema at visual effect batay sa color palette ng album",
"menu": {
"color-mix-ratio": {
"label": "Ratio ng paghahalo ng kulay"
"label": "Ratio ng paghahalo ng kulay",
"submenu": {
"percent": "{{ratio}}%"
}
}
},
"name": "Tema ng Kulay ng Album"
@ -261,6 +268,7 @@
}
},
"smoothness-transition": {
"label": "Ayos ng Transisyon",
"submenu": {
"during": "Habang {{interpolationTime}} s"
}
@ -268,6 +276,50 @@
"use-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": {
@ -301,7 +353,8 @@
}
},
"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": {
"description": "I-crossfade kada kanta",
@ -425,7 +478,8 @@
}
},
"lumiastream": {
"description": "Nabibigay suporta sa Lumia Stream"
"description": "Nabibigay suporta sa Lumia Stream",
"name": "Lumia Stream [Beta]"
},
"lyrics-genius": {
"description": "Nagdaragdag ng suporta sa lyrics para sa karamihan ng kanta",
@ -582,7 +636,8 @@
},
"listenbrainz": {
"token": {
"label": "Ilagay ang ListenBrainz user token:"
"label": "Ilagay ang ListenBrainz user token:",
"title": "Token ng ListenBrainz"
}
}
}
@ -696,7 +751,10 @@
}
},
"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",
"tooltip": {
"default": "YouTube Musik",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"with-song-info": "YouTube Musik: {{artist}} - {{title}}"
}
}
},
@ -279,6 +279,49 @@
},
"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": {
"description": "Menerapkan kompresi pada audio (mengurangi volume pada bagian paling keras dari sinyal dan meningkatkan volume pada bagian paling lembut)",
"name": "Kompresi suara"

View File

@ -279,6 +279,49 @@
},
"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": {
"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"
@ -670,7 +713,34 @@
},
"synced-lyrics": {
"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": {
"description": "Stjórnaðu spilun frá Windows verkefnastikunni þinni",

View File

@ -279,6 +279,49 @@
},
"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": {
"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"

View File

@ -279,6 +279,49 @@
},
"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": {
"description": "Применяет компрессию к аудио (уменьшает громкость самых громких частей сигнала и повышает громкость самых тихих частей)",
"name": "Нормализация аудио"
@ -414,6 +457,21 @@
"description": "Скачивать MP3 / исходное аудио напрямую из интерфейса",
"menu": {
"choose-download-folder": "Выберите папку для загрузок",
"download-finish-settings": {
"label": "Скачать по завершении",
"prompt": {
"last-percent": "После х процентов",
"last-seconds": "Осталось x сек",
"title": "Условия скачивания"
},
"submenu": {
"advanced": "Расширенные настройки",
"enabled": "Включено",
"mode": "Врмеменной режим",
"percent": "Проценты",
"seconds": "Секунды"
}
},
"download-playlist": "Скачать плейлист",
"presets": "Пресеты",
"skip-existing": "Пропускать уже существующие файлы"

View File

@ -207,6 +207,10 @@
}
},
"plugins": {
"ad-speedup": {
"description": "При програванні реклами звук вимикається і встановлюється швидкість відтворення 16х",
"name": "Прискорення реклами"
},
"adblocker": {
"description": "Блокувати всю рекламу та відстеження з коробки",
"menu": {
@ -275,6 +279,49 @@
},
"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": {
"description": "Застосувати стиснення аудіо (зменшити гучність найгучніших фрагментів сигналу та збільшити гучність тихих фрагментів)",
"name": "Аудіокомпресор"
@ -411,13 +458,17 @@
"menu": {
"choose-download-folder": "Оберіть папку для завантаження",
"download-finish-settings": {
"label": "Скачати по завершенню",
"prompt": {
"last-percent": "Після Х відсотків",
"last-seconds": "Останні Х секунд"
"last-seconds": "Останні Х секунд",
"title": "Налаштувати коли завантажувати"
},
"submenu": {
"advanced": "Розширені",
"enabled": "Увімкнено",
"percent": "Відсотків",
"mode": "Режим часу",
"percent": "Відсоток",
"seconds": "Секунди"
}
},
@ -661,6 +712,7 @@
"name": "SponsorBlock"
},
"synced-lyrics": {
"description": "Додає синхронізовані тексти до пісень використовуючи провайдери, такі як LRClib.",
"errors": {
"fetch": "⚠️ - При завантаженні тексту сталась помилка. Спробуйте ще раз пізніше.",
"not-found": "⚠️ - До цієї пісні текст не знайдено."
@ -677,6 +729,10 @@
"label": "Зосереджитись",
"tooltip": "Зробити білим лише поточний рядок"
},
"offset": {
"label": "Офсет",
"tooltip": "Офсет з права від нинішньої лінії"
},
"scale": {
"label": "Масштабувати",
"tooltip": "Масштабуваты поточну лінію"
@ -685,7 +741,8 @@
"tooltip": "Виберіть ефект, який потрібно застосувати до поточної лінії"
},
"precise-timing": {
"label": "Зробити текст пісні ідеально синхронізованим"
"label": "Зробити текст пісні ідеально синхронізованим",
"tooltip": "Обчисли до мілісекунд відображення наступного рядка (може мати невеликий вплив на продуктивність)"
},
"show-lyrics-even-if-inexact": {
"label": "Показувати текст пісні, навіть якщо він неточний",
@ -698,7 +755,7 @@
},
"name": "Синхронізовані тексти",
"refetch-btn": {
"fetching": "Отримання...",
"fetching": "Завантаження...",
"normal": "Перезавантажити текст"
},
"warnings": {

View File

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

View File

@ -11,6 +11,7 @@ import {
shell,
dialog,
ipcMain,
protocol,
type BrowserWindowConstructorOptions,
} from 'electron';
import enhanceWebRequest, {
@ -83,6 +84,34 @@ if (!gotTheLock) {
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
app.commandLine.appendSwitch('ozone-platform-hint', 'auto');
// SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt)
@ -531,7 +560,11 @@ app.once('browser-window-created', (_event, win) => {
console.log(log);
}
if (errorCode !== -3) {
if (
errorCode !== -3 &&
// Workaround for #2435
!new URL(validatedURL).hostname.includes('doubleclick.net')
) {
// -3 is a false positive
win.webContents.send('log', log);
win.webContents.loadFile(ErrorHtmlAsset);

View File

@ -10,14 +10,15 @@ import { createBackend } from '@/utils';
import { JWTPayloadSchema } from './scheme';
import { registerAuth, registerControl } from './routes';
import type { APIServerConfig } from '../config';
import { type APIServerConfig, AuthStrategy } from '../config';
import type { BackendType } from './types';
export const backend = createBackend<BackendType, APIServerConfig>({
async start(ctx) {
const config = await ctx.getConfig();
this.init(ctx);
await this.init(ctx);
registerCallback((songInfo) => {
this.songInfo = songInfo;
});
@ -49,17 +50,20 @@ export const backend = createBackend<BackendType, APIServerConfig>({
this.app.use('*', cors());
// middlewares
this.app.use(
'/api/*',
jwt({
secret: config.secret,
}),
);
this.app.use('/api/*', async (ctx, next) => {
if (config.authStrategy !== AuthStrategy.NONE) {
return await jwt({
secret: config.secret,
})(ctx, next);
}
await next();
});
this.app.use('/api/*', async (ctx, next) => {
const result = await JWTPayloadSchema.spa(await ctx.get('jwtPayload'));
const isAuthorized =
result.success && config.authorizedClients.includes(result.data.id);
config.authStrategy === AuthStrategy.NONE ||
(result.success && config.authorizedClients.includes(result.data.id));
if (!isAuthorized) {
ctx.status(401);
return ctx.body('Unauthorized');
@ -73,12 +77,26 @@ export const backend = createBackend<BackendType, APIServerConfig>({
registerAuth(this.app, ctx);
// swagger
this.app.openAPIRegistry.registerComponent(
'securitySchemes',
'bearerAuth',
{
type: 'http',
scheme: 'bearer',
bearerFormat: 'JWT',
},
);
this.app.doc('/doc', {
openapi: '3.1.0',
info: {
version: '1.0.0',
title: 'Youtube Music API Server',
},
security: [
{
bearerAuth: [],
},
],
});
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 { APIServerConfig } from '../../config';
import { JWTPayload } from '../scheme';
import { type APIServerConfig, AuthStrategy } from '../../config';
import type { JWTPayload } from '../scheme';
import type { HonoApp } from '../types';
import type { BackendContext } from '@/types/contexts';
@ -18,6 +18,7 @@ const routes = {
path: '/auth/{id}',
summary: '',
description: '',
security: [],
request: {
params: z.object({
id: z.string(),
@ -51,16 +52,16 @@ export const register = (
if (config.authorizedClients.includes(id)) {
// SKIP CHECK
} else if (config.authStrategy === 'AUTH_AT_FIRST') {
} else if (config.authStrategy === AuthStrategy.AUTH_AT_FIRST) {
const result = await dialog.showMessageBox({
title: t('plugins.api-server.dialog.request.title'),
message: t('plugins.api-server.dialog.request.message', {
origin: getConnInfo(ctx).remote.address,
id,
ID: id,
}),
buttons: [
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,
cancelId: 1,
@ -70,7 +71,7 @@ export const register = (
ctx.status(403);
return ctx.body(null);
}
} else if (config.authStrategy === 'NONE') {
} else if (config.authStrategy === AuthStrategy.NONE) {
// SKIP CHECK
}

View File

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

View File

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

View File

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

View File

@ -3,7 +3,11 @@ import prompt from 'custom-electron-prompt';
import { t } from '@/i18n';
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 { MenuTemplate } from '@/menu';
@ -74,17 +78,17 @@ export const onMenu = async ({
'plugins.api-server.menu.auth-strategy.submenu.auth-at-first.label',
),
type: 'radio',
checked: config.authStrategy === 'AUTH_AT_FIRST',
checked: config.authStrategy === AuthStrategy.AUTH_AT_FIRST,
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'),
type: 'radio',
checked: config.authStrategy === 'NONE',
checked: config.authStrategy === AuthStrategy.NONE,
click() {
setConfig({ ...config, authStrategy: 'NONE' });
setConfig({ ...config, authStrategy: AuthStrategy.NONE });
},
},
],

View File

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

View File

@ -10,7 +10,7 @@ export const onRendererLoad = ({
ipc: { invoke, on },
}: RendererContext<LyricsGeniusPluginConfig>) => {
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">
${
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>
`;
lyricsContainer.innerHTML = window.trustedTypes?.defaultPolicy ? window.trustedTypes.defaultPolicy.createHTML(targetHtml) : targetHtml;
if (lyrics) {
const footer = lyricsContainer.querySelector('.footer');

View File

@ -22,7 +22,8 @@ const updatePlayBackSpeed = () => {
const playbackSpeedElement = document.querySelector('#playback-speed-value');
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 => {
const template = document.createElement('template');
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;
};

View File

@ -51,6 +51,13 @@ interface YouTubeMusicAppElement extends HTMLElement {
}
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', () => {
document
.querySelector<HTMLElement>('.previous-button.ytmusic-player-bar')
@ -129,8 +136,8 @@ async function onApiLoaded() {
}
};
window.ipcRenderer.on('ytmd:get-fullscreen', (event) => {
event.sender.send('ytmd:set-fullscreen', isFullscreen());
window.ipcRenderer.on('ytmd:get-fullscreen', () => {
window.ipcRenderer.send('ytmd:set-fullscreen', isFullscreen());
});
window.ipcRenderer.on(
@ -148,9 +155,9 @@ async function onApiLoaded() {
?.onVolumeTap();
});
window.ipcRenderer.on('ytmd:get-queue', (event) => {
window.ipcRenderer.on('ytmd:get-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(),
autoPlaying: queue?.queue.autoPlaying,
continuation: queue?.queue.continuation,
@ -237,16 +244,16 @@ async function onApiLoaded() {
'options.likeButtons',
);
if (likeButtonsOptions) {
const likeButtons: HTMLElement | null = document.querySelector(
'ytmusic-like-button-renderer',
);
if (likeButtons) {
likeButtons.style.display =
{
hide: 'none',
force: 'inherit',
}[likeButtonsOptions] || '';
}
const style = document.createElement('style');
style.textContent = `
ytmusic-player-bar[is-mweb-player-bar-modernization-enabled] .middle-controls-buttons.ytmusic-player-bar, #like-button-renderer {
display: ${likeButtonsOptions === 'hide' ? 'none' : 'inherit'} !important;
}
ytmusic-player-bar[is-mweb-player-bar-modernization-enabled] .middle-controls.ytmusic-player-bar {
justify-content: ${likeButtonsOptions === 'hide' ? 'flex-start' : 'space-between'} !important;
}`;
document.head.appendChild(style);
}
}
@ -262,7 +269,8 @@ const defineYTMDTransElements = () => {
const that = this as HTMLElement;
const key = that.getAttribute('key');
if (key) {
that.innerHTML = i18t(key);
const targetHtml = i18t(key);
that.innerHTML = window.trustedTypes?.defaultPolicy ? window.trustedTypes.defaultPolicy.createHTML(targetHtml) : targetHtml;
}
};
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"]) {
margin-top: 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-width: calc(100% - var(--ytmusic-player-page-vertical-padding) * 2);
}