mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
Merge branch 'master' into synced-lyrics/netease
This commit is contained in:
@ -135,7 +135,7 @@
|
|||||||
"virtua": "0.42.3",
|
"virtua": "0.42.3",
|
||||||
"vudio": "2.1.1",
|
"vudio": "2.1.1",
|
||||||
"x11": "2.3.0",
|
"x11": "2.3.0",
|
||||||
"youtubei.js": "15.0.1",
|
"youtubei.js": "^16.0.1",
|
||||||
"zod": "4.1.5"
|
"zod": "4.1.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
41
pnpm-lock.yaml
generated
41
pnpm-lock.yaml
generated
@ -253,8 +253,8 @@ importers:
|
|||||||
specifier: 2.3.0
|
specifier: 2.3.0
|
||||||
version: 2.3.0
|
version: 2.3.0
|
||||||
youtubei.js:
|
youtubei.js:
|
||||||
specifier: 15.0.1
|
specifier: ^16.0.1
|
||||||
version: 15.0.1
|
version: 16.0.1
|
||||||
zod:
|
zod:
|
||||||
specifier: 4.1.5
|
specifier: 4.1.5
|
||||||
version: 4.1.5
|
version: 4.1.5
|
||||||
@ -488,8 +488,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
|
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@bufbuild/protobuf@2.6.3':
|
'@bufbuild/protobuf@2.10.0':
|
||||||
resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==}
|
resolution: {integrity: sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==}
|
||||||
|
|
||||||
'@dehoist/romanize-thai@1.0.0':
|
'@dehoist/romanize-thai@1.0.0':
|
||||||
resolution: {integrity: sha512-6SqD4vyZ48otnypLXMh901CeQetoP5ptYOaIr58N6zDqjjoN0bHszMb5d/6AXJJQf8kIvbmSWBeuDrbAWLajPQ==}
|
resolution: {integrity: sha512-6SqD4vyZ48otnypLXMh901CeQetoP5ptYOaIr58N6zDqjjoN0bHszMb5d/6AXJJQf8kIvbmSWBeuDrbAWLajPQ==}
|
||||||
@ -2583,6 +2583,9 @@ packages:
|
|||||||
exponential-backoff@3.1.2:
|
exponential-backoff@3.1.2:
|
||||||
resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==}
|
resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==}
|
||||||
|
|
||||||
|
exponential-backoff@3.1.3:
|
||||||
|
resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
|
||||||
|
|
||||||
extract-zip@2.0.1:
|
extract-zip@2.0.1:
|
||||||
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
|
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
|
||||||
engines: {node: '>= 10.17.0'}
|
engines: {node: '>= 10.17.0'}
|
||||||
@ -3226,9 +3229,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==}
|
resolution: {integrity: sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
jintr@3.3.1:
|
|
||||||
resolution: {integrity: sha512-nnOzyhf0SLpbWuZ270Omwbj5LcXUkTcZkVnK8/veJXtSZOiATM5gMZMdmzN75FmTyj+NVgrGaPdH12zIJ24oIA==}
|
|
||||||
|
|
||||||
jpeg-js@0.4.4:
|
jpeg-js@0.4.4:
|
||||||
resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==}
|
resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==}
|
||||||
|
|
||||||
@ -3492,6 +3492,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
|
meriyah@6.1.4:
|
||||||
|
resolution: {integrity: sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==}
|
||||||
|
engines: {node: '>=18.0.0'}
|
||||||
|
|
||||||
micromatch@4.0.8:
|
micromatch@4.0.8:
|
||||||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
||||||
engines: {node: '>=8.6'}
|
engines: {node: '>=8.6'}
|
||||||
@ -4887,8 +4891,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
youtubei.js@15.0.1:
|
youtubei.js@16.0.1:
|
||||||
resolution: {integrity: sha512-2slapqJS5NuXKHvcACEknyVz0AjH/TrXaOhDM0q2twQKa54kCmfj+7B/2nGfd20uzAe29zW1ejk2qOc4ABuGkg==}
|
resolution: {integrity: sha512-3802bCAGkBc2/G5WUTc0l/bO5mPYJbQAHL04d9hE9PnrDHoBUT8MN721Yqt4RCNncAXdHcfee9VdJy3Fhq1r5g==}
|
||||||
|
|
||||||
zlibjs@0.3.1:
|
zlibjs@0.3.1:
|
||||||
resolution: {integrity: sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==}
|
resolution: {integrity: sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==}
|
||||||
@ -5033,7 +5037,7 @@ snapshots:
|
|||||||
'@babel/helper-string-parser': 7.27.1
|
'@babel/helper-string-parser': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 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': {}
|
'@dehoist/romanize-thai@1.0.0': {}
|
||||||
|
|
||||||
@ -5103,7 +5107,7 @@ snapshots:
|
|||||||
'@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2':
|
'@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2':
|
||||||
dependencies:
|
dependencies:
|
||||||
env-paths: 2.2.1
|
env-paths: 2.2.1
|
||||||
exponential-backoff: 3.1.2
|
exponential-backoff: 3.1.3
|
||||||
glob: 8.1.0
|
glob: 8.1.0
|
||||||
graceful-fs: 4.2.11
|
graceful-fs: 4.2.11
|
||||||
make-fetch-happen: 10.2.1
|
make-fetch-happen: 10.2.1
|
||||||
@ -7521,6 +7525,8 @@ snapshots:
|
|||||||
|
|
||||||
exponential-backoff@3.1.2: {}
|
exponential-backoff@3.1.2: {}
|
||||||
|
|
||||||
|
exponential-backoff@3.1.3: {}
|
||||||
|
|
||||||
extract-zip@2.0.1:
|
extract-zip@2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.1
|
debug: 4.4.1
|
||||||
@ -8216,10 +8222,6 @@ snapshots:
|
|||||||
'@jimp/types': 1.6.0
|
'@jimp/types': 1.6.0
|
||||||
'@jimp/utils': 1.6.0
|
'@jimp/utils': 1.6.0
|
||||||
|
|
||||||
jintr@3.3.1:
|
|
||||||
dependencies:
|
|
||||||
acorn: 8.15.0
|
|
||||||
|
|
||||||
jpeg-js@0.4.4: {}
|
jpeg-js@0.4.4: {}
|
||||||
|
|
||||||
js-tokens@4.0.0: {}
|
js-tokens@4.0.0: {}
|
||||||
@ -8486,6 +8488,8 @@ snapshots:
|
|||||||
|
|
||||||
merge2@1.4.1: {}
|
merge2@1.4.1: {}
|
||||||
|
|
||||||
|
meriyah@6.1.4: {}
|
||||||
|
|
||||||
micromatch@4.0.8:
|
micromatch@4.0.8:
|
||||||
dependencies:
|
dependencies:
|
||||||
braces: 3.0.3
|
braces: 3.0.3
|
||||||
@ -9920,11 +9924,10 @@ snapshots:
|
|||||||
|
|
||||||
yocto-queue@0.1.0: {}
|
yocto-queue@0.1.0: {}
|
||||||
|
|
||||||
youtubei.js@15.0.1:
|
youtubei.js@16.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@bufbuild/protobuf': 2.6.3
|
'@bufbuild/protobuf': 2.10.0
|
||||||
jintr: 3.3.1
|
meriyah: 6.1.4
|
||||||
undici: 6.21.3
|
|
||||||
|
|
||||||
zlibjs@0.3.1: {}
|
zlibjs@0.3.1: {}
|
||||||
|
|
||||||
|
|||||||
@ -237,7 +237,8 @@
|
|||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"enable-seekbar": "Enable seekbar theming"
|
||||||
},
|
},
|
||||||
"name": "Album Color Theme"
|
"name": "Album Color Theme"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -150,6 +150,11 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "תיקונים חזותיים",
|
"label": "תיקונים חזותיים",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"prompt": {
|
||||||
|
"placeholder": "לדוגמה: שולחן כתיבה אגסי"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "ברירת מחדל",
|
"default": "ברירת מחדל",
|
||||||
"force-show": "הפעל בכוח",
|
"force-show": "הפעל בכוח",
|
||||||
@ -201,8 +206,8 @@
|
|||||||
"restart": "הפעל מחדש",
|
"restart": "הפעל מחדש",
|
||||||
"show": "הראה חלון",
|
"show": "הראה חלון",
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"default": "יוטיוב מיוזיק",
|
"default": "שולחן כתיבה אגסי",
|
||||||
"with-song-info": "יוטיוב מיוזיק: {{artist}} - {{title}}"
|
"with-song-info": "שולחן כתיב אגסי: {{יוצר}} - {{כותרת}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -212,7 +217,7 @@
|
|||||||
"name": "הגבר מהירות פרסומת"
|
"name": "הגבר מהירות פרסומת"
|
||||||
},
|
},
|
||||||
"adblocker": {
|
"adblocker": {
|
||||||
"description": "חסום את כל המודעות והמעקב מחוץ לקופסה",
|
"description": "חסום את כל המודעות והמעקבים",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blocker": "חוסם"
|
"blocker": "חוסם"
|
||||||
},
|
},
|
||||||
@ -244,6 +249,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"buffer": {
|
"buffer": {
|
||||||
|
"label": "חוצץ",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"buffer": "{{buffer}}"
|
"buffer": "{{buffer}}"
|
||||||
}
|
}
|
||||||
@ -380,6 +386,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "פתח בחירת כתוביות"
|
"title": "פתח בחירת כתוביות"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "תרגום שונה ל {{שפה}}",
|
||||||
|
"caption-disabled": "תרגום בוטל",
|
||||||
|
"no-captions": "אין תרגום זמין לשיר הזה"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -391,9 +402,11 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"advanced": "מתקדם"
|
"advanced": "מתקדם"
|
||||||
},
|
},
|
||||||
|
"name": "התפיידות צלב[בית]",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"options": {
|
"options": {
|
||||||
"multi-input": {
|
"multi-input": {
|
||||||
|
"fade-in-duration": "תתפייד בזמן[מילישניות]",
|
||||||
"fade-scaling": {
|
"fade-scaling": {
|
||||||
"linear": "לינארי",
|
"linear": "לינארי",
|
||||||
"logarithmic": "לוגריתמי"
|
"logarithmic": "לוגריתמי"
|
||||||
|
|||||||
@ -237,7 +237,8 @@
|
|||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"enable-seekbar": "재생바 색조 변경 활성화"
|
||||||
},
|
},
|
||||||
"name": "앨범 컬러 기반 테마"
|
"name": "앨범 컬러 기반 테마"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -462,7 +462,7 @@
|
|||||||
"label": "Text stavu",
|
"label": "Text stavu",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"artist": "Aktuálne si prehráva {artist}",
|
"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}"
|
"title": "Aktuálne si prehráva {song title}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -731,6 +731,13 @@
|
|||||||
"title": "Výber kvality videa"
|
"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": {
|
"scrobbler": {
|
||||||
@ -771,12 +778,38 @@
|
|||||||
"shortcuts": {
|
"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.",
|
"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": {
|
"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": {
|
"synced-lyrics": {
|
||||||
"description": "Poskytuje synchronizované texty k skladbám, pričom používa poskytovateľov ako LRClib.",
|
"description": "Poskytuje synchronizované texty k skladbám, pričom používa poskytovateľov ako LRClib.",
|
||||||
"errors": {
|
"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."
|
"not-found": "⚠️Pre túto skladbu nebol nájdený žiadny text."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
|
|||||||
@ -461,7 +461,9 @@
|
|||||||
"set-status-display-type": {
|
"set-status-display-type": {
|
||||||
"label": "Статус",
|
"label": "Статус",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"pear-desktop": "Відтворення з Pear Desktop"
|
"artist": "Ви слухаєте {artist}",
|
||||||
|
"pear-desktop": "Відтворення з Pear Desktop",
|
||||||
|
"title": "Ви слухаєте {song title}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -731,7 +733,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Дозволяє змінювати якість відео за допомогою кнопки на відео оверлеї",
|
"description": "Дозволяє змінювати якість відео за допомогою кнопки на відео оверлеї",
|
||||||
"name": "Зміна якості відео"
|
"name": "Зміна якості відео",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Відкрити налаштування якості плеєру"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Додає підтримку скроблінгу (last.fm, Listenbrainz тощо)",
|
"description": "Додає підтримку скроблінгу (last.fm, Listenbrainz тощо)",
|
||||||
@ -750,6 +757,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Ввести токен користувача ListenBrainz"
|
"token": "Ввести токен користувача ListenBrainz"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-artist": "Використати іншого виконавця",
|
||||||
"scrobble-alternative-title": "Використовувати альтернативні назви",
|
"scrobble-alternative-title": "Використовувати альтернативні назви",
|
||||||
"scrobble-other-media": "Скробилити інші медіа"
|
"scrobble-other-media": "Скробилити інші медіа"
|
||||||
},
|
},
|
||||||
@ -835,6 +843,14 @@
|
|||||||
"label": "Зробити текст пісні ідеально синхронізованим",
|
"label": "Зробити текст пісні ідеально синхронізованим",
|
||||||
"tooltip": "Обчисли до мілісекунд відображення наступного рядка (може мати невеликий вплив на продуктивність)"
|
"tooltip": "Обчисли до мілісекунд відображення наступного рядка (може мати невеликий вплив на продуктивність)"
|
||||||
},
|
},
|
||||||
|
"preferred-provider": {
|
||||||
|
"label": "Пріорітетний Провайдер",
|
||||||
|
"none": {
|
||||||
|
"label": "Жоден",
|
||||||
|
"tooltip": "Нема провайдера за замовчуванням"
|
||||||
|
},
|
||||||
|
"tooltip": "Оберіть якого провайдера використовувати за замовчуванням"
|
||||||
|
},
|
||||||
"romanization": {
|
"romanization": {
|
||||||
"label": "Транслітерувати текст пісень",
|
"label": "Транслітерувати текст пісень",
|
||||||
"tooltip": "Якщо текст пісні іншою мовою, спробувати його відобразити латинською версією."
|
"tooltip": "Якщо текст пісні іншою мовою, спробувати його відобразити латинською версією."
|
||||||
@ -867,6 +883,27 @@
|
|||||||
"description": "Додає віджет TouchBar для користувачів macOS",
|
"description": "Додає віджет TouchBar для користувачів macOS",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "Зробити вікно програми прозорим",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "Прозорість",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Тип",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "Акриловий",
|
||||||
|
"mica": "Міка",
|
||||||
|
"none": "Жоден",
|
||||||
|
"tabbed": "З роздільниками"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Прозорий Плеєр"
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "Інтеграція з плагіном Tuna для OBS",
|
"description": "Інтеграція з плагіном Tuna для OBS",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
@ -898,7 +935,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Перемикач відео",
|
"name": "Перемикач відео",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Пісня"
|
"button-song": "Пісня",
|
||||||
|
"button-video": "Відео"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -151,7 +151,9 @@
|
|||||||
"label": "بصری تبدیلیاں",
|
"label": "بصری تبدیلیاں",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"custom-window-title": {
|
"custom-window-title": {
|
||||||
|
"label": "اپنی مرضی کا ونڈو عنوان",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
"label": "اپنی مرضی کا ونڈو عنوان درج کریں: (بند کرنے کے لیے خالی چھوڑ دیں)",
|
||||||
"placeholder": "مثال: پیئر ڈیسک ٹاپ"
|
"placeholder": "مثال: پیئر ڈیسک ٹاپ"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -219,7 +221,8 @@
|
|||||||
"description": "شروغ سے تمام اشتہارات اور ٹریکنگ بلاک کردیں",
|
"description": "شروغ سے تمام اشتہارات اور ٹریکنگ بلاک کردیں",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blocker": "بلاکر"
|
"blocker": "بلاکر"
|
||||||
}
|
},
|
||||||
|
"name": "ایڈ بلاکر"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -237,7 +237,8 @@
|
|||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"enable-seekbar": "启用进度条主题"
|
||||||
},
|
},
|
||||||
"name": "专辑配色主题"
|
"name": "专辑配色主题"
|
||||||
},
|
},
|
||||||
@ -462,8 +463,8 @@
|
|||||||
"label": "状态文本",
|
"label": "状态文本",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"artist": "在听 {artist}",
|
"artist": "在听 {artist}",
|
||||||
"title": "在听 {song title}",
|
"pear-desktop": "在听 Pear Desktop",
|
||||||
"pear-desktop": "在听 Pear Desktop"
|
"title": "在听 {song title}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -10,41 +10,32 @@ const COLOR_KEY = '--ytmusic-album-color';
|
|||||||
const DARK_COLOR_KEY = '--ytmusic-album-color-dark';
|
const DARK_COLOR_KEY = '--ytmusic-album-color-dark';
|
||||||
const RATIO_KEY = '--ytmusic-album-color-ratio';
|
const RATIO_KEY = '--ytmusic-album-color-ratio';
|
||||||
|
|
||||||
export default createPlugin<
|
type Config = {
|
||||||
unknown,
|
enabled: boolean;
|
||||||
unknown,
|
ratio: number;
|
||||||
{
|
enableSeekbar: boolean;
|
||||||
color?: ColorInstance;
|
};
|
||||||
darkColor?: ColorInstance;
|
|
||||||
|
|
||||||
playerPage: HTMLElement | null;
|
type Renderer = {
|
||||||
navBarBackground: HTMLElement | null;
|
getMixedColor(
|
||||||
ytmusicPlayerBar: HTMLElement | null;
|
color: string,
|
||||||
playerBarBackground: HTMLElement | null;
|
key: string,
|
||||||
sidebarBig: HTMLElement | null;
|
alpha?: number,
|
||||||
sidebarSmall: HTMLElement | null;
|
ratioMultiply?: number,
|
||||||
ytmusicAppLayout: HTMLElement | null;
|
): string;
|
||||||
|
updateColor(alpha: number): void;
|
||||||
|
onConfigChange(newConfig: Config): void;
|
||||||
|
};
|
||||||
|
|
||||||
getMixedColor(
|
export default createPlugin({
|
||||||
color: string,
|
|
||||||
key: string,
|
|
||||||
alpha?: number,
|
|
||||||
ratioMultiply?: number,
|
|
||||||
): string;
|
|
||||||
updateColor(alpha: number): void;
|
|
||||||
},
|
|
||||||
{
|
|
||||||
enabled: boolean;
|
|
||||||
ratio: number;
|
|
||||||
}
|
|
||||||
>({
|
|
||||||
name: () => t('plugins.album-color-theme.name'),
|
name: () => t('plugins.album-color-theme.name'),
|
||||||
description: () => t('plugins.album-color-theme.description'),
|
description: () => t('plugins.album-color-theme.description'),
|
||||||
restartNeeded: false,
|
restartNeeded: false,
|
||||||
config: {
|
config: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
ratio: 0.5,
|
ratio: 0.5,
|
||||||
},
|
enableSeekbar: true,
|
||||||
|
} satisfies Config as Config,
|
||||||
stylesheets: [style],
|
stylesheets: [style],
|
||||||
menu: async ({ getConfig, setConfig }) => {
|
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];
|
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: {
|
renderer: {
|
||||||
playerPage: null,
|
playerPage: null as HTMLElement | null,
|
||||||
navBarBackground: null,
|
navBarBackground: null as HTMLElement | null,
|
||||||
ytmusicPlayerBar: null,
|
ytmusicPlayerBar: null as HTMLElement | null,
|
||||||
playerBarBackground: null,
|
playerBarBackground: null as HTMLElement | null,
|
||||||
sidebarBig: null,
|
sidebarBig: null as HTMLElement | null,
|
||||||
sidebarSmall: null,
|
sidebarSmall: null as HTMLElement | null,
|
||||||
ytmusicAppLayout: null,
|
ytmusicAppLayout: null as HTMLElement | null,
|
||||||
|
color: null as ColorInstance | null,
|
||||||
|
darkColor: null as ColorInstance | null,
|
||||||
|
|
||||||
async start({ getConfig }) {
|
start() {
|
||||||
this.playerPage = document.querySelector<HTMLElement>('#player-page');
|
this.playerPage = document.querySelector<HTMLElement>('#player-page');
|
||||||
this.navBarBackground = document.querySelector<HTMLElement>(
|
this.navBarBackground = document.querySelector<HTMLElement>(
|
||||||
'#nav-bar-background',
|
'#nav-bar-background',
|
||||||
@ -94,14 +95,11 @@ export default createPlugin<
|
|||||||
'#mini-guide-background',
|
'#mini-guide-background',
|
||||||
);
|
);
|
||||||
this.ytmusicAppLayout = document.querySelector<HTMLElement>('#layout');
|
this.ytmusicAppLayout = document.querySelector<HTMLElement>('#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();
|
const fastAverageColor = new FastAverageColor();
|
||||||
|
|
||||||
document.addEventListener('videodatachange', async (event) => {
|
document.addEventListener('videodatachange', async (event) => {
|
||||||
@ -152,7 +150,7 @@ export default createPlugin<
|
|||||||
alpha = value;
|
alpha = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.updateColor(alpha ?? 1);
|
(this as Renderer).updateColor(alpha ?? 1);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onConfigChange(config) {
|
onConfigChange(config) {
|
||||||
@ -160,8 +158,15 @@ export default createPlugin<
|
|||||||
RATIO_KEY,
|
RATIO_KEY,
|
||||||
`${~~(config.ratio * 100)}%`,
|
`${~~(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})`;
|
const keyColor = `rgba(var(${key}), ${alpha})`;
|
||||||
|
|
||||||
let colorRatio = `var(${RATIO_KEY}, 50%)`;
|
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-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-98': 'rgba(40,40,40,0.98)',
|
||||||
'--yt-spec-black-1-alpha-95': 'rgba(40,40,40,0.95)',
|
'--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<string, string> = {
|
||||||
|
'background': DARK_COLOR_KEY,
|
||||||
|
'--ytmusic-background': DARK_COLOR_KEY,
|
||||||
|
};
|
||||||
|
|
||||||
|
const ratioMap: Record<string, number> = {
|
||||||
|
'--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]) => {
|
Object.entries(variableMap).map(([variable, color]) => {
|
||||||
|
const key = colorKeyMap[variable] ?? COLOR_KEY;
|
||||||
|
const ratio = ratioMap[variable] ?? undefined;
|
||||||
|
|
||||||
document.documentElement.style.setProperty(
|
document.documentElement.style.setProperty(
|
||||||
variable,
|
variable,
|
||||||
this.getMixedColor(color, COLOR_KEY, alpha),
|
getMixedColor(color, key, alpha, ratio),
|
||||||
'important',
|
'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',
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -81,3 +81,14 @@ ytmusic-browse-response[has-background]:not([disable-gradient]) .background-grad
|
|||||||
#background.immersive-background.style-scope.ytmusic-browse-response {
|
#background.immersive-background.style-scope.ytmusic-browse-response {
|
||||||
opacity: 0.6;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import {
|
|||||||
UniversalCache,
|
UniversalCache,
|
||||||
Utils,
|
Utils,
|
||||||
YTNodes,
|
YTNodes,
|
||||||
|
Platform,
|
||||||
} from '\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js';
|
} from '\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js';
|
||||||
import is from 'electron-is';
|
import is from 'electron-is';
|
||||||
import filenamify from 'filenamify';
|
import filenamify from 'filenamify';
|
||||||
@ -57,6 +58,22 @@ const ffmpeg = lazy(async () =>
|
|||||||
);
|
);
|
||||||
const ffmpegMutex = new Mutex();
|
const ffmpegMutex = new Mutex();
|
||||||
|
|
||||||
|
Platform.shim.eval = async (data: Types.BuildScriptResult, env: Record<string, Types.VMPrimative>) => {
|
||||||
|
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 yt: Innertube;
|
||||||
let win: BrowserWindow;
|
let win: BrowserWindow;
|
||||||
let playingUrl: string;
|
let playingUrl: string;
|
||||||
@ -131,7 +148,6 @@ export const onMainLoad = async ({
|
|||||||
|
|
||||||
yt = await Innertube.create({
|
yt = await Innertube.create({
|
||||||
cache: new UniversalCache(false),
|
cache: new UniversalCache(false),
|
||||||
player_id: '0004de42',
|
|
||||||
cookie: await getCookieFromWindow(win),
|
cookie: await getCookieFromWindow(win),
|
||||||
generate_session_locally: true,
|
generate_session_locally: true,
|
||||||
fetch: getNetFetchAsFetch(),
|
fetch: getNetFetchAsFetch(),
|
||||||
|
|||||||
Reference in New Issue
Block a user