mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-18 21:52:05 +00:00
Compare commits
38 Commits
f87030ff55
...
c513959461
| Author | SHA1 | Date | |
|---|---|---|---|
| c513959461 | |||
| 66e414dd64 | |||
| 454d2a1d4e | |||
| ca3372d7f5 | |||
| 5bcbab1fac | |||
| 47656c08fd | |||
| 6374ff4a41 | |||
| 86e7c84e43 | |||
| d554fa34b2 | |||
| 1bec276c8b | |||
| 17153eacf0 | |||
| 20d25ca953 | |||
| b3b3d45b96 | |||
| 5ba65ea122 | |||
| 0108e3f603 | |||
| 8d23b13f70 | |||
| a8f9505255 | |||
| cd0509eb06 | |||
| 23504408ec | |||
| ba8282881d | |||
| ad1ac79fdb | |||
| 54736256a4 | |||
| 0d77ac096d | |||
| 6a2b27bfcb | |||
| 2a0aeac89b | |||
| 5dc11e2bdc | |||
| fba48dcd55 | |||
| 832c3103c7 | |||
| 49d9bf9859 | |||
| ef5d0c1222 | |||
| 1cb666d7dd | |||
| 45ca896bef | |||
| 624d5102a5 | |||
| 2e9e5cc51f | |||
| c5f755bfcf | |||
| 0d1cadd650 | |||
| 4cc7ffe74d | |||
| 7f59ca18b0 |
48
package.json
48
package.json
@ -45,12 +45,12 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"vite": "npm:rolldown-vite@7.0.8",
|
||||
"vite": "npm:rolldown-vite@7.0.11",
|
||||
"node-gyp": "11.2.0",
|
||||
"xml2js": "0.6.2",
|
||||
"node-fetch": "3.3.2",
|
||||
"@electron/universal": "3.0.0",
|
||||
"@babel/runtime": "7.27.6",
|
||||
"@babel/runtime": "7.28.2",
|
||||
"vitefu": "1.1.1"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
@ -68,18 +68,18 @@
|
||||
"@ffmpeg.wasm/main": "0.12.0",
|
||||
"@floating-ui/dom": "1.7.2",
|
||||
"@foobar404/wave": "2.0.5",
|
||||
"@ghostery/adblocker-electron": "2.11.1",
|
||||
"@ghostery/adblocker-electron-preload": "2.11.1",
|
||||
"@hono/node-server": "1.15.0",
|
||||
"@ghostery/adblocker-electron": "2.11.3",
|
||||
"@ghostery/adblocker-electron-preload": "2.11.3",
|
||||
"@hono/node-server": "1.17.1",
|
||||
"@hono/swagger-ui": "0.5.2",
|
||||
"@hono/zod-openapi": "1.0.0-beta.1",
|
||||
"@hono/zod-validator": "0.7.1",
|
||||
"@hono/zod-openapi": "1.0.2",
|
||||
"@hono/zod-validator": "0.7.2",
|
||||
"@jellybrick/dbus-next": "0.10.3",
|
||||
"@jellybrick/electron-better-web-request": "1.0.4",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
"@jimp/plugin-color": "1.6.0",
|
||||
"@skyra/jaro-winkler": "1.1.1",
|
||||
"@xhayper/discord-rpc": "1.2.2",
|
||||
"@xhayper/discord-rpc": "1.3.0",
|
||||
"async-mutex": "0.5.0",
|
||||
"bgutils-js": "3.2.0",
|
||||
"butterchurn": "3.0.0-beta.5",
|
||||
@ -102,7 +102,7 @@
|
||||
"filenamify": "6.0.0",
|
||||
"hanja": "1.1.4",
|
||||
"happy-dom": "18.0.1",
|
||||
"hono": "4.8.4",
|
||||
"hono": "4.8.9",
|
||||
"howler": "2.2.4",
|
||||
"html-to-text": "9.0.5",
|
||||
"i18next": "25.3.2",
|
||||
@ -132,14 +132,14 @@
|
||||
"virtua": "0.41.5",
|
||||
"vudio": "2.1.1",
|
||||
"x11": "2.3.0",
|
||||
"youtubei.js": "14.0.0",
|
||||
"zod": "4.0.5"
|
||||
"youtubei.js": "15.0.1",
|
||||
"zod": "4.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "9.31.0",
|
||||
"@eslint/js": "9.32.0",
|
||||
"@malept/flatpak-bundler": "0.4.0",
|
||||
"@playwright/test": "1.54.1",
|
||||
"@stylistic/eslint-plugin": "5.1.0",
|
||||
"@stylistic/eslint-plugin": "5.2.2",
|
||||
"@total-typescript/ts-reset": "0.6.1",
|
||||
"@types/electron-localshortcut": "3.1.3",
|
||||
"@types/howler": "2.2.12",
|
||||
@ -148,31 +148,31 @@
|
||||
"@types/trusted-types": "2.0.7",
|
||||
"bufferutil": "4.0.9",
|
||||
"builtin-modules": "5.0.0",
|
||||
"cross-env": "7.0.3",
|
||||
"cross-env": "10.0.0",
|
||||
"del-cli": "6.0.0",
|
||||
"discord-api-types": "0.38.15",
|
||||
"electron": "38.0.0-alpha.5",
|
||||
"discord-api-types": "0.38.17",
|
||||
"electron": "37.2.4",
|
||||
"electron-builder": "26.0.12",
|
||||
"electron-builder-squirrel-windows": "26.0.12",
|
||||
"electron-devtools-installer": "4.0.0",
|
||||
"electron-vite": "4.0.0",
|
||||
"esbuild": "0.25.6",
|
||||
"eslint": "9.31.0",
|
||||
"eslint-config-prettier": "10.1.5",
|
||||
"esbuild": "0.25.8",
|
||||
"eslint": "9.32.0",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
||||
"eslint-import-resolver-typescript": "4.4.4",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"eslint-plugin-prettier": "5.5.1",
|
||||
"eslint-plugin-prettier": "5.5.3",
|
||||
"eslint-plugin-solid": "0.14.5",
|
||||
"glob": "11.0.3",
|
||||
"node-gyp": "11.2.0",
|
||||
"playwright": "1.54.1",
|
||||
"rollup": "4.45.0",
|
||||
"rollup": "4.46.1",
|
||||
"typescript": "5.8.3",
|
||||
"typescript-eslint": "8.36.0",
|
||||
"typescript-eslint": "8.38.0",
|
||||
"utf-8-validate": "6.0.5",
|
||||
"vite": "npm:rolldown-vite@7.0.8",
|
||||
"vite-plugin-inspect": "11.3.0",
|
||||
"vite": "npm:rolldown-vite@7.0.11",
|
||||
"vite-plugin-inspect": "11.3.2",
|
||||
"vite-plugin-resolve": "2.5.2",
|
||||
"vite-plugin-solid": "2.11.7",
|
||||
"ws": "8.18.3"
|
||||
|
||||
1228
pnpm-lock.yaml
generated
1228
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -34,6 +34,7 @@ export interface DefaultConfig {
|
||||
overrideUserAgent: boolean;
|
||||
usePodcastParticipantAsArtist: boolean;
|
||||
themes: string[];
|
||||
customWindowTitle?: string;
|
||||
};
|
||||
'plugins': Record<string, unknown>;
|
||||
}
|
||||
|
||||
@ -1,7 +1,91 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Plagini icra etmək mümkün olmadı {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plagin {{pluginName}}::{{contextName}} {{ms}} millisaniyədə icra edildi",
|
||||
"initialize-failed": "\"{{pluginName}}\" plaginini başlatmaq mümkün olmadı",
|
||||
"load-all": "Bütün plaginlər yüklənir",
|
||||
"load-failed": "\"{{pluginName}}\" plaginini yükləmək mümkün olmadı",
|
||||
"loaded": "\"{{pluginName}}\" plagini yükləndi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "az",
|
||||
"local-name": "Azərbaycan dili",
|
||||
"name": "Azerbaijani"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Proqram keşi təmizlənir"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Pəncərə ekran kənarında göstərilməyə çalışıldı, PəncərəÖlçüsü={{windowSize}}, EkranÖlçüsü={{displaySize}}, Vəziyyət={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Menu gizlədildi, yenidən göstərmək üçün 'Alt' istifadə edin (Proqramiçi menu üçün 'Esc')",
|
||||
"message": "Gizlət menusu aktivləşdirildi",
|
||||
"title": "Gizlət menusu aktivləşdirildi"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Sonra",
|
||||
"restart-now": "Yenidən başlat"
|
||||
},
|
||||
"detail": "\"{{pluginName}}\" plaginin işləməsi üçün proqramı yenidən başladın",
|
||||
"message": "\"{{pluginName}}\" üçün proqram yenidən başlamalıdır",
|
||||
"title": "Yenidən başlatmaq tələb edilir"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Tərk et",
|
||||
"relaunch": "Yenidən işə sal",
|
||||
"wait": "Gözləyin"
|
||||
},
|
||||
"detail": "Narahatçılıq üçün üzr istəyirik! Nə etməli olduğumuzu seçin:",
|
||||
"message": "Proqram cavab vermir",
|
||||
"title": "Pəncərə Cavab vermir"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Yeniləmələri deaktiv et",
|
||||
"download": "Yüklə",
|
||||
"ok": "Oldu"
|
||||
},
|
||||
"detail": "Yeni versiya mövcuddur və bu linkdən yüklənə bilər {{downloadLink}}",
|
||||
"message": "Yeni versiya mövcuddur",
|
||||
"title": "Yeniləmə mövcuddur"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Haqqında",
|
||||
"navigation": {
|
||||
"label": "İstiqamət",
|
||||
"submenu": {
|
||||
"copy-current-url": "Hazırkı linki kopyala",
|
||||
"go-back": "Geri qayıt",
|
||||
"go-forward": "İrəli get",
|
||||
"quit": "Çıx",
|
||||
"restart": "Proqramı Yenidən Başlat"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Seçimlər",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Əlavə seçimlər",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Proqram başlayanda keşi təmizlə",
|
||||
"disable-hardware-acceleration": "Aparat təminatı sürətlənməsini deaktiv et",
|
||||
"edit-config-json": "Config.json dəyiş"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -381,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "ক্যাপশন নির্বাচক খুলুন"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "ক্যাপশন {{language}} ভাষায় পরিবর্তিত হয়েছে",
|
||||
"caption-disabled": "ক্যাপশন বন্ধ করা হয়েছে",
|
||||
"no-captions": "এই গানটির জন্য কোনো ক্যাপশন উপলব্ধ নেই"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -600,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "পরবর্তী/পূর্ববর্তী নেভিগেশন তীরগুলি আপনার প্রিয় ব্রাউজারের মতো সরাসরি ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে",
|
||||
"name": "নেভিগেশন"
|
||||
"name": "নেভিগেশন",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "আগের পাতায় যান"
|
||||
},
|
||||
"forward": {
|
||||
"title": "পরের পাতায় যান"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "ইন্টারফেস থেকে Google লগইন বাটন এবং লিঙ্কগুলি সরান",
|
||||
@ -692,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "ভিডিও ওভারলেতে একটি বাটনের মাধ্যমে ভিডিও কোয়ালিটি পরিবর্তন করতে দেয়",
|
||||
"name": "ভিডিও কোয়ালিটি পরিবর্তক"
|
||||
"name": "ভিডিও কোয়ালিটি পরিবর্তক",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "প্লেয়ারের মান পরিবর্তনের অপশন খুলুন"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "স্ক্রবলিং সমর্থন যোগ করুন (যেমন last.fm, Listenbrainz)",
|
||||
@ -857,7 +875,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "ভিডিও টগল"
|
||||
"name": "ভিডিও টগল",
|
||||
"templates": {
|
||||
"button-song": "গান",
|
||||
"button-video": "ভিডিও"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "প্লেয়ারে একটি ভিজ্যুয়ালাইজার যোগ করে",
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
"download": "Λήψη",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Μια νέα έκδοση είναι διαθέσιμη και μπορεί να ληφθεί από τον σύνδεσμο {{downloadLink}}",
|
||||
"detail": "Μια νέα έκδοση είναι διαθέσιμη και μπορεί να ληφθεί από το {{downloadLink}}",
|
||||
"message": "Μια νέα έκδοση είναι διαθέσιμη",
|
||||
"title": "Διατίθεται ενημέρωση"
|
||||
}
|
||||
@ -132,14 +132,14 @@
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Συνέχιση τελευταίου τραγουδιού όταν η εφαρμογή ξεκινά",
|
||||
"single-instance-lock": "Κλείδωμα Μοναδικής Εκδοχής",
|
||||
"start-at-login": "Έναρξη κατά την σύνδεση",
|
||||
"single-instance-lock": "Κλείδωμα μοναδικής εκδοχής",
|
||||
"start-at-login": "Έναρξη κατά τη σύνδεση",
|
||||
"starting-page": {
|
||||
"label": "Σελίδα έναρξης",
|
||||
"label": "Αρχική σελίδα",
|
||||
"unset": "Κατάργηση ορισμού"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Δίσκος",
|
||||
"label": "Περιοχή συστήματος",
|
||||
"submenu": {
|
||||
"disabled": "Απενεργοποιημένο",
|
||||
"enabled-and-hide-app": "Ενεργοποιημένο και απόκρυψη της εφαρμογής",
|
||||
@ -148,7 +148,7 @@
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Τροποποιήσεις εμφάνισης",
|
||||
"label": "Οπτικές προσαρμογές",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Προεπιλογή",
|
||||
@ -169,7 +169,7 @@
|
||||
"label": "Θέμα",
|
||||
"submenu": {
|
||||
"import-css-file": "Εισαγωγή προσαρμοσμένου αρχείου CSS",
|
||||
"no-theme": "Κανένα θέμα"
|
||||
"no-theme": "Χωρίς θέμα"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -208,11 +208,11 @@
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Εάν παίξει διαφήμιση κάνει σίγαση του ήχου και θέτει την ταχύτητα αναπαραγωγής στο 16x",
|
||||
"name": "Γρήγορη προώθηση διαφημίσεων"
|
||||
"description": "Εάν ξεκινήσει διαφήμιση, ο ήχος απενεργοποιείται και η ταχύτητα αναπαραγωγής ορίζεται σε 16x",
|
||||
"name": "Επιτάχυνση διαφημίσεων"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Αποκλεισμός όλων των διαφημίσεων και tracker",
|
||||
"description": "Αποκλεισμός όλων των διαφημίσεων και της παρακολούθησης από προεπιλογή",
|
||||
"menu": {
|
||||
"blocker": "Πρόγραμμα αποκλεισμού"
|
||||
},
|
||||
@ -223,28 +223,28 @@
|
||||
"name": "Ενέργειες σε Άλμπουμ"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Εφαρμόζει ένα δυναμικό θέμα και οπτικά εφέ με βάση τη χρωματική παλέτα του άλμπουμ",
|
||||
"description": "Εφαρμόζει ένα δυναμικό θέμα και οπτικά εφέ βάσει της παλέτας χρωμάτων του άλμπουμ",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Αναλογία μίξης χρωμάτων",
|
||||
"label": "Αναλογία ανάμειξης χρωμάτων",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Θέμα χρώματος άλμπουμ"
|
||||
"name": "Θέμα χρωμάτων άλμπουμ"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Εφαρμόζει ένα εφέ φωτισμού ρίχνοντας απαλά χρώματα από το βίντεο στο φόντο της οθόνης σας",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Ένταση θαμπώματος",
|
||||
"label": "Ποσότητα θολώματος",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} pixels"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Buffer",
|
||||
"label": "Ενδιάμεση μνήμη",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
@ -270,18 +270,18 @@
|
||||
"smoothness-transition": {
|
||||
"label": "Ομαλή μετάβαση",
|
||||
"submenu": {
|
||||
"during": "Σε {{interpolationTime}} δευτερόλεπτα"
|
||||
"during": "Για {{interpolationTime}} δευτερόλεπτα"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Χρήση πλήρους οθόνης"
|
||||
"label": "Σε πλήρη οθόνη"
|
||||
}
|
||||
},
|
||||
"name": "Λειτουργία περιβάλλοντος"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Προσθέτει υποστήριξη μουσικής YouTube για το widget Amuse now playing από την 6K Labs",
|
||||
"name": "Διασκέδαση",
|
||||
"description": "Προσθέτει υποστήριξη YouTube Music στο widget Amuse now playing από την 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Ο διακομιστής Amuse API εκτελείται. GET /query για να λάβετε πληροφορίες για το τραγούδι."
|
||||
}
|
||||
|
||||
@ -156,6 +156,13 @@
|
||||
"hide": "Hide",
|
||||
"label": "Like buttons"
|
||||
},
|
||||
"custom-window-title": {
|
||||
"label": "Custom window title",
|
||||
"prompt": {
|
||||
"label": "Enter custom window title: (leave empty to disable)",
|
||||
"placeholder": "Example: YouTube Music"
|
||||
}
|
||||
},
|
||||
"remove-upgrade-button": "Remove upgrade button",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
@ -334,7 +341,6 @@
|
||||
"name": "Audio Compressor"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"name": "Auth Proxy Adapter",
|
||||
"description": "Support for the use of authentication proxy services",
|
||||
"menu": {
|
||||
"disable": "Disable Proxy Adapter",
|
||||
@ -346,14 +352,15 @@
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Auth Proxy Adapter",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"title": "Proxy Hostname",
|
||||
"label": "Enter hostname for local proxy server (requires restart):"
|
||||
"label": "Enter hostname for local proxy server (requires restart):"
|
||||
},
|
||||
"port": {
|
||||
"title": "Proxy Port",
|
||||
"label": "Enter port for local proxy server (requires restart):"
|
||||
"label": "Enter port for local proxy server (requires restart):"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -704,13 +711,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Allows changing the video quality with a button on the video overlay",
|
||||
"name": "Video Quality Changer",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Open player quality changer"
|
||||
}
|
||||
},
|
||||
"description": "Allows changing the video quality with a button on the video overlay",
|
||||
"name": "Video Quality Changer"
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Add scrobbling support (etc. last.fm, Listenbrainz)",
|
||||
|
||||
@ -835,7 +835,7 @@
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - La letra puede estar desincronizada debido a un desajuste en la duración.",
|
||||
"inexact": "⚠️ - La letra de esta canción puede no ser exacta",
|
||||
"instrumental": "⚠️ - Se trata de una canción instrumental"
|
||||
"instrumental": "⚠️ - Esta es una canción instrumental"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
|
||||
@ -150,6 +150,11 @@
|
||||
"visual-tweaks": {
|
||||
"label": "दृश्य परिवर्तन",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"prompt": {
|
||||
"placeholder": "उदाहरण: यूट्यूब संगीत"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "डिफॉल्ट",
|
||||
"force-show": "बल पूर्वक दिखाएं",
|
||||
@ -482,7 +487,7 @@
|
||||
"playlist-has-only-one-song": "प्लेलिस्ट में केवल एक आइटम है, इसे सीधे डाउनलोड करें",
|
||||
"playlist-id-not-found": "कोई प्लेलिस्ट आईडी नहीं मिली",
|
||||
"playlist-is-empty": "प्लेलिस्ट ख़ाली है",
|
||||
"playlist-is-mix-or-private": "प्लेलिस्ट जानकारी प्राप्त करने में दिक्कत: सुनिश्चित करें कि यह निजी या \"आपके लिए मिश्रित\" प्लेलिस्ट नहीं है\n\n{{त्रुटि}}",
|
||||
"playlist-is-mix-or-private": "प्लेलिस्ट जानकारी प्राप्त करने में दिक्कत: सुनिश्चित करें कि यह निजी या \"आपके लिए मिश्रित\" प्लेलिस्ट नहीं है\n\n{{error}}",
|
||||
"preparing-file": "फ़ाइल तैयार की जा रही है…",
|
||||
"saving": "सेव जा रहा है…",
|
||||
"trying-to-get-playlist-id": "प्लेलिस्ट आईडी प्राप्त करने का प्रयास किया जा रहा है: {{playlistId}}",
|
||||
|
||||
@ -638,6 +638,17 @@
|
||||
"description": "Automatiškai praleidžia ne muzikines dalis, pvz., įžangą/užvedimą arba muzikinių vaizdo įrašų dalis, kuriose daina negrojama",
|
||||
"name": "Rėmėjų blokuotojas"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"refetch-btn": {
|
||||
"fetching": "Gaunama...",
|
||||
"normal": "Atgauti dainos žodžius"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Dainos žodžiai gali būti nesinchronizuoti dėl trukmės nesutikimo.",
|
||||
"inexact": "⚠️ - Dainos žodžiai gali šiek tiek skirtis",
|
||||
"instrumental": "⚠️ – Tai instrumentinė daina"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Valdykite atkūrimą iš „Windows“ užduočių juostos",
|
||||
"name": "Užduočių juostos medijos valdymas"
|
||||
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Poprawki wizualne",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Niestandardowy tytuł okna",
|
||||
"prompt": {
|
||||
"label": "Podaj niestandardowy tytuł okna (zostaw puste, aby to wyłączyć):",
|
||||
"placeholder": "Przykład: YouTube Music"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Domyślne",
|
||||
"force-show": "Wymuś pokazywanie",
|
||||
@ -383,9 +390,9 @@
|
||||
"title": "Otwórz selektor napisów"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Napisy zmienione na {{language}}",
|
||||
"caption-disabled": "Napisy wyłączone",
|
||||
"no-captions": "Niestety nie posiadamy napisów dla tej piosenki"
|
||||
"caption-changed": "Zmieniono napisy na {{language}}",
|
||||
"caption-disabled": "Napisy zostały wyłączone",
|
||||
"no-captions": "Nie znaleziono napisów dla tego utworu"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
|
||||
@ -381,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Abrir o seletor de legendas"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Idioma das legendas alterado para {{language}}",
|
||||
"caption-disabled": "Legendas desativadas",
|
||||
"no-captions": "Não existem legendas disponíveis para esta música"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -600,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Setas de navegação Avançar/Retroceder integradas diretamente na interface, como no seu navegador favorito",
|
||||
"name": "Navegação"
|
||||
"name": "Navegação",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Retroceder a página"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Avançar para a próxima página"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Remove os botões de login do Google e links da interface",
|
||||
@ -692,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "Permite alterar a qualidade do vídeo com um botão sobreposto ao vídeo",
|
||||
"name": "Alterador de qualidade de vídeo"
|
||||
"name": "Alterador de qualidade de vídeo",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Selecionar a qualidade de reprodução"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Adicionar suporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
||||
@ -859,7 +877,8 @@
|
||||
},
|
||||
"name": "Botão de Alternar Vídeo",
|
||||
"templates": {
|
||||
"button-song": "Música"
|
||||
"button-song": "Música",
|
||||
"button-video": "Vídeo"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "Vizuelna podešavanja",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "Prilagođeni naziv prozora",
|
||||
"prompt": {
|
||||
"label": "Unesite prilagođeni naslov prozora: (ostavite prazno da onemogućite)",
|
||||
"placeholder": "Primer: YouTube Muzika"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "Podrazumevano",
|
||||
"force-show": "Prinudno prikaži",
|
||||
@ -281,7 +288,7 @@
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Dodaje podršku za 'Amuse now' vidžet (6K Labs) u YouTube Muziku",
|
||||
"name": "Amuse",
|
||||
"name": "Zabavi",
|
||||
"response": {
|
||||
"query": "Amuse API server je pokrenut. Koristite GET /query da biste dobili informacije o numeri."
|
||||
}
|
||||
@ -439,7 +446,7 @@
|
||||
"play-on-youtube-music": "Reprodukuj na YouTube Muzici",
|
||||
"set-inactivity-timeout": "Podesi tajmer za neaktivnost"
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"name": "Discord Bogato Prisustvo",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Unesi vreme za tajmer neaktivnosti u sekundama:",
|
||||
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "ปรับแต่งหน้าตาแอป",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "ชื่อหน้าต่างกำหนดเอง",
|
||||
"prompt": {
|
||||
"label": "กำหนดชื่อหน้าต่างที่ต้องการ: (ปล่อยว่างเพื่อปิดใช้งาน)",
|
||||
"placeholder": "ตัวอย่าง: Youtube Music"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "ค่าเริ่มต้น",
|
||||
"force-show": "บังคับให้แสดง",
|
||||
|
||||
@ -317,7 +317,7 @@
|
||||
"label": "Cổng"
|
||||
}
|
||||
},
|
||||
"name": "Máy chủ API [Beta]",
|
||||
"name": "Máy chủ API [Thử nghiệm]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Điền tên máy chủ (như 0.0.0.0) cho máy chủ API:",
|
||||
@ -415,9 +415,9 @@
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Làm nhạc tạm dừng khi được phát",
|
||||
"description": "Làm nhạc bắt đầu ở chế độ \"tạm dừng\"\nNgoài ra có thể dừng nhạc khi khởi động ứng dụng (nếu có bật tính năng \"Tiếp tục bài hát cuối cùng khi ứng dụng khởi động\")",
|
||||
"menu": {
|
||||
"apply-once": "Áp dụng khi khởi động"
|
||||
"apply-once": "Chỉ áp dụng khi khởi động"
|
||||
},
|
||||
"name": "Tắt tự động phát"
|
||||
},
|
||||
@ -482,8 +482,8 @@
|
||||
"playlist-has-only-one-song": "Danh sách phát chỉ có một mục, tải trực tiếp",
|
||||
"playlist-id-not-found": "Không tìm thấy ID danh sách phát",
|
||||
"playlist-is-empty": "Danh sách phát trống",
|
||||
"playlist-is-mix-or-private": "Lỗi lấy thông tin danh sách phát: đảm bảo danh sách phát không ở chế độ riêng tư hoặc là danh sách phát \"Dành cho bạn\"\n\n{{error}}",
|
||||
"preparing-file": "Đang chuẩn bị thư mục…",
|
||||
"playlist-is-mix-or-private": "Lỗi lấy thông tin danh sách phát: hãy đảm bảo danh sách phát không ở chế độ riêng tư hoặc danh sách phát \"Dành cho bạn\"\n\n{{error}}",
|
||||
"preparing-file": "Đang chuẩn bị tệp…",
|
||||
"saving": "Đang lưu…",
|
||||
"trying-to-get-playlist-id": "Đang lấy ID danh sách phát: {{playlistId}}",
|
||||
"video-id-not-found": "Không tìm thấy video",
|
||||
@ -509,8 +509,8 @@
|
||||
}
|
||||
},
|
||||
"download-playlist": "Tải danh sách phát",
|
||||
"presets": "Cài đặt sẵn",
|
||||
"skip-existing": "Bỏ qua các tập tin hiện có"
|
||||
"presets": "Tùy chọn định dạng",
|
||||
"skip-existing": "Bỏ qua các tập tin đã có"
|
||||
},
|
||||
"name": "Trình tải xuống",
|
||||
"renderer": {
|
||||
@ -521,7 +521,7 @@
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Thêm bộ lọc xì vào trình phát nhạc\nP.S: Bộ lọc xì (Equalizer), là một thiết bị được thiết kế để phân chia, tăng, giảm, cắt các dải tần số âm thanh để mang tới sự cân bằng và làm thay đổi các tín hiệu âm thanh đi qua nó",
|
||||
"description": "Thêm bộ chỉnh âm để điều chỉnh âm thanh cho trình phát nhạc",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Thiết lập có sẵn",
|
||||
@ -530,7 +530,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Bộ lọc xì (EQ)"
|
||||
"name": "Bộ chỉnh âm"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Làm cho thanh trượt âm lượng theo cấp số nhân để dễ dàng chọn âm lượng thấp hơn.",
|
||||
|
||||
@ -150,6 +150,13 @@
|
||||
"visual-tweaks": {
|
||||
"label": "视觉调整",
|
||||
"submenu": {
|
||||
"custom-window-title": {
|
||||
"label": "自定义窗口标题",
|
||||
"prompt": {
|
||||
"label": "输入自定义窗口标题:(留空表示停用)",
|
||||
"placeholder": "示例:YouTube Music"
|
||||
}
|
||||
},
|
||||
"like-buttons": {
|
||||
"default": "默认",
|
||||
"force-show": "强制显示",
|
||||
|
||||
@ -599,6 +599,15 @@ app.once('browser-window-created', (_event, win) => {
|
||||
win.webContents.on('will-prevent-unload', (event) => {
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
const customWindowTitle = config.get('options.customWindowTitle');
|
||||
|
||||
if (customWindowTitle) {
|
||||
win.on('page-title-updated', (event) => {
|
||||
event.preventDefault();
|
||||
win.setTitle(customWindowTitle);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
|
||||
31
src/menu.ts
31
src/menu.ts
@ -216,6 +216,37 @@ export const mainMenuTemplate = async (
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.label',
|
||||
),
|
||||
async click() {
|
||||
const output = await prompt(
|
||||
{
|
||||
title: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.label',
|
||||
),
|
||||
label: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.prompt.label',
|
||||
),
|
||||
value: config.get('options.customWindowTitle') || '',
|
||||
type: 'input',
|
||||
inputAttrs: {
|
||||
type: 'text',
|
||||
placeholder: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.prompt.placeholder',
|
||||
),
|
||||
},
|
||||
width: 500,
|
||||
...promptOptions(),
|
||||
},
|
||||
win,
|
||||
);
|
||||
if (typeof output === 'string') {
|
||||
config.setMenuOption('options.customWindowTitle', output);
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.like-buttons.label',
|
||||
|
||||
@ -75,9 +75,11 @@ export const register = (
|
||||
// SKIP CHECK
|
||||
}
|
||||
|
||||
setConfig({
|
||||
authorizedClients: [...config.authorizedClients, id],
|
||||
});
|
||||
if (!config.authorizedClients.includes(id)) {
|
||||
setConfig({
|
||||
authorizedClients: [...config.authorizedClients, id],
|
||||
});
|
||||
}
|
||||
|
||||
const token = await sign(
|
||||
{
|
||||
|
||||
@ -848,5 +848,7 @@ const getMetadata = (info: TrackInfo): CustomSongInfo => ({
|
||||
const getAndroidTvInfo = async (id: string): Promise<VideoInfo> => {
|
||||
// GetInfo 404s with the bypass, so we use getBasicInfo instead
|
||||
// that's fine as we only need the streaming data
|
||||
return await yt.getBasicInfo(id, 'TV_EMBEDDED');
|
||||
return await yt.getBasicInfo(id, {
|
||||
client: 'TV_EMBEDDED',
|
||||
});
|
||||
};
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import { extractToken, getAuthorizationHeader, getClient } from './client';
|
||||
import type { YouTubeMusicAppElement } from '@/types/youtube-music-app-element';
|
||||
import type { QueueElement } from '@/types/queue';
|
||||
|
||||
type QueueRendererResponse = {
|
||||
queueDatas: {
|
||||
@ -11,40 +12,15 @@ type QueueRendererResponse = {
|
||||
export const getMusicQueueRenderer = async (
|
||||
videoIds: string[],
|
||||
): Promise<QueueRendererResponse | null> => {
|
||||
const token = extractToken();
|
||||
if (!token) return null;
|
||||
const queue = document.querySelector<QueueElement>('#queue');
|
||||
const app = document.querySelector<YouTubeMusicAppElement>('ytmusic-app');
|
||||
if (!app) return null;
|
||||
|
||||
const response = await fetch(
|
||||
'https://music.youtube.com/youtubei/v1/music/get_queue?key=AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30&prettyPrint=false',
|
||||
{
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
body: JSON.stringify({
|
||||
context: {
|
||||
client: getClient(),
|
||||
request: {
|
||||
useSsl: true,
|
||||
internalExperimentFlags: [],
|
||||
consistencyTokenJars: [],
|
||||
},
|
||||
user: {
|
||||
lockedSafetyMode: false,
|
||||
},
|
||||
},
|
||||
videoIds,
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Origin': 'https://music.youtube.com',
|
||||
'Authorization': await getAuthorizationHeader(token),
|
||||
},
|
||||
},
|
||||
);
|
||||
const store = queue?.queue.store.store;
|
||||
if (!store) return null;
|
||||
|
||||
const text = await response.text();
|
||||
try {
|
||||
return JSON.parse(text) as QueueRendererResponse;
|
||||
} catch {}
|
||||
|
||||
return null;
|
||||
return (await app.networkManager.fetch('/music/get_queue', {
|
||||
queueContextParams: store.getState().queue.queueContextParams,
|
||||
videoIds,
|
||||
})) as QueueRendererResponse | null;
|
||||
};
|
||||
|
||||
@ -21,9 +21,7 @@ export default createPlugin<
|
||||
this.observer = new MutationObserver(() => {
|
||||
if (dislikeBtn?.getAttribute('like-status') == 'DISLIKE') {
|
||||
document
|
||||
.querySelector<HTMLButtonElement>(
|
||||
'tp-yt-paper-icon-button.next-button',
|
||||
)
|
||||
.querySelector<HTMLButtonElement>('yt-icon-button.next-button')
|
||||
?.click();
|
||||
}
|
||||
});
|
||||
|
||||
@ -171,6 +171,7 @@ export default createPlugin({
|
||||
const video = document.querySelector<HTMLVideoElement>('video');
|
||||
|
||||
const switchButtonContainer = document.createElement('div');
|
||||
switchButtonContainer.id = 'ytmd-video-toggle-switch-button-container';
|
||||
switchButtonContainer.style.display = 'flex';
|
||||
render(
|
||||
() => (
|
||||
|
||||
Reference in New Issue
Block a user