From 4fba3ffd92ca4d12962d4bdac22b8d497aefed39 Mon Sep 17 00:00:00 2001 From: Trevin Date: Wed, 26 Nov 2025 12:20:58 -0700 Subject: [PATCH 1/8] fix(downloader): update youtubei.js and remove player_id (#4069) --- package.json | 2 +- pnpm-lock.yaml | 41 +++++++++++++++------------- src/plugins/downloader/main/index.ts | 18 +++++++++++- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 7d2a014a..a6297040 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "virtua": "0.42.3", "vudio": "2.1.1", "x11": "2.3.0", - "youtubei.js": "15.0.1", + "youtubei.js": "^16.0.1", "zod": "4.1.5" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 649e5b18..2ca82627 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -250,8 +250,8 @@ importers: specifier: 2.3.0 version: 2.3.0 youtubei.js: - specifier: 15.0.1 - version: 15.0.1 + specifier: ^16.0.1 + version: 16.0.1 zod: specifier: 4.1.5 version: 4.1.5 @@ -482,8 +482,8 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.6.3': - resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==} + '@bufbuild/protobuf@2.10.0': + resolution: {integrity: sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==} '@dehoist/romanize-thai@1.0.0': resolution: {integrity: sha512-6SqD4vyZ48otnypLXMh901CeQetoP5ptYOaIr58N6zDqjjoN0bHszMb5d/6AXJJQf8kIvbmSWBeuDrbAWLajPQ==} @@ -2571,6 +2571,9 @@ packages: exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} @@ -3214,9 +3217,6 @@ packages: resolution: {integrity: sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==} engines: {node: '>=18'} - jintr@3.3.1: - resolution: {integrity: sha512-nnOzyhf0SLpbWuZ270Omwbj5LcXUkTcZkVnK8/veJXtSZOiATM5gMZMdmzN75FmTyj+NVgrGaPdH12zIJ24oIA==} - jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -3480,6 +3480,10 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + meriyah@6.1.4: + resolution: {integrity: sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==} + engines: {node: '>=18.0.0'} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -4875,8 +4879,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - youtubei.js@15.0.1: - resolution: {integrity: sha512-2slapqJS5NuXKHvcACEknyVz0AjH/TrXaOhDM0q2twQKa54kCmfj+7B/2nGfd20uzAe29zW1ejk2qOc4ABuGkg==} + youtubei.js@16.0.1: + resolution: {integrity: sha512-3802bCAGkBc2/G5WUTc0l/bO5mPYJbQAHL04d9hE9PnrDHoBUT8MN721Yqt4RCNncAXdHcfee9VdJy3Fhq1r5g==} zlibjs@0.3.1: resolution: {integrity: sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==} @@ -5021,7 +5025,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@bufbuild/protobuf@2.6.3': {} + '@bufbuild/protobuf@2.10.0': {} '@dehoist/romanize-thai@1.0.0': {} @@ -5091,7 +5095,7 @@ snapshots: '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.2 + exponential-backoff: 3.1.3 glob: 8.1.0 graceful-fs: 4.2.11 make-fetch-happen: 10.2.1 @@ -7505,6 +7509,8 @@ snapshots: exponential-backoff@3.1.2: {} + exponential-backoff@3.1.3: {} + extract-zip@2.0.1: dependencies: debug: 4.4.1 @@ -8200,10 +8206,6 @@ snapshots: '@jimp/types': 1.6.0 '@jimp/utils': 1.6.0 - jintr@3.3.1: - dependencies: - acorn: 8.15.0 - jpeg-js@0.4.4: {} js-tokens@4.0.0: {} @@ -8470,6 +8472,8 @@ snapshots: merge2@1.4.1: {} + meriyah@6.1.4: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9904,11 +9908,10 @@ snapshots: yocto-queue@0.1.0: {} - youtubei.js@15.0.1: + youtubei.js@16.0.1: dependencies: - '@bufbuild/protobuf': 2.6.3 - jintr: 3.3.1 - undici: 6.21.3 + '@bufbuild/protobuf': 2.10.0 + meriyah: 6.1.4 zlibjs@0.3.1: {} diff --git a/src/plugins/downloader/main/index.ts b/src/plugins/downloader/main/index.ts index 0f2fe402..33d58ce4 100644 --- a/src/plugins/downloader/main/index.ts +++ b/src/plugins/downloader/main/index.ts @@ -8,6 +8,7 @@ import { UniversalCache, Utils, YTNodes, + Platform, } from '\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js'; import is from 'electron-is'; import filenamify from 'filenamify'; @@ -57,6 +58,22 @@ const ffmpeg = lazy(async () => ); const ffmpegMutex = new Mutex(); +Platform.shim.eval = async (data: Types.BuildScriptResult, env: Record) => { + const properties = []; + + if(env.n) { + properties.push(`n: exportedVars.nFunction("${env.n}")`) + } + + if (env.sig) { + properties.push(`sig: exportedVars.sigFunction("${env.sig}")`) + } + + const code = `${data.output}\nreturn { ${properties.join(', ')} }`; + + return new Function(code)(); +} + let yt: Innertube; let win: BrowserWindow; let playingUrl: string; @@ -131,7 +148,6 @@ export const onMainLoad = async ({ yt = await Innertube.create({ cache: new UniversalCache(false), - player_id: '0004de42', cookie: await getCookieFromWindow(win), generate_session_locally: true, fetch: getNetFetchAsFetch(), From 8100804ced0612a649dc747cc308b7793f6ceeec Mon Sep 17 00:00:00 2001 From: amos levi Date: Wed, 26 Nov 2025 19:48:29 +0100 Subject: [PATCH 2/8] chore(i18n): Translated using Weblate (Hebrew) Currently translated at 46.9% (214 of 456 strings) Translation: pear-devs/pear-desktop/i18n Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/he/ --- src/i18n/resources/he.json | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/i18n/resources/he.json b/src/i18n/resources/he.json index 3bab2e58..8c32a8e0 100644 --- a/src/i18n/resources/he.json +++ b/src/i18n/resources/he.json @@ -150,6 +150,11 @@ "visual-tweaks": { "label": "תיקונים חזותיים", "submenu": { + "custom-window-title": { + "prompt": { + "placeholder": "לדוגמה: שולחן כתיבה אגסי" + } + }, "like-buttons": { "default": "ברירת מחדל", "force-show": "הפעל בכוח", @@ -201,8 +206,8 @@ "restart": "הפעל מחדש", "show": "הראה חלון", "tooltip": { - "default": "יוטיוב מיוזיק", - "with-song-info": "יוטיוב מיוזיק: {{artist}} - {{title}}" + "default": "שולחן כתיבה אגסי", + "with-song-info": "שולחן כתיב אגסי: {{יוצר}} - {{כותרת}}" } } }, @@ -212,7 +217,7 @@ "name": "הגבר מהירות פרסומת" }, "adblocker": { - "description": "חסום את כל המודעות והמעקב מחוץ לקופסה", + "description": "חסום את כל המודעות והמעקבים", "menu": { "blocker": "חוסם" }, @@ -244,6 +249,7 @@ } }, "buffer": { + "label": "חוצץ", "submenu": { "buffer": "{{buffer}}" } @@ -380,6 +386,11 @@ }, "templates": { "title": "פתח בחירת כתוביות" + }, + "toast": { + "caption-changed": "תרגום שונה ל {{שפה}}", + "caption-disabled": "תרגום בוטל", + "no-captions": "אין תרגום זמין לשיר הזה" } }, "compact-sidebar": { @@ -391,9 +402,11 @@ "menu": { "advanced": "מתקדם" }, + "name": "התפיידות צלב[בית]", "prompt": { "options": { "multi-input": { + "fade-in-duration": "תתפייד בזמן[מילישניות]", "fade-scaling": { "linear": "לינארי", "logarithmic": "לוגריתמי" From e00f33eb2d18aa5783d81f3ddc460ad9285c9622 Mon Sep 17 00:00:00 2001 From: Neonka-Svk Date: Fri, 28 Nov 2025 07:28:43 +0100 Subject: [PATCH 3/8] chore(i18n): Translated using Weblate (Slovak) Currently translated at 84.4% (385 of 456 strings) Translation: pear-devs/pear-desktop/i18n Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/sk/ --- src/i18n/resources/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/resources/sk.json b/src/i18n/resources/sk.json index 65b0cc8a..19a805b0 100644 --- a/src/i18n/resources/sk.json +++ b/src/i18n/resources/sk.json @@ -462,7 +462,7 @@ "label": "Text stavu", "submenu": { "artist": "Aktuálne si prehráva {artist}", - "pear-desktop": "Aktuálne prehráva Pear Desktop", + "pear-desktop": "Počúva Pear Desktop", "title": "Aktuálne si prehráva {song title}" } } From 8d448c667f08ff9e12ed1585323330fd3bb2dea7 Mon Sep 17 00:00:00 2001 From: Syed Aqib Tajdar Date: Fri, 28 Nov 2025 23:07:59 +0100 Subject: [PATCH 4/8] chore(i18n): Translated using Weblate (Urdu) Currently translated at 25.0% (114 of 456 strings) Translation: pear-devs/pear-desktop/i18n Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ur/ --- src/i18n/resources/ur.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/resources/ur.json b/src/i18n/resources/ur.json index dde199dc..5772e4fc 100644 --- a/src/i18n/resources/ur.json +++ b/src/i18n/resources/ur.json @@ -151,7 +151,9 @@ "label": "بصری تبدیلیاں", "submenu": { "custom-window-title": { + "label": "اپنی مرضی کا ونڈو عنوان", "prompt": { + "label": "اپنی مرضی کا ونڈو عنوان درج کریں: (بند کرنے کے لیے خالی چھوڑ دیں)", "placeholder": "مثال: پیئر ڈیسک ٹاپ" } }, @@ -219,7 +221,8 @@ "description": "شروغ سے تمام اشتہارات اور ٹریکنگ بلاک کردیں", "menu": { "blocker": "بلاکر" - } + }, + "name": "ایڈ بلاکر" } } } From 127f56905c01b710827174e6b50e93ebe31ff070 Mon Sep 17 00:00:00 2001 From: MiNNU_ Date: Mon, 1 Dec 2025 16:25:14 +0900 Subject: [PATCH 5/8] fix(album-color-theme): improve theming consistency across UI elements (#4109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 최민우 --- src/i18n/resources/en.json | 3 +- src/i18n/resources/ko.json | 3 +- src/plugins/album-color-theme/index.ts | 132 ++++++++++++++---------- src/plugins/album-color-theme/style.css | 11 ++ 4 files changed, 90 insertions(+), 59 deletions(-) diff --git a/src/i18n/resources/en.json b/src/i18n/resources/en.json index 4cf482aa..74a4dc8a 100644 --- a/src/i18n/resources/en.json +++ b/src/i18n/resources/en.json @@ -237,7 +237,8 @@ "submenu": { "percent": "{{ratio}}%" } - } + }, + "enable-seekbar": "Enable seekbar theming" }, "name": "Album Color Theme" }, diff --git a/src/i18n/resources/ko.json b/src/i18n/resources/ko.json index eb5e3f98..0cc6b2d6 100644 --- a/src/i18n/resources/ko.json +++ b/src/i18n/resources/ko.json @@ -237,7 +237,8 @@ "submenu": { "percent": "{{ratio}}%" } - } + }, + "enable-seekbar": "재생바 색조 변경 활성화" }, "name": "앨범 컬러 기반 테마" }, diff --git a/src/plugins/album-color-theme/index.ts b/src/plugins/album-color-theme/index.ts index e8a78945..08048b9b 100644 --- a/src/plugins/album-color-theme/index.ts +++ b/src/plugins/album-color-theme/index.ts @@ -10,41 +10,32 @@ const COLOR_KEY = '--ytmusic-album-color'; const DARK_COLOR_KEY = '--ytmusic-album-color-dark'; const RATIO_KEY = '--ytmusic-album-color-ratio'; -export default createPlugin< - unknown, - unknown, - { - color?: ColorInstance; - darkColor?: ColorInstance; +type Config = { + enabled: boolean; + ratio: number; + enableSeekbar: boolean; +}; - playerPage: HTMLElement | null; - navBarBackground: HTMLElement | null; - ytmusicPlayerBar: HTMLElement | null; - playerBarBackground: HTMLElement | null; - sidebarBig: HTMLElement | null; - sidebarSmall: HTMLElement | null; - ytmusicAppLayout: HTMLElement | null; +type Renderer = { + getMixedColor( + color: string, + key: string, + alpha?: number, + ratioMultiply?: number, + ): string; + updateColor(alpha: number): void; + onConfigChange(newConfig: Config): void; +}; - getMixedColor( - color: string, - key: string, - alpha?: number, - ratioMultiply?: number, - ): string; - updateColor(alpha: number): void; - }, - { - enabled: boolean; - ratio: number; - } ->({ +export default createPlugin({ name: () => t('plugins.album-color-theme.name'), description: () => t('plugins.album-color-theme.description'), restartNeeded: false, config: { enabled: false, ratio: 0.5, - }, + enableSeekbar: true, + } satisfies Config as Config, stylesheets: [style], menu: async ({ getConfig, setConfig }) => { const ratioList = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]; @@ -68,18 +59,28 @@ export default createPlugin< }, })), }, + { + label: t('plugins.album-color-theme.menu.enable-seekbar'), + type: 'checkbox', + checked: config.enableSeekbar, + click(item) { + setConfig({ enableSeekbar: item.checked }); + }, + }, ]; }, renderer: { - playerPage: null, - navBarBackground: null, - ytmusicPlayerBar: null, - playerBarBackground: null, - sidebarBig: null, - sidebarSmall: null, - ytmusicAppLayout: null, + playerPage: null as HTMLElement | null, + navBarBackground: null as HTMLElement | null, + ytmusicPlayerBar: null as HTMLElement | null, + playerBarBackground: null as HTMLElement | null, + sidebarBig: null as HTMLElement | null, + sidebarSmall: null as HTMLElement | null, + ytmusicAppLayout: null as HTMLElement | null, + color: null as ColorInstance | null, + darkColor: null as ColorInstance | null, - async start({ getConfig }) { + start() { this.playerPage = document.querySelector('#player-page'); this.navBarBackground = document.querySelector( '#nav-bar-background', @@ -94,14 +95,11 @@ export default createPlugin< '#mini-guide-background', ); this.ytmusicAppLayout = document.querySelector('#layout'); - - const config = await getConfig(); - document.documentElement.style.setProperty( - RATIO_KEY, - `${~~(config.ratio * 100)}%`, - ); }, - onPlayerApiReady(playerApi) { + async onPlayerApiReady(playerApi, { getConfig }) { + const config = await getConfig(); + (this as Renderer).onConfigChange(config); + const fastAverageColor = new FastAverageColor(); document.addEventListener('videodatachange', async (event) => { @@ -152,7 +150,7 @@ export default createPlugin< alpha = value; } } - this.updateColor(alpha ?? 1); + (this as Renderer).updateColor(alpha ?? 1); }); }, onConfigChange(config) { @@ -160,8 +158,15 @@ export default createPlugin< RATIO_KEY, `${~~(config.ratio * 100)}%`, ); + if (config.enableSeekbar) document.body.classList.add('seekbar-theme'); + else document.body.classList.remove('seekbar-theme'); }, - getMixedColor(color: string, key: string, alpha = 1, ratioMultiply) { + getMixedColor( + color: string, + key: string, + alpha = 1, + ratioMultiply?: number, + ) { const keyColor = `rgba(var(${key}), ${alpha})`; let colorRatio = `var(${RATIO_KEY}, 50%)`; @@ -207,26 +212,39 @@ export default createPlugin< '--yt-spec-black-pure-alpha-80': 'rgba(0,0,0,0.8)', '--yt-spec-black-1-alpha-98': 'rgba(40,40,40,0.98)', '--yt-spec-black-1-alpha-95': 'rgba(40,40,40,0.95)', + '--paper-toast-background-color': '#323232', + '--ytmusic-search-background': '#030303', + '--paper-slider-knob-color': '#f03', + '--paper-dialog-background-color': '#212121', + '--paper-progress-active-color-1': '#f03', + '--paper-progress-active-color-2': '#ff2791', + '--yt-spec-inverted-background': '#f3f3f3', + 'background': 'rgba(3, 3, 3)', + '--ytmusic-background': 'rgba(3, 3, 3)', }; + + const colorKeyMap: Record = { + 'background': DARK_COLOR_KEY, + '--ytmusic-background': DARK_COLOR_KEY, + }; + + const ratioMap: Record = { + '--paper-progress-active-color-1': 1.75, + '--paper-progress-active-color-2': 1.75, + '--yt-spec-inverted-background': 1.75, + }; + + const getMixedColor = (this as Renderer).getMixedColor.bind(this); Object.entries(variableMap).map(([variable, color]) => { + const key = colorKeyMap[variable] ?? COLOR_KEY; + const ratio = ratioMap[variable] ?? undefined; + document.documentElement.style.setProperty( variable, - this.getMixedColor(color, COLOR_KEY, alpha), + getMixedColor(color, key, alpha, ratio), 'important', ); }); - - document.body.style.setProperty( - 'background', - this.getMixedColor('rgba(3, 3, 3)', DARK_COLOR_KEY, alpha), - 'important', - ); - document.documentElement.style.setProperty( - '--ytmusic-background', - // #030303 - this.getMixedColor('rgba(3, 3, 3)', DARK_COLOR_KEY, alpha), - 'important', - ); }, }, }); diff --git a/src/plugins/album-color-theme/style.css b/src/plugins/album-color-theme/style.css index 8d82160e..ec36c097 100644 --- a/src/plugins/album-color-theme/style.css +++ b/src/plugins/album-color-theme/style.css @@ -81,3 +81,14 @@ ytmusic-browse-response[has-background]:not([disable-gradient]) .background-grad #background.immersive-background.style-scope.ytmusic-browse-response { opacity: 0.6; } + +ytmusic-search-box[is-bauhaus-sidenav-enabled] { + --ytmusic-search-background: var(--ytmusic-color-black3) !important; +} + +.seekbar-theme #progress-bar.ytmusic-player-bar { + --paper-slider-active-color: linear-gradient(to right, var(--paper-progress-active-color-1) 80%, var(--paper-progress-active-color-2) 100%) !important; + --paper-slider-knob-color: var(--paper-progress-active-color-1) !important; + --paper-slider-knob-start-color: var(--paper-progress-active-color-2) !important; +} + From ab1a0478cf1500d652fac7d0ef0d715b614d94bd Mon Sep 17 00:00:00 2001 From: Emu Nox Date: Sun, 30 Nov 2025 22:09:05 +0100 Subject: [PATCH 6/8] chore(i18n): Translated using Weblate (Ukrainian) Currently translated at 100.0% (456 of 456 strings) Translation: pear-devs/pear-desktop/i18n Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/uk/ --- src/i18n/resources/uk.json | 44 +++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/i18n/resources/uk.json b/src/i18n/resources/uk.json index 7709ef50..14bf912f 100644 --- a/src/i18n/resources/uk.json +++ b/src/i18n/resources/uk.json @@ -461,7 +461,9 @@ "set-status-display-type": { "label": "Статус", "submenu": { - "pear-desktop": "Відтворення з Pear Desktop" + "artist": "Ви слухаєте {artist}", + "pear-desktop": "Відтворення з Pear Desktop", + "title": "Ви слухаєте {song title}" } } }, @@ -731,7 +733,12 @@ } }, "description": "Дозволяє змінювати якість відео за допомогою кнопки на відео оверлеї", - "name": "Зміна якості відео" + "name": "Зміна якості відео", + "renderer": { + "quality-settings-button": { + "label": "Відкрити налаштування якості плеєру" + } + } }, "scrobbler": { "description": "Додає підтримку скроблінгу (last.fm, Listenbrainz тощо)", @@ -750,6 +757,7 @@ "listenbrainz": { "token": "Ввести токен користувача ListenBrainz" }, + "scrobble-alternative-artist": "Використати іншого виконавця", "scrobble-alternative-title": "Використовувати альтернативні назви", "scrobble-other-media": "Скробилити інші медіа" }, @@ -835,6 +843,14 @@ "label": "Зробити текст пісні ідеально синхронізованим", "tooltip": "Обчисли до мілісекунд відображення наступного рядка (може мати невеликий вплив на продуктивність)" }, + "preferred-provider": { + "label": "Пріорітетний Провайдер", + "none": { + "label": "Жоден", + "tooltip": "Нема провайдера за замовчуванням" + }, + "tooltip": "Оберіть якого провайдера використовувати за замовчуванням" + }, "romanization": { "label": "Транслітерувати текст пісень", "tooltip": "Якщо текст пісні іншою мовою, спробувати його відобразити латинською версією." @@ -867,6 +883,27 @@ "description": "Додає віджет TouchBar для користувачів macOS", "name": "TouchBar" }, + "transparent-player": { + "description": "Зробити вікно програми прозорим", + "menu": { + "opacity": { + "label": "Прозорість", + "submenu": { + "percent": "{{opacity}}%" + } + }, + "type": { + "label": "Тип", + "submenu": { + "acrylic": "Акриловий", + "mica": "Міка", + "none": "Жоден", + "tabbed": "З роздільниками" + } + } + }, + "name": "Прозорий Плеєр" + }, "tuna-obs": { "description": "Інтеграція з плагіном Tuna для OBS", "name": "Tuna OBS" @@ -898,7 +935,8 @@ }, "name": "Перемикач відео", "templates": { - "button-song": "Пісня" + "button-song": "Пісня", + "button-video": "Відео" } }, "visualizer": { From f7aaa3377aea88b3d325465aa878c3bf0e79f2a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0terba?= Date: Mon, 1 Dec 2025 12:02:38 +0100 Subject: [PATCH 7/8] chore(i18n): Translated using Weblate (Slovak) Currently translated at 88.3% (403 of 456 strings) Translation: pear-devs/pear-desktop/i18n Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/sk/ --- src/i18n/resources/sk.json | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/i18n/resources/sk.json b/src/i18n/resources/sk.json index 19a805b0..bf41fa98 100644 --- a/src/i18n/resources/sk.json +++ b/src/i18n/resources/sk.json @@ -462,7 +462,7 @@ "label": "Text stavu", "submenu": { "artist": "Aktuálne si prehráva {artist}", - "pear-desktop": "Počúva Pear Desktop", + "pear-desktop": "Počúvať Pear Desktop", "title": "Aktuálne si prehráva {song title}" } } @@ -731,6 +731,13 @@ "title": "Výber kvality videa" } } + }, + "description": "Umožňuje zmeniť kvalitu videa pomocou tlačidla v prekrytí videa", + "name": "Zmena kvality videa", + "renderer": { + "quality-settings-button": { + "label": "Otvoriť nastavenia kvality prehrávača" + } } }, "scrobbler": { @@ -771,12 +778,38 @@ "shortcuts": { "description": "Povoľuje nastaviť globálne klávesové skratky pre prehrávanie (Prehrať/Pozastaviť/Ďalšie/Predošlé) a vypínať media OSD prepisovaním media kľúčov, zapne Ctrl/CMD + F pre vyhľadávanie, zapne Linux MPRIS podporu pre media kľúče a vlastné klávesové skratky pre pokročilých používateľov.", "menu": { - "override-media-keys": "Prepísať Media Kľúče" + "override-media-keys": "Prepísať Media Kľúče", + "set-keybinds": "Globálne ovládanie skladieb" + }, + "name": "Skratky (& MPRIS)", + "prompt": { + "keybind": { + "keybind-options": { + "next": "Ďalšia", + "play-pause": "Prehrať / Pauza", + "previous": "Predošlá" + }, + "label": "Zvoliť globálne klávesové skratky na ovládanie skladieb:", + "title": "Globálne klávesové skratky" + } } }, + "skip-disliked-songs": { + "description": "Preskakuje skladby označené Nepáči sa", + "name": "Preskakovať skladby označené Nepáči sa" + }, + "skip-silences": { + "description": "Automaticky preskakovať tiché časti v hudbe", + "name": "Preskakuj tiché časti" + }, + "sponsorblock": { + "description": "Automaticky preskakuje nehudbné časti ako intro/outro, alebo tie časti videoklipov v ktorých nehrá hudba", + "name": "Sponzorský blok" + }, "synced-lyrics": { "description": "Poskytuje synchronizované texty k skladbám, pričom používa poskytovateľov ako LRClib.", "errors": { + "fetch": "⚠️\t\tPri získavaní textu sa vyskytla chyba. \n\tSkúste znova neskôr.", "not-found": "⚠️Pre túto skladbu nebol nájdený žiadny text." }, "menu": { From 6c4ae0dbfaeaa9907831c01d9ea7ee73c5a15f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Tue, 2 Dec 2025 00:23:21 +0100 Subject: [PATCH 8/8] chore(i18n): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (457 of 457 strings) Translation: pear-devs/pear-desktop/i18n Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/zh_Hans/ --- src/i18n/resources/zh-CN.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/i18n/resources/zh-CN.json b/src/i18n/resources/zh-CN.json index 11a7a00d..057afa82 100644 --- a/src/i18n/resources/zh-CN.json +++ b/src/i18n/resources/zh-CN.json @@ -237,7 +237,8 @@ "submenu": { "percent": "{{ratio}}%" } - } + }, + "enable-seekbar": "启用进度条主题" }, "name": "专辑配色主题" }, @@ -462,8 +463,8 @@ "label": "状态文本", "submenu": { "artist": "在听 {artist}", - "title": "在听 {song title}", - "pear-desktop": "在听 Pear Desktop" + "pear-desktop": "在听 Pear Desktop", + "title": "在听 {song title}" } } },