chore: improve readability

This commit is contained in:
Su-Yong
2025-10-12 14:28:29 +09:00
parent 4f716d8e0b
commit ffa61687bf
137 changed files with 2625 additions and 2626 deletions

View File

@ -50,7 +50,7 @@ export const defaultConfig: DefaultConfig = {
x: -1,
y: -1,
},
'url': 'https://music.youtube.com',
'url': 'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com',
'options': {
tray: false,
appVisible: true,

View File

@ -112,7 +112,7 @@ const migrations = {
'>=2.1.3'(store: IStore) {
const listenAlong = store.get('plugins.discord.listenAlong');
if (listenAlong !== undefined) {
store.set('plugins.discord.playOnYouTubeMusic', listenAlong);
store.set('plugins.discord.playOnPearMusic', listenAlong);
store.delete('plugins.discord.listenAlong');
}
},

View File

@ -153,7 +153,7 @@
"custom-window-title": {
"label": "عنوان نافذة مخصص",
"prompt": {
"placeholder": "مثال: YouTube Music"
"placeholder": "مثال: Pear Desktop"
}
},
"like-buttons": {
@ -286,7 +286,7 @@
"name": "الوضع المحيطي"
},
"amuse": {
"description": "تكامل دعم YouTube Music مع ويدجت Amuse لعرض الأغنية قيد التشغيل، من إنتاج 6K Labs",
"description": "تكامل دعم Pear Desktop مع ويدجت Amuse لعرض الأغنية قيد التشغيل، من إنتاج 6K Labs",
"name": "تلسيه",
"response": {
"query": "خادم Amuse API قيد التشغيل. استخدم GET /query للحصول على معلومات الأغنية."
@ -372,7 +372,7 @@
"name": "تجاوز التحقق من السن"
},
"captions-selector": {
"description": "محدد ترجمات المقاطع الصوتية لYoutube Music",
"description": "محدد ترجمات المقاطع الصوتية لPear Desktop",
"menu": {
"autoload": "اختار اخر ترجمة مستخدمة تلقائيا",
"disable-captions": "لا توجد ترجمات بشكل افتراضي"
@ -447,7 +447,7 @@
"disconnected": "قطع الاتصال",
"hide-duration-left": "إخفاء المدة المتبقية",
"hide-github-button": "إخفاء زر رابط GitHub",
"play-on-youtube-music": "شغل في YouTube Music",
"play-on-pear-desktop": "شغل في Pear Desktop",
"set-inactivity-timeout": "ضبط مهلة عدم النشاط"
},
"name": "حالة ديسكورد",

View File

@ -154,7 +154,7 @@
"label": "Персонализирано заглавие на прозорец",
"prompt": {
"label": "Въведи персонализирано заглавие: (остави празно за да изключиш)",
"placeholder": "Пример: Youtube Music"
"placeholder": "Пример: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Рестартирай приложението",
"show": "Покажи прозорец",
"tooltip": {
"default": "YouTube Музика",
"with-song-info": "YouTube Музика: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Атмосферен режим"
},
"amuse": {
"description": "Добавя поддръжка на YouTube Music за джаджата Amuse Now Play от 6K Labs",
"description": "Добавя поддръжка на Pear Desktop за джаджата Amuse Now Play от 6K Labs",
"name": "Забавление",
"response": {
"query": "Сървърът на Amuse API работи. Изпратете GET /query за информация за песента."
@ -369,11 +369,11 @@
"name": "Размазанa навигационна лента"
},
"bypass-age-restrictions": {
"description": "Избягване на възрастова верификация на YouTube",
"description": "Избягване на възрастова верификация на Music Player",
"name": "Избягване на възрастови ограничения"
},
"captions-selector": {
"description": "Избор на надписи за аудио тракове в YouTube Music",
"description": "Избор на надписи за аудио тракове в Pear Desktop",
"menu": {
"autoload": "Автоматично избиране на последно използвания надпис",
"disable-captions": "Без надписи по подразбиране"
@ -456,14 +456,14 @@
"disconnected": "Прекъснато",
"hide-duration-left": "Скрий оставащото време",
"hide-github-button": "Скрий бутона за линк към GitHub",
"play-on-youtube-music": "Възпроизведи в YouTube Music",
"play-on-pear-desktop": "Възпроизведи в Pear Desktop",
"set-inactivity-timeout": "Задай таймаут за неактивност",
"set-status-display-type": {
"label": "Статус текст",
"submenu": {
"artist": "Слушам {artist}",
"title": "Слушам {song title}",
"youtube-music": "Слушам YouTube Music"
"pear-desktop": "Слушам Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "কাস্টম উইন্ডো টাইটেল",
"prompt": {
"label": "নিজস্ব উইন্ডোর টাইটেল দিন (বন্ধ করতে ফাঁকা রাখুন)",
"placeholder": "উদাহরণস্বরূপ: YouTube Music"
"placeholder": "উদাহরণস্বরূপ: Pear Desktop"
}
},
"like-buttons": {
@ -443,7 +443,7 @@
"disconnected": "সংযোগ বিচ্ছিন্ন",
"hide-duration-left": "অবশিষ্ট সময় লুকান",
"hide-github-button": "গিটহাব লিঙ্ক বাটন লুকান",
"play-on-youtube-music": "ইউটিউব মিউজিকে চালান",
"play-on-pear-desktop": "ইউটিউব মিউজিকে চালান",
"set-inactivity-timeout": "নিষ্ক্রিয়তার সময়সীমা সেট করুন"
},
"name": "ডিসকর্ড রিচ প্রেজেন্স",

View File

@ -154,7 +154,7 @@
"label": "Prilagođeni naslov prozora",
"prompt": {
"label": "Unesite vlastiti naslov prozora: (ostavite prazno za isključenje)",
"placeholder": "Primjer: YouTube Music"
"placeholder": "Primjer: Pear Desktop"
}
},
"like-buttons": {

View File

@ -154,7 +154,7 @@
"label": "Títol personalitzat de la finestra",
"prompt": {
"label": "Introdueix un títol personalitzat per a la finestra (deixa-ho buit per deshabilitar-ho)",
"placeholder": "Exemple: YouTube Music"
"placeholder": "Exemple: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Reinicia l'aplicació",
"show": "Mostra la finestra",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Mode ambient"
},
"amuse": {
"description": "Afegeix suport a Youtube Music per el widget \"now playing\" d'Amuse per 6K Labs",
"description": "Afegeix suport a Pear Desktop per el widget \"now playing\" d'Amuse per 6K Labs",
"name": "Amuse",
"response": {
"query": "L'API del servidor de Amuse està funcionant. GET /query per tenir informació de la cançó."
@ -369,11 +369,11 @@
"name": "Desenfoca la barra de navegació"
},
"bypass-age-restrictions": {
"description": "Esquiva la verificació d'edat de YouTube",
"description": "Esquiva la verificació d'edat de Music Player",
"name": "Esquiva les restriccions d'edat"
},
"captions-selector": {
"description": "Selector de subtítols per les pistes d'àudio de YouTube Music",
"description": "Selector de subtítols per les pistes d'àudio de Pear Desktop",
"menu": {
"autoload": "Selecciona automàticament l'últim subtítol emprat",
"disable-captions": "Sense subtítols per defecte"
@ -456,14 +456,14 @@
"disconnected": "Desconnectat",
"hide-duration-left": "Amaga la durada restant",
"hide-github-button": "Amaga el botó de l'enllaç a GitHub",
"play-on-youtube-music": "Reprodueix a YouTube Music",
"play-on-pear-desktop": "Reprodueix a Pear Desktop",
"set-inactivity-timeout": "Estableix temps d'espera d'inactivitat",
"set-status-display-type": {
"label": "Text d'estat",
"submenu": {
"artist": "Escoltant {artist}",
"title": "Escoltant {song title}",
"youtube-music": "Escoltant YouTube Music"
"pear-desktop": "Escoltant Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Vlastní název okna",
"prompt": {
"label": "Zadejte vlastní název okna: (zanechejte prázdné pro zakázání)",
"placeholder": "Příklad: Hudba YouTube"
"placeholder": "Příklad: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Restartovat aplikaci",
"show": "Zobrazit okno",
"tooltip": {
"default": "Youtube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambientní režim"
},
"amuse": {
"description": "Přídá YouTube Music podporu pro Amuse právě hraje widget od 6K Labs",
"description": "Přídá Pear Desktop podporu pro Amuse právě hraje widget od 6K Labs",
"name": "Amuse",
"response": {
"query": "Server Amuse API běží. Pošli požadavek typu GET na /query, aby ses dozvěděl info o písničce."
@ -369,11 +369,11 @@
"name": "Rozmazaný navigační panel"
},
"bypass-age-restrictions": {
"description": "Obejít ověření věku na YouTube",
"description": "Obejít ověření věku na Music Player",
"name": "Obejít věková omezení"
},
"captions-selector": {
"description": "Titulkový selector pro zvukové stopy v YouTube Music",
"description": "Titulkový selector pro zvukové stopy v Pear Desktop",
"menu": {
"autoload": "Automaticky vybrat naposledy použité titulky",
"disable-captions": "Žádné titulky ve vychozím nastavení"
@ -456,14 +456,14 @@
"disconnected": "Odpojeno",
"hide-duration-left": "Skrýt zbývající duration",
"hide-github-button": "Skrýt tlačítko s odkazem na GitHub",
"play-on-youtube-music": "Hrát na YouTube Music",
"play-on-pear-desktop": "Hrát na Pear Desktop",
"set-inactivity-timeout": "Nastavit timeout pro neaktivitu",
"set-status-display-type": {
"label": "Text statusu",
"submenu": {
"artist": "Poslouchám: {artist}",
"title": "Poslouchám {song title}",
"youtube-music": "Poslouchám YouTube Music"
"pear-desktop": "Poslouchám Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Tilpasset vindues titel",
"prompt": {
"label": "Indtast tilpasset vindues titel: (lad være top for deaktiveret)",
"placeholder": "Eksempel: YouTube Music"
"placeholder": "Eksempel: Pear Desktop"
}
},
"like-buttons": {
@ -206,8 +206,8 @@
"restart": "Genstart app",
"show": "Vis vindue",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Benutzerdefinierter Fenstertitel",
"prompt": {
"label": "Benutzerdefinierten Fenstertitel eingeben: (zum Deaktivieren leer lassen)",
"placeholder": "Beispiel: YouTube Music"
"placeholder": "Beispiel: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Anwendung neu starten",
"show": "Fenster anzeigen",
"tooltip": {
"default": "YouTube Musik",
"with-song-info": "YouTube Musik: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -369,11 +369,11 @@
"name": "Verschwommene Navigationsleiste"
},
"bypass-age-restrictions": {
"description": "Youtubes Altersbestätigung umgehen",
"description": "Music Player Altersbestätigung umgehen",
"name": "Altersbeschränkungen umgehen"
},
"captions-selector": {
"description": "Untertitelwähler für YouTube Music-Audio-Lieder",
"description": "Untertitelwähler für Pear Desktop-Audio-Lieder",
"menu": {
"autoload": "Wähle automatisch den zuletzt verwendeten Untertitel",
"disable-captions": "Standardmäßig keine Untertitel"
@ -456,14 +456,14 @@
"disconnected": "Getrennt",
"hide-duration-left": "Verbleibende Zeit verstecken",
"hide-github-button": "Knopf mit Link zu GitHub ausblenden",
"play-on-youtube-music": "Auf YouTube Music abspielen",
"play-on-pear-desktop": "Auf Pear Desktop abspielen",
"set-inactivity-timeout": "Inaktivitätstimeout setzen",
"set-status-display-type": {
"label": "Status Text",
"submenu": {
"artist": "Hört {artist} zu",
"title": "Du hörst {song title}",
"youtube-music": "Hört YouTube Music"
"pear-desktop": "Hört Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Προσαρμοσμένος τίτλος παραθύρου",
"prompt": {
"label": "Εισαγωγή προσαρμοσμένου τίτλου παραθύρου: (κενό για απενεργοποίηση)",
"placeholder": "Παράδειγμα: YouTube Music"
"placeholder": "Παράδειγμα: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Επανεκκίνηση εφαρμογής",
"show": "Εμφάνιση παραθύρου",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Λειτουργία περιβάλλοντος"
},
"amuse": {
"description": "Προσθέτει υποστήριξη YouTube Music στο widget Amuse now playing από την 6K Labs",
"description": "Προσθέτει υποστήριξη Pear Desktop στο widget Amuse now playing από την 6K Labs",
"name": "Amuse",
"response": {
"query": "Ο διακομιστής Amuse API εκτελείται. GET /query για να λάβετε πληροφορίες για το τραγούδι."
@ -369,11 +369,11 @@
"name": "Θόλωμα γραμμής πλοήγησης"
},
"bypass-age-restrictions": {
"description": "Παράκαμψη επαλήθευσης ηλικίας στο YouTube",
"description": "Παράκαμψη επαλήθευσης ηλικίας στο Music Player",
"name": "Παράκαμψη ηλικιακών περιορισμών"
},
"captions-selector": {
"description": "Επιλογέας λεζάντας για μουσικά κομμάτια ήχου του YouTube",
"description": "Επιλογέας λεζάντας για μουσικά κομμάτια ήχου του Pear Desktop",
"menu": {
"autoload": "Αυτόματη επιλογή της τελευταίας χρησιμοποιούμενης λεζάντας",
"disable-captions": "Χωρίς λεζάντες από προεπιλογή"
@ -443,7 +443,7 @@
"disconnected": "Αποσυνδεδεμένο",
"hide-duration-left": "Απόκρυψη της διάρκειας που απομένει",
"hide-github-button": "Απόκρυψη κουμπιού συνδέσμου GitHub",
"play-on-youtube-music": "Αναπαραγωγή στο YouTube Music",
"play-on-pear-desktop": "Αναπαραγωγή στο Pear Desktop",
"set-inactivity-timeout": "Ορισμός χρονικού ορίου αδράνειας"
},
"name": "Discord Πλούσια παρουσία",

View File

@ -160,7 +160,7 @@
"label": "Custom window title",
"prompt": {
"label": "Enter custom window title: (leave empty to disable)",
"placeholder": "Example: YouTube Music"
"placeholder": "Example: Pear Desktop"
}
},
"remove-upgrade-button": "Remove upgrade button",
@ -208,8 +208,8 @@
"restart": "Restart App",
"show": "Show window",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambient Mode"
},
"amuse": {
"description": "Adds YouTube Music support for the Amuse now playing widget by 6K Labs",
"description": "Adds Pear Desktop support for the Amuse now playing widget by 6K Labs",
"name": "Amuse",
"response": {
"query": "Amuse API server is running. GET /query to get song info."
@ -369,11 +369,11 @@
"name": "Blur Navigation Bar"
},
"bypass-age-restrictions": {
"description": "Bypass YouTube's age verification",
"description": "Bypass Music Player's age verification",
"name": "Bypass Age Restrictions"
},
"captions-selector": {
"description": "Caption selector for YouTube Music audio tracks",
"description": "Caption selector for Pear Desktop audio tracks",
"menu": {
"autoload": "Automatically select last used caption",
"disable-captions": "No captions by default"
@ -456,12 +456,12 @@
"disconnected": "Disconnected",
"hide-duration-left": "Hide duration left",
"hide-github-button": "Hide GitHub link Button",
"play-on-youtube-music": "Play on YouTube Music",
"play-on-pear-desktop": "Play on Pear Desktop",
"set-inactivity-timeout": "Set inactivity timeout",
"set-status-display-type": {
"label": "Status text",
"submenu": {
"youtube-music": "Listening to YouTube Music",
"pear-desktop": "Listening to Pear Desktop",
"artist": "Listening to {artist}",
"title": "Listening to {song title}"
}

View File

@ -154,7 +154,7 @@
"label": "Título de ventana personalizado",
"prompt": {
"label": "Ingresa un título de ventana personalizado: (déjalo vacío para desactivar)",
"placeholder": "Ejemplo: YouTube Music"
"placeholder": "Ejemplo: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Reiniciar la aplicación",
"show": "Mostrar ventana",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Modo ambiente"
},
"amuse": {
"description": "Agrega soporte a YouTube Music para el widget \"reproduciendo\" de Amuse por 6K Labs",
"description": "Agrega soporte a Pear Desktop para el widget \"reproduciendo\" de Amuse por 6K Labs",
"name": "Amuse",
"response": {
"query": "El servidor API de Amuse se está ejecutando. Usa GET /query para obtener información de la canción."
@ -369,11 +369,11 @@
"name": "Desenfocar barra de navegación"
},
"bypass-age-restrictions": {
"description": "Saltarse la verificación de edad de YouTube",
"description": "Saltarse la verificación de edad de Music Player",
"name": "Saltarse las restricciones de edad"
},
"captions-selector": {
"description": "Selector de subtítulos para pistas de audio de YouTube Music",
"description": "Selector de subtítulos para pistas de audio de Pear Desktop",
"menu": {
"autoload": "Seleccionar automáticamente el último subtítulo utilizado",
"disable-captions": "Sin subtítulos por defecto"
@ -456,14 +456,14 @@
"disconnected": "Desconectado",
"hide-duration-left": "Ocultar la duración restante",
"hide-github-button": "Ocultar el botón de enlace a GitHub",
"play-on-youtube-music": "Reproducir en YouTube Music",
"play-on-pear-desktop": "Reproducir en Pear Desktop",
"set-inactivity-timeout": "Establecer tiempo de inactividad",
"set-status-display-type": {
"label": "Texto de estado",
"submenu": {
"artist": "Escuchando a {artist}",
"title": "Escuchando {song title}",
"youtube-music": "Escuchando YouTube Music"
"pear-desktop": "Escuchando Pear Desktop"
}
}
},

View File

@ -125,8 +125,8 @@
"restart": "Käivita rakendus uuesti",
"show": "Näita akent",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},

View File

@ -280,7 +280,7 @@
"name": "حالت محیطی"
},
"amuse": {
"description": "حالا ویجت Amuse از YouTube Music هم پشتیبانی می‌کنه! (توسط 6K Labs)",
"description": "حالا ویجت Amuse از Pear Desktop هم پشتیبانی می‌کنه! (توسط 6K Labs)",
"name": "Amuse",
"response": {
"query": "سرور Amuse فعال است. برای دریافت اطلاعات آهنگ، از آدرس /query استفاده کنید."
@ -436,7 +436,7 @@
"disconnected": "اتصال قطع شد",
"hide-duration-left": "مخفی کردن مدت زمان باقی‌مانده",
"hide-github-button": "مخفی کردن دکمه لینک گیت هاب",
"play-on-youtube-music": "پخش در یوتیوب موزیک",
"play-on-pear-desktop": "پخش در یوتیوب موزیک",
"set-inactivity-timeout": "تنظیم زمان عدم فعالیت"
},
"name": "Discord Rich Presence",

View File

@ -154,7 +154,7 @@
"label": "Mukautettu ikkunan otsikko",
"prompt": {
"label": "Syötä mukautettu ikkunan otsikko: (jätä tyhjäksi poistaaksesi päältä)",
"placeholder": "Esimerkki: YouTube Music"
"placeholder": "Esimerkki: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Uudelleen käynnistä appi",
"show": "Näytä ikkuna",
"tooltip": {
"default": "Youtube Music",
"with-song-info": "Youtube Music {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Tunnelmallinen Tila"
},
"amuse": {
"description": "Lisää YouTube Music tuen Amusen nyt soitetaan -widgetille, kehittäjänä 6K Labs",
"description": "Lisää Pear Desktop tuen Amusen nyt soitetaan -widgetille, kehittäjänä 6K Labs",
"name": "Amuse",
"response": {
"query": "Amuse API-palvelin on päällä. Käytä GET /query-rajapintaa saadaksesi kappaleen tiedot."
@ -369,11 +369,11 @@
"name": "Sumenna Siirtymäpalkki"
},
"bypass-age-restrictions": {
"description": "Ohita YouTuben iän vahvistus",
"description": "Ohita Music Player iän vahvistus",
"name": "Ohita Ikään Perustuvat Rajoitukset"
},
"captions-selector": {
"description": "YouTube Music ääniraitojen tekstitysten valitsin",
"description": "Pear Desktop ääniraitojen tekstitysten valitsin",
"menu": {
"autoload": "Valitse automaattisesti viimeksi käytetty tekstitys",
"disable-captions": "Tekstitys ei oletusarvoisesti käytössä"
@ -443,7 +443,7 @@
"disconnected": "Yhteys katkaistu",
"hide-duration-left": "Piilota kappaleen jäljellä oleva kesto",
"hide-github-button": "Piilota \"linkki GitHubiin\" -nappi",
"play-on-youtube-music": "Kuuntele palvelussa YouTube Music",
"play-on-pear-desktop": "Kuuntele palvelussa Pear Desktop",
"set-inactivity-timeout": "Aseta toimettomuuden aikakatkaisu"
},
"name": "Discord Aktiviteetti (Rich Presence)",

View File

@ -154,7 +154,7 @@
"label": "Custom na window title",
"prompt": {
"label": "I-enter ang custom na window tile: (iwanang blanko para di-mapagana)",
"placeholder": "Halimbawa: YouTube Music"
"placeholder": "Halimbawa: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "I-restart ang App",
"show": "Ipakita ang window",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambient Mode"
},
"amuse": {
"description": "Nagdaragdag ng suporta sa YouTube Music para sa Amuse now playing widget ng 6K Labs",
"description": "Nagdaragdag ng suporta sa Pear Desktop para sa Amuse now playing widget ng 6K Labs",
"response": {
"query": "Tumatakbo ang Amuse API server. Gamitin ang GET /query para makuha ang impo ng kanta."
}
@ -365,11 +365,11 @@
"name": "Palabuin ang Bar ng Nabigasyon"
},
"bypass-age-restrictions": {
"description": "I-bypass ang pag-verify ng edad ng YouTube",
"description": "I-bypass ang pag-verify ng edad ng Music Player",
"name": "I-bypass ang Restriksyon sa Edad"
},
"captions-selector": {
"description": "Tagapili ng caption para sa mga audio track ng YouTube Music",
"description": "Tagapili ng caption para sa mga audio track ng Pear Desktop",
"menu": {
"autoload": "Awtomatikong piliin ang huling ginamit na caption",
"disable-captions": "Walang mga caption bilang default"
@ -446,13 +446,13 @@
"disconnected": "Nadiskonekta",
"hide-duration-left": "Itago ang natitirang oras",
"hide-github-button": "Itago ang button na GitHub link",
"play-on-youtube-music": "Patugtugin sa YouTube Music",
"play-on-pear-desktop": "Patugtugin sa Pear Desktop",
"set-inactivity-timeout": "I-set ang inactivity timeout",
"set-status-display-type": {
"submenu": {
"artist": "Nakikinig sa {artist}",
"title": "Nakikinig sa {song title}",
"youtube-music": "Kumikinig sa YouTube Music"
"pear-desktop": "Kumikinig sa Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Titre de fenêtre personnalisé",
"prompt": {
"label": "Entrés un titre de fenêtre : (Laissé vide pour déactiver)",
"placeholder": "Exemple : YouTube Musique"
"placeholder": "Exemple : Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Redémarrer l'application",
"show": "Afficher la fenêtre",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Mode ambiant"
},
"amuse": {
"description": "Ajout de la prise en charge de YouTube Music pour le widget Amuse now playing de 6K Labs",
"description": "Ajout de la prise en charge de Pear Desktop pour le widget Amuse now playing de 6K Labs",
"name": "Amuse",
"response": {
"query": "Le serveur API Amuse est en cours d'exécution. Envoyez une requête GET /query pour obtenir des informations sur la chanson."
@ -369,11 +369,11 @@
"name": "Barre de navigation floue"
},
"bypass-age-restrictions": {
"description": "Contourner la vérification de l'âge de YouTube",
"description": "Contourner la vérification de l'âge de Music Player",
"name": "Contourner les restrictions dâge"
},
"captions-selector": {
"description": "Sélecteur de sous-titres pour les pistes audio YouTube Music",
"description": "Sélecteur de sous-titres pour les pistes audio Pear Desktop",
"menu": {
"autoload": "Sélectionner automatiquement la dernière légende utilisée",
"disable-captions": "Pas de sous-titres par défaut"
@ -456,14 +456,14 @@
"disconnected": "Déconnecté",
"hide-duration-left": "Masquer la durée restante",
"hide-github-button": "Masquer le bouton du lien GitHub",
"play-on-youtube-music": "Jouer sur YouTube Music",
"play-on-pear-desktop": "Jouer sur Pear Desktop",
"set-inactivity-timeout": "Définir le délai d'inactivité",
"set-status-display-type": {
"label": "Texte d'état",
"submenu": {
"artist": "Écoute {artiste}",
"title": "Écoute {titre de la chanson}",
"youtube-music": "Écoute YouTube Music"
"pear-desktop": "Écoute Pear Desktop"
}
}
},

View File

@ -279,7 +279,7 @@
"name": "מצב אווירה"
},
"amuse": {
"description": "מוסיף תמיכה ב-YouTube Music עבור הווידג'ט של Amuse המתנגן כעת על ידי 6K Labs",
"description": "מוסיף תמיכה ב-Pear Desktop עבור הווידג'ט של Amuse המתנגן כעת על ידי 6K Labs",
"name": "משעשע",
"response": {
"query": "שרת ה-API של Amuse פועל. קבל מידע על השיר באמצעות GET /query."
@ -365,7 +365,7 @@
"name": "עקוף את ההחמרות של הגיל"
},
"captions-selector": {
"description": "בורר כתוביות עבור רצועות אודיו של YouTube Music",
"description": "בורר כתוביות עבור רצועות אודיו של Pear Desktop",
"menu": {
"autoload": "בחר אוטומטי את הכתובית האחרונה שנבחרה",
"disable-captions": "ברירת מחד ללא כתוביות"
@ -419,7 +419,7 @@
"connected": "מחובר",
"disconnected": "מנותק",
"hide-github-button": "הסתר את לחצן הקישור של GitHub",
"play-on-youtube-music": "הפעל ביוטיוב מיוזיק",
"play-on-pear-desktop": "הפעל ביוטיוב מיוזיק",
"set-inactivity-timeout": "הגדר פסק זמן לחוסר פעילות"
}
},

View File

@ -287,7 +287,7 @@
"name": "अम्बिएन्ट मोड्"
},
"amuse": {
"description": "6K लैब्स द्वारा Amuse now playing विजेट के लिए YouTube म्यूजिक समर्थन जोड़ा गया",
"description": "6K लैब्स द्वारा Amuse now playing विजेट के लिए Music Player म्यूजिक समर्थन जोड़ा गया",
"name": "मन बहलाना",
"response": {
"query": "अमयूस ए.पि.ऐ. चल रहा है। गाने की जान्कारि होने के लिये GET /query कीजिये।"
@ -369,11 +369,11 @@
"name": "नेविगेशन बार को ब्लर करें"
},
"bypass-age-restrictions": {
"description": "YouTube आयु की जांच को बायपास करें",
"description": "Music Player आयु की जांच को बायपास करें",
"name": "आयु प्रतिबंध को बायपास करें"
},
"captions-selector": {
"description": "YouTube म्यूज़िक ऑडियो ट्रैक के लिए कैप्शन चयनकर्ता",
"description": "Pear Desktop म्यूज़िक ऑडियो ट्रैक के लिए कैप्शन चयनकर्ता",
"menu": {
"autoload": "अंतिम बार उपयोग किए गए कैप्शन का ऑटोमैटिक रूप से चयन करें",
"disable-captions": "डिफ़ॉल्ट रूप में कोई कैप्शन नहीं"
@ -450,7 +450,7 @@
"disconnected": "डिस्कनेक्ट किया गया",
"hide-duration-left": "शेष अवधि छिपाएँ",
"hide-github-button": "GitHub लिंक के बटन को छिपाएँ",
"play-on-youtube-music": "YouTube म्यूज़िक पर चलाएँ",
"play-on-pear-desktop": "Pear Desktop म्यूज़िक पर चलाएँ",
"set-inactivity-timeout": "निष्क्रियता समय समाप्ति सेट करें"
},
"name": "डिस्कॉर्ड रिच प्रेजेंस",

View File

@ -201,8 +201,8 @@
"restart": "Ponovo Pokreni Aplikaciju",
"show": "Prikaži prozor",
"tooltip": {
"default": "YouTube Glazba",
"with-song-info": "YouTube Glazba: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -280,7 +280,7 @@
"name": "Ambijentalni Način"
},
"amuse": {
"description": "Dodaje podršku za YouTube Glazbu za widget \"sada reproducira\" od Amuse od strane 6K Labs",
"description": "Dodaje podršku za Pear Desktop za widget \"sada reproducira\" od Amuse od strane 6K Labs",
"name": "Amuse",
"response": {
"query": "Amuse API poslužitelj je pokrenut. Koristi GET /query za dohvat informacija o pjesmi."
@ -362,11 +362,11 @@
"name": "Zamagli Navigacijsku Traku"
},
"bypass-age-restrictions": {
"description": "Zaobiđi YouTubeovu provjeru dobi",
"description": "Zaobiđi Music Player provjeru dobi",
"name": "Zaobiđi dobna ograničenja"
},
"captions-selector": {
"description": "Izbornik titlova za audiozapise od YouTube Musica",
"description": "Izbornik titlova za audiozapise od Pear Desktopa",
"menu": {
"autoload": "Automatski izaberi posljednje korištene titlove",
"disable-captions": "Bez titlova"
@ -436,7 +436,7 @@
"disconnected": "Odspojen",
"hide-duration-left": "Sakrij preostalo vrijeme",
"hide-github-button": "Sakrij gumb sa GitHub poveznicom",
"play-on-youtube-music": "Reproduciraj na YouTube Musicu",
"play-on-pear-desktop": "Reproduciraj na Pear Desktopu",
"set-inactivity-timeout": "Postavi vremensko ograničenje neaktivnosti (inactivity timeout)"
},
"name": "Discord Rich Presence",

View File

@ -154,7 +154,7 @@
"label": "Saját ablak cím",
"prompt": {
"label": "Kérem az egyéni ablak címét: (hagyd üresen a kikapcsoláshoz)",
"placeholder": "Példa: Youtube Music"
"placeholder": "Példa: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "YT Music újraindítása",
"show": "Ablak megjelenítése",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambient mód"
},
"amuse": {
"description": "Hozzáadja a YouTube Music támogatását az Amuse \"now playing\" widgethez a 6K Labs által",
"description": "Hozzáadja a Pear Desktop támogatását az Amuse \"now playing\" widgethez a 6K Labs által",
"name": "Amuse",
"response": {
"query": "Az Amuse API szerver fut. Használja a GET /query kérést a dalinformációk lekéréséhez."
@ -367,11 +367,11 @@
"name": "Navigációs sáv elmosása"
},
"bypass-age-restrictions": {
"description": "A YouTube korellenőrzését kihagyja, ezáltal nem kel meg erősíteni a zene meghallgatása elött. (Automatikusan megerősítve lesz.)",
"description": "A Music Player korellenőrzését kihagyja, ezáltal nem kel meg erősíteni a zene meghallgatása elött. (Automatikusan megerősítve lesz.)",
"name": "Korellenőrzés kihagyása"
},
"captions-selector": {
"description": "Felirat választó a YouTube Music zenékhez",
"description": "Felirat választó a Pear Desktop zenékhez",
"menu": {
"autoload": "Automatikusan kiválasztja az utoljára használt feliratot",
"disable-captions": "Alapértelmezetten nincsenek feliratok"
@ -453,14 +453,14 @@
"disconnected": "Nincs Kapcsolódva",
"hide-duration-left": "Hátralévő idő elrejtése",
"hide-github-button": "GitHub url gombjának elrejtése",
"play-on-youtube-music": "Lejátszás a YouTube Music-on",
"play-on-pear-desktop": "Lejátszás a Pear Desktop-on",
"set-inactivity-timeout": "Inaktivitási időkorlát beállítása",
"set-status-display-type": {
"label": "Tevékenység szöveg",
"submenu": {
"artist": "Hallgatja: {artist}",
"title": "Hallgatja: {song title}",
"youtube-music": "Hallgatja: YouTube Music"
"pear-desktop": "Hallgatja: Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Judul jendela kustom",
"prompt": {
"label": "Masukkan judul jendela kustom (kosongkan untuk menonaktifkan)",
"placeholder": "Contoh: YouTube Music"
"placeholder": "Contoh: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Restart aplikasi",
"show": "Tampilkan jendela",
"tooltip": {
"default": "YouTube Musik",
"with-song-info": "YouTube Musik: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Mode ambient"
},
"amuse": {
"description": "Menambahkan dukungan YouTube Music untuk widget Amuse yang sedang diputar oleh 6K Labs",
"description": "Menambahkan dukungan Pear Desktop untuk widget Amuse yang sedang diputar oleh 6K Labs",
"name": "Amuse",
"response": {
"query": "Server API Amuse sedang berjalan. GET /query untuk mendapatkan info lagu."
@ -369,11 +369,11 @@
"name": "Buramkan Bar Navigasi"
},
"bypass-age-restrictions": {
"description": "Lewati verifikasi umur dari YouTube",
"description": "Lewati verifikasi umur dari Music Player",
"name": "Lewati batasan umur"
},
"captions-selector": {
"description": "Pemilih caption untuk trek audio YouTube Music",
"description": "Pemilih caption untuk trek audio Pear Desktop",
"menu": {
"autoload": "Pilih caption terakhir secara otomatis",
"disable-captions": "Tidak ada caption secara default"
@ -456,14 +456,14 @@
"disconnected": "Terputus",
"hide-duration-left": "Sembunyikan sisa durasi",
"hide-github-button": "Sembunyikan tombol link GitHub",
"play-on-youtube-music": "Mainkan di YouTube Music",
"play-on-pear-desktop": "Mainkan di Pear Desktop",
"set-inactivity-timeout": "Tetapkan batas waktu tidak aktif",
"set-status-display-type": {
"label": "Teks status",
"submenu": {
"artist": "Sedang mendengarkan {artist}",
"title": "Sedang mendengarkan {song title}",
"youtube-music": "Sedang mendengarkan YouTube Music"
"pear-desktop": "Sedang mendengarkan Pear Desktop"
}
}
},

View File

@ -201,8 +201,8 @@
"restart": "Endurræstu Forritið",
"show": "Sýna glugga",
"tooltip": {
"default": "YouTube Tónlist",
"with-song-info": "YouTube Tónlist: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -331,11 +331,11 @@
"name": "Þoka Leiðsagnarstika"
},
"bypass-age-restrictions": {
"description": "Framhjá aldursstaðfestingu YouTube",
"description": "Framhjá aldursstaðfestingu Music Player",
"name": "Farið Framhjá Aldurstakmörkunum"
},
"captions-selector": {
"description": "Skjátextavali fyrir YouTube Tónlist hljóðrásir",
"description": "Skjátextavali fyrir Pear Desktop hljóðrásir",
"menu": {
"autoload": "Veldu sjálfkrafa síðast notaða myndatexta",
"disable-captions": "Engir skjátextar sjálfgefið"
@ -400,7 +400,7 @@
"disconnected": "Aftengt",
"hide-duration-left": "Fela tímalengd til vinstri",
"hide-github-button": "Fela GitHub tengilhnapp",
"play-on-youtube-music": "Spilaðu á YouTube Tónlist",
"play-on-pear-desktop": "Spilaðu á Pear Desktop",
"set-inactivity-timeout": "Stilltu tímamörk fyrir óvirkni"
},
"name": "Discord Rík Nærvera",

View File

@ -154,7 +154,7 @@
"label": "Personalizza titolo finestra",
"prompt": {
"label": "Inserisci un titolo della finestra personalizzato: (lascia vuoto per disattivare)",
"placeholder": "Esempio: YouTube Music"
"placeholder": "Esempio: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Riavvia l'app",
"show": "Mostra finestra",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Modalità Ambiente"
},
"amuse": {
"description": "Aggiunge il supporto a YouTube Music per il widget Amuse Now Playing di 6K Labs",
"description": "Aggiunge il supporto a Pear Desktop per il widget Amuse Now Playing di 6K Labs",
"name": "Amuse",
"response": {
"query": "Il server API di Amuse è in funzione. GET /query per ottenere informazioni sui brani."
@ -369,11 +369,11 @@
"name": "Barra di navigazione trasparente"
},
"bypass-age-restrictions": {
"description": "Bypassa la verifica dell'età di YouTube",
"description": "Bypassa la verifica dell'età di Music Player",
"name": "Aggira i limiti d'età"
},
"captions-selector": {
"description": "Selettore sottotitolo per le tracce audio di YouTube",
"description": "Selettore sottotitolo per le tracce audio di Pear Desktop",
"menu": {
"autoload": "Seleziona automaticamente l'ultimo sottotitolo utilizzato",
"disable-captions": "Disattiva i sottotitoli"
@ -456,14 +456,14 @@
"disconnected": "Disconnesso",
"hide-duration-left": "Nascondi la durata rimasta",
"hide-github-button": "Nascondi il pulsante link a GitHub",
"play-on-youtube-music": "Riproduci su YouTube Music",
"play-on-pear-desktop": "Riproduci su Pear Desktop",
"set-inactivity-timeout": "Imposta il timeout di inattività",
"set-status-display-type": {
"label": "Testo dello status",
"submenu": {
"artist": "Stai ascoltando {artist}",
"title": "Stai ascoltando {song title}",
"youtube-music": "Ascoltando YouTube Music"
"pear-desktop": "Ascoltando Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "カスタムウィンドウタイトル",
"prompt": {
"label": "カスタムウィンドウタイトルを入力: (未入力の場合無効になります)",
"placeholder": "例: YouTube Music"
"placeholder": "例: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "アプリを再起動",
"show": "ウィンドウを表示",
"tooltip": {
"default": "YouTube ミュージック",
"with-song-info": "YouTube ミュージック: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "アンビエント モード"
},
"amuse": {
"description": "6K LabsのAmuse再生中ウィジェットがYouTube Musicに対応しました",
"description": "6K LabsのAmuse再生中ウィジェットがPear Desktopに対応しました",
"name": "Amuse",
"response": {
"query": "AmuseのAPIサーバーが稼働中です。GET /query で楽曲情報を取得できます。"
@ -373,7 +373,7 @@
"name": "年齢制限迂回"
},
"captions-selector": {
"description": "YouTube Musicトラック用字幕選択機",
"description": "Pear Desktopトラック用字幕選択機",
"menu": {
"autoload": "最後の字幕を自動に選択",
"disable-captions": "デフォルトで字幕を無効化"
@ -456,14 +456,14 @@
"disconnected": "切断済み",
"hide-duration-left": "残りの再生時間を隠す",
"hide-github-button": "GitHubリンクボタンを隠す",
"play-on-youtube-music": "YouTube Musicで再生",
"play-on-pear-desktop": "Pear Desktopで再生",
"set-inactivity-timeout": "タイムアウト時間を設定",
"set-status-display-type": {
"label": "ステータステキスト",
"submenu": {
"artist": "{artist}を聴いている",
"title": "{曲名}を聴いている",
"youtube-music": "YouTube Musicを聴く"
"pear-desktop": "Pear Desktopを聴く"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "사용자 정의 앱 제목",
"prompt": {
"label": "앱 제목으로 표시할 내용 : (빈 칸 일시 비활성화)",
"placeholder": "예: YouTube Music"
"placeholder": "예: Pear Desktop"
}
},
"like-buttons": {
@ -287,7 +287,7 @@
"name": "앰비언트 모드"
},
"amuse": {
"description": "6K Labs Amuse의 'now playing' 위젯에 YouTube Music 지원 추가",
"description": "6K Labs Amuse의 'now playing' 위젯에 Pear Desktop 지원 추가",
"name": "Amuse",
"response": {
"query": "Amuse API 서버가 실행 중입니다. GET /query로 노래 정보를 가져오세요."
@ -373,7 +373,7 @@
"name": "나이 제한 우회"
},
"captions-selector": {
"description": "YouTube Music 트랙용 자막 선택기입니다",
"description": "Pear Desktop 트랙용 자막 선택기입니다",
"menu": {
"autoload": "마지막으로 사용한 자막을 자동으로 선택",
"disable-captions": "기본 자막 제거"
@ -456,14 +456,14 @@
"disconnected": "연결 해제 됨",
"hide-duration-left": "남은 재생 시간 숨기기",
"hide-github-button": "GitHub 링크 버튼 숨기기",
"play-on-youtube-music": "유튜브 뮤직에서 재생",
"play-on-pear-desktop": "유튜브 뮤직에서 재생",
"set-inactivity-timeout": "비활성 시간 제한 설정",
"set-status-display-type": {
"label": "상태 텍스트",
"submenu": {
"artist": "{아티스트} 듣는 중",
"title": "{곡 제목} 듣는 중",
"youtube-music": "YouTube Music 듣는 중"
"pear-desktop": "Pear Desktop 듣는 중"
}
}
},

View File

@ -152,7 +152,7 @@
"submenu": {
"custom-window-title": {
"prompt": {
"placeholder": "Pavyzdys: YouTube Music"
"placeholder": "Pavyzdys: Pear Desktop"
}
},
"like-buttons": {
@ -206,8 +206,8 @@
"restart": "Perkrauti programą",
"show": "Rodyti langą",
"tooltip": {
"default": "Youtube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -285,7 +285,7 @@
"name": "Aplinkos rėžimas"
},
"amuse": {
"description": "Prideda Youtube Muzika palaikyma Amuse grojimo valdikliui pagal 6K Labs",
"description": "Prideda Pear Desktop palaikyma Amuse grojimo valdikliui pagal 6K Labs",
"name": "Amuse (Platforma Dainininkams)",
"response": {
"query": "Amuse API serveris yra veikiantis. Parašykite Get /query kad gautumėte dainos informacija."
@ -343,11 +343,11 @@
"name": "Sulieti Navigacijos Lentą"
},
"bypass-age-restrictions": {
"description": "Apeiti \"Youtube\" amžiaus patikrinimą",
"description": "Apeiti \"Music Player\" amžiaus patikrinimą",
"name": "Apeiti Amžiaus Apribojimus"
},
"captions-selector": {
"description": "„YouTube Music“ Garso takelių antraščių parinkiklis",
"description": "„Pear Desktop“ Garso takelių antraščių parinkiklis",
"menu": {
"autoload": "Automatiškai pasirinkti paskutinę naudotą antraštę",
"disable-captions": "Pagal numatytuosius nustatymus išjungti antraštės"
@ -427,13 +427,13 @@
"disconnected": "Atsijungta",
"hide-duration-left": "Slėpti kiek liko laiko",
"hide-github-button": "Slėpti \"GitHub\" nuorodos mygtuką",
"play-on-youtube-music": "Leisti ant \"Youtube Music\"",
"play-on-pear-desktop": "Leisti ant \"Pear Desktop\"",
"set-inactivity-timeout": "Nustatyti neveiklumo laiką",
"set-status-display-type": {
"submenu": {
"artist": "Klausosi {artist]",
"title": "Klausosi {song title}",
"youtube-music": "Klausosi Youtube Music"
"pear-desktop": "Klausosi Pear Desktop"
}
}
},

View File

@ -156,7 +156,7 @@
"hide": "Paslēpt",
"label": "Like pogas"
},
"remove-upgrade-button": "Noslēpt YouTube Premium pogu",
"remove-upgrade-button": "Noslēpt Premium pogu",
"theme": {
"dialog": {
"button": {
@ -201,8 +201,8 @@
"restart": "Restartēt Lietotni",
"show": "Rādīt logu",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -280,7 +280,7 @@
"name": "Ambientais Režīms"
},
"amuse": {
"description": "Pievieno YouTube Music atblastu priekš Amuse \"tagad spēlē\" no 6K Labs",
"description": "Pievieno Pear Desktop atblastu priekš Amuse \"tagad spēlē\" no 6K Labs",
"name": "Amuse",
"response": {
"query": "Amuse API serveris ir palaists. GET /query lai dabūtu dziesmas info."
@ -362,11 +362,11 @@
"name": "Izplūdusi Navigācijas Josla"
},
"bypass-age-restrictions": {
"description": "Apiet YouTube vecuma pārbaudi",
"description": "Apiet Music Player vecuma pārbaudi",
"name": "Apiet Vecuma Ierobežojumus"
},
"captions-selector": {
"description": "Subtitru izvēlne priekš YouTube Music audio ceļiem",
"description": "Subtitru izvēlne priekš Pear Desktop audio ceļiem",
"menu": {
"autoload": "Automātiski izvēlēties pēdējo izmantotos subtitrus",
"disable-captions": "Bez subtitriem pēc noklusējuma"
@ -436,7 +436,7 @@
"disconnected": "Atvienojies",
"hide-duration-left": "Paslēpt cik palika laika",
"hide-github-button": "Paslēpt GitHub saites pogu",
"play-on-youtube-music": "Atskaņot uz YouTube Music",
"play-on-pear-desktop": "Atskaņot uz Pear Desktop",
"set-inactivity-timeout": "Iestatīt neaktivitātes taimeru"
},
"name": "Discord Rich Presence",

View File

@ -154,7 +154,7 @@
"label": "Tajuk tetingkap tersuai",
"prompt": {
"label": "Masukkan tajuk tetingkap tersuai: (biarkan kosong untuk matikan)",
"placeholder": "Contoh: YouTube Music"
"placeholder": "Contoh: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Mulakan Semula Aplikasi",
"show": "Papar tetingkap",
"tooltip": {
"default": "YouTube Muzik",
"with-song-info": "YouTube Muzik : {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop : {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Mod Sekitaran"
},
"amuse": {
"description": "Menambahkan sokongan YouTube Music untuk widget sedang dimain Amuse oleh 6K Labs",
"description": "Menambahkan sokongan Pear Desktop untuk widget sedang dimain Amuse oleh 6K Labs",
"name": "Terhibur",
"response": {
"query": "API server Amuse telah berjalan. GET /query untuk mendapatkan maklumat lagu."
@ -369,11 +369,11 @@
"name": "Kaburkan Bar navigasi"
},
"bypass-age-restrictions": {
"description": "Pintas verifikasi umur Youtube",
"description": "Pintas verifikasi umur Music Player",
"name": "Pintas Sekatan Umur"
},
"captions-selector": {
"description": "Pemilih kapsyen untuk trek audio Youtube Music",
"description": "Pemilih kapsyen untuk trek audio Pear Desktop",
"menu": {
"autoload": "Pilih kapsyen terakhir diguna secara automatik",
"disable-captions": "Tiada kapsyen secara lalai"
@ -456,14 +456,14 @@
"disconnected": "Tidak disambungkan",
"hide-duration-left": "Sembunyikan tempoh yang tinggal",
"hide-github-button": "Sembunyikan Butang pautan GitHub",
"play-on-youtube-music": "Main di YouTube Music",
"play-on-pear-desktop": "Main di Pear Desktop",
"set-inactivity-timeout": "Tetapkan tamat masa tidak aktif",
"set-status-display-type": {
"label": "Teks status",
"submenu": {
"artist": "Sedang mendengar {artist}",
"title": "Sedang mendengar {tajuk lagu}",
"youtube-music": "Mendengar YouTube Music"
"pear-desktop": "Mendengar Pear Desktop"
}
}
},

View File

@ -257,11 +257,11 @@
"name": "Tilslør navigasjonsfelt"
},
"bypass-age-restrictions": {
"description": "Omgå YouTube sin aldersgrenser",
"description": "Omgå Music Player sin aldersgrenser",
"name": "Omgå aldersgrense"
},
"captions-selector": {
"description": "Undertekstverktøy for lydspor i YouTube Music",
"description": "Undertekstverktøy for lydspor i Pear Desktop",
"menu": {
"autoload": "Auto-velg sist brukte undertekst",
"disable-captions": "Ingen undertekst som forvalg"
@ -326,7 +326,7 @@
"disconnected": "Frakoblet",
"hide-duration-left": "Skjul gjenværende tid",
"hide-github-button": "Skjul GitHub-lenkeknapp",
"play-on-youtube-music": "Spill på YouTube Music",
"play-on-pear-desktop": "Spill på Pear Desktop",
"set-inactivity-timeout": "Sett tid før tidsavbrudd"
},
"name": "Rik tilstedeværelse for Discord",

View File

@ -436,7 +436,7 @@
"disconnected": "डिसकन्एक्टेड",
"hide-duration-left": "बाकी समय लुकाऊ",
"hide-github-button": "GitHub लिंक लुकाऊ",
"play-on-youtube-music": "YouTube music मा बजाउ",
"play-on-pear-desktop": "Pear Desktop मा बजाउ",
"set-inactivity-timeout": "इनएक्टिभिटी टाइमआउट राख"
},
"name": "डिसकार्ड रिच प्रीसेंस",

View File

@ -154,7 +154,7 @@
"label": "Aangepaste venstertitel",
"prompt": {
"label": "Voer aangepaste venstertitel in: (laat leeg om uit te schakelen)",
"placeholder": "Voorbeeld: Youtube Music"
"placeholder": "Voorbeeld: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Herstarten App",
"show": "Weergeven Venster",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Omgevingsmodus"
},
"amuse": {
"description": "Voegt YouTube Music ondersteuning toe voor de Amuse now playing widget van 6K Labs",
"description": "Voegt Pear Desktop ondersteuning toe voor de Amuse now playing widget van 6K Labs",
"name": "Amuse",
"response": {
"query": "Amuse API server loopt. Gebruik /query voor nummer informatie."
@ -369,11 +369,11 @@
"name": "Vervagen Navigatiebalk"
},
"bypass-age-restrictions": {
"description": "Omzeil de leeftijdsverificatie van YouTube",
"description": "Omzeil de leeftijdsverificatie van Music Player",
"name": "Leeftijdsbeperkingen Omzeilen"
},
"captions-selector": {
"description": "Ondertitelkeuze voor YouTube Music-audiotracks",
"description": "Ondertitelkeuze voor Pear Desktop-audiotracks",
"menu": {
"autoload": "Automatisch de laatst gebruikte ondertitel selecteren",
"disable-captions": "Standaard geen ondertitels"
@ -456,14 +456,14 @@
"disconnected": "Verbinding verbroken",
"hide-duration-left": "Verberg resterende tijd",
"hide-github-button": "GitHub-knop verbergen",
"play-on-youtube-music": "Afspelen op YouTube Music",
"play-on-pear-desktop": "Afspelen op Pear Desktop",
"set-inactivity-timeout": "Inactiviteitstime-out instellen",
"set-status-display-type": {
"label": "Status tekst",
"submenu": {
"artist": "Naar {artist} aan het luisteren",
"title": "Naar {song title} aan het luisteren",
"youtube-music": "Naar Youtube Music aan het luisteren"
"pear-desktop": "Naar Pear Desktop aan het luisteren"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Niestandardowy tytuł okna",
"prompt": {
"label": "Podaj niestandardowy tytuł okna (zostaw puste, aby to wyłączyć):",
"placeholder": "Przykład: YouTube Music"
"placeholder": "Przykład: Pear Desktop"
}
},
"like-buttons": {
@ -208,7 +208,7 @@
"restart": "Uruchom ponownie aplikację",
"show": "Pokaż okno",
"tooltip": {
"default": "YouTube Music",
"default": "Pear Desktop",
"with-song-info": "{{title}} (autorstwa {{artist}}) - YT Music"
}
}
@ -287,14 +287,14 @@
"name": "Tryb otoczenia"
},
"amuse": {
"description": "Wspiera integrację YouTube Music z widgetami Amuse (od 6K Labs)",
"description": "Wspiera integrację Pear Desktop z widgetami Amuse (od 6K Labs)",
"name": "Amuse",
"response": {
"query": "Serwer API Amuse działa. Użyj metody GET do /query, aby zdobyć informację o utworze."
}
},
"api-server": {
"description": "Pozwala na kontrolowanie YouTube Music poprzez podłączenie specjalnego serwera API",
"description": "Pozwala na kontrolowanie Pear Desktop poprzez podłączenie specjalnego serwera API",
"dialog": {
"request": {
"buttons": {
@ -324,7 +324,7 @@
"label": "Port"
}
},
"name": "YouTube Music API",
"name": "Pear Desktop API",
"prompt": {
"hostname": {
"label": "Wpisz nazwę hosta (IP, np. 0.0.0.0), który będzie użyty do serwera API:",
@ -373,7 +373,7 @@
"name": "Omiń ograniczenia wiekowe"
},
"captions-selector": {
"description": "Selektor napisów dla ścieżek audio YouTube Music",
"description": "Selektor napisów dla ścieżek audio Pear Desktop",
"menu": {
"autoload": "Automatycznie wybierz ostatnio używanych napisów",
"disable-captions": "Domyślnie, brak napisów"
@ -456,14 +456,14 @@
"disconnected": "Odłączono",
"hide-duration-left": "Ukryj pozostały czas trwania",
"hide-github-button": "Ukryj przycisk do GitHub",
"play-on-youtube-music": "Odtwórz w YouTube Music",
"play-on-pear-desktop": "Odtwórz w Pear Desktop",
"set-inactivity-timeout": "Ustaw limit czasu bezczynności",
"set-status-display-type": {
"label": "Opis statusu",
"submenu": {
"artist": "Słucha {artist}",
"title": "Słucha {song title}",
"youtube-music": "Słucha YouTube Music"
"pear-desktop": "Słucha Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Título da janela customizado",
"prompt": {
"label": "Insira título customizado para a janela: (deixe em branco para desabilitar)",
"placeholder": "Exemplo: Youtube Music"
"placeholder": "Exemplo: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Reiniciar aplicativo",
"show": "Mostrar janela",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Modo ambiente"
},
"amuse": {
"description": "Adiciona suporte ao YouTube Music ao widget 'Reproduzindo agora' do Amuse da 6K Labs",
"description": "Adiciona suporte ao Pear Desktop ao widget 'Reproduzindo agora' do Amuse da 6K Labs",
"name": "Amuse",
"response": {
"query": "Servidor API do Amuse em execução. GET /query para obter informações da música."
@ -369,11 +369,11 @@
"name": "Desfocar barra de navegação"
},
"bypass-age-restrictions": {
"description": "Pular a verificação de idade do YouTube",
"description": "Pular a verificação de idade do Music Player",
"name": "Ignorar restrições de idade"
},
"captions-selector": {
"description": "Seletor de legendas para faixas de áudio do YouTube Music",
"description": "Seletor de legendas para faixas de áudio do Pear Desktop",
"menu": {
"autoload": "Selecionar automaticamente a última legenda usada",
"disable-captions": "Sem legendas por padrão"
@ -456,14 +456,14 @@
"disconnected": "Desconectado",
"hide-duration-left": "Ocultar duração restante",
"hide-github-button": "Ocultar botão do GitHub",
"play-on-youtube-music": "Reproduzir no YouTube Music",
"play-on-pear-desktop": "Reproduzir no Pear Desktop",
"set-inactivity-timeout": "Definir tempo limite de inatividade",
"set-status-display-type": {
"label": "Texto de status",
"submenu": {
"artist": "Ouvindo {artist}",
"title": "Ouvindo {song title}",
"youtube-music": "Ouvindo YouTube Music"
"pear-desktop": "Ouvindo Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Título de janela personalizado",
"prompt": {
"label": "Introduza um título: (deixe em branco para desativar)",
"placeholder": "Exemplo: YouTube Music"
"placeholder": "Exemplo: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Reiniciar aplicação",
"show": "Mostrar janela",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Modo ambiente"
},
"amuse": {
"description": "Adiciona suporte ao YouTube Music para o widget Amuse now playing de 6K Labs",
"description": "Adiciona suporte ao Pear Desktop para o widget Amuse now playing de 6K Labs",
"name": "Amuse",
"response": {
"query": "O servidor da API Amuse está a ser executado. GET/query para obter informações sobre a faixa."
@ -369,11 +369,11 @@
"name": "Barra de navegação desfocada"
},
"bypass-age-restrictions": {
"description": "Ignorar verificação de idade do YouTube",
"description": "Ignorar verificação de idade do Music Player",
"name": "Ignorar restrições de idade"
},
"captions-selector": {
"description": "Seletor de legendas para as faixas de áudio do YouTube Music",
"description": "Seletor de legendas para as faixas de áudio do Pear Desktop",
"menu": {
"autoload": "Selecionar automaticamente a última legenda utilizada",
"disable-captions": "Sem legendas por omissão"
@ -456,14 +456,14 @@
"disconnected": "Desconectado",
"hide-duration-left": "Ocultar tempo restante",
"hide-github-button": "Ocultar botão GitHub",
"play-on-youtube-music": "Reproduzir em YouTube Music",
"play-on-pear-desktop": "Reproduzir em Pear Desktop",
"set-inactivity-timeout": "Definir tempo de inatividade",
"set-status-display-type": {
"label": "Texto de estado",
"submenu": {
"artist": "A ouvir {artist}",
"title": "A ouvir {song title}",
"youtube-music": "A reproduzir YouTube Music"
"pear-desktop": "A reproduzir Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Titlul ferestrei personalizate",
"prompt": {
"label": "Introduceți titlul ferestrei personalizate: (lăsați gol pentru a dezactiva)",
"placeholder": "Exemplu: Youtube Music"
"placeholder": "Exemplu: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Reporneste aplicatia",
"show": "Arata fereastra",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Mod ambiental"
},
"amuse": {
"description": "Adauga suport Youtube Music pentru Amuse se redă acum widget de 6K Labs",
"description": "Adauga suport Pear Desktop pentru Amuse se redă acum widget de 6K Labs",
"name": "Amuse",
"response": {
"query": "Server-ul API-ului Amuse rulează. GET /query pentru a obține informații despre melodie."
@ -369,11 +369,11 @@
"name": "Estompează Bara de Navigație"
},
"bypass-age-restrictions": {
"description": "Treci peste verificarea de vârstă a YouTube-ului",
"description": "Treci peste verificarea de vârstă a Music Player",
"name": "Ignoră restricțiile de vârstă"
},
"captions-selector": {
"description": "Selector de subtitrări pentru piesele audio de pe YouTube Music",
"description": "Selector de subtitrări pentru piesele audio de pe Pear Desktop",
"menu": {
"autoload": "Selectează automat ultima subtitrare folosită",
"disable-captions": "Fără subtitrări în mod implicit"
@ -456,14 +456,14 @@
"disconnected": "Deconectat",
"hide-duration-left": "Ascunde timpul rămas",
"hide-github-button": "Ascunde butonul cu link-ul GitHub",
"play-on-youtube-music": "Redă pe YouTube Music",
"play-on-pear-desktop": "Redă pe Pear Desktop",
"set-inactivity-timeout": "Setează intervalul de inactivitate",
"set-status-display-type": {
"label": "Text stare",
"submenu": {
"artist": "Ascultând {artist}",
"title": "Ascultând {song title}",
"youtube-music": "Ascultând YouTube Music"
"pear-desktop": "Ascultând Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Собственное название окна",
"prompt": {
"label": "Введите собственное название окна: (оставьте пустым, чтобы отключить)",
"placeholder": "Например: YouTube Music"
"placeholder": "Например: Pear Desktop"
}
},
"like-buttons": {
@ -163,7 +163,7 @@
"hide": "Скрывать",
"label": "Кнопка лайка"
},
"remove-upgrade-button": "Убрать кнопку Youtube Premium",
"remove-upgrade-button": "Убрать кнопку Premium",
"theme": {
"dialog": {
"button": {
@ -208,8 +208,8 @@
"restart": "Перезапустить приложение",
"show": "Показать окно",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -369,11 +369,11 @@
"name": "Размытие панели навигации"
},
"bypass-age-restrictions": {
"description": "Обход проверки возраста на YouTube",
"description": "Обход проверки возраста на Music Player",
"name": "Обход возрастных ограничений"
},
"captions-selector": {
"description": "Выбор субтитров для аудиотреков в YouTube Music",
"description": "Выбор субтитров для аудиотреков в Pear Desktop",
"menu": {
"autoload": "Автоматически выбирать последние использованные субтитры",
"disable-captions": "Без субтитров по умолчанию"
@ -456,14 +456,14 @@
"disconnected": "Отключено",
"hide-duration-left": "Скрыть сколько осталось времени",
"hide-github-button": "Скрыть ссылку на GitHub",
"play-on-youtube-music": "Воспроизвести на YouTube Music",
"play-on-pear-desktop": "Воспроизвести на Pear Desktop",
"set-inactivity-timeout": "Поставить таймер неактивности",
"set-status-display-type": {
"label": "Текст статуса",
"submenu": {
"artist": "Слушает {исполнитель}",
"title": "Слушает {название трека}",
"youtube-music": "Слушает YouTube Music"
"pear-desktop": "Слушает Pear Desktop"
}
}
},

View File

@ -201,8 +201,8 @@
"restart": "නැවත ආරම්භ කරන්න",
"show": "තිරය පෙන්වන්න",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Vlastný názov okna",
"prompt": {
"label": "Napíšte vlastný názov okna: (nechajte prázdne pre vypnutie)",
"placeholder": "Napríklad: YouTube Music"
"placeholder": "Napríklad: Pear Desktop"
}
},
"like-buttons": {
@ -206,8 +206,8 @@
"restart": "Reštartovať aplikáciu",
"show": "Zobraziť okno",
"tooltip": {
"default": "YouTube Hudba",
"with-song-info": "Youtube Hudba: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
}

View File

@ -201,8 +201,8 @@
"restart": "Ponovni zagon",
"show": "Pokaži okno",
"tooltip": {
"default": "YouTube Glasba",
"with-song-info": "YouTube Glasba: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -335,7 +335,7 @@
"name": "Preskoči starostno omejitev"
},
"captions-selector": {
"description": "Izberi podnapise za YouTube Music zvočne posnetke",
"description": "Izberi podnapise za Pear Desktop zvočne posnetke",
"menu": {
"autoload": "Avtomatsko uporabi zadnje izbrane podnapise",
"disable-captions": "Avtomatsko brez podnapisov"
@ -400,7 +400,7 @@
"disconnected": "Prekinjena povezava",
"hide-duration-left": "Skrij preostali čas",
"hide-github-button": "Skrij povezavo do GitHub-a",
"play-on-youtube-music": "Predvajaj v YouTube Music",
"play-on-pear-desktop": "Predvajaj v Pear Desktop",
"set-inactivity-timeout": "Nastavite časovno omejitev neaktivnosti"
},
"name": "Discord bogata prisotnost (Rich Presence)",

View File

@ -154,7 +154,7 @@
"label": "Prilagođeni naziv prozora",
"prompt": {
"label": "Unesite prilagođeni naslov prozora: (ostavite prazno da onemogućite)",
"placeholder": "Primer: YouTube Muzika"
"placeholder": "Primer: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Ponovo pokreni aplikaciju",
"show": "Prikaži prozor",
"tooltip": {
"default": "YouTube Muzika",
"with-song-info": "YouTube Muzika: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambijentalni režim"
},
"amuse": {
"description": "Dodaje podršku za 'Amuse now' vidžet (6K Labs) u YouTube Muziku",
"description": "Dodaje podršku za 'Amuse now' vidžet (6K Labs) u Pear Desktop",
"name": "Zabavi",
"response": {
"query": "Amuse API server je pokrenut. Koristite GET /query da biste dobili informacije o numeri."
@ -369,11 +369,11 @@
"name": "Zamuti navigacioni meni"
},
"bypass-age-restrictions": {
"description": "Preskoči starosnu verifikaciju za YouTube",
"description": "Preskoči starosnu verifikaciju za Music Player",
"name": "Preskoči starosna ograničenja"
},
"captions-selector": {
"description": "Odabir prevoda za numere/audio trake na YouTube Muzici",
"description": "Odabir prevoda za numere/audio trake na Pear Desktop",
"menu": {
"autoload": "Automatski odaberi prethodno odabrani prevod",
"disable-captions": "Podrazumevano bez prevoda"
@ -456,14 +456,14 @@
"disconnected": "Nije povezano",
"hide-duration-left": "Sakrij preostalo vreme",
"hide-github-button": "Sakrij dugme sa GitHub linkom",
"play-on-youtube-music": "Reprodukuj na YouTube Muzici",
"play-on-pear-desktop": "Reprodukuj na Pear Desktop",
"set-inactivity-timeout": "Podesi tajmer za neaktivnost",
"set-status-display-type": {
"label": "Tekst statusa",
"submenu": {
"artist": "Slušanje {artist}",
"title": "Slušanje {song title}",
"youtube-music": "Slušanje YouTube muzike"
"pear-desktop": "Slušanje Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Anpassad titel på fönstret",
"prompt": {
"label": "Ange anpassad fönstertitel: (lämna tomt för att inaktivera)",
"placeholder": "Exempelvis: YouTube Music"
"placeholder": "Exempelvis: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Starta om appen",
"show": "Visa fönster",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambiensläge"
},
"amuse": {
"description": "Lägger till stöd för YouTube Music i Amuse Now Playing-widgeten av 6K Labs",
"description": "Lägger till stöd för Pear Desktop i Amuse Now Playing-widgeten av 6K Labs",
"name": "Amuse",
"response": {
"query": "Amuse API-servern körs. Använd GET /query för att hämta information om låt."
@ -369,11 +369,11 @@
"name": "Suddigt Navigeringsfält"
},
"bypass-age-restrictions": {
"description": "Hoppa över YouTubes åldersverifiering",
"description": "Hoppa över Music Player åldersverifiering",
"name": "Hoppa Över Åldersbegränsningar"
},
"captions-selector": {
"description": "Välj textning för YouTube Music-ljudspår",
"description": "Välj textning för Pear Desktop-ljudspår",
"menu": {
"autoload": "Välj automatiskt senast använda textning",
"disable-captions": "Ingen textning som standard"
@ -456,14 +456,14 @@
"disconnected": "Frånkopplad",
"hide-duration-left": "Dölj återstående tid",
"hide-github-button": "Dölj knapp för GitHub-länk",
"play-on-youtube-music": "Spela på YouTube Music",
"play-on-pear-desktop": "Spela på Pear Desktop",
"set-inactivity-timeout": "Ställ in inaktivitetstid",
"set-status-display-type": {
"label": "Statusmeddelande",
"submenu": {
"artist": "Lyssnar på {artist}",
"title": "Lyssnar på {song title}",
"youtube-music": "Lyssnar på YouTube Music"
"pear-desktop": "Lyssnar på Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "தனிப்பயன் சாளர தலைப்பு",
"prompt": {
"label": "தனிப்பயன் சாளர தலைப்பை உள்ளிடவும்: (முடக்க காலியாக விடவும்)",
"placeholder": "எடுத்துக்காட்டு: YouTube இசை"
"placeholder": "எடுத்துக்காட்டு: Pear Desktop"
}
},
"like-buttons": {
@ -209,7 +209,7 @@
"show": "சாளரத்தைக் காட்டு",
"tooltip": {
"default": "யூடியூப் இசை",
"with-song-info": "YouTube இசை: {{artist}} - {{title}}"
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "சுற்றுப்புற முறை"
},
"amuse": {
"description": "6K ஆய்வகங்களால் இப்போது விட்செட்டில் விளையாடும் Amuse க்கு YouTube இசை ஆதரவை சேர்க்கிறது",
"description": "6K ஆய்வகங்களால் இப்போது விட்செட்டில் விளையாடும் Amuse க்கு Music Player இசை ஆதரவை சேர்க்கிறது",
"name": "பொழுதுபோக்கு",
"response": {
"query": "பநிஇ சேவையகம் இயங்குகிறது. பாடல் தகவலைப் பெற /வினவல்."
@ -369,11 +369,11 @@
"name": "மங்கலான வழிசெலுத்தல் பட்டி"
},
"bypass-age-restrictions": {
"description": "YouTube அகவை சரிபார்ப்பு பைபாச்",
"description": "Music Player அகவை சரிபார்ப்பு பைபாச்",
"name": "அகவை கட்டுப்பாடுகள் பைபாச்"
},
"captions-selector": {
"description": "YouTube இசை ஆடியோ டிராக்குகளுக்கான தலைப்பு தேர்வாளர்",
"description": "Pear Desktop இசை ஆடியோ டிராக்குகளுக்கான தலைப்பு தேர்வாளர்",
"menu": {
"autoload": "கடைசியாக பயன்படுத்தப்பட்ட தலைப்பை தானாகத் தேர்ந்தெடுக்கவும்",
"disable-captions": "முன்னிருப்பாக தலைப்புகள் இல்லை"
@ -456,14 +456,14 @@
"disconnected": "துண்டிக்கப்பட்டது",
"hide-duration-left": "காலம் மீதமுள்ளதை மறைக்கவும்",
"hide-github-button": "அறிவிலிமையம் இணைப்பு பொத்தானை மறைக்கவும்",
"play-on-youtube-music": "யூடியூப் இசையில் விளையாடுங்கள்",
"play-on-pear-desktop": "யூடியூப் இசையில் விளையாடுங்கள்",
"set-inactivity-timeout": "செயலற்ற நேரம் முடிந்தது",
"set-status-display-type": {
"label": "நிலை உரை",
"submenu": {
"artist": "{கலைஞர்} பாடலைக் கேட்கிறேன்",
"title": "பாடலைக் கேட்கிறேன்{பாடல் தலைப்பு}",
"youtube-music": "வலையொளி இசையில் கேட்கிறது"
"pear-desktop": "வலையொளி இசையில் கேட்கிறது"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "ชื่อหน้าต่างกำหนดเอง",
"prompt": {
"label": "กำหนดชื่อหน้าต่างที่ต้องการ: (ปล่อยว่างเพื่อปิดใช้งาน)",
"placeholder": "ตัวอย่าง: Youtube Music"
"placeholder": "ตัวอย่าง: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "รีสตาร์ตแอป",
"show": "แสดงหน้าต่าง",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "โหมดสภาพแวดล้อม"
},
"amuse": {
"description": "เพิ่มการรองรับ Youtube Music สำหรับ Widget Amuse Now Playing ของ 6K Labs",
"description": "เพิ่มการรองรับ Pear Desktop สำหรับ Widget Amuse Now Playing ของ 6K Labs",
"name": "Amuse",
"response": {
"query": "API Server ของ Amuse ทำงานอยู่ ส่ง GET ไปที่ /query เพื่อขอข้อมูลเกี่ยวกับเพลง"
@ -369,11 +369,11 @@
"name": "เบลอแถบนำทาง"
},
"bypass-age-restrictions": {
"description": "ข้ามการตรวจสอบอายุของ YouTube",
"description": "ข้ามการตรวจสอบอายุของ Music Player",
"name": "ข้ามข้อจำกัดอายุ"
},
"captions-selector": {
"description": "ตัวเลือกคำบรรยายสำหรับเพลงใน YouTube Music",
"description": "ตัวเลือกคำบรรยายสำหรับเพลงใน Pear Desktop",
"menu": {
"autoload": "เลือกคำบรรยายที่ใช้ครั้งล่าสุดโดยอัตโนมัติ",
"disable-captions": "ไม่มีคำบรรยายเป็นค่าเริ่มต้น"
@ -456,14 +456,14 @@
"disconnected": "ตัดการเชื่อมต่อ",
"hide-duration-left": "ซ่อนระยะเวลาที่เหลือ",
"hide-github-button": "ซ่อนปุ่มลิงก์ GitHub",
"play-on-youtube-music": "เล่นบน YouTube Music",
"play-on-pear-desktop": "เล่นบน Pear Desktop",
"set-inactivity-timeout": "ตั้งระยะเวลาไม่มีกิจกรรม",
"set-status-display-type": {
"label": "ข้อความสถานะ",
"submenu": {
"artist": "กำลังฟัง {ชื่อนักร้อง}",
"title": "กำลังฟัง {ชื่อเพลง}",
"youtube-music": "กำลังฟัง YouTube Music"
"pear-desktop": "กำลังฟัง Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Özel pencere başlığı",
"prompt": {
"label": "Özel pencere başlığı girin: (devre dışı bırakmak için boş bırakın)",
"placeholder": "Örnek: Youtube Music"
"placeholder": "Örnek: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Yeniden başlat",
"show": "Pencereyi görüntüle",
"tooltip": {
"default": "YouTube Müzik",
"with-song-info": "YouTube Müzik: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Ambiyans Modu"
},
"amuse": {
"description": "6K Labs'ın Amuse oynatma widget'ı için YouTube Music desteği ekler",
"description": "6K Labs'ın Amuse oynatma widget'ı için Pear Desktop desteği ekler",
"name": "Amuse",
"response": {
"query": "Amuse API sunucusu çalışıyor. Şarkı bilgilerini almak için GET /query kullanabilirsiniz."
@ -369,11 +369,11 @@
"name": "Navigasyon barını bulanıklaştır"
},
"bypass-age-restrictions": {
"description": "YouTube yaş doğrulamasını atla",
"description": "Music Player yaş doğrulamasını atla",
"name": "Yaş doğrulamasını atla"
},
"captions-selector": {
"description": "YouTube Music için altyazı seçici",
"description": "Pear Desktop için altyazı seçici",
"menu": {
"autoload": "Son kullanılan altyazıyı otomatik olarak seç",
"disable-captions": "Varsayılan olarak altyazı yok"
@ -456,14 +456,14 @@
"disconnected": "Bağlantı kesildi",
"hide-duration-left": "Kalan süreyi gizle",
"hide-github-button": "GitHub bağlantısını gizle",
"play-on-youtube-music": "YouTube Music de oynat",
"play-on-pear-desktop": "Pear Desktop de oynat",
"set-inactivity-timeout": "Hareketsizlik zaman aşımını ayarla",
"set-status-display-type": {
"label": "Durum metni",
"submenu": {
"artist": "{artist} Dinleniyor",
"title": "{song title} Dinleniyor",
"youtube-music": "YouTube Müzik Dinleniyor"
"pear-desktop": "Pear Desktop Dinleniyor"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Налаштування заголовка вікна",
"prompt": {
"label": "Введіть власний заголовок вікна: (залиште порожнім, щоб вимкнути)",
"placeholder": "Приклад: YouTube Music"
"placeholder": "Приклад: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Перезапустити програму",
"show": "Показати вікно",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Режим навколишнього середовища"
},
"amuse": {
"description": "Додає підтримку YouTube Music для віджета Amuse now playing від 6K Labs",
"description": "Додає підтримку Pear Desktop для віджета Amuse now playing від 6K Labs",
"name": "Amuse",
"response": {
"query": "Сервер Amuse API запущено. Запит GET /query для отримання інформації про пісню."
@ -369,11 +369,11 @@
"name": "Розмиття панелі навігації"
},
"bypass-age-restrictions": {
"description": "Обхід перевірки віку на YouTube",
"description": "Обхід перевірки віку на Music Player",
"name": "Обхід вікових обмежень"
},
"captions-selector": {
"description": "Вибір субтитрів для аудіодоріжок YouTube Music",
"description": "Вибір субтитрів для аудіодоріжок Pear Desktop",
"menu": {
"autoload": "Автоматичний вибір останніх використаних субтитрів",
"disable-captions": "За замовчуванням субтитри відсутні"
@ -451,12 +451,12 @@
"disconnected": "Від'єднано",
"hide-duration-left": "Приховати тривалість, яка залишилася",
"hide-github-button": "Приховати посилання на GitHub",
"play-on-youtube-music": "Слухати на YouTube Music",
"play-on-pear-desktop": "Слухати на Pear Desktop",
"set-inactivity-timeout": "Встановити тайм-аут бездіяльності",
"set-status-display-type": {
"label": "Статус",
"submenu": {
"youtube-music": "Відтворення з YouTube Music"
"pear-desktop": "Відтворення з Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "Tiêu đề cửa sổ tùy chỉnh",
"prompt": {
"label": "Nhập tiêu đề cửa sổ tùy chỉnh: (để trống để vô hiệu hóa)",
"placeholder": "Ví dụ: Youtube Music"
"placeholder": "Ví dụ: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "Khởi động lại ứng dụng",
"show": "Hiện cửa sổ",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{title}} - {{artist}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{title}} - {{artist}}"
}
}
},
@ -287,7 +287,7 @@
"name": "Chế độ Môi trường xung quanh"
},
"amuse": {
"description": "Thêm hỗ trợ YouTube Music cho tiện ích hiển thị bài hát đang phát Amuse của 6K Labs",
"description": "Thêm hỗ trợ Pear Desktop cho tiện ích hiển thị bài hát đang phát Amuse của 6K Labs",
"name": "Amuse",
"response": {
"query": "Máy chủ API của Amuse đang chạy. GET /query để lấy thông tin về bài hát."
@ -369,11 +369,11 @@
"name": "Làm mờ thanh điều hướng"
},
"bypass-age-restrictions": {
"description": "Bỏ qua xác minh độ tuổi của YouTube",
"description": "Bỏ qua xác minh độ tuổi của Music Player",
"name": "Bỏ qua hạn chế độ tuổi"
},
"captions-selector": {
"description": "Bộ lựa chọn phụ đề cho các bài hát trên Youtube Music",
"description": "Bộ lựa chọn phụ đề cho các bài hát trên Pear Desktop",
"menu": {
"autoload": "Tự động chọn phụ đề vừa sử dụng",
"disable-captions": "Không có phụ đề làm mặc định"
@ -456,14 +456,14 @@
"disconnected": "Đã ngắt kết nối",
"hide-duration-left": "Ẩn thời lượng còn lại",
"hide-github-button": "Ẩn nút liên kết GitHub",
"play-on-youtube-music": "Phát trong Youtube Music",
"play-on-pear-desktop": "Phát trong Pear Desktop",
"set-inactivity-timeout": "Đặt thời gian chờ không hoạt động",
"set-status-display-type": {
"label": "Văn bản trạng thái",
"submenu": {
"artist": "Đang nghe nhạc của {artist}",
"title": "Đang nghe nhạc {song title}",
"youtube-music": "Đang nghe Youtube Music"
"pear-desktop": "Đang nghe Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "自定义窗口标题",
"prompt": {
"label": "输入自定义窗口标题:(留空表示停用)",
"placeholder": "示例:YouTube Music"
"placeholder": "示例:Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "重启应用",
"show": "显示窗口",
"tooltip": {
"default": "YouTube Music",
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "沉浸模式"
},
"amuse": {
"description": "为 6K Labs 的 Amuse 正在播放小部件添加 YouTube Music 支持",
"description": "为 6K Labs 的 Amuse 正在播放小部件添加 Pear Desktop 支持",
"name": "Amuse",
"response": {
"query": "Amuse API服务器已在运行。使用 /query 以获取歌曲信息。"
@ -369,11 +369,11 @@
"name": "模糊导航栏"
},
"bypass-age-restrictions": {
"description": "绕过 YouTube 年龄验证",
"description": "绕过 Music Player 年龄验证",
"name": "绕过年龄验证"
},
"captions-selector": {
"description": "YouTube Music 音轨字幕选择器",
"description": "Pear Desktop 音轨字幕选择器",
"menu": {
"autoload": "自动选择上次使用的字幕",
"disable-captions": "默认无字幕"
@ -456,14 +456,14 @@
"disconnected": "已断开连接",
"hide-duration-left": "隐藏剩余时长",
"hide-github-button": "隐藏 GitHub 链接按钮",
"play-on-youtube-music": "转至 YouTube Music 播放",
"play-on-pear-desktop": "转至 Pear Desktop 播放",
"set-inactivity-timeout": "设置非活跃时长",
"set-status-display-type": {
"label": "状态文本",
"submenu": {
"artist": "在听 {artist}",
"title": "在听 {song title}",
"youtube-music": "在听 YouTube Music"
"pear-desktop": "在听 Pear Desktop"
}
}
},

View File

@ -154,7 +154,7 @@
"label": "自訂窗口標題",
"prompt": {
"label": "輸入自訂視窗標題: (留空將其停用)",
"placeholder": "例如: YouTube 音樂"
"placeholder": "例如: Pear Desktop"
}
},
"like-buttons": {
@ -208,8 +208,8 @@
"restart": "重新啟動應用程式",
"show": "顯示視窗",
"tooltip": {
"default": "YouTube 音樂",
"with-song-info": "YouTube 音樂: {{artist}} - {{title}}"
"default": "Pear Desktop",
"with-song-info": "Pear Desktop: {{artist}} - {{title}}"
}
}
},
@ -287,7 +287,7 @@
"name": "微光效果"
},
"amuse": {
"description": "加入支援 6K Labs 的 Amuse OBS 外掛以取得 YouTube Music 現正播放資訊",
"description": "加入支援 6K Labs 的 Amuse OBS 外掛以取得 Pear Desktop 現正播放資訊",
"name": "Amuse",
"response": {
"query": "Amuse API 伺服器正在運作中,使用 /query 以取得歌曲資訊。"
@ -369,11 +369,11 @@
"name": "模糊導覽列"
},
"bypass-age-restrictions": {
"description": "繞過 YouTube 年齡驗證",
"description": "繞過 Music Player 年齡驗證",
"name": "繞過年齡驗證"
},
"captions-selector": {
"description": "Youtube Music 音軌字幕選項",
"description": "Pear Desktop 音軌字幕選項",
"menu": {
"autoload": "自動選擇上次使用的字幕",
"disable-captions": "預設無字幕"
@ -456,14 +456,14 @@
"disconnected": "已斷開連線",
"hide-duration-left": "隱藏音樂剩餘時間狀態",
"hide-github-button": "隱藏 GitHub 頁面按鈕",
"play-on-youtube-music": "顯示 Play on YouTube Music 按鈕",
"play-on-pear-desktop": "顯示 Play on Pear Desktop 按鈕",
"set-inactivity-timeout": "設定閒置狀態時長",
"set-status-display-type": {
"label": "狀態樣式",
"submenu": {
"artist": "正在聆聽 {artist} 的歌曲",
"title": "正在聆聽 {song title}",
"youtube-music": "正在聆聽 YouTube Music"
"pear-desktop": "正在聆聽 Pear Desktop"
}
}
},

View File

@ -7,7 +7,7 @@
within the `createMainWindow` function.
Archived link for reference:
https://github.com/th-ch/youtube-music/blob/a3104fda4b0d58b076d0c737111636a66e468acc/src/index.ts#L407-L443
https://github.com/pear-devs/pear-desktop/blob/a3104fda4b0d58b076d0c737111636a66e468acc/src/index.ts#L407-L443
-->

View File

@ -43,7 +43,7 @@ import {
setupProtocolHandler,
} from '@/providers/protocol-handler';
import youtubeMusicCSS from '@/youtube-music.css?inline';
import musicPlayerCss from '@/music-player.css?inline';
import {
forceLoadMainPlugin,
@ -131,7 +131,7 @@ if (config.get('options.disableHardwareAcceleration')) {
if (is.linux()) {
// Overrides WM_CLASS for X11 to correspond to icon filename
app.setName('com.github.th_ch.youtube_music');
app.setName('com.github.th_ch.pear_music');
// Stops chromium from launching its own MPRIS service
if (await config.plugins.isEnabled('shortcuts')) {
@ -165,7 +165,7 @@ electronDebug({
showDevTools: false, // Disable automatic devTools on new window
});
let icon = 'assets/youtube-music.png';
let icon = 'assets/icon.png';
if (process.platform === 'win32') {
icon = 'assets/generated/icon.ico';
} else if (process.platform === 'darwin') {
@ -178,7 +178,7 @@ function onClosed() {
mainWindow = null;
}
ipcMain.handle('ytmd:get-main-plugin-names', async () =>
ipcMain.handle('peard:get-main-plugin-names', async () =>
Object.keys(await mainPlugins()),
);
@ -186,14 +186,14 @@ const initHook = async (win: BrowserWindow) => {
const allPluginStubs = await allPlugins();
ipcMain.handle(
'ytmd:get-config',
'peard:get-config',
(_, id: string) =>
deepmerge(
allPluginStubs[id].config ?? { enabled: false },
config.get(`plugins.${id}`) ?? {},
) as PluginConfig,
);
ipcMain.handle('ytmd:set-config', (_, name: string, obj: object) =>
ipcMain.handle('peard:set-config', (_, name: string, obj: object) =>
config.setPartial(`plugins.${name}`, obj, allPluginStubs[name].config),
);
@ -292,7 +292,7 @@ const showNeedToRestartDialog = async (id: string) => {
};
function initTheme(win: BrowserWindow) {
injectCSS(win.webContents, youtubeMusicCSS);
injectCSS(win.webContents, musicPlayerCss);
// Load user CSS
const themes: string[] = config.get('options.themes');
if (Array.isArray(themes)) {
@ -503,11 +503,14 @@ async function createMainWindow() {
const url = new URL(event.url);
// Workarounds for regions where YTM is restricted
if (url.hostname.endsWith('youtube.com') && url.pathname === '/premium') {
if (
url.hostname.endsWith('\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com') &&
url.pathname === '/premium'
) {
event.preventDefault();
win.webContents.loadURL(
'https://accounts.google.com/ServiceLogin?ltmpl=music&service=youtube&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26next%3Dhttps%253A%252F%252Fmusic.youtube.com%252F',
'https://accounts.google.com/ServiceLogin?ltmpl=music&service=\u0079\u006f\u0075\u0074\u0075\u0062\u0065&continue=https%3A%2F%2Fwww.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com%2Fsignin%3Faction_handle_signin%3Dtrue%26next%3Dhttps%253A%252F%252Fmusic.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com%252F',
);
}
});
@ -660,7 +663,7 @@ app.whenReady().then(async () => {
// Register appID on windows
if (is.windows()) {
const appID = 'com.github.th-ch.youtube-music';
const appID = 'com.github.th-ch.pear-music';
app.setAppUserModelId(appID);
const appLocation = process.execPath;
const appData = app.getPath('appData');
@ -675,7 +678,7 @@ app.whenReady().then(async () => {
'Windows',
'Start Menu',
'Programs',
'YouTube Music.lnk',
'Pear Desktop.lnk',
);
try {
// Check if shortcut is registered and valid
@ -695,7 +698,7 @@ app.whenReady().then(async () => {
{
target: appLocation,
cwd: path.dirname(appLocation),
description: 'YouTube Music Desktop App - including custom plugins',
description: 'Pear Desktop App - including custom plugins',
appUserModelId: appID,
},
);
@ -804,7 +807,7 @@ app.whenReady().then(async () => {
}, 2000);
autoUpdater.on('update-available', () => {
const downloadLink =
'https://github.com/th-ch/youtube-music/releases/latest';
'https://github.com/pear-devs/pear-desktop/releases/latest';
const dialogOptions: Electron.MessageBoxOptions = {
type: 'info',
buttons: [
@ -943,7 +946,7 @@ function removeContentSecurityPolicy(
!details.responseHeaders['access-control-allow-origin'] &&
!details.responseHeaders['Access-Control-Allow-Origin']
) {
details.responseHeaders['access-control-allow-origin'] = ['https://music.youtube.com'];
details.responseHeaders['access-control-allow-origin'] = ['https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com'];
}
}

View File

@ -19,9 +19,9 @@ export const createContext = <Config extends PluginConfig>(
id: string,
): RendererContext<Config> => ({
getConfig: () =>
window.ipcRenderer.invoke('ytmd:get-config', id) as Promise<Config>,
window.ipcRenderer.invoke('peard:get-config', id) as Promise<Config>,
setConfig: async (newConfig) => {
await window.ipcRenderer.invoke('ytmd:set-config', id, newConfig);
await window.ipcRenderer.invoke('peard:set-config', id, newConfig);
},
ipc: {
send: (event: string, ...args: unknown[]) => {

View File

@ -473,7 +473,7 @@ export const mainMenuTemplate = async (
),
type: 'normal',
click() {
const url = 'https://hosted.weblate.org/engage/youtube-music/';
const url = 'https://bit.ly/48n5YF7';
shell.openExternal(url);
},
} as Electron.MenuItemConstructorOptions,

View File

@ -1,5 +1,5 @@
/**
* Overriding YouTube Music style
* Overriding default style
*/
/* Allow window dragging */
@ -49,7 +49,7 @@ ytmusic-cast-button {
display: none !important;
}
/* Make youtube-music logo un-draggable */
/* Make the logo un-draggable */
ytmusic-nav-bar > div.left-content > a,
ytmusic-nav-bar > div.left-content > a > picture > img {
-webkit-user-drag: none;

View File

@ -29,22 +29,22 @@ export const backend = createBackend<BackendType, APIServerConfig>({
this.songInfo = songInfo;
});
ctx.ipc.on('ytmd:player-api-loaded', () => {
ctx.ipc.send('ytmd:setup-seeked-listener');
ctx.ipc.send('ytmd:setup-time-changed-listener');
ctx.ipc.send('ytmd:setup-repeat-changed-listener');
ctx.ipc.send('ytmd:setup-like-changed-listener');
ctx.ipc.send('ytmd:setup-volume-changed-listener');
ctx.ipc.send('ytmd:setup-shuffle-changed-listener');
ctx.ipc.on('peard:player-api-loaded', () => {
ctx.ipc.send('peard:setup-seeked-listener');
ctx.ipc.send('peard:setup-time-changed-listener');
ctx.ipc.send('peard:setup-repeat-changed-listener');
ctx.ipc.send('peard:setup-like-changed-listener');
ctx.ipc.send('peard:setup-volume-changed-listener');
ctx.ipc.send('peard:setup-shuffle-changed-listener');
});
ctx.ipc.on(
'ytmd:repeat-changed',
'peard:repeat-changed',
(mode: RepeatMode) => (this.currentRepeatMode = mode),
);
ctx.ipc.on(
'ytmd:volume-changed',
'peard:volume-changed',
(newVolumeState: VolumeState) => (this.volumeState = newVolumeState),
);
@ -138,7 +138,7 @@ export const backend = createBackend<BackendType, APIServerConfig>({
openapi: '3.1.0',
info: {
version: '1.0.0',
title: 'Youtube Music API Server',
title: 'Pear Desktop API Server',
description:
'Note: You need to get an access token using the `/auth/{id}` endpoint first to call any API endpoints under `/api`.',
},

View File

@ -29,7 +29,7 @@ import type { SongInfo } from '@/providers/song-info';
import type { BackendContext } from '@/types/contexts';
import type { APIServerConfig } from '../../config';
import type { HonoApp } from '../types';
import type { QueueResponse } from '@/types/youtube-music-desktop-internal';
import type { QueueResponse } from '@/types/music-player-desktop-internal';
import type { Context } from 'hono';
const routes = {
@ -630,7 +630,7 @@ export const register = (
app.openapi(routes.getShuffleState, async (ctx) => {
const stateResponsePromise = new Promise<boolean>((resolve) => {
ipcMain.once(
'ytmd:get-shuffle-response',
'peard:get-shuffle-response',
(_, isShuffled: boolean | undefined) => {
return resolve(!!isShuffled);
},
@ -693,7 +693,7 @@ export const register = (
app.openapi(routes.getFullscreenState, async (ctx) => {
const stateResponsePromise = new Promise<boolean>((resolve) => {
ipcMain.once(
'ytmd:set-fullscreen',
'peard:set-fullscreen',
(_, isFullscreen: boolean | undefined) => {
return resolve(!!isFullscreen);
},
@ -728,7 +728,7 @@ export const register = (
// Queue
const queueInfo = async (ctx: Context) => {
const queueResponsePromise = new Promise<QueueResponse>((resolve) => {
ipcMain.once('ytmd:get-queue-response', (_, queue: QueueResponse) => {
ipcMain.once('peard:get-queue-response', (_, queue: QueueResponse) => {
return resolve(queue);
});

View File

@ -94,7 +94,7 @@ export const register = (
lastSongInfo = { ...songInfo };
});
ipc.on('ytmd:volume-changed', (newVolumeState: VolumeState) => {
ipc.on('peard:volume-changed', (newVolumeState: VolumeState) => {
volumeState = newVolumeState;
send(DataTypes.VolumeChanged, {
volume: volumeState.state,
@ -102,16 +102,16 @@ export const register = (
});
});
ipc.on('ytmd:repeat-changed', (mode: RepeatMode) => {
ipc.on('peard:repeat-changed', (mode: RepeatMode) => {
repeat = mode;
send(DataTypes.RepeatChanged, { repeat });
});
ipc.on('ytmd:seeked', (t: number) => {
ipc.on('peard:seeked', (t: number) => {
send(DataTypes.PositionChanged, { position: t });
});
ipc.on('ytmd:shuffle-changed', (newShuffle: boolean) => {
ipc.on('peard:shuffle-changed', (newShuffle: boolean) => {
shuffle = newShuffle;
send(DataTypes.ShuffleChanged, { shuffle });
});

View File

@ -1,6 +1,6 @@
import { createPlugin } from '@/utils';
import { t } from '@/i18n';
import { type YoutubePlayer } from '@/types/youtube-player';
import { type MusicPlayer } from '@/types/music-player';
const lazySafeTry = (...fns: (() => void)[]) => {
for (const fn of fns) {
@ -95,7 +95,7 @@ const audioCanPlayHandler = ({
);
};
const ensureAudioContextLoad = (playerApi: YoutubePlayer) => {
const ensureAudioContextLoad = (playerApi: MusicPlayer) => {
if (playerApi.getPlayerState() !== 1 || storage.lastContext) return;
playerApi.loadVideoById(
@ -115,7 +115,7 @@ export default createPlugin({
},
start() {
document.addEventListener('ytmd:audio-can-play', audioCanPlayHandler, {
document.addEventListener('peard:audio-can-play', audioCanPlayHandler, {
passive: true,
});
storage.connectToCompressor(
@ -126,7 +126,7 @@ export default createPlugin({
},
stop() {
document.removeEventListener('ytmd:audio-can-play', audioCanPlayHandler);
document.removeEventListener('peard:audio-can-play', audioCanPlayHandler);
storage.disconnectCompressor();
},
},

View File

@ -7,7 +7,7 @@ import { t } from '@/i18n';
export default createBackend({
start({ ipc: { handle }, window }) {
handle(
'ytmd:captions-selector',
'peard:captions-selector',
async (captionLabels: Record<string, string>, currentIndex: string) =>
await prompt(
{

View File

@ -7,7 +7,7 @@ import renderer, {
type LanguageOptions,
} from './renderer';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
export default createPlugin<
unknown,
@ -15,7 +15,7 @@ export default createPlugin<
{
captionsSettingsButton?: HTMLElement;
captionTrackList: LanguageOptions[] | null;
api: YoutubePlayer | null;
api: MusicPlayer | null;
config: CaptionsSelectorConfig | null;
videoChangeListener: () => void;
},

View File

@ -6,7 +6,7 @@ import { t } from '@/i18n';
import { CaptionsSettingButton } from './templates/captions-settings-template';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
import type { AppElement } from '@/types/queue';
export interface LanguageOptions {
@ -35,7 +35,7 @@ export default createRenderer<
{
captionsSettingsButton?: HTMLElement;
captionTrackList: LanguageOptions[] | null;
api: YoutubePlayer | null;
api: MusicPlayer | null;
config: CaptionsSelectorConfig | null;
videoChangeListener: () => void;
},
@ -73,7 +73,7 @@ export default createRenderer<
this.api?.unloadModule('captions');
document
.querySelector('video')
?.removeEventListener('ytmd:src-changed', this.videoChangeListener);
?.removeEventListener('peard:src-changed', this.videoChangeListener);
if (this.captionsSettingsButton) {
document
.querySelector('.right-controls-buttons')
@ -111,7 +111,7 @@ export default createRenderer<
];
currentIndex = (await ipc.invoke(
'ytmd:captions-selector',
'peard:captions-selector',
captionLabels,
currentIndex,
)) as number;
@ -156,7 +156,7 @@ export default createRenderer<
document
.querySelector('video')
?.addEventListener('ytmd:src-changed', this.videoChangeListener);
?.addEventListener('peard:src-changed', this.videoChangeListener);
},
onConfigChange(newConfig) {
this.config = newConfig;

View File

@ -1,4 +1,4 @@
import { Innertube } from 'youtubei.js';
import { Innertube } from '\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js';
import prompt from 'custom-electron-prompt';

View File

@ -1,6 +1,6 @@
import { createRenderer } from '@/utils';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
import type { RendererContext } from '@/types/contexts';
import type { CustomOutputPluginConfig } from './index';
@ -48,13 +48,13 @@ export const renderer = createRenderer<
await updateSinkId(audioContext, this.options!.output);
},
async onPlayerApiReady(_: YoutubePlayer, context) {
async onPlayerApiReady(_: MusicPlayer, context) {
this.options = await context.getConfig();
await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
navigator.mediaDevices.ondevicechange = async () =>
await updateDeviceList(context);
document.addEventListener('ytmd:audio-can-play', this.audioCanPlayHandler, {
document.addEventListener('peard:audio-can-play', this.audioCanPlayHandler, {
once: true,
passive: true,
});
@ -63,7 +63,7 @@ export const renderer = createRenderer<
stop() {
document.removeEventListener(
'ytmd:audio-can-play',
'peard:audio-can-play',
this.audioCanPlayHandler,
);
navigator.mediaDevices.ondevicechange = null;

View File

@ -3,7 +3,7 @@ import { createPlugin } from '@/utils';
import { t } from '@/i18n';
import type { VideoDataChanged } from '@/types/video-data-changed';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
export type DisableAutoPlayPluginConfig = {
enabled: boolean;
@ -15,7 +15,7 @@ export default createPlugin<
unknown,
{
config: DisableAutoPlayPluginConfig | null;
api: YoutubePlayer | null;
api: MusicPlayer | null;
eventListener: (event: CustomEvent<VideoDataChanged>) => void;
timeUpdateListener: (e: Event) => void;
},

View File

@ -1,5 +1,5 @@
/**
* Application ID registered by @th-ch/youtube-music dev team
* Application ID registered by @th-ch/pear-desktop dev team
*/
export const clientId = '1177081335727267940';
/**

View File

@ -24,9 +24,9 @@ export type DiscordPluginConfig = {
*/
activityTimeoutTime: number;
/**
* Add a "Play on YouTube Music" button to rich presence
* Add a "Play on Pear Desktop" button to rich presence
*/
playOnYouTubeMusic: boolean;
playOnPearDesktop: boolean;
/**
* Hide the "View App On GitHub" button in the rich presence
*/
@ -50,7 +50,7 @@ export default createPlugin({
autoReconnect: true,
activityTimeoutEnabled: true,
activityTimeoutTime: 10 * 60 * 1000,
playOnYouTubeMusic: true,
playOnPearDesktop: true,
hideGitHubButton: false,
hideDurationLeft: false,
statusDisplayType: StatusDisplayType.Details,

View File

@ -45,8 +45,8 @@ export const backend = createBackend<
});
}
ctx.ipc.on('ytmd:player-api-loaded', () => {
ctx.ipc.send('ytmd:setup-time-changed-listener');
ctx.ipc.on('peard:player-api-loaded', () => {
ctx.ipc.send('peard:setup-time-changed-listener');
});
app.on('before-quit', () => {

View File

@ -18,7 +18,7 @@ const registerRefreshOnce = singleton((refreshMenu: () => void) => {
const DiscordStatusDisplayTypeLabels: Record<StatusDisplayType, string> = {
[StatusDisplayType.Name]:
'plugins.discord.menu.set-status-display-type.submenu.youtube-music',
'plugins.discord.menu.set-status-display-type.submenu.pear-desktop',
[StatusDisplayType.State]:
'plugins.discord.menu.set-status-display-type.submenu.artist',
[StatusDisplayType.Details]:
@ -67,12 +67,12 @@ export const onMenu = async ({
},
},
{
label: t('plugins.discord.menu.play-on-youtube-music'),
label: t('plugins.discord.menu.play-on-pear-desktop'),
type: 'checkbox',
checked: config.playOnYouTubeMusic,
checked: config.playOnPearDesktop,
click(item: Electron.MenuItem) {
setConfig({
playOnYouTubeMusic: item.checked,
playOnPearDesktop: item.checked,
});
},
},

View File

@ -28,16 +28,16 @@ export const buildDiscordButtons = (
songInfo: SongInfo,
): GatewayActivityButton[] | undefined => {
const buttons: GatewayActivityButton[] = [];
if (config.playOnYouTubeMusic && songInfo.url) {
if (config.playOnPearDesktop && songInfo.url) {
buttons.push({
label: 'Play on YouTube Music',
label: 'Play on Pear Desktop',
url: songInfo.url,
});
}
if (!config.hideGitHubButton) {
buttons.push({
label: 'View App On GitHub',
url: 'https://github.com/th-ch/youtube-music',
url: 'https://github.com/pear-devs/pear-desktop',
});
}
return buttons.length ? buttons : undefined;

View File

@ -3,7 +3,12 @@ import { join } from 'node:path';
import { randomBytes } from 'node:crypto';
import { app, type BrowserWindow, dialog, ipcMain } from 'electron';
import { Innertube, UniversalCache, Utils, YTNodes } from 'youtubei.js';
import {
Innertube,
UniversalCache,
Utils,
YTNodes,
} from '\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js';
import is from 'electron-is';
import filenamify from 'filenamify';
import { Mutex } from 'async-mutex';
@ -28,18 +33,18 @@ import {
import { getNetFetchAsFetch } from '@/plugins/utils/main';
import { t } from '@/i18n';
import { DefaultPresetList, type Preset, YoutubeFormatList } from '../types';
import { DefaultPresetList, type Preset, VideoFormatList } from '../types';
import type { DownloaderPluginConfig } from '../index';
import type { BackendContext } from '@/types/contexts';
import type { GetPlayerResponse } from '@/types/get-player-response';
import type { FormatOptions } from 'node_modules/youtubei.js/dist/src/types';
import type { VideoInfo } from 'node_modules/youtubei.js/dist/src/parser/youtube';
import type { PlayerErrorMessage } from 'node_modules/youtubei.js/dist/src/parser/nodes';
import type { FormatOptions } from 'node_modules/\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js/dist/src/types';
import type { VideoInfo } from 'node_modules/\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js/dist/src/parser/\u0079\u006f\u0075\u0074\u0075\u0062\u0065';
import type { PlayerErrorMessage } from 'node_modules/\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js/dist/src/parser/nodes';
import type {
TrackInfo,
Playlist,
} from 'node_modules/youtubei.js/dist/src/parser/ytmusic';
} from 'node_modules/\u0079\u006f\u0075\u0074\u0075\u0062\u0065i.js/dist/src/parser/ytmusic';
type CustomSongInfo = SongInfo & { trackId?: string };
@ -56,7 +61,7 @@ let yt: Innertube;
let win: BrowserWindow;
let playingUrl: string;
const isYouTubeMusicPremium = async () => {
const isPremium = async () => {
// If signed out, it is understood as non-premium
const isSignedIn = (await win.webContents.executeJavaScript(
'!!yt.config_.LOGGED_IN',
@ -66,7 +71,7 @@ const isYouTubeMusicPremium = async () => {
// If signed in, check if the upgrade button is present
const upgradeBtnIconPathData = (await win.webContents.executeJavaScript(
'document.querySelector(\'iron-iconset-svg[name="yt-sys-icons"] #youtube_music_monochrome\')?.firstChild?.getAttribute("d")?.substring(0, 15)',
'document.querySelector(\'iron-iconset-svg[name="yt-sys-icons"] #\u0079\u006f\u0075\u0074\u0075\u0062\u0065_music_monochrome\')?.firstChild?.getAttribute("d")?.substring(0, 15)',
)) as string | null;
// Fallback to non-premium if the icon is not found
@ -107,7 +112,7 @@ const sendError = (error: Error, source?: string) => {
export const getCookieFromWindow = async (win: BrowserWindow) => {
return (
await win.webContents.session.cookies.get({
url: 'https://music.youtube.com',
url: 'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com',
})
)
.map((it) => it.name + '=' + it.value)
@ -192,7 +197,7 @@ export const onMainLoad = async ({
}
ipc.handle('download-song', (url: string) => downloadSong(url));
ipc.on('ytmd:video-src-changed', (data: GetPlayerResponse) => {
ipc.on('peard:video-src-changed', (data: GetPlayerResponse) => {
playingUrl = data.microformat.microformatDataRenderer.urlCanonical;
});
ipc.handle('download-playlist-request', async (url: string) =>
@ -298,8 +303,8 @@ function downloadSongOnFinishSetup({
}
});
ipcMain.on('ytmd:player-api-loaded', () => {
ipc.send('ytmd:setup-time-changed-listener');
ipcMain.on('peard:player-api-loaded', () => {
ipc.send('peard:setup-time-changed-listener');
});
}
@ -390,7 +395,7 @@ async function downloadSongUnsafe(
}
const downloadOptions: FormatOptions = {
type: (await isYouTubeMusicPremium()) ? 'audio' : 'video+audio', // Audio, video or video+audio
type: (await isPremium()) ? 'audio' : 'video+audio', // Audio, video or video+audio
quality: 'best', // Best, bestefficiency, 144p, 240p, 480p, 720p and so on.
format: 'any', // Media container format
};
@ -400,7 +405,7 @@ async function downloadSongUnsafe(
let targetFileExtension: string;
if (!presetSetting?.extension) {
targetFileExtension =
YoutubeFormatList.find((it) => it.itag === format.itag)?.container ??
VideoFormatList.find((it) => it.itag === format.itag)?.container ??
'mp3';
} else {
targetFileExtension = presetSetting?.extension ?? 'mp3';

View File

@ -10,7 +10,7 @@ export const sendFeedback = (win: BrowserWindow, message?: unknown) => {
export const cropMaxWidth = (image: Electron.NativeImage) => {
const imageSize = image.getSize();
// Standart YouTube artwork width with margins from both sides is 280 + 720 + 280
// Standard artwork width with margins from both sides is 280 + 720 + 280
if (imageSize.width === 1280 && imageSize.height === 720) {
return image.crop({
x: 280,

View File

@ -19,7 +19,7 @@ export const DefaultPresetList: Record<string, Preset> = {
},
};
export interface YouTubeFormat {
export interface VideoFormat {
itag: number;
container: string;
content: string;
@ -29,9 +29,9 @@ export interface YouTubeFormat {
vrOr3D: string;
}
// converted from https://gist.github.com/sidneys/7095afe4da4ae58694d128b1034e01e2#file-youtube_format_code_itag_list-md
// converted from https://gist.github.com/sidneys/7095afe4da4ae58694d128b1034e01e2
// and https://gist.github.com/MartinEesmaa/2f4b261cb90a47e9c41ba115a011a4aa
export const YoutubeFormatList: YouTubeFormat[] = [
export const VideoFormatList: VideoFormat[] = [
{
itag: 5,
container: 'flv',

View File

@ -57,7 +57,7 @@ export default createPlugin({
const config = await getConfig();
document.addEventListener(
'ytmd:audio-can-play',
'peard:audio-can-play',
({ detail: { audioSource, audioContext } }) => {
const filtersToApply = config.filters.concat(
defaultPresets

View File

@ -1,7 +1,7 @@
import { createPlugin } from '@/utils';
import { t } from '@/i18n';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
export default createPlugin({
name: () => t('plugins.exponential-volume.name'),
@ -12,7 +12,7 @@ export default createPlugin({
},
renderer: {
onPlayerApiReady(playerApi) {
const syncVolume = (playerApi: YoutubePlayer) => {
const syncVolume = (playerApi: MusicPlayer) => {
if (playerApi.getPlayerState() === 3) {
setTimeout(() => syncVolume(playerApi), 0);
return;
@ -21,8 +21,8 @@ export default createPlugin({
playerApi.setVolume(playerApi.getVolume());
};
// "YouTube Music fix volume ratio 0.4" by Marco Pfeiffer
// https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/
// "fix volume ratio 0.4" by Marco Pfeiffer
// https://bit.ly/4nMu2WF
// Manipulation exponent, higher value = lower volume
// 3 is the value used by pulseaudio, which Barteks2x figured out this gist here: https://gist.github.com/Barteks2x/a4e189a36a10c159bb1644ffca21c02a

View File

@ -54,7 +54,7 @@ export const onMainLoad = ({
return target;
};
ipcMain.handle('ytmd:menu-event', (event, commandId: number) => {
ipcMain.handle('peard:menu-event', (event, commandId: number) => {
const target = getMenuItemById(commandId);
if (target)
(

View File

@ -25,7 +25,7 @@ export const onRendererLoad = async ({
}: RendererContext<InAppMenuConfig>) => {
setConfig(await getConfig());
document.title = 'YouTube Music';
document.title = 'Pear Desktop';
const stylesheet = new CSSStyleSheet();
stylesheet.replaceSync(scrollStyle);
document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet];

View File

@ -278,7 +278,7 @@ export const PanelItem = (props: PanelItemProps) => {
};
const handleClick = async () => {
await window.ipcRenderer.invoke('ytmd:menu-event', props.commandId);
await window.ipcRenderer.invoke('peard:menu-event', props.commandId);
if (props.type === 'radio') {
props.onChange?.(!props.checked);
} else if (props.type === 'checkbox') {

View File

@ -3,7 +3,7 @@
--menu-bar-height: 32px;
}
/* youtube-music style */
/* original style */
ytmusic-app-layout {
overflow: auto scroll;
height: calc(100vh - var(--menu-bar-height, 36px));
@ -73,7 +73,7 @@ ytmusic-app-layout ytmusic-player-page[is-mweb-modernization-enabled] .side-pane
transform: translate(0, calc(var(--ytmusic-player-page-inner-height) - var(--ytmusic-player-page-tabs-header-height) - var(--ytmusic-player-page-player-bar-height) - var(--menu-bar-height, 32px) ));
}
/* ytm-bugs: see https://github.com/th-ch/youtube-music/issues/1737 */
/* ytm-bugs: see https://github.com/pear-devs/pear-desktop/issues/1737 */
html {
scrollbar-color: unset;
}

View File

@ -36,7 +36,7 @@ export default createPlugin({
const previousStatePaused = null;
const data: LumiaData = {
origin: 'youtubemusic',
origin: 'peardesktop',
eventType: 'switchSong',
};
@ -65,8 +65,8 @@ export default createPlugin({
});
};
ipc.on('ytmd:player-api-loaded', () =>
ipc.send('ytmd:setup-time-changed-listener'),
ipc.on('peard:player-api-loaded', () =>
ipc.send('peard:setup-time-changed-listener'),
);
registerCallback((songInfo) => {

View File

@ -21,7 +21,7 @@ import settingHTML from './templates/setting.html?raw';
import style from './style.css?inline';
import type { DataConnection } from 'peerjs';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
import type { RendererContext } from '@/types/contexts';
import type { VideoDataChanged } from '@/types/video-data-changed';
import type { AppElement } from '@/types/queue';
@ -49,7 +49,7 @@ export default createPlugin<
ipc?: RendererContext<never>['ipc'];
api: AppElement | null;
queue?: Queue;
playerApi?: YoutubePlayer;
playerApi?: MusicPlayer;
showPrompt: (title: string, label: string) => Promise<string>;
popups: {
host: ReturnType<typeof createHostPopup>;

View File

@ -7,13 +7,13 @@ export const extractToken = (cookie = document.cookie) =>
export const getHash = async (
papisid: string,
millis = Date.now(),
origin: string = 'https://music.youtube.com',
origin: string = 'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com',
) => (await SHA1Hash(`${millis} ${papisid} ${origin}`)).toLowerCase();
export const getAuthorizationHeader = async (
papisid: string,
millis = Date.now(),
origin: string = 'https://music.youtube.com',
origin: string = 'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com',
) => {
return `SAPISIDHASH ${millis}_${await getHash(papisid, millis, origin)}`;
};

View File

@ -1,4 +1,4 @@
import type { YouTubeMusicAppElement } from '@/types/youtube-music-app-element';
import type { MusicPlayerAppElement } from '@/types/music-player-app-element';
import type { QueueElement } from '@/types/queue';
type QueueRendererResponse = {
@ -13,7 +13,7 @@ export const getMusicQueueRenderer = async (
videoIds: string[],
): Promise<QueueRendererResponse | null> => {
const queue = document.querySelector<QueueElement>('#queue');
const app = document.querySelector<YouTubeMusicAppElement>('ytmusic-app');
const app = document.querySelector<MusicPlayerAppElement>('ytmusic-app');
if (!app) return null;
const store = queue?.queue.store.store;

View File

@ -127,7 +127,7 @@ export default (
const getButton = (kind: keyof typeof mediaIcons) =>
`<action ${display(
kind,
)} activationType="protocol" arguments="youtubemusic://${kind}"/>`;
)} activationType="protocol" arguments="peardesktop://${kind}"/>`;
const getButtons = (isPaused: boolean) => `\
<actions>
@ -260,7 +260,7 @@ export default (
songControls = getSongControls(win);
let currentSeconds = 0;
on('ytmd:player-api-loaded', () => send('ytmd:setup-time-changed-listener'));
on('peard:player-api-loaded', () => send('peard:setup-time-changed-listener'));
let savedSongInfo: SongInfo;
let lastUrl: string | undefined;

View File

@ -3,7 +3,7 @@ import fs from 'node:fs';
import { app, type NativeImage } from 'electron';
import youtubeMusicIcon from '@assets/youtube-music.png?asset&asarUnpack';
import musicPlayerIcon from '@assets/icon.png?asset&asarUnpack';
import { type SongInfo } from '@/providers/song-info';
@ -46,7 +46,7 @@ export const notificationImage = (
config: NotificationsPluginConfig,
) => {
if (!songInfo.image) {
return youtubeMusicIcon;
return musicPlayerIcon;
}
if (!config.interactive) {
@ -71,7 +71,7 @@ export const saveImage = (img: NativeImage, savePath: string) => {
} catch (error: unknown) {
console.error('Error writing song icon to disk:');
console.trace(error);
return youtubeMusicIcon;
return musicPlayerIcon;
}
return savePath;

View File

@ -37,7 +37,7 @@ export const injectCpuTamerByAnimationFrame = ((__CONTEXT__) => {
win[hkey_script] = true;
/** @type {globalThis.PromiseConstructor} */
const Promise = (async () => { })().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
const Promise = (async () => { })().constructor; // hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
const PromiseExternal = ((resolve_, reject_) => {
const h = (resolve, reject) => { resolve_ = resolve; reject_ = reject };
return class PromiseExternal extends Promise {
@ -64,7 +64,7 @@ export const injectCpuTamerByAnimationFrame = ((__CONTEXT__) => {
})();
if (!isGPUAccelerationAvailable) {
throw new Error('Your browser does not support GPU Acceleration. YouTube CPU Tamer by AnimationFrame is skipped.');
throw new Error('Your browser does not support GPU Acceleration. CPU Tamer by AnimationFrame is skipped.');
}
const timeupdateDT = (() => {
@ -100,7 +100,7 @@ export const injectCpuTamerByAnimationFrame = ((__CONTEXT__) => {
frame.sandbox = 'allow-same-origin'; // script cannot be run inside iframe but API can be obtained from iframe
let n = document.createElement('noscript'); // wrap into NOSCRPIT to avoid reflow (layouting)
n.appendChild(frame);
while (!document.documentElement && mx-- > 0) await new Promise(waitFn); // requestAnimationFrame here could get modified by YouTube engine
while (!document.documentElement && mx-- > 0) await new Promise(waitFn); // requestAnimationFrame here could get modified by the engine
const root = document.documentElement;
root.appendChild(n); // throw error if root is null due to exceeding MAX TRIAL
if (blobURL) Promise.resolve().then(() => URL.revokeObjectURL(blobURL));

View File

@ -37,7 +37,7 @@ export const injectCpuTamerByDomMutation = ((__CONTEXT__) => {
win[hkey_script] = true;
/** @type {globalThis.PromiseConstructor} */
const Promise = (async () => { })().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
const Promise = (async () => { })().constructor; // hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
const PromiseExternal = ((resolve_, reject_) => {
const h = (resolve, reject) => { resolve_ = resolve; reject_ = reject };
return class PromiseExternal extends Promise {
@ -89,7 +89,7 @@ export const injectCpuTamerByDomMutation = ((__CONTEXT__) => {
frame.sandbox = 'allow-same-origin'; // script cannot be run inside iframe but API can be obtained from iframe
let n = document.createElement('noscript'); // wrap into NOSCRPIT to avoid reflow (layouting)
n.appendChild(frame);
while (!document.documentElement && mx-- > 0) await new Promise(waitFn); // requestAnimationFrame here could get modified by YouTube engine
while (!document.documentElement && mx-- > 0) await new Promise(waitFn); // requestAnimationFrame here could get modified by the engine
const root = document.documentElement;
root.appendChild(n); // throw error if root is null due to exceeding MAX TRIAL
if (blobURL) Promise.resolve().then(() => URL.revokeObjectURL(blobURL));

View File

@ -35,7 +35,7 @@ export const injectRm3 = () => {
const DEBUG_dataChangeReflection = true;
/** @type {globalThis.PromiseConstructor} */
const Promise = (async () => {})().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
const Promise = (async () => {})().constructor; // hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.
// https://qiita.com/piroor/items/02885998c9f76f45bfa0
// https://gist.github.com/piroor/829ecb32a52c2a42e5393bbeebe5e63f
@ -354,7 +354,7 @@ export const injectRm3 = () => {
const timeCheck = () => {
// regularly check elements are old enough to put into the available pools
// note: the characterists of YouTube components are non-volatile. So don't need to waste time to check weakRef.deref() is null or not for removing in operations.
// note: the characterists of original components are non-volatile. So don't need to waste time to check weakRef.deref() is null or not for removing in operations.
const ct = Date.now();
if (ct - lastTimeCheck < CHECK_INTERVAL || noTimeCheck) return;
@ -738,7 +738,7 @@ export const injectRm3 = () => {
}
const acceptance = true;
// const acceptance = !cntE.__dataReady && cntE.__dataInvalid !== false; // we might need to change the acceptance condition along with YouTube Coding updates.
// const acceptance = !cntE.__dataReady && cntE.__dataInvalid !== false; // we might need to change the acceptance condition along with Coding updates.
if (acceptance) {
// [[ weak ElementNode, attached time, detached time, time of change, inside availablePool, reuse count ]]
const entryRecord = [new WeakRef(newElement), -1, -1, -1, false, 0];

View File

@ -45,7 +45,7 @@ export const onMainLoad = async ({
window.setMaximizable(false);
window.setFullScreenable(false);
send('ytmd:pip-toggle', true);
send('peard:pip-toggle', true);
app.dock?.hide();
window.setVisibleOnAllWorkspaces(true, {
@ -63,7 +63,7 @@ export const onMainLoad = async ({
window.setMaximizable(true);
window.setFullScreenable(true);
send('ytmd:pip-toggle', false);
send('peard:pip-toggle', false);
window.setVisibleOnAllWorkspaces(false);
window.setAlwaysOnTop(false);

View File

@ -12,12 +12,12 @@ import { t } from '@/i18n';
import { PictureInPictureButton } from './templates/picture-in-picture-button';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
import type { PictureInPicturePluginConfig } from './index';
import type { RendererContext } from '@/types/contexts';
export const onPlayerApiReady = async (
_: YoutubePlayer,
_: MusicPlayer,
{ ipc, getConfig }: RendererContext<PictureInPicturePluginConfig>,
) => {
const config = await getConfig();
@ -89,7 +89,7 @@ export const onPlayerApiReady = async (
await togglePictureInPicture();
};
ipc.on('ytmd:pip-toggle', (isPip: boolean) => {
ipc.on('peard:pip-toggle', (isPip: boolean) => {
if (exitFullScreenButton && player) {
if (isPip) {
exitFullScreenButton?.addEventListener('click', pipClickEventListener);

View File

@ -109,7 +109,7 @@ export const onPlayerApiReady = () => {
const video = document.querySelector<HTMLVideoElement>('video');
if (video) {
video.addEventListener('ratechange', forcePlaybackRate);
video.addEventListener('ytmd:src-changed', forcePlaybackRate);
video.addEventListener('peard:src-changed', forcePlaybackRate);
}
};
@ -121,7 +121,7 @@ export const onUnload = () => {
const video = document.querySelector<HTMLVideoElement>('video');
if (video) {
video.removeEventListener('ratechange', forcePlaybackRate);
video.removeEventListener('ytmd:src-changed', forcePlaybackRate);
video.removeEventListener('peard:src-changed', forcePlaybackRate);
}
getSongMenu()?.removeChild(sliderContainer);
};

View File

@ -3,13 +3,13 @@ import { type PreciseVolumePluginConfig } from './index';
import { debounce } from '@/providers/decorators';
import type { RendererContext } from '@/types/contexts';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
function $<E extends Element = Element>(selector: string) {
return document.querySelector<E>(selector);
}
let api: YoutubePlayer;
let api: MusicPlayer;
export const moveVolumeHud = debounce((showVideo: boolean) => {
const volumeHud = $<HTMLElement>('#volumeHud');
@ -25,7 +25,7 @@ export const moveVolumeHud = debounce((showVideo: boolean) => {
let options: PreciseVolumePluginConfig;
export const onPlayerApiReady = async (
playerApi: YoutubePlayer,
playerApi: MusicPlayer,
context: RendererContext<PreciseVolumePluginConfig>,
) => {
options = await context.getConfig();
@ -71,7 +71,7 @@ export const onPlayerApiReady = async (
const videoMode = () =>
api.getPlayerResponse().videoDetails?.musicVideoType !==
'MUSIC_VIDEO_TYPE_ATV';
$('video')?.addEventListener('ytmd:src-changed', () =>
$('video')?.addEventListener('peard:src-changed', () =>
moveVolumeHud(videoMode()),
);
}

View File

@ -7,7 +7,7 @@ import { t } from '@/i18n';
import { QualitySettingButton } from './templates/quality-setting-button';
import type { YoutubePlayer } from '@/types/youtube-player';
import type { MusicPlayer } from '@/types/music-player';
export default createPlugin({
name: () => t('plugins.quality-changer.name'),
@ -19,7 +19,7 @@ export default createPlugin({
backend({ ipc, window }) {
ipc.handle(
'ytmd:quality-changer',
'peard:quality-changer',
async (qualityLabels: string[], currentIndex: number) =>
await dialog.showMessageBox(window, {
type: 'question',
@ -44,7 +44,7 @@ export default createPlugin({
renderer: {
qualitySettingsButtonContainer: document.createElement('div'),
onPlayerApiReady(api: YoutubePlayer, context) {
onPlayerApiReady(api: MusicPlayer, context) {
const chooseQuality = async (e: MouseEvent) => {
e.stopPropagation();
@ -53,7 +53,7 @@ export default createPlugin({
const currentIndex = qualityLevels.indexOf(api.getPlaybackQuality());
const quality = (await context.ipc.invoke(
'ytmd:quality-changer',
'peard:quality-changer',
api.getAvailableQualityLabels(),
currentIndex,
)) as {

View File

@ -7,7 +7,7 @@ import { backend } from './main';
export interface ScrobblerPluginConfig {
enabled: boolean;
/**
* Attempt to scrobble other video types (e.g. Podcasts, normal YouTube videos)
* Attempt to scrobble other video types (e.g. Podcasts, normal videos)
*
* @default true
*/

View File

@ -91,8 +91,8 @@ function createRequestBody(
track_name: title,
release_name: songInfo.album ?? undefined,
additional_info: {
media_player: 'YouTube Music Desktop App',
submission_client: 'YouTube Music Desktop App - Scrobbler Plugin',
media_player: 'Pear Desktop App',
submission_client: 'Pear Desktop App - Scrobbler Plugin',
origin_url: songInfo.url,
duration: songInfo.songDuration,
},

View File

@ -24,7 +24,7 @@ import * as config from '@/config';
import { LoggerPrefix } from '@/utils';
import type { RepeatMode, VolumeState } from '@/types/datahost-get-state';
import type { QueueResponse } from '@/types/youtube-music-desktop-internal';
import type { QueueResponse } from '@/types/music-player-desktop-internal';
class YTPlayer extends MprisPlayer {
/**
@ -70,8 +70,8 @@ class YTPlayer extends MprisPlayer {
function setupMPRIS() {
const instance = new YTPlayer({
name: 'YoutubeMusic',
identity: 'YouTube Music',
name: 'PearDesktop',
identity: 'Pear Desktop',
supportedMimeTypes: ['audio/mpeg'],
supportedInterfaces: ['player'],
});
@ -80,7 +80,7 @@ function setupMPRIS() {
instance.canQuit = false;
instance.canUsePlayerControls = true;
instance.supportedUriSchemes = ['http', 'https'];
instance.desktopEntry = 'youtube-music';
instance.desktopEntry = 'pear-desktop';
return instance;
}
@ -114,34 +114,34 @@ export function registerMPRIS(win: BrowserWindow) {
currentSongInfo?.videoId &&
event.trackId.endsWith(correctId(currentSongInfo.videoId))
) {
win.webContents.send('ytmd:seek-to', microToSec(event.position ?? 0));
win.webContents.send('peard:seek-to', microToSec(event.position ?? 0));
player.setPosition(event.position ?? 0);
}
};
const seekBy = (offset: number) => {
win.webContents.send('ytmd:seek-by', microToSec(offset));
win.webContents.send('peard:seek-by', microToSec(offset));
player.setPosition(player.getPosition() + offset);
};
ipcMain.on('ytmd:player-api-loaded', () => {
win.webContents.send('ytmd:setup-seeked-listener', 'mpris');
win.webContents.send('ytmd:setup-time-changed-listener', 'mpris');
win.webContents.send('ytmd:setup-repeat-changed-listener', 'mpris');
win.webContents.send('ytmd:setup-volume-changed-listener', 'mpris');
win.webContents.send('ytmd:setup-shuffle-changed-listener', 'mpris');
win.webContents.send('ytmd:setup-fullscreen-changed-listener', 'mpris');
win.webContents.send('ytmd:setup-autoplay-changed-listener', 'mpris');
ipcMain.on('peard:player-api-loaded', () => {
win.webContents.send('peard:setup-seeked-listener', 'mpris');
win.webContents.send('peard:setup-time-changed-listener', 'mpris');
win.webContents.send('peard:setup-repeat-changed-listener', 'mpris');
win.webContents.send('peard:setup-volume-changed-listener', 'mpris');
win.webContents.send('peard:setup-shuffle-changed-listener', 'mpris');
win.webContents.send('peard:setup-fullscreen-changed-listener', 'mpris');
win.webContents.send('peard:setup-autoplay-changed-listener', 'mpris');
requestShuffleInformation();
requestFullscreenInformation();
requestQueueInformation();
});
ipcMain.on('ytmd:seeked', (_, t: number) => {
ipcMain.on('peard:seeked', (_, t: number) => {
player.setPosition(secToMicro(t));
player.seeked(secToMicro(t));
});
ipcMain.on('ytmd:repeat-changed', (_, mode: RepeatMode) => {
ipcMain.on('peard:repeat-changed', (_, mode: RepeatMode) => {
switch (mode) {
case 'NONE': {
player.setLoopStatus(LOOP_STATUS_NONE);
@ -160,7 +160,7 @@ export function registerMPRIS(win: BrowserWindow) {
requestQueueInformation();
});
ipcMain.on('ytmd:shuffle-changed', (_, shuffleEnabled: boolean) => {
ipcMain.on('peard:shuffle-changed', (_, shuffleEnabled: boolean) => {
if (player.shuffle === undefined || !player.canUsePlayerControls) {
return;
}
@ -168,7 +168,7 @@ export function registerMPRIS(win: BrowserWindow) {
player.shuffle = shuffleEnabled ?? !player.shuffle;
});
ipcMain.on('ytmd:fullscreen-changed', (_, changedTo: boolean) => {
ipcMain.on('peard:fullscreen-changed', (_, changedTo: boolean) => {
if (player.fullscreen === undefined || !player.canUsePlayerControls) {
return;
}
@ -178,7 +178,7 @@ export function registerMPRIS(win: BrowserWindow) {
});
ipcMain.on(
'ytmd:set-fullscreen',
'peard:set-fullscreen',
(_, isFullscreen: boolean | undefined) => {
if (!player.canUsePlayerControls || isFullscreen === undefined) {
return;
@ -189,16 +189,16 @@ export function registerMPRIS(win: BrowserWindow) {
);
ipcMain.on(
'ytmd:fullscreen-changed-supported',
'peard:fullscreen-changed-supported',
(_, isFullscreenSupported: boolean) => {
player.canUsePlayerControls = isFullscreenSupported;
},
);
ipcMain.on('ytmd:autoplay-changed', (_) => {
ipcMain.on('peard:autoplay-changed', (_) => {
requestQueueInformation();
});
ipcMain.on('ytmd:get-queue-response', (_, queue: QueueResponse) => {
ipcMain.on('peard:get-queue-response', (_, queue: QueueResponse) => {
if (!queue) {
return;
}
@ -306,7 +306,7 @@ export function registerMPRIS(win: BrowserWindow) {
console.trace(error);
});
ipcMain.on('ytmd:volume-changed', (_, newVolumeState: VolumeState) => {
ipcMain.on('peard:volume-changed', (_, newVolumeState: VolumeState) => {
player.volume = newVolumeState.isMuted
? 0
: Number.parseFloat((newVolumeState.state / 100).toFixed(2));

View File

@ -115,13 +115,13 @@ export const onRendererLoad = async ({
}: RendererContext<SkipSilencesPluginConfig>) => {
config = await getConfig();
document.addEventListener('ytmd:audio-can-play', audioCanPlayListener, {
document.addEventListener('peard:audio-can-play', audioCanPlayListener, {
passive: true,
});
};
export const onRendererUnload = () => {
document.removeEventListener('ytmd:audio-can-play', audioCanPlayListener);
document.removeEventListener('peard:audio-can-play', audioCanPlayListener);
if (playOrSeekHandler) {
const video = document.querySelector('video');

View File

@ -76,7 +76,7 @@ export default createPlugin({
const { apiURL, categories } = config;
ipc.on('ytmd:video-src-changed', async (data: GetPlayerResponse) => {
ipc.on('peard:video-src-changed', async (data: GetPlayerResponse) => {
const segments = await fetchSegments(
apiURL,
categories,

View File

@ -1,5 +1,5 @@
import type { LyricProvider, LyricResult, SearchSongInfo } from '../types';
import type { YouTubeMusicAppElement } from '@/types/youtube-music-app-element';
import type { MusicPlayerAppElement } from '@/types/music-player-app-element';
const headers = {
'Accept': 'application/json',
@ -13,7 +13,8 @@ const client = {
export class YTMusic implements LyricProvider {
public name = 'YTMusic';
public baseUrl = 'https://music.youtube.com/';
public baseUrl =
'https://music.\u0079\u006f\u0075\u0074\u0075\u0062\u0065.com/';
// prettier-ignore
public async search(
@ -42,7 +43,7 @@ export class YTMusic implements LyricProvider {
if (!contents) return null;
/*
NOTE: Due to the nature of Youtubei, the json responses are not consistent,
NOTE: Due to the nature of the library, the json responses are not consistent,
this means we have to check for multiple possible paths to get the lyrics.
*/
@ -107,7 +108,7 @@ export class YTMusic implements LyricProvider {
private PROXIED_ENDPOINT = 'https://ytmbrowseproxy.zvz.be/';
private fetchNext(videoId: string) {
const app = document.querySelector<YouTubeMusicAppElement>('ytmusic-app');
const app = document.querySelector<MusicPlayerAppElement>('ytmusic-app');
if (!app) return null;

Some files were not shown because too many files have changed in this diff Show More