Add yt-dlp release channel selection to updater UI
Introduces UI elements and logic for selecting between stable and nightly yt-dlp release channels in the updater tab, with support for switching channels and displaying status. Updates all language files with new strings for channel selection and status messages, and adds a default 'ytdlp_channel' config key.
This commit is contained in:
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "خطأ",
|
"error_title": "خطأ",
|
||||||
"failed_save_settings": "فشل حفظ إعدادات التحديث التلقائي.",
|
"failed_save_settings": "فشل حفظ إعدادات التحديث التلقائي.",
|
||||||
"error_saving_settings": "خطأ في حفظ إعدادات التحديث التلقائي: {error}",
|
"error_saving_settings": "خطأ في حفظ إعدادات التحديث التلقائي: {error}",
|
||||||
|
"ytdlp_channel": "قناة إصدار yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "مستقر (إصدارات مختبرة)",
|
||||||
|
"ytdlp_channel_nightly": "ليلي (تحديثات يومية، موصى به من yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "اختر بين الإصدارات المستقرة والليلية. يتم تحديث الإصدارات الليلية يومياً بأحدث الإصلاحات والميزات. يمكنك تبديل القنوات في أي وقت.",
|
||||||
|
"ytdlp_switching_channel": "التبديل إلى قناة {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ تم التبديل بنجاح إلى قناة {channel}!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ فشل تبديل القناة: {error}",
|
||||||
|
"ytdlp_current_channel": "القناة الحالية: {channel}",
|
||||||
"auto_update_title": "إعدادات التحديثات التلقائية",
|
"auto_update_title": "إعدادات التحديثات التلقائية",
|
||||||
"auto_update_header": "🔄 إعدادات التحديثات التلقائية",
|
"auto_update_header": "🔄 إعدادات التحديثات التلقائية",
|
||||||
"auto_update_description": "قم بتكوين التحديثات التلقائية لـ yt-dlp لضمان الحصول على أحدث الميزات وإصلاحات الأخطاء.",
|
"auto_update_description": "قم بتكوين التحديثات التلقائية لـ yt-dlp لضمان الحصول على أحدث الميزات وإصلاحات الأخطاء.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Fehler",
|
"error_title": "Fehler",
|
||||||
"failed_save_settings": "Speichern der Auto-Update-Einstellungen fehlgeschlagen.",
|
"failed_save_settings": "Speichern der Auto-Update-Einstellungen fehlgeschlagen.",
|
||||||
"error_saving_settings": "Fehler beim Speichern der Auto-Update-Einstellungen: {error}",
|
"error_saving_settings": "Fehler beim Speichern der Auto-Update-Einstellungen: {error}",
|
||||||
|
"ytdlp_channel": "yt-dlp Release-Kanal",
|
||||||
|
"ytdlp_channel_stable": "Stabil (Getestete Versionen)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Tägliche Updates, empfohlen von yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Wählen Sie zwischen stabilen und nächtlichen Versionen. Nightly-Builds werden täglich mit den neuesten Korrekturen und Funktionen aktualisiert. Sie können jederzeit zwischen den Kanälen wechseln.",
|
||||||
|
"ytdlp_switching_channel": "Wechsle zu {channel}-Kanal...",
|
||||||
|
"ytdlp_channel_switched": "✅ Erfolgreich zu {channel}-Kanal gewechselt!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Kanalwechsel fehlgeschlagen: {error}",
|
||||||
|
"ytdlp_current_channel": "Aktueller Kanal: {channel}",
|
||||||
"auto_update_title": "Auto-Update-Einstellungen",
|
"auto_update_title": "Auto-Update-Einstellungen",
|
||||||
"auto_update_header": "🔄 Auto-Update-Einstellungen",
|
"auto_update_header": "🔄 Auto-Update-Einstellungen",
|
||||||
"auto_update_description": "Konfigurieren Sie automatische Updates für yt-dlp, um sicherzustellen, dass Sie immer die neuesten Funktionen und Fehlerbehebungen haben.",
|
"auto_update_description": "Konfigurieren Sie automatische Updates für yt-dlp, um sicherzustellen, dass Sie immer die neuesten Funktionen und Fehlerbehebungen haben.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Error",
|
"error_title": "Error",
|
||||||
"failed_save_settings": "Failed to save auto-update settings.",
|
"failed_save_settings": "Failed to save auto-update settings.",
|
||||||
"error_saving_settings": "Error saving auto-update settings: {error}",
|
"error_saving_settings": "Error saving auto-update settings: {error}",
|
||||||
|
"ytdlp_channel": "yt-dlp Release Channel",
|
||||||
|
"ytdlp_channel_stable": "Stable (Tested releases)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Daily updates, recommended by yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Choose between stable and nightly releases. Nightly builds are updated daily with the latest fixes and features. You can switch channels at any time.",
|
||||||
|
"ytdlp_switching_channel": "Switching to {channel} channel...",
|
||||||
|
"ytdlp_channel_switched": "✅ Successfully switched to {channel} channel!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Failed to switch channel: {error}",
|
||||||
|
"ytdlp_current_channel": "Current channel: {channel}",
|
||||||
"auto_update_title": "Auto-Update Settings",
|
"auto_update_title": "Auto-Update Settings",
|
||||||
"auto_update_header": "🔄 Auto-Update Settings",
|
"auto_update_header": "🔄 Auto-Update Settings",
|
||||||
"auto_update_description": "Configure automatic updates for yt-dlp to ensure you always have the latest features and bug fixes.",
|
"auto_update_description": "Configure automatic updates for yt-dlp to ensure you always have the latest features and bug fixes.",
|
||||||
|
|||||||
@@ -250,6 +250,14 @@
|
|||||||
"error_title": "Error",
|
"error_title": "Error",
|
||||||
"failed_save_settings": "Falló al guardar la configuración de auto-actualización.",
|
"failed_save_settings": "Falló al guardar la configuración de auto-actualización.",
|
||||||
"error_saving_settings": "Error al guardar la configuración de auto-actualización: {error}",
|
"error_saving_settings": "Error al guardar la configuración de auto-actualización: {error}",
|
||||||
|
"ytdlp_channel": "Canal de Lanzamiento de yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Estable (Versiones probadas)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Actualizaciones diarias, recomendado por yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Elige entre versiones estables y nightly. Las versiones nightly se actualizan diariamente con las últimas correcciones y características. Puedes cambiar de canal en cualquier momento.",
|
||||||
|
"ytdlp_switching_channel": "Cambiando al canal {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ ¡Cambiado exitosamente al canal {channel}!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Error al cambiar de canal: {error}",
|
||||||
|
"ytdlp_current_channel": "Canal actual: {channel}",
|
||||||
"auto_update_title": "Configuración de Auto-Actualización",
|
"auto_update_title": "Configuración de Auto-Actualización",
|
||||||
"auto_update_header": "🔄 Configuración de Auto-Actualización",
|
"auto_update_header": "🔄 Configuración de Auto-Actualización",
|
||||||
"auto_update_description": "Configura las actualizaciones automáticas de yt-dlp para asegurar que siempre tengas las últimas funciones y correcciones de errores.",
|
"auto_update_description": "Configura las actualizaciones automáticas de yt-dlp para asegurar que siempre tengas las últimas funciones y correcciones de errores.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Erreur",
|
"error_title": "Erreur",
|
||||||
"failed_save_settings": "Échec de la sauvegarde des paramètres de mise à jour automatique.",
|
"failed_save_settings": "Échec de la sauvegarde des paramètres de mise à jour automatique.",
|
||||||
"error_saving_settings": "Erreur lors de la sauvegarde des paramètres de mise à jour automatique : {error}",
|
"error_saving_settings": "Erreur lors de la sauvegarde des paramètres de mise à jour automatique : {error}",
|
||||||
|
"ytdlp_channel": "Canal de version yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Stable (Versions testées)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Mises à jour quotidiennes, recommandé par yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Choisissez entre les versions stables et nightly. Les versions nightly sont mises à jour quotidiennement avec les dernières corrections et fonctionnalités. Vous pouvez changer de canal à tout moment.",
|
||||||
|
"ytdlp_switching_channel": "Passage au canal {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ Passage réussi au canal {channel} !",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Échec du changement de canal : {error}",
|
||||||
|
"ytdlp_current_channel": "Canal actuel : {channel}",
|
||||||
"auto_update_title": "Paramètres de mise à jour automatique",
|
"auto_update_title": "Paramètres de mise à jour automatique",
|
||||||
"auto_update_header": "🔄 Paramètres de mise à jour automatique",
|
"auto_update_header": "🔄 Paramètres de mise à jour automatique",
|
||||||
"auto_update_description": "Configurez les mises à jour automatiques pour yt-dlp afin de vous assurer d'avoir toujours les dernières fonctionnalités et corrections de bogues.",
|
"auto_update_description": "Configurez les mises à jour automatiques pour yt-dlp afin de vous assurer d'avoir toujours les dernières fonctionnalités et corrections de bogues.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "त्रुटि",
|
"error_title": "त्रुटि",
|
||||||
"failed_save_settings": "स्वचालित अपडेट सेटिंग्स सेव करना असफल।",
|
"failed_save_settings": "स्वचालित अपडेट सेटिंग्स सेव करना असफल।",
|
||||||
"error_saving_settings": "स्वचालित अपडेट सेटिंग्स सेव करने में त्रुटि: {error}",
|
"error_saving_settings": "स्वचालित अपडेट सेटिंग्स सेव करने में त्रुटि: {error}",
|
||||||
|
"ytdlp_channel": "yt-dlp रिलीज़ चैनल",
|
||||||
|
"ytdlp_channel_stable": "स्थिर (परीक्षित रिलीज़)",
|
||||||
|
"ytdlp_channel_nightly": "नाइटली (दैनिक अपडेट, yt-dlp द्वारा अनुशंसित)",
|
||||||
|
"ytdlp_channel_description": "स्थिर और नाइटली रिलीज़ के बीच चुनें। नाइटली बिल्ड नवीनतम फिक्स और सुविधाओं के साथ दैनिक अपडेट होते हैं। आप किसी भी समय चैनल बदल सकते हैं।",
|
||||||
|
"ytdlp_switching_channel": "{channel} चैनल पर स्विच किया जा रहा है...",
|
||||||
|
"ytdlp_channel_switched": "✅ सफलतापूर्वक {channel} चैनल पर स्विच किया गया!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ चैनल स्विच करना विफल: {error}",
|
||||||
|
"ytdlp_current_channel": "वर्तमान चैनल: {channel}",
|
||||||
"auto_update_title": "स्वचालित अपडेट सेटिंग्स",
|
"auto_update_title": "स्वचालित अपडेट सेटिंग्स",
|
||||||
"auto_update_header": "🔄 स्वचालित अपडेट सेटिंग्स",
|
"auto_update_header": "🔄 स्वचालित अपडेट सेटिंग्स",
|
||||||
"auto_update_description": "yt-dlp के लिए स्वचालित अपडेट कॉन्फ़िगर करें ताकि आपके पास हमेशा नवीनतम सुविधाएं और बग फिक्स हों।",
|
"auto_update_description": "yt-dlp के लिए स्वचालित अपडेट कॉन्फ़िगर करें ताकि आपके पास हमेशा नवीनतम सुविधाएं और बग फिक्स हों।",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Kesalahan",
|
"error_title": "Kesalahan",
|
||||||
"failed_save_settings": "Gagal menyimpan pengaturan pembaruan otomatis.",
|
"failed_save_settings": "Gagal menyimpan pengaturan pembaruan otomatis.",
|
||||||
"error_saving_settings": "Kesalahan menyimpan pengaturan pembaruan otomatis: {error}",
|
"error_saving_settings": "Kesalahan menyimpan pengaturan pembaruan otomatis: {error}",
|
||||||
|
"ytdlp_channel": "Saluran Rilis yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Stabil (Rilis yang diuji)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Pembaruan harian, direkomendasikan oleh yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Pilih antara rilis stabil dan nightly. Build nightly diperbarui setiap hari dengan perbaikan dan fitur terbaru. Anda dapat berganti saluran kapan saja.",
|
||||||
|
"ytdlp_switching_channel": "Beralih ke saluran {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ Berhasil beralih ke saluran {channel}!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Gagal beralih saluran: {error}",
|
||||||
|
"ytdlp_current_channel": "Saluran saat ini: {channel}",
|
||||||
"auto_update_title": "Pengaturan pembaruan otomatis",
|
"auto_update_title": "Pengaturan pembaruan otomatis",
|
||||||
"auto_update_header": "🔄 Pengaturan pembaruan otomatis",
|
"auto_update_header": "🔄 Pengaturan pembaruan otomatis",
|
||||||
"auto_update_description": "Konfigurasi pembaruan otomatis untuk yt-dlp untuk memastikan Anda selalu memiliki fitur dan perbaikan bug terbaru.",
|
"auto_update_description": "Konfigurasi pembaruan otomatis untuk yt-dlp untuk memastikan Anda selalu memiliki fitur dan perbaikan bug terbaru.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Errore",
|
"error_title": "Errore",
|
||||||
"failed_save_settings": "Impossibile salvare le impostazioni di aggiornamento automatico.",
|
"failed_save_settings": "Impossibile salvare le impostazioni di aggiornamento automatico.",
|
||||||
"error_saving_settings": "Errore nel salvataggio delle impostazioni di aggiornamento automatico: {error}",
|
"error_saving_settings": "Errore nel salvataggio delle impostazioni di aggiornamento automatico: {error}",
|
||||||
|
"ytdlp_channel": "Canale di rilascio yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Stabile (Rilasci testati)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Aggiornamenti giornalieri, consigliato da yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Scegli tra rilasci stabili e nightly. Le build nightly vengono aggiornate quotidianamente con le ultime correzioni e funzionalità. Puoi cambiare canale in qualsiasi momento.",
|
||||||
|
"ytdlp_switching_channel": "Passaggio al canale {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ Passaggio al canale {channel} riuscito!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Impossibile cambiare canale: {error}",
|
||||||
|
"ytdlp_current_channel": "Canale attuale: {channel}",
|
||||||
"auto_update_title": "Impostazioni aggiornamenti automatici",
|
"auto_update_title": "Impostazioni aggiornamenti automatici",
|
||||||
"auto_update_header": "🔄 Impostazioni aggiornamenti automatici",
|
"auto_update_header": "🔄 Impostazioni aggiornamenti automatici",
|
||||||
"auto_update_description": "Configura gli aggiornamenti automatici per yt-dlp per garantire le ultime funzionalità e correzioni bug.",
|
"auto_update_description": "Configura gli aggiornamenti automatici per yt-dlp per garantire le ultime funzionalità e correzioni bug.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "エラー",
|
"error_title": "エラー",
|
||||||
"failed_save_settings": "自動更新設定の保存に失敗しました。",
|
"failed_save_settings": "自動更新設定の保存に失敗しました。",
|
||||||
"error_saving_settings": "自動更新設定の保存エラー: {error}",
|
"error_saving_settings": "自動更新設定の保存エラー: {error}",
|
||||||
|
"ytdlp_channel": "yt-dlp リリースチャンネル",
|
||||||
|
"ytdlp_channel_stable": "安定版(テスト済みリリース)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly(毎日更新、yt-dlp推奨)",
|
||||||
|
"ytdlp_channel_description": "安定版とNightlyリリースのどちらかを選択してください。Nightlyビルドは最新の修正と機能で毎日更新されます。いつでもチャンネルを切り替えることができます。",
|
||||||
|
"ytdlp_switching_channel": "{channel}チャンネルに切り替え中...",
|
||||||
|
"ytdlp_channel_switched": "✅ {channel}チャンネルへの切り替えに成功しました!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ チャンネルの切り替えに失敗しました: {error}",
|
||||||
|
"ytdlp_current_channel": "現在のチャンネル: {channel}",
|
||||||
"auto_update_title": "自動更新設定",
|
"auto_update_title": "自動更新設定",
|
||||||
"auto_update_header": "🔄 自動更新設定",
|
"auto_update_header": "🔄 自動更新設定",
|
||||||
"auto_update_description": "yt-dlpの自動更新を設定して、最新の機能とバグ修正を確実に入手してください。",
|
"auto_update_description": "yt-dlpの自動更新を設定して、最新の機能とバグ修正を確実に入手してください。",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Błąd",
|
"error_title": "Błąd",
|
||||||
"failed_save_settings": "Nie udało się zapisać ustawień automatycznych aktualizacji.",
|
"failed_save_settings": "Nie udało się zapisać ustawień automatycznych aktualizacji.",
|
||||||
"error_saving_settings": "Błąd zapisywania ustawień automatycznych aktualizacji: {error}",
|
"error_saving_settings": "Błąd zapisywania ustawień automatycznych aktualizacji: {error}",
|
||||||
|
"ytdlp_channel": "Kanał wydań yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Stabilny (Przetestowane wydania)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Codzienne aktualizacje, zalecane przez yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Wybierz między wydaniami stabilnymi a nightly. Buildy nightly są aktualizowane codziennie z najnowszymi poprawkami i funkcjami. Możesz zmienić kanał w dowolnym momencie.",
|
||||||
|
"ytdlp_switching_channel": "Przełączanie na kanał {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ Pomyślnie przełączono na kanał {channel}!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Nie udało się przełączyć kanału: {error}",
|
||||||
|
"ytdlp_current_channel": "Aktualny kanał: {channel}",
|
||||||
"auto_update_title": "Ustawienia automatycznych aktualizacji",
|
"auto_update_title": "Ustawienia automatycznych aktualizacji",
|
||||||
"auto_update_header": "🔄 Ustawienia automatycznych aktualizacji",
|
"auto_update_header": "🔄 Ustawienia automatycznych aktualizacji",
|
||||||
"auto_update_description": "Skonfiguruj automatyczne aktualizacje dla yt-dlp, aby zapewnić najnowsze funkcje i poprawki błędów.",
|
"auto_update_description": "Skonfiguruj automatyczne aktualizacje dla yt-dlp, aby zapewnić najnowsze funkcje i poprawki błędów.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Erro",
|
"error_title": "Erro",
|
||||||
"failed_save_settings": "Falha ao salvar configurações de auto-atualização.",
|
"failed_save_settings": "Falha ao salvar configurações de auto-atualização.",
|
||||||
"error_saving_settings": "Erro ao salvar configurações de auto-atualização: {error}",
|
"error_saving_settings": "Erro ao salvar configurações de auto-atualização: {error}",
|
||||||
|
"ytdlp_channel": "Canal de Lançamento do yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Estável (Lançamentos testados)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Atualizações diárias, recomendado pelo yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Escolha entre lançamentos estáveis e nightly. Builds nightly são atualizadas diariamente com as últimas correções e recursos. Você pode trocar de canal a qualquer momento.",
|
||||||
|
"ytdlp_switching_channel": "Mudando para o canal {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ Mudado com sucesso para o canal {channel}!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Falha ao trocar de canal: {error}",
|
||||||
|
"ytdlp_current_channel": "Canal atual: {channel}",
|
||||||
"auto_update_title": "Configurações de Auto-Atualização",
|
"auto_update_title": "Configurações de Auto-Atualização",
|
||||||
"auto_update_header": "🔄 Configurações de Auto-Atualização",
|
"auto_update_header": "🔄 Configurações de Auto-Atualização",
|
||||||
"auto_update_description": "Configure atualizações automáticas para o yt-dlp para garantir que você sempre tenha os recursos mais recentes e correções de bugs.",
|
"auto_update_description": "Configure atualizações automáticas para o yt-dlp para garantir que você sempre tenha os recursos mais recentes e correções de bugs.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Ошибка",
|
"error_title": "Ошибка",
|
||||||
"failed_save_settings": "Не удалось сохранить настройки автообновления.",
|
"failed_save_settings": "Не удалось сохранить настройки автообновления.",
|
||||||
"error_saving_settings": "Ошибка сохранения настроек автообновления: {error}",
|
"error_saving_settings": "Ошибка сохранения настроек автообновления: {error}",
|
||||||
|
"ytdlp_channel": "Канал выпуска yt-dlp",
|
||||||
|
"ytdlp_channel_stable": "Стабильный (Протестированные релизы)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Ежедневные обновления, рекомендовано yt-dlp)",
|
||||||
|
"ytdlp_channel_description": "Выберите между стабильными и nightly релизами. Nightly сборки обновляются ежедневно с последними исправлениями и функциями. Вы можете переключать каналы в любое время.",
|
||||||
|
"ytdlp_switching_channel": "Переключение на канал {channel}...",
|
||||||
|
"ytdlp_channel_switched": "✅ Успешно переключено на канал {channel}!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Не удалось переключить канал: {error}",
|
||||||
|
"ytdlp_current_channel": "Текущий канал: {channel}",
|
||||||
"auto_update_title": "Настройки автообновления",
|
"auto_update_title": "Настройки автообновления",
|
||||||
"auto_update_header": "🔄 Настройки автообновления",
|
"auto_update_header": "🔄 Настройки автообновления",
|
||||||
"auto_update_description": "Настройте автоматические обновления для yt-dlp, чтобы всегда иметь последние функции и исправления ошибок.",
|
"auto_update_description": "Настройте автоматические обновления для yt-dlp, чтобы всегда иметь последние функции и исправления ошибок.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "Hata",
|
"error_title": "Hata",
|
||||||
"failed_save_settings": "Otomatik güncelleme ayarları kaydedilemedi.",
|
"failed_save_settings": "Otomatik güncelleme ayarları kaydedilemedi.",
|
||||||
"error_saving_settings": "Otomatik güncelleme ayarları kaydetme hatası: {error}",
|
"error_saving_settings": "Otomatik güncelleme ayarları kaydetme hatası: {error}",
|
||||||
|
"ytdlp_channel": "yt-dlp Sürüm Kanalı",
|
||||||
|
"ytdlp_channel_stable": "Kararlı (Test edilmiş sürümler)",
|
||||||
|
"ytdlp_channel_nightly": "Nightly (Günlük güncellemeler, yt-dlp tarafından önerilir)",
|
||||||
|
"ytdlp_channel_description": "Kararlı ve nightly sürümler arasında seçim yapın. Nightly derlemeleri en son düzeltmeler ve özelliklerle günlük olarak güncellenir. İstediğiniz zaman kanal değiştirebilirsiniz.",
|
||||||
|
"ytdlp_switching_channel": "{channel} kanalına geçiliyor...",
|
||||||
|
"ytdlp_channel_switched": "✅ Başarıyla {channel} kanalına geçildi!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ Kanal değiştirilemedi: {error}",
|
||||||
|
"ytdlp_current_channel": "Mevcut kanal: {channel}",
|
||||||
"auto_update_title": "Otomatik güncelleme ayarları",
|
"auto_update_title": "Otomatik güncelleme ayarları",
|
||||||
"auto_update_header": "🔄 Otomatik güncelleme ayarları",
|
"auto_update_header": "🔄 Otomatik güncelleme ayarları",
|
||||||
"auto_update_description": "En son özelliklere ve hata düzeltmelerine sahip olmak için yt-dlp otomatik güncellemelerini yapılandırın.",
|
"auto_update_description": "En son özelliklere ve hata düzeltmelerine sahip olmak için yt-dlp otomatik güncellemelerini yapılandırın.",
|
||||||
|
|||||||
@@ -267,6 +267,14 @@
|
|||||||
"error_title": "错误",
|
"error_title": "错误",
|
||||||
"failed_save_settings": "保存自动更新设置失败。",
|
"failed_save_settings": "保存自动更新设置失败。",
|
||||||
"error_saving_settings": "保存自动更新设置时出错:{error}",
|
"error_saving_settings": "保存自动更新设置时出错:{error}",
|
||||||
|
"ytdlp_channel": "yt-dlp 发布渠道",
|
||||||
|
"ytdlp_channel_stable": "稳定版(经过测试的版本)",
|
||||||
|
"ytdlp_channel_nightly": "夜间版(每日更新,yt-dlp 推荐)",
|
||||||
|
"ytdlp_channel_description": "在稳定版和夜间版之间选择。夜间构建版每天更新,包含最新修复和功能。您可以随时切换渠道。",
|
||||||
|
"ytdlp_switching_channel": "正在切换到 {channel} 渠道...",
|
||||||
|
"ytdlp_channel_switched": "✅ 成功切换到 {channel} 渠道!",
|
||||||
|
"ytdlp_channel_switch_failed": "❌ 切换渠道失败:{error}",
|
||||||
|
"ytdlp_current_channel": "当前渠道:{channel}",
|
||||||
"auto_update_title": "自动更新设置",
|
"auto_update_title": "自动更新设置",
|
||||||
"auto_update_header": "🔄 自动更新设置",
|
"auto_update_header": "🔄 自动更新设置",
|
||||||
"auto_update_description": "为 yt-dlp 配置自动更新,以确保您始终拥有最新功能和错误修复。",
|
"auto_update_description": "为 yt-dlp 配置自动更新,以确保您始终拥有最新功能和错误修复。",
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ Updater tab for Custom Options dialog.
|
|||||||
Handles checking for and installing FFmpeg updates and yt-dlp auto-update settings.
|
Handles checking for and installing FFmpeg updates and yt-dlp auto-update settings.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import subprocess
|
||||||
import threading
|
import threading
|
||||||
from typing import TYPE_CHECKING, cast
|
from typing import TYPE_CHECKING, cast
|
||||||
|
|
||||||
@@ -15,6 +16,7 @@ from PySide6.QtWidgets import (
|
|||||||
QProgressBar,
|
QProgressBar,
|
||||||
QPushButton,
|
QPushButton,
|
||||||
QRadioButton,
|
QRadioButton,
|
||||||
|
QScrollArea,
|
||||||
QTextEdit,
|
QTextEdit,
|
||||||
QVBoxLayout,
|
QVBoxLayout,
|
||||||
QWidget,
|
QWidget,
|
||||||
@@ -24,10 +26,13 @@ from src.core.ytsage_utils import (
|
|||||||
get_auto_update_settings,
|
get_auto_update_settings,
|
||||||
update_auto_update_settings,
|
update_auto_update_settings,
|
||||||
)
|
)
|
||||||
|
from src.core.ytsage_yt_dlp import get_yt_dlp_path
|
||||||
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_update import YTDLPUpdateDialog
|
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_update import YTDLPUpdateDialog
|
||||||
|
from src.utils.ytsage_config_manager import ConfigManager
|
||||||
from src.utils.ytsage_localization import _
|
from src.utils.ytsage_localization import _
|
||||||
from src.utils.ytsage_logger import logger
|
from src.utils.ytsage_logger import logger
|
||||||
from src.core.ytsage_ffmpeg_updater import check_ffmpeg_update_available, update_ffmpeg
|
from src.core.ytsage_ffmpeg_updater import check_ffmpeg_update_available, update_ffmpeg
|
||||||
|
from src.utils.ytsage_constants import OS_NAME, SUBPROCESS_CREATIONFLAGS
|
||||||
from src.utils.ytsage_constants import OS_NAME
|
from src.utils.ytsage_constants import OS_NAME
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -77,7 +82,19 @@ class UpdaterTabWidget(QWidget):
|
|||||||
|
|
||||||
def _init_ui(self) -> None:
|
def _init_ui(self) -> None:
|
||||||
"""Initialize the UI components."""
|
"""Initialize the UI components."""
|
||||||
layout = QVBoxLayout(self)
|
# Main layout for the tab
|
||||||
|
main_layout = QVBoxLayout(self)
|
||||||
|
main_layout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
|
# Create scroll area
|
||||||
|
scroll_area = QScrollArea()
|
||||||
|
scroll_area.setWidgetResizable(True)
|
||||||
|
scroll_area.setFrameShape(QScrollArea.Shape.NoFrame)
|
||||||
|
scroll_area.setStyleSheet("QScrollArea { background: transparent; }")
|
||||||
|
|
||||||
|
# Create a widget to hold all content
|
||||||
|
content_widget = QWidget()
|
||||||
|
layout = QVBoxLayout(content_widget)
|
||||||
|
|
||||||
# Help text
|
# Help text
|
||||||
help_text = QLabel(_('ffmpeg_updater.description'))
|
help_text = QLabel(_('ffmpeg_updater.description'))
|
||||||
@@ -209,14 +226,14 @@ class UpdaterTabWidget(QWidget):
|
|||||||
|
|
||||||
# Log output
|
# Log output
|
||||||
log_label = QLabel("Update Log:")
|
log_label = QLabel("Update Log:")
|
||||||
log_label.setStyleSheet("font-size: 12px; font-weight: bold; color: #ffffff; margin-top: 10px;")
|
log_label.setStyleSheet("font-size: 11px; font-weight: bold; color: #ffffff; margin-top: 5px;")
|
||||||
ffmpeg_layout.addWidget(log_label)
|
ffmpeg_layout.addWidget(log_label)
|
||||||
|
|
||||||
self.log_output = QTextEdit()
|
self.log_output = QTextEdit()
|
||||||
self.log_output.setReadOnly(True)
|
self.log_output.setReadOnly(True)
|
||||||
self.log_output.setPlaceholderText("Update logs will appear here...")
|
self.log_output.setPlaceholderText("Update logs will appear here...")
|
||||||
self.log_output.setMinimumHeight(80)
|
self.log_output.setMinimumHeight(60)
|
||||||
self.log_output.setMaximumHeight(120)
|
self.log_output.setMaximumHeight(100)
|
||||||
self.log_output.setStyleSheet(
|
self.log_output.setStyleSheet(
|
||||||
"""
|
"""
|
||||||
QTextEdit {
|
QTextEdit {
|
||||||
@@ -234,6 +251,65 @@ class UpdaterTabWidget(QWidget):
|
|||||||
|
|
||||||
layout.addWidget(ffmpeg_group)
|
layout.addWidget(ffmpeg_group)
|
||||||
|
|
||||||
|
# === yt-dlp Release Channel Section ===
|
||||||
|
ytdlp_channel_group = QGroupBox(_("settings.ytdlp_channel"))
|
||||||
|
ytdlp_channel_layout = QVBoxLayout()
|
||||||
|
ytdlp_channel_layout.setSpacing(5) # Reduce spacing
|
||||||
|
ytdlp_channel_layout.setContentsMargins(10, 10, 10, 10) # Reduce margins
|
||||||
|
|
||||||
|
# Description
|
||||||
|
channel_desc = QLabel(_("settings.ytdlp_channel_description"))
|
||||||
|
channel_desc.setWordWrap(True)
|
||||||
|
channel_desc.setStyleSheet("color: #cccccc; font-size: 11px; padding: 2px;")
|
||||||
|
ytdlp_channel_layout.addWidget(channel_desc)
|
||||||
|
|
||||||
|
# Radio buttons for channel selection
|
||||||
|
self.channel_stable_radio = QRadioButton(_("settings.ytdlp_channel_stable"))
|
||||||
|
self.channel_nightly_radio = QRadioButton(_("settings.ytdlp_channel_nightly"))
|
||||||
|
|
||||||
|
radio_button_style = """
|
||||||
|
QRadioButton {
|
||||||
|
color: #ffffff;
|
||||||
|
spacing: 5px;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
QRadioButton::indicator {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
QRadioButton::indicator:unchecked {
|
||||||
|
border: 2px solid #666666;
|
||||||
|
background: #15181b;
|
||||||
|
}
|
||||||
|
QRadioButton::indicator:checked {
|
||||||
|
border: 2px solid #c90000;
|
||||||
|
background: #c90000;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
self.channel_stable_radio.setStyleSheet(radio_button_style)
|
||||||
|
self.channel_nightly_radio.setStyleSheet(radio_button_style)
|
||||||
|
|
||||||
|
# Connect radio button signals
|
||||||
|
self.channel_stable_radio.toggled.connect(self._on_channel_changed)
|
||||||
|
self.channel_nightly_radio.toggled.connect(self._on_channel_changed)
|
||||||
|
|
||||||
|
ytdlp_channel_layout.addWidget(self.channel_stable_radio)
|
||||||
|
ytdlp_channel_layout.addWidget(self.channel_nightly_radio)
|
||||||
|
|
||||||
|
# Status label for channel operations
|
||||||
|
self.channel_status_label = QLabel("")
|
||||||
|
self.channel_status_label.setWordWrap(True)
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #888888; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
self.channel_status_label.setVisible(False)
|
||||||
|
ytdlp_channel_layout.addWidget(self.channel_status_label)
|
||||||
|
|
||||||
|
ytdlp_channel_group.setLayout(ytdlp_channel_layout)
|
||||||
|
layout.addWidget(ytdlp_channel_group)
|
||||||
|
|
||||||
# === Auto-Update yt-dlp Section ===
|
# === Auto-Update yt-dlp Section ===
|
||||||
auto_update_group_box = QGroupBox(_("settings.auto_update_ytdlp"))
|
auto_update_group_box = QGroupBox(_("settings.auto_update_ytdlp"))
|
||||||
auto_update_layout = QVBoxLayout()
|
auto_update_layout = QVBoxLayout()
|
||||||
@@ -310,6 +386,12 @@ class UpdaterTabWidget(QWidget):
|
|||||||
layout.addWidget(auto_update_group_box)
|
layout.addWidget(auto_update_group_box)
|
||||||
|
|
||||||
layout.addStretch()
|
layout.addStretch()
|
||||||
|
|
||||||
|
# Set the content widget to the scroll area
|
||||||
|
scroll_area.setWidget(content_widget)
|
||||||
|
|
||||||
|
# Add scroll area to main layout
|
||||||
|
main_layout.addWidget(scroll_area)
|
||||||
|
|
||||||
def _load_auto_update_settings(self) -> None:
|
def _load_auto_update_settings(self) -> None:
|
||||||
"""Load current auto-update settings for yt-dlp."""
|
"""Load current auto-update settings for yt-dlp."""
|
||||||
@@ -327,6 +409,20 @@ class UpdaterTabWidget(QWidget):
|
|||||||
self.daily_radio.setChecked(True)
|
self.daily_radio.setChecked(True)
|
||||||
else: # weekly
|
else: # weekly
|
||||||
self.weekly_radio.setChecked(True)
|
self.weekly_radio.setChecked(True)
|
||||||
|
|
||||||
|
# Load channel setting
|
||||||
|
channel = ConfigManager.get("ytdlp_channel")
|
||||||
|
if channel is None:
|
||||||
|
channel = "stable" # Default to stable if not set
|
||||||
|
|
||||||
|
if channel == "nightly":
|
||||||
|
self.channel_nightly_radio.setChecked(True)
|
||||||
|
else:
|
||||||
|
self.channel_stable_radio.setChecked(True)
|
||||||
|
|
||||||
|
# Update status label
|
||||||
|
self._update_channel_status(channel)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(f"Error loading auto-update settings: {e}")
|
logger.exception(f"Error loading auto-update settings: {e}")
|
||||||
|
|
||||||
@@ -343,6 +439,155 @@ class UpdaterTabWidget(QWidget):
|
|||||||
|
|
||||||
return enabled, frequency
|
return enabled, frequency
|
||||||
|
|
||||||
|
def _on_channel_changed(self, checked: bool) -> None:
|
||||||
|
"""Handle channel selection change."""
|
||||||
|
if not checked:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Determine which channel was selected
|
||||||
|
new_channel = "nightly" if self.channel_nightly_radio.isChecked() else "stable"
|
||||||
|
current_channel = ConfigManager.get("ytdlp_channel")
|
||||||
|
if current_channel is None:
|
||||||
|
current_channel = "stable"
|
||||||
|
|
||||||
|
# If channel hasn't actually changed, just update status
|
||||||
|
if new_channel == current_channel:
|
||||||
|
self._update_channel_status(new_channel)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Show switching message
|
||||||
|
self.channel_status_label.setText(_("settings.ytdlp_switching_channel", channel=new_channel))
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #ffaa00; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
self.channel_status_label.setVisible(True)
|
||||||
|
|
||||||
|
# Disable radio buttons during switch
|
||||||
|
self.channel_stable_radio.setEnabled(False)
|
||||||
|
self.channel_nightly_radio.setEnabled(False)
|
||||||
|
|
||||||
|
# Run channel switch in background thread
|
||||||
|
def switch_channel():
|
||||||
|
try:
|
||||||
|
# Get yt-dlp path
|
||||||
|
yt_dlp_path = get_yt_dlp_path()
|
||||||
|
|
||||||
|
# Build the update command
|
||||||
|
# When switching to stable from nightly, we need to get the latest stable version
|
||||||
|
# to force the switch even if versions have the same date
|
||||||
|
update_target = new_channel
|
||||||
|
|
||||||
|
if new_channel == "stable" and current_channel == "nightly":
|
||||||
|
# Get the latest stable version tag
|
||||||
|
logger.info("Fetching latest stable version tag...")
|
||||||
|
try:
|
||||||
|
import requests
|
||||||
|
response = requests.get("https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest", timeout=10)
|
||||||
|
response.raise_for_status()
|
||||||
|
latest_tag = response.json().get("tag_name", "")
|
||||||
|
if latest_tag:
|
||||||
|
update_target = f"stable@{latest_tag}"
|
||||||
|
logger.info(f"Latest stable version tag: {latest_tag}")
|
||||||
|
else:
|
||||||
|
logger.warning("Could not determine latest stable tag, using 'stable'")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to fetch latest stable tag, using 'stable': {e}")
|
||||||
|
|
||||||
|
# Run the update-to command
|
||||||
|
logger.info(f"Switching yt-dlp to {new_channel} channel...")
|
||||||
|
logger.debug(f"Running command: {yt_dlp_path} --update-to {update_target}")
|
||||||
|
result = subprocess.run(
|
||||||
|
[yt_dlp_path, "--update-to", update_target],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=120,
|
||||||
|
creationflags=SUBPROCESS_CREATIONFLAGS,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Log the output for debugging
|
||||||
|
if result.stdout:
|
||||||
|
logger.debug(f"yt-dlp stdout: {result.stdout.strip()}")
|
||||||
|
if result.stderr:
|
||||||
|
logger.debug(f"yt-dlp stderr: {result.stderr.strip()}")
|
||||||
|
logger.debug(f"yt-dlp return code: {result.returncode}")
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
# Success - save the preference
|
||||||
|
ConfigManager.set("ytdlp_channel", new_channel)
|
||||||
|
logger.info(f"Successfully switched to {new_channel} channel")
|
||||||
|
|
||||||
|
# Update UI
|
||||||
|
self.channel_status_label.setText(_("settings.ytdlp_channel_switched", channel=new_channel))
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #00cc00; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make executable on Unix systems
|
||||||
|
if OS_NAME != "Windows":
|
||||||
|
import os
|
||||||
|
os.chmod(yt_dlp_path, 0o755)
|
||||||
|
else:
|
||||||
|
# Failed - revert radio button
|
||||||
|
error_msg = result.stderr.strip() if result.stderr else result.stdout.strip() if result.stdout else "Unknown error"
|
||||||
|
logger.error(f"Failed to switch channel: {error_msg}")
|
||||||
|
|
||||||
|
self.channel_status_label.setText(_("settings.ytdlp_channel_switch_failed", error=error_msg))
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #ff6666; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Revert radio selection
|
||||||
|
if current_channel == "nightly":
|
||||||
|
self.channel_nightly_radio.setChecked(True)
|
||||||
|
else:
|
||||||
|
self.channel_stable_radio.setChecked(True)
|
||||||
|
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
logger.error("Channel switch timed out")
|
||||||
|
self.channel_status_label.setText(_("settings.ytdlp_channel_switch_failed", error="Timeout"))
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #ff6666; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
# Revert radio selection
|
||||||
|
if current_channel == "nightly":
|
||||||
|
self.channel_nightly_radio.setChecked(True)
|
||||||
|
else:
|
||||||
|
self.channel_stable_radio.setChecked(True)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(f"Error switching channel: {e}")
|
||||||
|
self.channel_status_label.setText(_("settings.ytdlp_channel_switch_failed", error=str(e)))
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #ff6666; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
# Revert radio selection
|
||||||
|
if current_channel == "nightly":
|
||||||
|
self.channel_nightly_radio.setChecked(True)
|
||||||
|
else:
|
||||||
|
self.channel_stable_radio.setChecked(True)
|
||||||
|
finally:
|
||||||
|
# Re-enable radio buttons
|
||||||
|
self.channel_stable_radio.setEnabled(True)
|
||||||
|
self.channel_nightly_radio.setEnabled(True)
|
||||||
|
|
||||||
|
# Start the thread
|
||||||
|
thread = threading.Thread(target=switch_channel, daemon=True)
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
def _update_channel_status(self, channel: str) -> None:
|
||||||
|
"""Update the channel status label."""
|
||||||
|
self.channel_status_label.setText(_("settings.ytdlp_current_channel", channel=channel))
|
||||||
|
self.channel_status_label.setStyleSheet(
|
||||||
|
"color: #888888; font-size: 11px; padding: 5px; "
|
||||||
|
"background-color: #2a2d36; border-radius: 4px; margin: 5px 0;"
|
||||||
|
)
|
||||||
|
self.channel_status_label.setVisible(True)
|
||||||
|
|
||||||
def test_update_check(self) -> None:
|
def test_update_check(self) -> None:
|
||||||
"""Open the yt-dlp update dialog with proper progress tracking."""
|
"""Open the yt-dlp update dialog with proper progress tracking."""
|
||||||
# Create and show the update dialog (non-modal to prevent blocking)
|
# Create and show the update dialog (non-modal to prevent blocking)
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ class ConfigManager:
|
|||||||
"auto_update_frequency": "daily",
|
"auto_update_frequency": "daily",
|
||||||
"last_update_check": 0,
|
"last_update_check": 0,
|
||||||
"language": "en",
|
"language": "en",
|
||||||
|
"ytdlp_channel": "stable",
|
||||||
"force_output_format": False,
|
"force_output_format": False,
|
||||||
"preferred_output_format": "mp4",
|
"preferred_output_format": "mp4",
|
||||||
"cached_versions": {
|
"cached_versions": {
|
||||||
|
|||||||
Reference in New Issue
Block a user