diff --git a/languages/ar.json b/languages/ar.json index 443a344..05c6df1 100644 --- a/languages/ar.json +++ b/languages/ar.json @@ -398,5 +398,27 @@ "next_check_error": "الفحص التالي: خطأ في الحساب", "checking": "🔄 جاري الفحص...", "check_now": "🔍 التحقق من التحديثات الآن" + }, + "url_validation": { + "empty_url": "لا يمكن أن يكون الرابط فارغًا", + "invalid_format": "تنسيق الرابط غير صالح", + "invalid_scheme": "يجب أن يبدأ الرابط بـ http:// أو https://", + "missing_domain": "رابط غير صالح: اسم النطاق مفقود", + "unsupported_platform": "YTSage يدعم فقط روابط YouTube و YouTube Music.\nالنطاق '{domain}' غير مدعوم.", + "invalid_youtu_be": "رابط youtu.be غير صالح: معرف الفيديو مفقود" + }, + "ytdlp_errors": { + "private_video": "هذا فيديو خاص. يمكنك تنزيله عن طريق تسجيل الدخول إلى حسابك باستخدام ملفات تعريف الارتباط.\nانتقل إلى 'خيارات مخصصة' ← 'تسجيل الدخول باستخدام ملفات تعريف الارتباط' ← 'استخراج ملفات تعريف الارتباط من المتصفح' للمصادقة.", + "age_restricted": "هذا الفيديو مقيد بالعمر. تحتاج إلى تسجيل الدخول للوصول إليه.\nاستخدم 'خيارات مخصصة' ← 'تسجيل الدخول باستخدام ملفات تعريف الارتباط' للمصادقة بحسابك.", + "geo_blocked": "هذا الفيديو غير متاح في منطقتك (محظور جغرافيًا).\nقد تحتاج إلى استخدام VPN أو قد يكون الفيديو مقيدًا في بلدك.", + "video_unavailable": "تمت إزالة هذا الفيديو أو لم يعد متاحًا.\nربما تم حذف الفيديو بواسطة المُحمِّل أو إزالته بسبب انتهاك السياسات.", + "live_stream": "هذا بث مباشر لا يمكن تنزيله أثناء نشاطه.\nانتظر حتى ينتهي البث، ثم حاول تنزيل النسخة المؤرشفة.", + "playlist_error": "تعذر الوصول إلى قائمة التشغيل هذه. قد تكون خاصة أو محذوفة أو فارغة.\nتحقق من وجود قائمة التشغيل وأنها متاحة للعامة.", + "network_error": "خطأ في الاتصال بالشبكة. يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى.\nإذا استمرت المشكلة، فقد يكون خادم الفيديو غير متاح مؤقتًا.", + "invalid_url": "رابط غير صالح أو غير مدعوم. يرجى التحقق من الرابط والمحاولة مرة أخرى.\nتأكد من استخدام رابط صالح لـ YouTube أو Vimeo أو منصة مدعومة أخرى.", + "premium_content": "يتطلب هذا المحتوى YouTube Premium أو عضوية القناة.\nتحتاج إلى تسجيل الدخول بحساب لديه حق الوصول إلى هذا المحتوى.", + "copyright_blocked": "هذا الفيديو محظور بسبب مطالبات حقوق النشر.\nصاحب المحتوى قيد الوصول إلى هذا الفيديو.", + "extraction_failed": "فشل استخراج معلومات الفيديو. قد تكون هذه مشكلة مؤقتة.\nيرجى المحاولة مرة أخرى بعد بضع دقائق، أو تحقق من صحة رابط الفيديو.", + "generic_error": "تعذر استخراج معلومات الفيديو. يرجى التحقق من الرابط الخاص بك.\nالتفاصيل التقنية: {error}" } } \ No newline at end of file diff --git a/languages/de.json b/languages/de.json index 541c679..a857017 100644 --- a/languages/de.json +++ b/languages/de.json @@ -398,5 +398,27 @@ "next_check_error": "Nächste Prüfung: Fehler bei Berechnung", "checking": "🔄 Prüfen...", "check_now": "🔍 Jetzt nach Updates suchen" + }, + "url_validation": { + "empty_url": "URL kann nicht leer sein", + "invalid_format": "Ungültiges URL-Format", + "invalid_scheme": "URL muss mit http:// oder https:// beginnen", + "missing_domain": "Ungültige URL: Domain-Name fehlt", + "unsupported_platform": "YTSage unterstützt nur YouTube- und YouTube Music-URLs.\nDie Domain '{domain}' wird nicht unterstützt.", + "invalid_youtu_be": "Ungültige youtu.be-URL: Video-ID fehlt" + }, + "ytdlp_errors": { + "private_video": "Dies ist ein privates Video. Sie können es herunterladen, indem Sie sich mit Cookies in Ihr Konto einloggen.\nGehen Sie zu 'Benutzerdefinierte Optionen' → 'Mit Cookies anmelden' → 'Cookies aus Browser extrahieren', um sich zu authentifizieren.", + "age_restricted": "Dieses Video ist altersbeschränkt. Sie müssen angemeldet sein, um darauf zuzugreifen.\nVerwenden Sie 'Benutzerdefinierte Optionen' → 'Mit Cookies anmelden', um sich mit Ihrem Konto zu authentifizieren.", + "geo_blocked": "Dieses Video ist in Ihrer Region nicht verfügbar (geografisch gesperrt).\nSie benötigen möglicherweise ein VPN oder das Video ist in Ihrem Land eingeschränkt.", + "video_unavailable": "Dieses Video wurde entfernt oder ist nicht mehr verfügbar.\nDas Video wurde möglicherweise vom Uploader gelöscht oder wegen Richtlinienverstößen entfernt.", + "live_stream": "Dies ist ein Live-Stream, der während der Aktivität nicht heruntergeladen werden kann.\nWarten Sie, bis der Stream endet, und versuchen Sie dann, die archivierte Version herunterzuladen.", + "playlist_error": "Zugriff auf diese Playlist nicht möglich. Sie ist möglicherweise privat, gelöscht oder leer.\nÜberprüfen Sie, ob die Playlist existiert und öffentlich zugänglich ist.", + "network_error": "Netzwerkverbindungsfehler. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.\nWenn das Problem weiterhin besteht, ist der Videoserver möglicherweise vorübergehend nicht verfügbar.", + "invalid_url": "Ungültige oder nicht unterstützte URL. Bitte überprüfen Sie den Link und versuchen Sie es erneut.\nStellen Sie sicher, dass Sie eine gültige YouTube-, Vimeo- oder andere unterstützte Plattform-URL verwenden.", + "premium_content": "Dieser Inhalt erfordert YouTube Premium oder eine Kanalmitgliedschaft.\nSie müssen mit einem Konto angemeldet sein, das Zugriff auf diesen Inhalt hat.", + "copyright_blocked": "Dieses Video ist aufgrund von Urheberrechtsansprüchen gesperrt.\nDer Inhaltsinhaber hat den Zugriff auf dieses Video eingeschränkt.", + "extraction_failed": "Fehler beim Extrahieren von Videoinformationen. Dies könnte ein vorübergehendes Problem sein.\nBitte versuchen Sie es in ein paar Minuten erneut oder überprüfen Sie, ob der Videolink korrekt ist.", + "generic_error": "Videoinformationen konnten nicht extrahiert werden. Bitte überprüfen Sie Ihren Link.\nTechnische Details: {error}" } } \ No newline at end of file diff --git a/languages/en.json b/languages/en.json index 9ca11c5..645750b 100644 --- a/languages/en.json +++ b/languages/en.json @@ -398,5 +398,27 @@ "next_check_error": "Next check: Error calculating", "checking": "🔄 Checking...", "check_now": "🔍 Check for Updates Now" + }, + "url_validation": { + "empty_url": "URL cannot be empty", + "invalid_format": "Invalid URL format", + "invalid_scheme": "URL must start with http:// or https://", + "missing_domain": "Invalid URL: missing domain name", + "unsupported_platform": "YTSage only supports YouTube and YouTube Music URLs.\nThe domain '{domain}' is not supported.", + "invalid_youtu_be": "Invalid youtu.be URL: missing video ID" + }, + "ytdlp_errors": { + "private_video": "This is a private video. You can download it by logging into your account using cookies.\nGo to 'Custom Options' → 'Login with Cookies' → 'Extract cookies from browser' to authenticate.", + "age_restricted": "This video is age-restricted. You need to be logged in to access it.\nUse 'Custom Options' → 'Login with Cookies' to authenticate with your account.", + "geo_blocked": "This video is not available in your region (geo-blocked).\nYou may need to use a VPN or the video might be restricted in your country.", + "video_unavailable": "This video has been removed or is no longer available.\nThe video may have been deleted by the uploader or removed due to policy violations.", + "live_stream": "This is a live stream that cannot be downloaded while active.\nWait for the stream to end, then try downloading the archived version.", + "playlist_error": "Unable to access this playlist. It may be private, deleted, or empty.\nCheck if the playlist exists and is publicly accessible.", + "network_error": "Network connection error. Please check your internet connection and try again.\nIf the problem persists, the video server might be temporarily unavailable.", + "invalid_url": "Invalid or unsupported URL. Please check the link and try again.\nMake sure you're using a valid YouTube, Vimeo, or other supported platform URL.", + "premium_content": "This content requires YouTube Premium or channel membership.\nYou need to be logged in with an account that has access to this content.", + "copyright_blocked": "This video is blocked due to copyright claims.\nThe content owner has restricted access to this video.", + "extraction_failed": "Failed to extract video information. This might be a temporary issue.\nPlease try again in a few minutes, or check if the video link is correct.", + "generic_error": "Could not extract video information. Please check your link.\nTechnical details: {error}" } } \ No newline at end of file diff --git a/languages/es.json b/languages/es.json index 44fea13..f7002fa 100644 --- a/languages/es.json +++ b/languages/es.json @@ -381,5 +381,27 @@ "next_check_error": "Próxima verificación: Error al calcular", "checking": "🔄 Verificando...", "check_now": "🔍 Verificar actualizaciones ahora" + }, + "url_validation": { + "empty_url": "La URL no puede estar vacía", + "invalid_format": "Formato de URL no válido", + "invalid_scheme": "La URL debe comenzar con http:// o https://", + "missing_domain": "URL no válida: falta el nombre de dominio", + "unsupported_platform": "YTSage solo admite URLs de YouTube y YouTube Music.\nEl dominio '{domain}' no es compatible.", + "invalid_youtu_be": "URL de youtu.be no válida: falta el ID del video" + }, + "ytdlp_errors": { + "private_video": "Este es un video privado. Puede descargarlo iniciando sesión en su cuenta usando cookies.\nVaya a 'Opciones Personalizadas' → 'Iniciar sesión con Cookies' → 'Extraer cookies del navegador' para autenticarse.", + "age_restricted": "Este video tiene restricción de edad. Debe iniciar sesión para acceder a él.\nUse 'Opciones Personalizadas' → 'Iniciar sesión con Cookies' para autenticarse con su cuenta.", + "geo_blocked": "Este video no está disponible en su región (bloqueado geográficamente).\nPuede necesitar usar una VPN o el video puede estar restringido en su país.", + "video_unavailable": "Este video ha sido eliminado o ya no está disponible.\nEl video puede haber sido eliminado por el usuario que lo subió o eliminado debido a violaciones de políticas.", + "live_stream": "Esta es una transmisión en vivo que no se puede descargar mientras está activa.\nEspere a que termine la transmisión y luego intente descargar la versión archivada.", + "playlist_error": "No se puede acceder a esta lista de reproducción. Puede ser privada, estar eliminada o vacía.\nVerifique si la lista de reproducción existe y es públicamente accesible.", + "network_error": "Error de conexión de red. Verifique su conexión a Internet e intente nuevamente.\nSi el problema persiste, el servidor de video puede no estar disponible temporalmente.", + "invalid_url": "URL no válida o no compatible. Verifique el enlace e intente nuevamente.\nAsegúrese de usar una URL válida de YouTube, Vimeo u otra plataforma compatible.", + "premium_content": "Este contenido requiere YouTube Premium o membresía del canal.\nDebe iniciar sesión con una cuenta que tenga acceso a este contenido.", + "copyright_blocked": "Este video está bloqueado debido a reclamaciones de derechos de autor.\nEl propietario del contenido ha restringido el acceso a este video.", + "extraction_failed": "Error al extraer información del video. Esto podría ser un problema temporal.\nIntente nuevamente en unos minutos o verifique si el enlace del video es correcto.", + "generic_error": "No se pudo extraer la información del video. Verifique su enlace.\nDetalles técnicos: {error}" } } \ No newline at end of file diff --git a/languages/fr.json b/languages/fr.json index f6411ef..e199be0 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -398,5 +398,27 @@ "next_check_error": "Prochaine vérification : Erreur de calcul", "checking": "🔄 Vérification...", "check_now": "🔍 Vérifier les mises à jour maintenant" + }, + "url_validation": { + "empty_url": "L'URL ne peut pas être vide", + "invalid_format": "Format d'URL invalide", + "invalid_scheme": "L'URL doit commencer par http:// ou https://", + "missing_domain": "URL invalide : nom de domaine manquant", + "unsupported_platform": "YTSage ne prend en charge que les URLs YouTube et YouTube Music.\nLe domaine '{domain}' n'est pas pris en charge.", + "invalid_youtu_be": "URL youtu.be invalide : ID de vidéo manquant" + }, + "ytdlp_errors": { + "private_video": "Ceci est une vidéo privée. Vous pouvez la télécharger en vous connectant à votre compte avec des cookies.\nAllez dans 'Options Personnalisées' → 'Se connecter avec des Cookies' → 'Extraire les cookies du navigateur' pour vous authentifier.", + "age_restricted": "Cette vidéo est soumise à une restriction d'âge. Vous devez être connecté pour y accéder.\nUtilisez 'Options Personnalisées' → 'Se connecter avec des Cookies' pour vous authentifier avec votre compte.", + "geo_blocked": "Cette vidéo n'est pas disponible dans votre région (géo-bloquée).\nVous pourriez avoir besoin d'utiliser un VPN ou la vidéo pourrait être restreinte dans votre pays.", + "video_unavailable": "Cette vidéo a été supprimée ou n'est plus disponible.\nLa vidéo a peut-être été supprimée par l'uploader ou retirée en raison de violations de politique.", + "live_stream": "Ceci est un flux en direct qui ne peut pas être téléchargé pendant qu'il est actif.\nAttendez la fin du flux, puis essayez de télécharger la version archivée.", + "playlist_error": "Impossible d'accéder à cette playlist. Elle peut être privée, supprimée ou vide.\nVérifiez si la playlist existe et est accessible publiquement.", + "network_error": "Erreur de connexion réseau. Veuillez vérifier votre connexion Internet et réessayer.\nSi le problème persiste, le serveur vidéo pourrait être temporairement indisponible.", + "invalid_url": "URL invalide ou non prise en charge. Veuillez vérifier le lien et réessayer.\nAssurez-vous d'utiliser une URL YouTube, Vimeo ou autre plateforme prise en charge valide.", + "premium_content": "Ce contenu nécessite YouTube Premium ou l'adhésion à la chaîne.\nVous devez être connecté avec un compte ayant accès à ce contenu.", + "copyright_blocked": "Cette vidéo est bloquée en raison de réclamations pour droits d'auteur.\nLe propriétaire du contenu a restreint l'accès à cette vidéo.", + "extraction_failed": "Échec de l'extraction des informations vidéo. Cela pourrait être un problème temporaire.\nVeuillez réessayer dans quelques minutes ou vérifier si le lien vidéo est correct.", + "generic_error": "Impossible d'extraire les informations vidéo. Veuillez vérifier votre lien.\nDétails techniques : {error}" } } \ No newline at end of file diff --git a/languages/hi.json b/languages/hi.json index af704fd..9dba826 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -398,5 +398,27 @@ "next_check_error": "अगली जांच: गणना त्रुटि", "checking": "🔄 जांच रहे हैं...", "check_now": "🔍 अभी अपडेट की जांच करें" + }, + "url_validation": { + "empty_url": "URL खाली नहीं हो सकता", + "invalid_format": "अमान्य URL प्रारूप", + "invalid_scheme": "URL http:// या https:// से शुरू होना चाहिए", + "missing_domain": "अमान्य URL: डोमेन नाम गायब है", + "unsupported_platform": "YTSage केवल YouTube और YouTube Music URLs का समर्थन करता है।\nडोमेन '{domain}' समर्थित नहीं है।", + "invalid_youtu_be": "अमान्य youtu.be URL: वीडियो ID गायब है" + }, + "ytdlp_errors": { + "private_video": "यह एक निजी वीडियो है। आप कुकीज़ का उपयोग करके अपने खाते में लॉग इन करके इसे डाउनलोड कर सकते हैं।\nप्रमाणित करने के लिए 'कस्टम विकल्प' → 'कुकीज़ के साथ लॉगिन' → 'ब्राउज़र से कुकीज़ निकालें' पर जाएं।", + "age_restricted": "यह वीडियो आयु-प्रतिबंधित है। इसे एक्सेस करने के लिए आपको लॉग इन करना होगा।\nअपने खाते से प्रमाणित करने के लिए 'कस्टम विकल्प' → 'कुकीज़ के साथ लॉगिन' का उपयोग करें।", + "geo_blocked": "यह वीडियो आपके क्षेत्र में उपलब्ध नहीं है (भू-अवरोधित)।\nआपको VPN का उपयोग करने की आवश्यकता हो सकती है या वीडियो आपके देश में प्रतिबंधित हो सकता है।", + "video_unavailable": "यह वीडियो हटा दिया गया है या अब उपलब्ध नहीं है।\nवीडियो को अपलोडर द्वारा हटाया जा सकता है या नीति उल्लंघन के कारण हटाया जा सकता है।", + "live_stream": "यह एक लाइव स्ट्रीम है जिसे सक्रिय रहते हुए डाउनलोड नहीं किया जा सकता।\nस्ट्रीम समाप्त होने तक प्रतीक्षा करें, फिर संग्रहीत संस्करण डाउनलोड करने का प्रयास करें।", + "playlist_error": "इस प्लेलिस्ट तक पहुंचने में असमर्थ। यह निजी, हटाई गई या खाली हो सकती है।\nजांचें कि प्लेलिस्ट मौजूद है और सार्वजनिक रूप से सुलभ है।", + "network_error": "नेटवर्क कनेक्शन त्रुटि। कृपया अपना इंटरनेट कनेक्शन जांचें और पुनः प्रयास करें।\nयदि समस्या बनी रहती है, तो वीडियो सर्वर अस्थायी रूप से अनुपलब्ध हो सकता है।", + "invalid_url": "अमान्य या असमर्थित URL। कृपया लिंक जांचें और पुनः प्रयास करें।\nसुनिश्चित करें कि आप एक मान्य YouTube, Vimeo, या अन्य समर्थित प्लेटफ़ॉर्म URL का उपयोग कर रहे हैं।", + "premium_content": "इस सामग्री के लिए YouTube Premium या चैनल सदस्यता की आवश्यकता है।\nआपको ऐसे खाते से लॉग इन करना होगा जिसके पास इस सामग्री तक पहुंच है।", + "copyright_blocked": "कॉपीराइट दावों के कारण यह वीडियो अवरुद्ध है।\nसामग्री स्वामी ने इस वीडियो तक पहुंच प्रतिबंधित कर दी है।", + "extraction_failed": "वीडियो जानकारी निकालने में विफल। यह एक अस्थायी समस्या हो सकती है।\nकृपया कुछ मिनट में पुनः प्रयास करें, या जांचें कि वीडियो लिंक सही है या नहीं।", + "generic_error": "वीडियो जानकारी निकालने में विफल। कृपया अपना लिंक जांचें।\nतकनीकी विवरण: {error}" } } \ No newline at end of file diff --git a/languages/id.json b/languages/id.json index bec7c0c..8af1678 100644 --- a/languages/id.json +++ b/languages/id.json @@ -398,5 +398,27 @@ "next_check_error": "Pemeriksaan berikutnya: Kesalahan perhitungan", "checking": "🔄 Memeriksa...", "check_now": "🔍 Periksa pembaruan sekarang" + }, + "url_validation": { + "empty_url": "URL tidak boleh kosong", + "invalid_format": "Format URL tidak valid", + "invalid_scheme": "URL harus dimulai dengan http:// atau https://", + "missing_domain": "URL tidak valid: nama domain hilang", + "unsupported_platform": "YTSage hanya mendukung URL YouTube dan YouTube Music.\nDomain '{domain}' tidak didukung.", + "invalid_youtu_be": "URL youtu.be tidak valid: ID video hilang" + }, + "ytdlp_errors": { + "private_video": "Ini adalah video privat. Anda dapat mengunduhnya dengan masuk ke akun Anda menggunakan cookie.\nBuka 'Opsi Kustom' → 'Masuk dengan Cookie' → 'Ekstrak cookie dari browser' untuk autentikasi.", + "age_restricted": "Video ini dibatasi usia. Anda perlu masuk untuk mengaksesnya.\nGunakan 'Opsi Kustom' → 'Masuk dengan Cookie' untuk autentikasi dengan akun Anda.", + "geo_blocked": "Video ini tidak tersedia di wilayah Anda (diblokir geografis).\nAnda mungkin perlu menggunakan VPN atau video mungkin dibatasi di negara Anda.", + "video_unavailable": "Video ini telah dihapus atau tidak lagi tersedia.\nVideo mungkin telah dihapus oleh pengunggah atau dihapus karena pelanggaran kebijakan.", + "live_stream": "Ini adalah siaran langsung yang tidak dapat diunduh saat aktif.\nTunggu hingga siaran berakhir, lalu coba unduh versi arsip.", + "playlist_error": "Tidak dapat mengakses playlist ini. Mungkin privat, dihapus, atau kosong.\nPeriksa apakah playlist ada dan dapat diakses publik.", + "network_error": "Kesalahan koneksi jaringan. Silakan periksa koneksi internet Anda dan coba lagi.\nJika masalah berlanjut, server video mungkin tidak tersedia sementara.", + "invalid_url": "URL tidak valid atau tidak didukung. Silakan periksa tautan dan coba lagi.\nPastikan Anda menggunakan URL YouTube, Vimeo, atau platform didukung lainnya yang valid.", + "premium_content": "Konten ini memerlukan YouTube Premium atau keanggotaan channel.\nAnda perlu masuk dengan akun yang memiliki akses ke konten ini.", + "copyright_blocked": "Video ini diblokir karena klaim hak cipta.\nPemilik konten telah membatasi akses ke video ini.", + "extraction_failed": "Gagal mengekstrak informasi video. Ini mungkin masalah sementara.\nSilakan coba lagi dalam beberapa menit, atau periksa apakah tautan video benar.", + "generic_error": "Tidak dapat mengekstrak informasi video. Silakan periksa tautan Anda.\nDetail teknis: {error}" } } \ No newline at end of file diff --git a/languages/it.json b/languages/it.json index 50798a0..b4c6db8 100644 --- a/languages/it.json +++ b/languages/it.json @@ -398,5 +398,27 @@ "next_check_error": "Prossimo controllo: Errore di calcolo", "checking": "🔄 Controllo...", "check_now": "🔍 Controlla aggiornamenti ora" + }, + "url_validation": { + "empty_url": "L'URL non può essere vuoto", + "invalid_format": "Formato URL non valido", + "invalid_scheme": "L'URL deve iniziare con http:// o https://", + "missing_domain": "URL non valido: nome di dominio mancante", + "unsupported_platform": "YTSage supporta solo URL di YouTube e YouTube Music.\nIl dominio '{domain}' non è supportato.", + "invalid_youtu_be": "URL youtu.be non valido: ID video mancante" + }, + "ytdlp_errors": { + "private_video": "Questo è un video privato. Puoi scaricarlo accedendo al tuo account utilizzando i cookie.\nVai su 'Opzioni Personalizzate' → 'Accedi con Cookie' → 'Estrai cookie dal browser' per autenticarti.", + "age_restricted": "Questo video è soggetto a restrizioni di età. Devi effettuare l'accesso per accedervi.\nUtilizza 'Opzioni Personalizzate' → 'Accedi con Cookie' per autenticarti con il tuo account.", + "geo_blocked": "Questo video non è disponibile nella tua regione (geo-bloccato).\nPotresti aver bisogno di utilizzare una VPN o il video potrebbe essere limitato nel tuo paese.", + "video_unavailable": "Questo video è stato rimosso o non è più disponibile.\nIl video potrebbe essere stato eliminato dall'uploader o rimosso a causa di violazioni delle politiche.", + "live_stream": "Questo è uno stream live che non può essere scaricato mentre è attivo.\nAttendi la fine dello stream, quindi prova a scaricare la versione archiviata.", + "playlist_error": "Impossibile accedere a questa playlist. Potrebbe essere privata, eliminata o vuota.\nVerifica se la playlist esiste ed è accessibile pubblicamente.", + "network_error": "Errore di connessione di rete. Controlla la tua connessione Internet e riprova.\nSe il problema persiste, il server video potrebbe essere temporaneamente non disponibile.", + "invalid_url": "URL non valido o non supportato. Controlla il link e riprova.\nAssicurati di utilizzare un URL YouTube, Vimeo o altra piattaforma supportata valido.", + "premium_content": "Questo contenuto richiede YouTube Premium o l'iscrizione al canale.\nDevi accedere con un account che ha accesso a questo contenuto.", + "copyright_blocked": "Questo video è bloccato a causa di rivendicazioni di copyright.\nIl proprietario del contenuto ha limitato l'accesso a questo video.", + "extraction_failed": "Impossibile estrarre le informazioni del video. Questo potrebbe essere un problema temporaneo.\nRiprova tra qualche minuto o verifica se il link del video è corretto.", + "generic_error": "Impossibile estrarre le informazioni del video. Controlla il tuo link.\nDettagli tecnici: {error}" } } \ No newline at end of file diff --git a/languages/ja.json b/languages/ja.json index 81ab4c2..8f612e4 100644 --- a/languages/ja.json +++ b/languages/ja.json @@ -398,5 +398,27 @@ "next_check_error": "次回確認: 計算エラー", "checking": "🔄 確認中...", "check_now": "🔍 今すぐ更新を確認" + }, + "url_validation": { + "empty_url": "URLを空にすることはできません", + "invalid_format": "無効なURL形式", + "invalid_scheme": "URLはhttp://またはhttps://で始まる必要があります", + "missing_domain": "無効なURL:ドメイン名がありません", + "unsupported_platform": "YTSageはYouTubeとYouTube MusicのURLのみをサポートしています。\nドメイン'{domain}'はサポートされていません。", + "invalid_youtu_be": "無効なyoutu.be URL:ビデオIDがありません" + }, + "ytdlp_errors": { + "private_video": "これは非公開動画です。Cookieを使用してアカウントにログインすることでダウンロードできます。\n認証するには、「カスタムオプション」→「Cookieでログイン」→「ブラウザからCookieを抽出」に移動してください。", + "age_restricted": "この動画は年齢制限があります。アクセスするにはログインする必要があります。\nアカウントで認証するには、「カスタムオプション」→「Cookieでログイン」を使用してください。", + "geo_blocked": "この動画はお住まいの地域では利用できません(地理的にブロックされています)。\nVPNを使用する必要がある場合や、お住まいの国で動画が制限されている可能性があります。", + "video_unavailable": "この動画は削除されたか、利用できなくなりました。\n動画はアップローダーによって削除されたか、ポリシー違反のために削除された可能性があります。", + "live_stream": "これはアクティブな間はダウンロードできないライブストリームです。\nストリームが終了するまで待ってから、アーカイブされたバージョンのダウンロードを試してください。", + "playlist_error": "このプレイリストにアクセスできません。非公開、削除、または空の可能性があります。\nプレイリストが存在し、公開されているか確認してください。", + "network_error": "ネットワーク接続エラー。インターネット接続を確認して、もう一度お試しください。\n問題が解決しない場合は、ビデオサーバーが一時的に利用できない可能性があります。", + "invalid_url": "無効またはサポートされていないURL。リンクを確認して、もう一度お試しください。\n有効なYouTube、Vimeo、またはその他のサポートされているプラットフォームのURLを使用していることを確認してください。", + "premium_content": "このコンテンツにはYouTube Premiumまたはチャンネルメンバーシップが必要です。\nこのコンテンツにアクセスできるアカウントでログインする必要があります。", + "copyright_blocked": "著作権の申し立てにより、この動画はブロックされています。\nコンテンツ所有者がこの動画へのアクセスを制限しています。", + "extraction_failed": "動画情報の抽出に失敗しました。これは一時的な問題である可能性があります。\n数分後にもう一度お試しいただくか、動画リンクが正しいか確認してください。", + "generic_error": "動画情報を抽出できませんでした。リンクを確認してください。\n技術的詳細:{error}" } } \ No newline at end of file diff --git a/languages/pl.json b/languages/pl.json index a0bdb0e..4ad407c 100644 --- a/languages/pl.json +++ b/languages/pl.json @@ -398,5 +398,27 @@ "next_check_error": "Następne sprawdzenie: Błąd obliczania", "checking": "🔄 Sprawdzanie...", "check_now": "🔍 Sprawdź aktualizacje teraz" + }, + "url_validation": { + "empty_url": "URL nie może być pusty", + "invalid_format": "Nieprawidłowy format URL", + "invalid_scheme": "URL musi zaczynać się od http:// lub https://", + "missing_domain": "Nieprawidłowy URL: brak nazwy domeny", + "unsupported_platform": "YTSage obsługuje tylko adresy URL YouTube i YouTube Music.\nDomena '{domain}' nie jest obsługiwana.", + "invalid_youtu_be": "Nieprawidłowy URL youtu.be: brak ID wideo" + }, + "ytdlp_errors": { + "private_video": "To jest prywatny film. Możesz go pobrać, logując się na swoje konto za pomocą plików cookie.\nPrzejdź do 'Opcje Niestandardowe' → 'Zaloguj się z plikami cookie' → 'Wyodrębnij pliki cookie z przeglądarki', aby się uwierzytelnić.", + "age_restricted": "Ten film ma ograniczenie wiekowe. Musisz się zalogować, aby uzyskać do niego dostęp.\nUżyj 'Opcje Niestandardowe' → 'Zaloguj się z plikami cookie', aby uwierzytelnić się swoim kontem.", + "geo_blocked": "Ten film nie jest dostępny w Twoim regionie (geoblokada).\nMożesz potrzebować VPN lub film może być ograniczony w Twoim kraju.", + "video_unavailable": "Ten film został usunięty lub nie jest już dostępny.\nFilm mógł zostać usunięty przez osobę przesyłającą lub usunięty z powodu naruszenia zasad.", + "live_stream": "To jest transmisja na żywo, której nie można pobrać, gdy jest aktywna.\nPoczekaj, aż transmisja się zakończy, a następnie spróbuj pobrać zarchiwizowaną wersję.", + "playlist_error": "Nie można uzyskać dostępu do tej playlisty. Może być prywatna, usunięta lub pusta.\nSprawdź, czy playlista istnieje i jest publicznie dostępna.", + "network_error": "Błąd połączenia sieciowego. Sprawdź swoje połączenie internetowe i spróbuj ponownie.\nJeśli problem będzie się utrzymywał, serwer wideo może być tymczasowo niedostępny.", + "invalid_url": "Nieprawidłowy lub nieobsługiwany URL. Sprawdź link i spróbuj ponownie.\nUpewnij się, że używasz prawidłowego adresu URL YouTube, Vimeo lub innej obsługiwanej platformy.", + "premium_content": "Ta treść wymaga YouTube Premium lub członkostwa w kanale.\nMusisz zalogować się na konto, które ma dostęp do tej treści.", + "copyright_blocked": "Ten film jest zablokowany z powodu roszczeń dotyczących praw autorskich.\nWłaściciel treści ograniczył dostęp do tego filmu.", + "extraction_failed": "Nie udało się wyodrębnić informacji o filmie. To może być tymczasowy problem.\nSpróbuj ponownie za kilka minut lub sprawdź, czy link do filmu jest poprawny.", + "generic_error": "Nie udało się wyodrębnić informacji o filmie. Sprawdź swój link.\nSzczegóły techniczne: {error}" } } \ No newline at end of file diff --git a/languages/pt.json b/languages/pt.json index 0fbe7cd..eef0144 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -398,5 +398,27 @@ "next_check_error": "Próxima verificação: Erro ao calcular", "checking": "🔄 Verificando...", "check_now": "🔍 Verificar atualizações agora" + }, + "url_validation": { + "empty_url": "O URL não pode estar vazio", + "invalid_format": "Formato de URL inválido", + "invalid_scheme": "O URL deve começar com http:// ou https://", + "missing_domain": "URL inválido: nome de domínio ausente", + "unsupported_platform": "YTSage suporta apenas URLs do YouTube e YouTube Music.\nO domínio '{domain}' não é suportado.", + "invalid_youtu_be": "URL youtu.be inválido: ID do vídeo ausente" + }, + "ytdlp_errors": { + "private_video": "Este é um vídeo privado. Você pode baixá-lo fazendo login em sua conta usando cookies.\nVá para 'Opções Personalizadas' → 'Login com Cookies' → 'Extrair cookies do navegador' para autenticar.", + "age_restricted": "Este vídeo tem restrição de idade. Você precisa estar conectado para acessá-lo.\nUse 'Opções Personalizadas' → 'Login com Cookies' para autenticar com sua conta.", + "geo_blocked": "Este vídeo não está disponível em sua região (geo-bloqueado).\nVocê pode precisar usar uma VPN ou o vídeo pode estar restrito em seu país.", + "video_unavailable": "Este vídeo foi removido ou não está mais disponível.\nO vídeo pode ter sido excluído pelo uploader ou removido devido a violações de políticas.", + "live_stream": "Esta é uma transmissão ao vivo que não pode ser baixada enquanto está ativa.\nAguarde o término da transmissão e tente baixar a versão arquivada.", + "playlist_error": "Não é possível acessar esta playlist. Ela pode ser privada, excluída ou vazia.\nVerifique se a playlist existe e está acessível publicamente.", + "network_error": "Erro de conexão de rede. Verifique sua conexão com a internet e tente novamente.\nSe o problema persistir, o servidor de vídeo pode estar temporariamente indisponível.", + "invalid_url": "URL inválido ou não suportado. Verifique o link e tente novamente.\nCertifique-se de usar um URL válido do YouTube, Vimeo ou outra plataforma suportada.", + "premium_content": "Este conteúdo requer YouTube Premium ou associação ao canal.\nVocê precisa fazer login com uma conta que tenha acesso a este conteúdo.", + "copyright_blocked": "Este vídeo está bloqueado devido a reivindicações de direitos autorais.\nO proprietário do conteúdo restringiu o acesso a este vídeo.", + "extraction_failed": "Falha ao extrair informações do vídeo. Isso pode ser um problema temporário.\nTente novamente em alguns minutos ou verifique se o link do vídeo está correto.", + "generic_error": "Não foi possível extrair informações do vídeo. Verifique seu link.\nDetalhes técnicos: {error}" } } \ No newline at end of file diff --git a/languages/ru.json b/languages/ru.json index d664eb1..5e1a539 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -398,5 +398,27 @@ "next_check_error": "Следующая проверка: Ошибка расчета", "checking": "🔄 Проверка...", "check_now": "🔍 Проверить обновления сейчас" + }, + "url_validation": { + "empty_url": "URL не может быть пустым", + "invalid_format": "Недопустимый формат URL", + "invalid_scheme": "URL должен начинаться с http:// или https://", + "missing_domain": "Недопустимый URL: отсутствует доменное имя", + "unsupported_platform": "YTSage поддерживает только URL-адреса YouTube и YouTube Music.\nДомен '{domain}' не поддерживается.", + "invalid_youtu_be": "Недопустимый URL youtu.be: отсутствует ID видео" + }, + "ytdlp_errors": { + "private_video": "Это частное видео. Вы можете загрузить его, войдя в свою учетную запись с помощью cookies.\nПерейдите в 'Пользовательские параметры' → 'Вход с помощью Cookies' → 'Извлечь cookies из браузера' для аутентификации.", + "age_restricted": "Это видео имеет возрастные ограничения. Для доступа необходимо войти в систему.\nИспользуйте 'Пользовательские параметры' → 'Вход с помощью Cookies' для аутентификации с вашей учетной записью.", + "geo_blocked": "Это видео недоступно в вашем регионе (геоблокировка).\nВам может понадобиться VPN или видео может быть ограничено в вашей стране.", + "video_unavailable": "Это видео было удалено или больше не доступно.\nВидео могло быть удалено загрузчиком или удалено из-за нарушения правил.", + "live_stream": "Это прямая трансляция, которую нельзя загрузить во время активности.\nДождитесь окончания трансляции, затем попробуйте загрузить архивную версию.", + "playlist_error": "Не удается получить доступ к этому плейлисту. Он может быть частным, удаленным или пустым.\nПроверьте, существует ли плейлист и доступен ли он публично.", + "network_error": "Ошибка сетевого подключения. Проверьте подключение к Интернету и повторите попытку.\nЕсли проблема сохраняется, видеосервер может быть временно недоступен.", + "invalid_url": "Недопустимый или неподдерживаемый URL. Проверьте ссылку и повторите попытку.\nУбедитесь, что вы используете действительный URL YouTube, Vimeo или другой поддерживаемой платформы.", + "premium_content": "Для этого контента требуется YouTube Premium или членство в канале.\nВам необходимо войти с учетной записью, имеющей доступ к этому контенту.", + "copyright_blocked": "Это видео заблокировано из-за претензий по авторским правам.\nВладелец контента ограничил доступ к этому видео.", + "extraction_failed": "Не удалось извлечь информацию о видео. Это может быть временной проблемой.\nПовторите попытку через несколько минут или проверьте правильность ссылки на видео.", + "generic_error": "Не удалось извлечь информацию о видео. Проверьте вашу ссылку.\nТехнические детали: {error}" } } \ No newline at end of file diff --git a/languages/tr.json b/languages/tr.json index 1e7cf7f..78e55d5 100644 --- a/languages/tr.json +++ b/languages/tr.json @@ -398,5 +398,27 @@ "next_check_error": "Sonraki kontrol: Hesaplama hatası", "checking": "🔄 Kontrol ediliyor...", "check_now": "🔍 Şimdi güncellemeleri kontrol et" + }, + "url_validation": { + "empty_url": "URL boş olamaz", + "invalid_format": "Geçersiz URL formatı", + "invalid_scheme": "URL http:// veya https:// ile başlamalıdır", + "missing_domain": "Geçersiz URL: alan adı eksik", + "unsupported_platform": "YTSage yalnızca YouTube ve YouTube Music URL'lerini destekler.\n'{domain}' alan adı desteklenmiyor.", + "invalid_youtu_be": "Geçersiz youtu.be URL'si: video ID'si eksik" + }, + "ytdlp_errors": { + "private_video": "Bu özel bir video. Çerezleri kullanarak hesabınıza giriş yaparak indirebilirsiniz.\nKimlik doğrulamak için 'Özel Seçenekler' → 'Çerezlerle Giriş' → 'Tarayıcıdan çerezleri çıkar' bölümüne gidin.", + "age_restricted": "Bu video yaş kısıtlamalı. Erişmek için giriş yapmanız gerekiyor.\nHesabınızla kimlik doğrulamak için 'Özel Seçenekler' → 'Çerezlerle Giriş' kullanın.", + "geo_blocked": "Bu video bölgenizde kullanılamıyor (coğrafi engel).\nBir VPN kullanmanız gerekebilir veya video ülkenizde kısıtlanmış olabilir.", + "video_unavailable": "Bu video kaldırıldı veya artık kullanılamıyor.\nVideo, yükleyici tarafından silinmiş veya politika ihlalleri nedeniyle kaldırılmış olabilir.", + "live_stream": "Bu, aktifken indirilemeyen canlı bir yayındır.\nYayın bitene kadar bekleyin, ardından arşivlenmiş sürümü indirmeyi deneyin.", + "playlist_error": "Bu oynatma listesine erişilemiyor. Özel, silinmiş veya boş olabilir.\nOynatma listesinin var olduğunu ve herkese açık olduğunu kontrol edin.", + "network_error": "Ağ bağlantı hatası. Lütfen internet bağlantınızı kontrol edin ve tekrar deneyin.\nSorun devam ederse, video sunucusu geçici olarak kullanılamıyor olabilir.", + "invalid_url": "Geçersiz veya desteklenmeyen URL. Lütfen bağlantıyı kontrol edin ve tekrar deneyin.\nGeçerli bir YouTube, Vimeo veya desteklenen başka bir platform URL'si kullandığınızdan emin olun.", + "premium_content": "Bu içerik YouTube Premium veya kanal üyeliği gerektirir.\nBu içeriğe erişimi olan bir hesapla giriş yapmanız gerekiyor.", + "copyright_blocked": "Bu video telif hakkı iddiaları nedeniyle engellenmiş.\nİçerik sahibi bu videoya erişimi kısıtlamış.", + "extraction_failed": "Video bilgileri çıkarılamadı. Bu geçici bir sorun olabilir.\nLütfen birkaç dakika içinde tekrar deneyin veya video bağlantısının doğru olup olmadığını kontrol edin.", + "generic_error": "Video bilgileri çıkarılamadı. Lütfen bağlantınızı kontrol edin.\nTeknik ayrıntılar: {error}" } } \ No newline at end of file diff --git a/languages/zh.json b/languages/zh.json index 8dd404f..3d21872 100644 --- a/languages/zh.json +++ b/languages/zh.json @@ -398,5 +398,27 @@ "next_check_error": "下次检查: 计算错误", "checking": "🔄 检查中...", "check_now": "🔍 立即检查更新" + }, + "url_validation": { + "empty_url": "URL不能为空", + "invalid_format": "无效的URL格式", + "invalid_scheme": "URL必须以http://或https://开头", + "missing_domain": "无效的URL:缺少域名", + "unsupported_platform": "YTSage仅支持YouTube和YouTube Music的URL。\n不支持域名'{domain}'。", + "invalid_youtu_be": "无效的youtu.be URL:缺少视频ID" + }, + "ytdlp_errors": { + "private_video": "这是一个私人视频。您可以通过使用Cookie登录您的账户来下载它。\n转到【自定义选项】→【使用Cookie登录】→【从浏览器提取Cookie】进行身份验证。", + "age_restricted": "此视频有年龄限制。您需要登录才能访问它。\n使用【自定义选项】→【使用Cookie登录】以使用您的账户进行身份验证。", + "geo_blocked": "此视频在您所在的地区不可用(地理封锁)。\n您可能需要使用VPN,或者该视频在您的国家受到限制。", + "video_unavailable": "此视频已被删除或不再可用。\n该视频可能已被上传者删除或因违反政策而被删除。", + "live_stream": "这是一个在活动时无法下载的直播。\n等待直播结束,然后尝试下载存档版本。", + "playlist_error": "无法访问此播放列表。它可能是私有的、已删除或为空。\n检查播放列表是否存在并且可以公开访问。", + "network_error": "网络连接错误。请检查您的互联网连接并重试。\n如果问题仍然存在,视频服务器可能暂时不可用。", + "invalid_url": "无效或不支持的URL。请检查链接并重试。\n确保您使用的是有效的YouTube、Vimeo或其他支持的平台URL。", + "premium_content": "此内容需要YouTube Premium或频道会员资格。\n您需要使用有权访问此内容的账户登录。", + "copyright_blocked": "由于版权声明,此视频已被封锁。\n内容所有者已限制对此视频的访问。", + "extraction_failed": "提取视频信息失败。这可能是一个临时问题。\n请在几分钟后重试,或检查视频链接是否正确。", + "generic_error": "无法提取视频信息。请检查您的链接。\n技术详情:{error}" } } \ No newline at end of file diff --git a/src/core/ytsage_utils.py b/src/core/ytsage_utils.py index 2d58628..c5e8e9b 100644 --- a/src/core/ytsage_utils.py +++ b/src/core/ytsage_utils.py @@ -20,6 +20,7 @@ from src.utils.ytsage_constants import ( YTDLP_APP_BIN_PATH, YTDLP_DOWNLOAD_URL, ) +from src.utils.ytsage_localization import _ from src.utils.ytsage_logger import logger try: @@ -677,17 +678,11 @@ def parse_yt_dlp_error(error_message: str) -> str: # Private video errors if any(keyword in error_str for keyword in ["private video", "login_required", "sign in if you"]): - return ( - "This is a private video. You can download it by logging into your account using cookies.\n" - "Go to 'Custom Options' → 'Login with Cookies' → 'Extract cookies from browser' to authenticate." - ) + return _("ytdlp_errors.private_video") # Age-restricted content if any(keyword in error_str for keyword in ["age restricted", "age-restricted", "confirm your age"]): - return ( - "This video is age-restricted. You need to be logged in to access it.\n" - "Use 'Custom Options' → 'Login with Cookies' to authenticate with your account." - ) + return _("ytdlp_errors.age_restricted") # Geo-blocked content if any( @@ -699,66 +694,42 @@ def parse_yt_dlp_error(error_message: str) -> str: "not made this video available in your country", ] ): - return ( - "This video is not available in your region (geo-blocked).\n" - "You may need to use a VPN or the video might be restricted in your country." - ) + return _("ytdlp_errors.geo_blocked") # Removed/deleted videos if any(keyword in error_str for keyword in ["video unavailable", "this video has been removed", "video does not exist"]): - return ( - "This video has been removed or is no longer available.\n" - "The video may have been deleted by the uploader or removed due to policy violations." - ) + return _("ytdlp_errors.video_unavailable") # Live stream errors if any(keyword in error_str for keyword in ["live stream", "livestream", "is live"]): - return ( - "This is a live stream that cannot be downloaded while active.\n" - "Wait for the stream to end, then try downloading the archived version." - ) + return _("ytdlp_errors.live_stream") # Playlist errors if any(keyword in error_str for keyword in ["playlist", "no entries"]): - return ( - "Unable to access this playlist. It may be private, deleted, or empty.\n" - "Check if the playlist exists and is publicly accessible." - ) + return _("ytdlp_errors.playlist_error") # Network/connection errors if any(keyword in error_str for keyword in ["network error", "connection", "timeout", "unable to download"]): - return ( - "Network connection error. Please check your internet connection and try again.\n" - "If the problem persists, the video server might be temporarily unavailable." - ) + return _("ytdlp_errors.network_error") # Invalid URL if any(keyword in error_str for keyword in ["invalid url", "unsupported url", "no video found"]): - return ( - "Invalid or unsupported URL. Please check the link and try again.\n" - "Make sure you're using a valid YouTube, Vimeo, or other supported platform URL." - ) + return _("ytdlp_errors.invalid_url") # YouTube premium content if any(keyword in error_str for keyword in ["youtube premium", "premium", "members only"]): - return ( - "This content requires YouTube Premium or channel membership.\n" - "You need to be logged in with an account that has access to this content." - ) + return _("ytdlp_errors.premium_content") # Copyright/DMCA if any(keyword in error_str for keyword in ["copyright", "dmca", "blocked"]): - return "This video is blocked due to copyright claims.\n" "The content owner has restricted access to this video." + return _("ytdlp_errors.copyright_blocked") # Extraction errors (could be temporary) if any(keyword in error_str for keyword in ["unable to extract", "extraction failed"]): - return ( - "Failed to extract video information. This might be a temporary issue.\n" - "Please try again in a few minutes, or check if the video link is correct." - ) + return _("ytdlp_errors.extraction_failed") # Generic fallback with the original error for debugging - return f"Could not extract video information. Please check your link.\n" f"Technical details: {error_message}" + return _("ytdlp_errors.generic_error", error=error_message) def validate_video_url(url: str) -> tuple[bool, str]: @@ -782,7 +753,7 @@ def validate_video_url(url: str) -> tuple[bool, str]: # Check if URL is empty if not url or not url.strip(): - return False, "URL cannot be empty" + return False, _("url_validation.empty_url") url = url.strip() @@ -791,15 +762,15 @@ def validate_video_url(url: str) -> tuple[bool, str]: parsed = urlparse(url) except Exception as e: logger.debug(f"URL parsing error: {e}") - return False, "Invalid URL format" + return False, _("url_validation.invalid_format") # Check if scheme is http or https if parsed.scheme not in ['http', 'https']: - return False, "URL must start with http:// or https://" + return False, _("url_validation.invalid_scheme") # Check if netloc (domain) exists if not parsed.netloc: - return False, "Invalid URL: missing domain name" + return False, _("url_validation.missing_domain") # YTSage focuses on YouTube and YouTube Music only # Supported YouTube domains @@ -820,14 +791,7 @@ def validate_video_url(url: str) -> tuple[bool, str]: ) if not is_youtube: - return False, ( - "YTSage only supports YouTube and YouTube Music URLs.\n" - f"The domain '{parsed.netloc}' is not supported.\n\n" - "Supported domains:\n" - " • youtube.com\n" - " • youtu.be\n" - " • music.youtube.com" - ) + return False, _("url_validation.unsupported_platform", domain=parsed.netloc) # Optional: Validate YouTube URL patterns # Common YouTube URL patterns: @@ -849,7 +813,7 @@ def validate_video_url(url: str) -> tuple[bool, str]: # For youtu.be, the path itself is the video ID if 'youtu.be' in netloc_lower: if not parsed.path or parsed.path == '/': - return False, "Invalid youtu.be URL: missing video ID" + return False, _("url_validation.invalid_youtu_be") return True, "" # For youtube.com domains, check for valid patterns diff --git a/src/gui/ytsage_gui_main.py b/src/gui/ytsage_gui_main.py index 1a5fdc0..b8084c2 100644 --- a/src/gui/ytsage_gui_main.py +++ b/src/gui/ytsage_gui_main.py @@ -29,7 +29,7 @@ from PySide6.QtWidgets import ( ) from src.core.ytsage_downloader import DownloadThread, SignalManager # Import downloader related classes -from src.core.ytsage_utils import check_ffmpeg, load_saved_path, parse_yt_dlp_error, save_path, should_check_for_auto_update +from src.core.ytsage_utils import check_ffmpeg, load_saved_path, parse_yt_dlp_error, save_path, should_check_for_auto_update, validate_video_url from src.core.ytsage_yt_dlp import get_yt_dlp_path, setup_ytdlp # Import the new yt-dlp functions from src.gui.ytsage_gui_dialogs import ( # use of src\gui\ytsage_gui_dialogs\__init__.py AboutDialog, @@ -707,6 +707,12 @@ class YTSageApp(QMainWindow, FormatTableMixin, VideoInfoMixin): # Inherit from if not url: self.signals.update_status.emit(_("main_ui.invalid_url_or_enter")) return + + # Validate URL before processing + is_valid, error_message = validate_video_url(url) + if not is_valid: + self.signals.update_status.emit(error_message) + return self.signals.update_status.emit(_("main_ui.analyzing_preparing")) threading.Thread(target=self._analyze_url_thread, args=(url,), daemon=True).start() @@ -788,6 +794,12 @@ class YTSageApp(QMainWindow, FormatTableMixin, VideoInfoMixin): # Inherit from self.status_label.setText(_('download.please_enter_url_and_path')) return # --- End Path Change --- + + # Validate URL before starting download + is_valid, error_message = validate_video_url(url) + if not is_valid: + self.status_label.setText(error_message) + return # Get selected format format_id = self.get_selected_format()