Merge branch 'master' into api-only

This commit is contained in:
Omar Roth 2019-03-29 16:34:19 -05:00
commit 3d76898bb9
21 changed files with 483 additions and 451 deletions

View File

@ -10,7 +10,7 @@
"newest": "الأجدد", "newest": "الأجدد",
"oldest": "الأقدم", "oldest": "الأقدم",
"popular": "الاكثر شعبية", "popular": "الاكثر شعبية",
"last": "", "last": "اخر الفيديوهات المعدلة",
"Next page": "الصفحة الثانية", "Next page": "الصفحة الثانية",
"Previous page": "الصفحة السابقة", "Previous page": "الصفحة السابقة",
"Clear watch history?": "مسح السجل ؟", "Clear watch history?": "مسح السجل ؟",
@ -50,7 +50,7 @@
"Autoplay: ": "تشغيل تلقائى: ", "Autoplay: ": "تشغيل تلقائى: ",
"Autoplay next video: ": "شغل الفيديو التالى تلقائى: ", "Autoplay next video: ": "شغل الفيديو التالى تلقائى: ",
"Listen by default: ": "تشغيل النسخة السمعية تلقائى: ", "Listen by default: ": "تشغيل النسخة السمعية تلقائى: ",
"Proxy videos? ": "", "Proxy videos? ": "عرض الفيديوهات عن طريق الوكيل(proxy) ؟",
"Default speed: ": "السرعة الإفتراضية: ", "Default speed: ": "السرعة الإفتراضية: ",
"Preferred video quality: ": "الجودة المفضلة للفيديوهات: ", "Preferred video quality: ": "الجودة المفضلة للفيديوهات: ",
"Player volume: ": "صوت المشغل: ", "Player volume: ": "صوت المشغل: ",
@ -83,14 +83,14 @@
"Manage subscriptions": "إدارة المشتركين", "Manage subscriptions": "إدارة المشتركين",
"Watch history": "سجل المشاهدة", "Watch history": "سجل المشاهدة",
"Delete account": "حذف الحساب", "Delete account": "حذف الحساب",
"Administrator preferences": "", "Administrator preferences": "إعدادات المدير",
"Default homepage: ": "", "Default homepage: ": "الصفحة الرئيسية الافتراضية ",
"Feed menu: ": "", "Feed menu: ": "قائمة التغذية",
"Top enabled? ": "", "Top enabled? ": "تفعيل 'الأفضل' ؟ ",
"CAPTCHA enabled? ": "", "CAPTCHA enabled? ": "تفعيل الكابتشا ؟",
"Login enabled? ": "", "Login enabled? ": "تفعيل تسجيل الدخول ؟",
"Registration enabled? ": "", "Registration enabled? ": "تفعيل التسجيل ؟",
"Report statistics? ": "", "Report statistics? ": "إبلاغ الإحصائيات",
"Save preferences": "حفظ التفضيلات", "Save preferences": "حفظ التفضيلات",
"Subscription manager": "مدير الإشتراكات", "Subscription manager": "مدير الإشتراكات",
"`x` subscriptions": "`x` مشتركين", "`x` subscriptions": "`x` مشتركين",
@ -103,8 +103,9 @@
"Released under the AGPLv3 by Omar Roth.": "تم الإنشاء تحت AGPLv3 بواسطة عمر روث.", "Released under the AGPLv3 by Omar Roth.": "تم الإنشاء تحت AGPLv3 بواسطة عمر روث.",
"Source available here.": "الأكواد متوفرة هنا.", "Source available here.": "الأكواد متوفرة هنا.",
"View JavaScript license information.": "مشاهدة معلومات حول تراخيص الجافاسكريبت.", "View JavaScript license information.": "مشاهدة معلومات حول تراخيص الجافاسكريبت.",
"View privacy policy.": "", "View privacy policy.": "عرض سياسة الخصوصية",
"Trending": "الشائع", "Trending": "الشائع",
"Unlisted": "غير مصنف",
"Watch video on Youtube": "مشاهدة الفيديو على اليوتيوب", "Watch video on Youtube": "مشاهدة الفيديو على اليوتيوب",
"Genre: ": "النوع: ", "Genre: ": "النوع: ",
"License: ": "التراخيص: ", "License: ": "التراخيص: ",
@ -114,6 +115,7 @@
"Whitelisted regions: ": "الدول المسموح فيها هذا الفيديو: ", "Whitelisted regions: ": "الدول المسموح فيها هذا الفيديو: ",
"Blacklisted regions: ": "الدول الحظور فيها هذا الفيديو: ", "Blacklisted regions: ": "الدول الحظور فيها هذا الفيديو: ",
"Shared `x`": "شارك منذ `x`", "Shared `x`": "شارك منذ `x`",
"Premieres in `x`": "يعرض فى 'x'",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "اهلا! يبدو ان الجافاسكريبت معطلة. اضغط هنا لعرض التعليقات, ضع فى إعتبارك انها ستأخذ وقت اطول للعرض.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "اهلا! يبدو ان الجافاسكريبت معطلة. اضغط هنا لعرض التعليقات, ضع فى إعتبارك انها ستأخذ وقت اطول للعرض.",
"View YouTube comments": "عرض تعليقات اليوتيوب", "View YouTube comments": "عرض تعليقات اليوتيوب",
"View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع Reddit", "View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع Reddit",

View File

@ -105,6 +105,7 @@
"View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.", "View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.",
"View privacy policy.": "", "View privacy policy.": "",
"Trending": "Trending", "Trending": "Trending",
"Unlisted": "",
"Watch video on Youtube": "Video auf YouTube ansehen", "Watch video on Youtube": "Video auf YouTube ansehen",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
"License: ": "Lizenz: ", "License: ": "Lizenz: ",
@ -114,6 +115,7 @@
"Whitelisted regions: ": "Erlaubte Regionen: ", "Whitelisted regions: ": "Erlaubte Regionen: ",
"Blacklisted regions: ": "Unerlaubte Regionen: ", "Blacklisted regions: ": "Unerlaubte Regionen: ",
"Shared `x`": "Geteilt `x`", "Shared `x`": "Geteilt `x`",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hallo! Anscheinend haben Sie JavaScript deaktiviert. Klicken Sie hier um Kommentare anzuzeigen, beachten sie dass es etwas länger dauern kann um sie zu laden.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hallo! Anscheinend haben Sie JavaScript deaktiviert. Klicken Sie hier um Kommentare anzuzeigen, beachten sie dass es etwas länger dauern kann um sie zu laden.",
"View YouTube comments": "YouTube Kommentare anzeigen", "View YouTube comments": "YouTube Kommentare anzeigen",
"View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen", "View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen",

View File

@ -103,6 +103,7 @@
"View JavaScript license information.": "View JavaScript license information.", "View JavaScript license information.": "View JavaScript license information.",
"View privacy policy.": "View privacy policy.", "View privacy policy.": "View privacy policy.",
"Trending": "Trending", "Trending": "Trending",
"Unlisted": "",
"Watch video on Youtube": "Watch video on Youtube", "Watch video on Youtube": "Watch video on Youtube",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
"License: ": "License: ", "License: ": "License: ",
@ -112,6 +113,7 @@
"Whitelisted regions: ": "Whitelisted regions: ", "Whitelisted regions: ": "Whitelisted regions: ",
"Blacklisted regions: ": "Blacklisted regions: ", "Blacklisted regions: ": "Blacklisted regions: ",
"Shared `x`": "Shared `x`", "Shared `x`": "Shared `x`",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.",
"View YouTube comments": "View YouTube comments", "View YouTube comments": "View YouTube comments",
"View more comments on Reddit": "View more comments on Reddit", "View more comments on Reddit": "View more comments on Reddit",

View File

@ -102,6 +102,7 @@
"Source available here.": "", "Source available here.": "",
"View JavaScript license information.": "", "View JavaScript license information.": "",
"View privacy policy.": "", "View privacy policy.": "",
"Unlisted": "",
"Trending": "", "Trending": "",
"Watch video on Youtube": "", "Watch video on Youtube": "",
"Genre: ": "", "Genre: ": "",
@ -112,6 +113,7 @@
"Whitelisted regions: ": "", "Whitelisted regions: ": "",
"Blacklisted regions: ": "", "Blacklisted regions: ": "",
"Shared `x`": "", "Shared `x`": "",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "",
"View YouTube comments": "", "View YouTube comments": "",
"View more comments on Reddit": "", "View more comments on Reddit": "",

View File

@ -2,7 +2,7 @@
"`x` subscribers": "`x` abonnés", "`x` subscribers": "`x` abonnés",
"`x` videos": "`x` vidéos", "`x` videos": "`x` vidéos",
"LIVE": "EN DIRECT", "LIVE": "EN DIRECT",
"Shared `x` ago": "Partagé il y a `x`", "Shared `x` ago": "Ajoutée il y a `x`",
"Unsubscribe": "Se désabonner", "Unsubscribe": "Se désabonner",
"Subscribe": "S'abonner", "Subscribe": "S'abonner",
"Login to subscribe to `x`": "Vous devez vous connecter pour vous abonner à `x`", "Login to subscribe to `x`": "Vous devez vous connecter pour vous abonner à `x`",
@ -16,7 +16,7 @@
"Clear watch history?": "Êtes-vous sûr de vouloir supprimer l'historique des vidéos regardées ?", "Clear watch history?": "Êtes-vous sûr de vouloir supprimer l'historique des vidéos regardées ?",
"Yes": "Oui", "Yes": "Oui",
"No": "Non", "No": "Non",
"Import and Export Data": "Importer et Exporter les Données", "Import and Export Data": "Importer et exporter des données",
"Import": "Importer", "Import": "Importer",
"Import Invidious data": "Importer des données Invidious", "Import Invidious data": "Importer des données Invidious",
"Import YouTube subscriptions": "Importer des abonnements YouTube", "Import YouTube subscriptions": "Importer des abonnements YouTube",
@ -32,32 +32,32 @@
"An alternative front-end to YouTube": "Un front-end alternatif à YouTube", "An alternative front-end to YouTube": "Un front-end alternatif à YouTube",
"JavaScript license information": "Informations sur les licences JavaScript", "JavaScript license information": "Informations sur les licences JavaScript",
"source": "source", "source": "source",
"Login": "Connexion", "Login": "Se connecter",
"Login/Register": "Connexion/S'inscrire", "Login/Register": "Se connecter/Créer un compte",
"Login to Google": "Se connecter à Google", "Login to Google": "Se connecter avec Google",
"User ID:": "Identifiant utilisateur :", "User ID:": "Identifiant utilisateur :",
"Password:": "Mot de passe :", "Password:": "Mot de passe :",
"Time (h:mm:ss):": "Heure (h:mm:ss) :", "Time (h:mm:ss):": "Heure (h:mm:ss) :",
"Text CAPTCHA": "CAPTCHA Texte", "Text CAPTCHA": "CAPTCHA Texte",
"Image CAPTCHA": "CAPTCHA Image", "Image CAPTCHA": "CAPTCHA Image",
"Sign In": "S'identifier", "Sign In": "Se connecter",
"Register": "S'inscrire", "Register": "S'inscrire",
"Email:": "E-mail :", "Email:": "E-mail :",
"Google verification code:": "Code de vérification Google :", "Google verification code:": "Code de vérification Google :",
"Preferences": "Préférences", "Preferences": "Préférences",
"Player preferences": "Préférences du Lecteur", "Player preferences": "Préférences du lecteur",
"Always loop: ": "Lire en boucle : ", "Always loop: ": "Lire en boucle : ",
"Autoplay: ": "Lire Automatiquement : ", "Autoplay: ": "Lire automatiquement : ",
"Autoplay next video: ": "Lire automatiquement la vidéo suivante : ", "Autoplay next video: ": "Lire automatiquement la vidéo suivante : ",
"Listen by default: ": "Audio Uniquement par défaut : ", "Listen by default: ": "Audio uniquement : ",
"Proxy videos? ": "Souhaitez vous charger les vidéos à travers un proxy ?", "Proxy videos? ": "Charger les vidéos à travers un proxy ? ",
"Default speed: ": "Vitesse par défaut : ", "Default speed: ": "Vitesse par défaut : ",
"Preferred video quality: ": "Qualité vidéo souhaitée : ", "Preferred video quality: ": "Qualité vidéo souhaitée : ",
"Player volume: ": "Volume du lecteur : ", "Player volume: ": "Volume du lecteur : ",
"Default comments: ": "Source des Commentaires : ", "Default comments: ": "Source des commentaires : ",
"Default captions: ": "Sous-titres principal : ", "Default captions: ": "Sous-titres par défaut : ",
"Fallback captions: ": "Sous-titres secondaire : ", "Fallback captions: ": "Fallback captions: ",
"Show related videos? ": "Voir les vidéos liées à ce sujet ? ", "Show related videos? ": "Voir les vidéos liées ? ",
"Visual preferences": "Préférences du site", "Visual preferences": "Préférences du site",
"Dark mode: ": "Mode Sombre : ", "Dark mode: ": "Mode Sombre : ",
"Thin mode: ": "Mode Simplifié : ", "Thin mode: ": "Mode Simplifié : ",
@ -82,13 +82,13 @@
"Watch history": "Historique de visionnage", "Watch history": "Historique de visionnage",
"Delete account": "Supprimer votre compte", "Delete account": "Supprimer votre compte",
"Administrator preferences": "Préferences d'Administrateur", "Administrator preferences": "Préferences d'Administrateur",
"Default homepage: ": "Page d'accueil par defaut :", "Default homepage: ": "Page d'accueil par défaut : ",
"Feed menu: ": "Menu des Flux :", "Feed menu: ": "Menu des Flux : ",
"Top enabled? ": "Top activé ?", "Top enabled? ": "Top activé ? ",
"CAPTCHA enabled? ": "CAPTCHA activé ?", "CAPTCHA enabled? ": "CAPTCHA activé ? ",
"Login enabled? ": "Connexion activé ?", "Login enabled? ": "Connexion activé ? ",
"Registration enabled? ": "Inscription activé ?", "Registration enabled? ": "Inscription activée ? ",
"Report statistics? ": "Telemetrie activé ?", "Report statistics? ": "Télémétrie activé ? ",
"Save preferences": "Enregistrer les préférences", "Save preferences": "Enregistrer les préférences",
"Subscription manager": "Gestionnaire d'abonnement", "Subscription manager": "Gestionnaire d'abonnement",
"`x` subscriptions": "`x` abonnements", "`x` subscriptions": "`x` abonnements",
@ -103,16 +103,18 @@
"View JavaScript license information.": "Voir les informations des licences JavaScript.", "View JavaScript license information.": "Voir les informations des licences JavaScript.",
"View privacy policy.": "Politique de confidentialité", "View privacy policy.": "Politique de confidentialité",
"Trending": "Tendances", "Trending": "Tendances",
"Unlisted": "Non répertoriée",
"Watch video on Youtube": "Voir la vidéo sur Youtube", "Watch video on Youtube": "Voir la vidéo sur Youtube",
"Genre: ": "Genre : ", "Genre: ": "Genre : ",
"License: ": "Licence : ", "License: ": "Licence : ",
"Family friendly? ": "Tout Public ? ", "Family friendly? ": "Tout Public ? ",
"Wilson score: ": "Score de Wilson : ", "Wilson score: ": "Score de Wilson : ",
"Engagement: ": "Poucentage de spectateur aillant aimé Liker ou Disliker la vidéo : ", "Engagement: ": "Poucentage de spectateur aillant aimé Like ou Dislike la vidéo : ",
"Whitelisted regions: ": "Régions en liste blanche : ", "Whitelisted regions: ": "Régions en liste blanche : ",
"Blacklisted regions: ": "Régions sur liste noire : ", "Blacklisted regions: ": "Régions sur liste noire : ",
"Shared `x`": "Partagée `x`", "Shared `x`": "Ajoutée le `x`",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Il semblerait que JavaScript sois désactivé. Cliquez ici pour voir les commentaires. Gardez à l'esprit que le chargement peut prendre plus de temps.", "Premieres in `x`": "Première dans `x`",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Il semblerait que JavaScript soit désactivé. Cliquez ici pour voir les commentaires sans. Gardez à l'esprit que le chargement peut prendre plus de temps.",
"View YouTube comments": "Voir les commentaires YouTube", "View YouTube comments": "Voir les commentaires YouTube",
"View more comments on Reddit": "Voir plus de commentaires sur Reddit", "View more comments on Reddit": "Voir plus de commentaires sur Reddit",
"View `x` comments": "Voir `x` commentaires", "View `x` comments": "Voir `x` commentaires",
@ -124,13 +126,13 @@
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Si vous ne parvenez pas à vous connecter, assurez-vous que l'authentification à deux facteurs (Authenticator ou SMS) est activée.", "Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Si vous ne parvenez pas à vous connecter, assurez-vous que l'authentification à deux facteurs (Authenticator ou SMS) est activée.",
"Invalid TFA code": "Code d'authentification à deux facteurs invalide", "Invalid TFA code": "Code d'authentification à deux facteurs invalide",
"Login failed. This may be because two-factor authentication is not enabled on your account.": "La connexion a échoué. Cela peut être dû au fait que l'authentification à deux facteurs n'est pas activée sur votre compte.", "Login failed. This may be because two-factor authentication is not enabled on your account.": "La connexion a échoué. Cela peut être dû au fait que l'authentification à deux facteurs n'est pas activée sur votre compte.",
"Invalid answer": "Réponse non valide", "Invalid answer": "Réponse invalide",
"Invalid CAPTCHA": "CAPTCHA invalide", "Invalid CAPTCHA": "CAPTCHA invalide",
"CAPTCHA is a required field": "Veuillez rentrez un CAPTCHA", "CAPTCHA is a required field": "Veuillez entrer un CAPTCHA",
"User ID is a required field": "Veuillez rentrez un Identifiant Utilisateur", "User ID is a required field": "Veuillez entrer un Identifiant Utilisateur",
"Password is a required field": "Veuillez rentrez un Mot de passe", "Password is a required field": "Veuillez entrer un Mot de passe",
"Invalid username or password": "Nom d'utilisateur ou mot de passe invalide", "Invalid username or password": "Nom d'utilisateur ou mot de passe invalide",
"Please sign in using 'Sign in with Google'": "Veuillez vous connecter en utilisant \"S'identifier avec Google\"", "Please sign in using 'Sign in with Google'": "Veuillez vous connecter en utilisant \"Se connecter avec Google\"",
"Password cannot be empty": "Le mot de passe ne peut pas être vide", "Password cannot be empty": "Le mot de passe ne peut pas être vide",
"Password cannot be longer than 55 characters": "Le mot de passe ne doit pas comporter plus de 55 caractères", "Password cannot be longer than 55 characters": "Le mot de passe ne doit pas comporter plus de 55 caractères",
"Please sign in": "Veuillez vous connecter", "Please sign in": "Veuillez vous connecter",
@ -268,7 +270,7 @@
"`x` hours": "`x` heures", "`x` hours": "`x` heures",
"`x` minutes": "`x` minutes", "`x` minutes": "`x` minutes",
"`x` seconds": "`x` secondes", "`x` seconds": "`x` secondes",
"Fallback comments: ": "Commentaires secondaires : ", "Fallback comments: ": "Fallback comments: ",
"Popular": "Populaire", "Popular": "Populaire",
"Top": "Top", "Top": "Top",
"About": "A Propos", "About": "A Propos",
@ -289,5 +291,5 @@
"Video mode": "Mode Vidéo", "Video mode": "Mode Vidéo",
"Videos": "Vidéos", "Videos": "Vidéos",
"Playlists": "Liste de lecture", "Playlists": "Liste de lecture",
"Current version: ": "Version actuelle :" "Current version: ": "Version :"
} }

View File

@ -103,6 +103,7 @@
"View JavaScript license information.": "Guarda le informazioni di licenza del codice JavaScript.", "View JavaScript license information.": "Guarda le informazioni di licenza del codice JavaScript.",
"View privacy policy.": "", "View privacy policy.": "",
"Trending": "Tendenze", "Trending": "Tendenze",
"Unlisted": "",
"Watch video on Youtube": "Guarda il video su YouTube", "Watch video on Youtube": "Guarda il video su YouTube",
"Genre: ": "Genere: ", "Genre: ": "Genere: ",
"License: ": "Licenza: ", "License: ": "Licenza: ",
@ -112,6 +113,7 @@
"Whitelisted regions: ": "Regioni nella lista bianca: ", "Whitelisted regions: ": "Regioni nella lista bianca: ",
"Blacklisted regions: ": "Regioni nella lista nera: ", "Blacklisted regions: ": "Regioni nella lista nera: ",
"Shared `x`": "Condiviso `x`", "Shared `x`": "Condiviso `x`",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Ciao! Sembra che tu abbia disattivato JavaScript. Clicca qui per visualizzare i commenti. Considera che potrebbe volerci più tempo.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Ciao! Sembra che tu abbia disattivato JavaScript. Clicca qui per visualizzare i commenti. Considera che potrebbe volerci più tempo.",
"View YouTube comments": "Visualizza i commenti da YouTube", "View YouTube comments": "Visualizza i commenti da YouTube",
"View more comments on Reddit": "Visualizza più commenti su Reddit", "View more comments on Reddit": "Visualizza più commenti su Reddit",

View File

@ -103,6 +103,7 @@
"View JavaScript license information.": "Vis JavaScript-lisensinfo.", "View JavaScript license information.": "Vis JavaScript-lisensinfo.",
"View privacy policy.": "", "View privacy policy.": "",
"Trending": "Trendsettende", "Trending": "Trendsettende",
"Unlisted": "",
"Watch video on Youtube": "Vis video på YouTube", "Watch video on Youtube": "Vis video på YouTube",
"Genre: ": "Sjanger: ", "Genre: ": "Sjanger: ",
"License: ": "Lisens: ", "License: ": "Lisens: ",
@ -112,6 +113,7 @@
"Whitelisted regions: ": "Hvitlistede regioner: ", "Whitelisted regions: ": "Hvitlistede regioner: ",
"Blacklisted regions: ": "Svartelistede regioner: ", "Blacklisted regions: ": "Svartelistede regioner: ",
"Shared `x`": "Delt `x`", "Shared `x`": "Delt `x`",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hei. Det ser ut til at du har JavaScript avslått. Klikk her for å vise kommentarer, ha i minnet at innlasting tar lengre tid.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hei. Det ser ut til at du har JavaScript avslått. Klikk her for å vise kommentarer, ha i minnet at innlasting tar lengre tid.",
"View YouTube comments": "Vis YouTube-kommentarer", "View YouTube comments": "Vis YouTube-kommentarer",
"View more comments on Reddit": "Vis flere kommenterer på Reddit", "View more comments on Reddit": "Vis flere kommenterer på Reddit",

View File

@ -103,6 +103,7 @@
"View JavaScript license information.": "Bekijk JavaScript licentie informatie.", "View JavaScript license information.": "Bekijk JavaScript licentie informatie.",
"View privacy policy.": "", "View privacy policy.": "",
"Trending": "Trending", "Trending": "Trending",
"Unlisted": "",
"Watch video on Youtube": "Bekijk video op Youtube", "Watch video on Youtube": "Bekijk video op Youtube",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
"License: ": "Licentie: ", "License: ": "Licentie: ",
@ -112,6 +113,7 @@
"Whitelisted regions: ": "Toegestane regio's: ", "Whitelisted regions: ": "Toegestane regio's: ",
"Blacklisted regions: ": "Geblokkeerde regio's: ", "Blacklisted regions: ": "Geblokkeerde regio's: ",
"Shared `x`": "`x` gedeeld", "Shared `x`": "`x` gedeeld",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hoi! Het lijkt erop dat je JavaScript uit hebt staan. Klik hier om de reacties te bekijken, hou er rekening mee dat het wat langer duurt om te laden.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hoi! Het lijkt erop dat je JavaScript uit hebt staan. Klik hier om de reacties te bekijken, hou er rekening mee dat het wat langer duurt om te laden.",
"View YouTube comments": "Bekijk YouTube reacties", "View YouTube comments": "Bekijk YouTube reacties",
"View more comments on Reddit": "Bekijk meer reacties op Reddit", "View more comments on Reddit": "Bekijk meer reacties op Reddit",

View File

@ -10,7 +10,7 @@
"newest": "najnowsze", "newest": "najnowsze",
"oldest": "najstarsze", "oldest": "najstarsze",
"popular": "popularne", "popular": "popularne",
"last": "", "last": "ostatnie",
"Next page": "Następna strona", "Next page": "Następna strona",
"Previous page": "Poprzednia strona", "Previous page": "Poprzednia strona",
"Clear watch history?": "Wyczyścić historię?", "Clear watch history?": "Wyczyścić historię?",
@ -50,7 +50,7 @@
"Autoplay: ": "Autoodtwarzanie: ", "Autoplay: ": "Autoodtwarzanie: ",
"Autoplay next video: ": "Odtwórz następny film: ", "Autoplay next video: ": "Odtwórz następny film: ",
"Listen by default: ": "Tryb dźwiękowy: ", "Listen by default: ": "Tryb dźwiękowy: ",
"Proxy videos? ": "", "Proxy videos? ": "Filmy przez proxy? ",
"Default speed: ": "Domyślna prędkość: ", "Default speed: ": "Domyślna prędkość: ",
"Preferred video quality: ": "Preferowana jakość filmów: ", "Preferred video quality: ": "Preferowana jakość filmów: ",
"Player volume: ": "Głośność odtwarzacza: ", "Player volume: ": "Głośność odtwarzacza: ",
@ -101,8 +101,9 @@
"Released under the AGPLv3 by Omar Roth.": "Wydano na licencji AGPLv3 przez Omar Roth.", "Released under the AGPLv3 by Omar Roth.": "Wydano na licencji AGPLv3 przez Omar Roth.",
"Source available here.": "Kod źródłowy dostępny tutaj.", "Source available here.": "Kod źródłowy dostępny tutaj.",
"View JavaScript license information.": "Wyświetl informację o licencji JavaScript.", "View JavaScript license information.": "Wyświetl informację o licencji JavaScript.",
"View privacy policy.": "", "View privacy policy.": "Polityka prywatności.",
"Trending": "Na czasie", "Trending": "Na czasie",
"Unlisted": "",
"Watch video on Youtube": "Zobacz film na YouTube", "Watch video on Youtube": "Zobacz film na YouTube",
"Genre: ": "Gatunek: ", "Genre: ": "Gatunek: ",
"License: ": "Licencja: ", "License: ": "Licencja: ",
@ -112,6 +113,7 @@
"Whitelisted regions: ": "Dostępny na obszarach: ", "Whitelisted regions: ": "Dostępny na obszarach: ",
"Blacklisted regions: ": "Niedostępny na obszarach: ", "Blacklisted regions: ": "Niedostępny na obszarach: ",
"Shared `x`": "Udostępniono `x`", "Shared `x`": "Udostępniono `x`",
"Premieres in `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Cześć! Wygląda na to, że masz wyłączoną obsługę JavaScriptu. Kliknij tutaj, żeby zobaczyć komentarze. Pamiętaj, że wczytywanie może potrwać dłużej.", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Cześć! Wygląda na to, że masz wyłączoną obsługę JavaScriptu. Kliknij tutaj, żeby zobaczyć komentarze. Pamiętaj, że wczytywanie może potrwać dłużej.",
"View YouTube comments": "Wyświetl komentarze z YouTube", "View YouTube comments": "Wyświetl komentarze z YouTube",
"View more comments on Reddit": "Wyświetl więcej komentarzy na Reddicie", "View more comments on Reddit": "Wyświetl więcej komentarzy na Reddicie",
@ -270,7 +272,7 @@
"`x` seconds": "`x` sekund", "`x` seconds": "`x` sekund",
"Fallback comments: ": "Zastępcze komentarze: ", "Fallback comments: ": "Zastępcze komentarze: ",
"Popular": "Popularne", "Popular": "Popularne",
"Top": "Na czasie", "Top": "Najczęściej oglądane",
"About": "Informacje", "About": "Informacje",
"Rating: ": "Ocena: ", "Rating: ": "Ocena: ",
"Language: ": "Język: ", "Language: ": "Język: ",

View File

@ -1,295 +1,297 @@
{ {
"`x` subscribers": "`x` подписчиков", "`x` subscribers": "`x` подписчиков",
"`x` videos": "`x` видео", "`x` videos": "`x` видео",
"LIVE": "ПРЯМОЙ ЭФИР", "LIVE": "ПРЯМОЙ ЭФИР",
"Shared `x` ago": "Опубликовано `x` назад", "Shared `x` ago": "Опубликовано `x` назад",
"Unsubscribe": "Отписаться", "Unsubscribe": "Отписаться",
"Subscribe": "Подписаться", "Subscribe": "Подписаться",
"Login to subscribe to `x`": "Войти, чтобы подписаться на `x`", "Login to subscribe to `x`": "Войти, чтобы подписаться на `x`",
"View channel on YouTube": "Канал на YouTube", "View channel on YouTube": "Канал на YouTube",
"newest": "новые", "newest": "новые",
"oldest": "старые", "oldest": "старые",
"popular": "популярные", "popular": "популярные",
"last": "недавно обновленные", "last": "недавно обновленные",
"Next page": "Следующая страница", "Next page": "Следующая страница",
"Previous page": "Предыдущая страница", "Previous page": "Предыдущая страница",
"Clear watch history?": "Очистить историю просмотров?", "Clear watch history?": "Очистить историю просмотров?",
"Yes": "Да", "Yes": "Да",
"No": "Нет", "No": "Нет",
"Import and Export Data": "Импорт и экспорт данных", "Import and Export Data": "Импорт и экспорт данных",
"Import": "Импорт", "Import": "Импорт",
"Import Invidious data": "Импортировать данные Invidious", "Import Invidious data": "Импортировать данные Invidious",
"Import YouTube subscriptions": "Импортировать YouTube подписки", "Import YouTube subscriptions": "Импортировать YouTube подписки",
"Import FreeTube subscriptions (.db)": "Импортировать FreeTube подписки (.db)", "Import FreeTube subscriptions (.db)": "Импортировать FreeTube подписки (.db)",
"Import NewPipe subscriptions (.json)": "Импортировать NewPipe подписки (.json)", "Import NewPipe subscriptions (.json)": "Импортировать NewPipe подписки (.json)",
"Import NewPipe data (.zip)": "Импортировать данные NewPipe (.zip)", "Import NewPipe data (.zip)": "Импортировать данные NewPipe (.zip)",
"Export": "Экспорт", "Export": "Экспорт",
"Export subscriptions as OPML": "Экспортировать подписки в OPML", "Export subscriptions as OPML": "Экспортировать подписки в OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Экспортировать подписки в OPML (для NewPipe и FreeTube)", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Экспортировать подписки в OPML (для NewPipe и FreeTube)",
"Export data as JSON": "Экспортировать данные в JSON", "Export data as JSON": "Экспортировать данные в JSON",
"Delete account?": "Удалить аккаунт?", "Delete account?": "Удалить аккаунт?",
"History": "История", "History": "История",
"An alternative front-end to YouTube": "Альтернативный фронтенд для YouTube", "An alternative front-end to YouTube": "Альтернативный фронтенд для YouTube",
"JavaScript license information": "Лицензии JavaScript", "JavaScript license information": "Лицензии JavaScript",
"source": "источник", "source": "источник",
"Login": "Войти", "Login": "Войти",
"Login/Register": "Войти/Регистрация", "Login/Register": "Войти/Регистрация",
"Login to Google": "Войти через Google", "Login to Google": "Войти через Google",
"User ID:": "ID пользователя:", "User ID:": "ID пользователя:",
"Password:": "Пароль:", "Password:": "Пароль:",
"Time (h:mm:ss):": "Время (ч:мм:сс):", "Time (h:mm:ss):": "Время (ч:мм:сс):",
"Text CAPTCHA": "Текст капчи", "Text CAPTCHA": "Текст капчи",
"Image CAPTCHA": "Изображение капчи", "Image CAPTCHA": "Изображение капчи",
"Sign In": "Войти", "Sign In": "Войти",
"Register": "Регистрация", "Register": "Регистрация",
"Email:": "Эл. почта:", "Email:": "Эл. почта:",
"Google verification code:": "Код подтверждения Google:", "Google verification code:": "Код подтверждения Google:",
"Preferences": "Настройки", "Preferences": "Настройки",
"Player preferences": "Настройки проигрывателя", "Player preferences": "Настройки проигрывателя",
"Always loop: ": "Всегда повторять: ", "Always loop: ": "Всегда повторять: ",
"Autoplay: ": "Автовоспроизведение: ", "Autoplay: ": "Автовоспроизведение: ",
"Autoplay next video: ": "Автовоспроизведение следующего видео: ", "Autoplay next video: ": "Автовоспроизведение следующего видео: ",
"Listen by default: ": "Режим \"только аудио\" по-умолчанию: ", "Listen by default: ": "Режим \"только аудио\" по-умолчанию: ",
"Proxy videos? ": "Проксировать видео? ", "Proxy videos? ": "Проксировать видео? ",
"Default speed: ": "Скорость по-умолчанию: ", "Default speed: ": "Скорость по-умолчанию: ",
"Preferred video quality: ": "Предпочтительное качество видео: ", "Preferred video quality: ": "Предпочтительное качество видео: ",
"Player volume: ": "Громкость воспроизведения: ", "Player volume: ": "Громкость воспроизведения: ",
"Default comments: ": "Источник комментариев: ", "Default comments: ": "Источник комментариев: ",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "Reddit", "reddit": "Reddit",
"Default captions: ": "Субтитры по-умолчанию: ", "Default captions: ": "Субтитры по-умолчанию: ",
"Fallback captions: ": "Резервные субтитры: ", "Fallback captions: ": "Резервные субтитры: ",
"Show related videos? ": "Показывать похожие видео? ", "Show related videos? ": "Показывать похожие видео? ",
"Visual preferences": "Визуальные настройки", "Visual preferences": "Визуальные настройки",
"Dark mode: ": "Темная тема: ", "Dark mode: ": "Темная тема: ",
"Thin mode: ": "Облегченный режим: ", "Thin mode: ": "Облегченный режим: ",
"Subscription preferences": "Настройки подписок", "Subscription preferences": "Настройки подписок",
"Redirect homepage to feed: ": "Отображать ленту вместо главной страницы: ", "Redirect homepage to feed: ": "Отображать ленту вместо главной страницы: ",
"Number of videos shown in feed: ": "Число видео в ленте: ", "Number of videos shown in feed: ": "Число видео в ленте: ",
"Sort videos by: ": "Сортировать видео по: ", "Sort videos by: ": "Сортировать видео по: ",
"published": "дате публикации", "published": "дате публикации",
"published - reverse": "дате - обратный порядок", "published - reverse": "дате - обратный порядок",
"alphabetically": "алфавиту", "alphabetically": "алфавиту",
"alphabetically - reverse": "алфавиту - обратный порядок", "alphabetically - reverse": "алфавиту - обратный порядок",
"channel name": "имени канала", "channel name": "имени канала",
"channel name - reverse": "имени канала - обратный порядок", "channel name - reverse": "имени канала - обратный порядок",
"Only show latest video from channel: ": "Отображать только последние видео с каждого канала: ", "Only show latest video from channel: ": "Отображать только последние видео с каждого канала: ",
"Only show latest unwatched video from channel: ": "Отображать только непросмотренные видео с каждого канала: ", "Only show latest unwatched video from channel: ": "Отображать только непросмотренные видео с каждого канала: ",
"Only show unwatched: ": "Отображать только непросмотренные видео: ", "Only show unwatched: ": "Отображать только непросмотренные видео: ",
"Only show notifications (if there are any): ": "Отображать только оповещения (если есть): ", "Only show notifications (if there are any): ": "Отображать только оповещения (если есть): ",
"Data preferences": "Настройки данных", "Data preferences": "Настройки данных",
"Clear watch history": "Очистить историю просмотра", "Clear watch history": "Очистить историю просмотра",
"Import/Export data": "Импорт/Экспорт данных", "Import/Export data": "Импорт/Экспорт данных",
"Manage subscriptions": "Управление подписками", "Manage subscriptions": "Управление подписками",
"Watch history": "История просмотров", "Watch history": "История просмотров",
"Delete account": "Удалить аккаунт", "Delete account": "Удалить аккаунт",
"Administrator preferences": "Настройки администратора", "Administrator preferences": "Настройки администратора",
"Default homepage: ": "Главная страница по умолчанию: ", "Default homepage: ": "Главная страница по умолчанию: ",
"Feed menu: ": "Меню ленты: ", "Feed menu: ": "Меню ленты: ",
"Top enabled? ": "Включить ТОП? ", "Top enabled? ": "Включить ТОП? ",
"CAPTCHA enabled? ": "Включить капчу? ", "CAPTCHA enabled? ": "Включить капчу? ",
"Login enabled? ": "Включить логин? ", "Login enabled? ": "Включить логин? ",
"Registration enabled? ": "Включить регистрацию? ", "Registration enabled? ": "Включить регистрацию? ",
"Report statistics? ": "Отображать статистику? ", "Report statistics? ": "Отображать статистику? ",
"Save preferences": "Сохранить настройки", "Save preferences": "Сохранить настройки",
"Subscription manager": "Менеджер подписок", "Subscription manager": "Менеджер подписок",
"`x` subscriptions": "`x` подписок", "`x` subscriptions": "`x` подписок",
"Import/Export": "Импорт/Экспорт", "Import/Export": "Импорт/Экспорт",
"unsubscribe": "отписаться", "unsubscribe": "отписаться",
"Subscriptions": "Подписки", "Subscriptions": "Подписки",
"`x` unseen notifications": "`x` новых оповещений", "`x` unseen notifications": "`x` новых оповещений",
"search": "поиск", "search": "поиск",
"Sign out": "Выйти", "Sign out": "Выйти",
"Released under the AGPLv3 by Omar Roth.": "Распространяется Omar Roth по AGPLv3.", "Released under the AGPLv3 by Omar Roth.": "Распространяется Omar Roth по AGPLv3.",
"Source available here.": "Исходный код доступен здесь.", "Source available here.": "Исходный код доступен здесь.",
"View JavaScript license information.": "Посмотреть лицензии JavaScript кода.", "View JavaScript license information.": "Посмотреть лицензии JavaScript кода.",
"View privacy policy.": "См. политику конфиденциальности.", "View privacy policy.": "См. политику конфиденциальности.",
"Trending": "В тренде", "Trending": "В тренде",
"Watch video on Youtube": "Смотреть на YouTube", "Unlisted": "",
"Genre: ": "Жанр: ", "Watch video on Youtube": "Смотреть на YouTube",
"License: ": "Лицензия: ", "Genre: ": "Жанр: ",
"Family friendly? ": "Семейный просмотр: ", "License: ": "Лицензия: ",
"Wilson score: ": "Рейтинг Вильсона: ", "Family friendly? ": "Семейный просмотр: ",
"Engagement: ": "Вовлеченность: ", "Wilson score: ": "Рейтинг Вильсона: ",
"Whitelisted regions: ": "Доступно для: ", "Engagement: ": "Вовлеченность: ",
"Blacklisted regions: ": "Недоступно для: ", "Whitelisted regions: ": "Доступно для: ",
"Shared `x`": "Опубликовано `x`", "Blacklisted regions: ": "Недоступно для: ",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Похоже, что у Вас отключен JavaScript. Нажмите сюда, чтобы увидеть комментарии (учтите, что они могут загружаться дольше).", "Shared `x`": "Опубликовано `x`",
"View YouTube comments": "Смотреть комментарии с YouTube", "Premieres in `x`": "",
"View more comments on Reddit": "Больше комментариев на Reddit", "Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Похоже, что у Вас отключен JavaScript. Нажмите сюда, чтобы увидеть комментарии (учтите, что они могут загружаться дольше).",
"View `x` comments": "Показать `x` комментариев", "View YouTube comments": "Смотреть комментарии с YouTube",
"View Reddit comments": "Смотреть комментарии с Reddit", "View more comments on Reddit": "Больше комментариев на Reddit",
"Hide replies": "Скрыть ответы", "View `x` comments": "Показать `x` комментариев",
"Show replies": "Показать ответы", "View Reddit comments": "Смотреть комментарии с Reddit",
"Incorrect password": "Неправильный пароль", "Hide replies": "Скрыть ответы",
"Quota exceeded, try again in a few hours": "Превышена квота, попробуйте снова через несколько часов", "Show replies": "Показать ответы",
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Вход не выполнен, проверьте, не включена ли двухфакторная аутентификация.", "Incorrect password": "Неправильный пароль",
"Invalid TFA code": "Неправильный TFA код", "Quota exceeded, try again in a few hours": "Превышена квота, попробуйте снова через несколько часов",
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Не удалось войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.", "Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Вход не выполнен, проверьте, не включена ли двухфакторная аутентификация.",
"Invalid answer": "Неверный ответ", "Invalid TFA code": "Неправильный TFA код",
"Invalid CAPTCHA": "Неверная капча", "Login failed. This may be because two-factor authentication is not enabled on your account.": "Не удалось войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.",
"CAPTCHA is a required field": "Необходимо ввести капчу", "Invalid answer": "Неверный ответ",
"User ID is a required field": "Необходимо ввести идентификатор пользователя", "Invalid CAPTCHA": "Неверная капча",
"Password is a required field": "Необходимо ввести пароль", "CAPTCHA is a required field": "Необходимо ввести капчу",
"Invalid username or password": "Недопустимый пароль или имя пользователя", "User ID is a required field": "Необходимо ввести идентификатор пользователя",
"Please sign in using 'Sign in with Google'": "Пожалуйста войдите через Google", "Password is a required field": "Необходимо ввести пароль",
"Password cannot be empty": "Пароль не может быть пустым", "Invalid username or password": "Недопустимый пароль или имя пользователя",
"Password cannot be longer than 55 characters": "Пароль не может быть длиннее 55 символов", "Please sign in using 'Sign in with Google'": "Пожалуйста войдите через Google",
"Please sign in": "Пожалуйста, войдите", "Password cannot be empty": "Пароль не может быть пустым",
"Invidious Private Feed for `x`": "Приватная лента Invidious для `x`", "Password cannot be longer than 55 characters": "Пароль не может быть длиннее 55 символов",
"channel:`x`": "канал: `x`", "Please sign in": "Пожалуйста, войдите",
"Deleted or invalid channel": "Канал удален или не найден", "Invidious Private Feed for `x`": "Приватная лента Invidious для `x`",
"This channel does not exist.": "Такой канал не существует.", "channel:`x`": "канал: `x`",
"Could not get channel info.": "Невозможно получить информацию о канале.", "Deleted or invalid channel": "Канал удален или не найден",
"Could not fetch comments": "Невозможно получить комментарии", "This channel does not exist.": "Такой канал не существует.",
"View `x` replies": "Показать `x` ответов", "Could not get channel info.": "Невозможно получить информацию о канале.",
"`x` ago": "`x` назад", "Could not fetch comments": "Невозможно получить комментарии",
"Load more": "Загрузить больше", "View `x` replies": "Показать `x` ответов",
"`x` points": "`x` очков", "`x` ago": "`x` назад",
"Could not create mix.": "Невозможно создать \"микс\".", "Load more": "Загрузить больше",
"Playlist is empty": "Плейлист пуст", "`x` points": "`x` очков",
"Invalid playlist.": "Некорректный плейлист.", "Could not create mix.": "Невозможно создать \"микс\".",
"Playlist does not exist.": "Плейлист не существует.", "Playlist is empty": "Плейлист пуст",
"Could not pull trending pages.": "Невозможно получить страницы \"в тренде\".", "Invalid playlist.": "Некорректный плейлист.",
"Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле \"challenge\"", "Playlist does not exist.": "Плейлист не существует.",
"Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле \"токен\"", "Could not pull trending pages.": "Невозможно получить страницы \"в тренде\".",
"Invalid challenge": "Неправильный ответ в \"challenge\"", "Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле \"challenge\"",
"Invalid token": "Неправильный токен", "Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле \"токен\"",
"Invalid user": "Недопустимое имя пользователя", "Invalid challenge": "Неправильный ответ в \"challenge\"",
"Token is expired, please try again": "Срок действия токена истек, попробуйте позже", "Invalid token": "Неправильный токен",
"English": "Английский", "Invalid user": "Недопустимое имя пользователя",
"English (auto-generated)": "Английский (созданы автоматически)", "Token is expired, please try again": "Срок действия токена истек, попробуйте позже",
"Afrikaans": "Африкаанс", "English": "Английский",
"Albanian": "Албанский", "English (auto-generated)": "Английский (созданы автоматически)",
"Amharic": "Амхарский", "Afrikaans": "Африкаанс",
"Arabic": "Арабский", "Albanian": "Албанский",
"Armenian": "Армянский", "Amharic": "Амхарский",
"Azerbaijani": "Азербайджанский", "Arabic": "Арабский",
"Bangla": "Бенгальский", "Armenian": "Армянский",
"Basque": "Баскский", "Azerbaijani": "Азербайджанский",
"Belarusian": "Белорусский", "Bangla": "Бенгальский",
"Bosnian": "Боснийский", "Basque": "Баскский",
"Bulgarian": "Болгарский", "Belarusian": "Белорусский",
"Burmese": "Бирманский", "Bosnian": "Боснийский",
"Catalan": "Каталонский", "Bulgarian": "Болгарский",
"Cebuano": "Себуанский", "Burmese": "Бирманский",
"Chinese (Simplified)": "Китайский (упрощенный)", "Catalan": "Каталонский",
"Chinese (Traditional)": "Китайский (традиционный)", "Cebuano": "Себуанский",
"Corsican": "Корсиканский", "Chinese (Simplified)": "Китайский (упрощенный)",
"Croatian": "Хорватский", "Chinese (Traditional)": "Китайский (традиционный)",
"Czech": "Чешский", "Corsican": "Корсиканский",
"Danish": "Датский", "Croatian": "Хорватский",
"Dutch": "Нидерландский", "Czech": "Чешский",
"Esperanto": "Эсперанто", "Danish": "Датский",
"Estonian": "Эстонский", "Dutch": "Нидерландский",
"Filipino": "Филиппинский", "Esperanto": "Эсперанто",
"Finnish": "Финский", "Estonian": "Эстонский",
"French": "Французский", "Filipino": "Филиппинский",
"Galician": "Галисийский", "Finnish": "Финский",
"Georgian": "Грузинский", "French": "Французский",
"German": "Немецкий", "Galician": "Галисийский",
"Greek": "Греческий", "Georgian": "Грузинский",
"Gujarati": "Гуджаратский", "German": "Немецкий",
"Haitian Creole": "Гаит. креольский", "Greek": "Греческий",
"Hausa": "Хауса", "Gujarati": "Гуджаратский",
"Hawaiian": "Гавайский", "Haitian Creole": "Гаит. креольский",
"Hebrew": "Иврит", "Hausa": "Хауса",
"Hindi": "Хинди", "Hawaiian": "Гавайский",
"Hmong": "Хмонг (мяо)", "Hebrew": "Иврит",
"Hungarian": "Венгерский", "Hindi": "Хинди",
"Icelandic": "Исландский", "Hmong": "Хмонг (мяо)",
"Igbo": "Игбо", "Hungarian": "Венгерский",
"Indonesian": "Индонезийский", "Icelandic": "Исландский",
"Irish": "Ирландский", "Igbo": "Игбо",
"Italian": "Итальянский", "Indonesian": "Индонезийский",
"Japanese": "Японский", "Irish": "Ирландский",
"Javanese": "Яванский", "Italian": "Итальянский",
"Kannada": "Каннада", "Japanese": "Японский",
"Kazakh": "Казахский", "Javanese": "Яванский",
"Khmer": "Кхмерский", "Kannada": "Каннада",
"Korean": "Корейский", "Kazakh": "Казахский",
"Kurdish": "Курдский", "Khmer": "Кхмерский",
"Kyrgyz": "Киргизский", "Korean": "Корейский",
"Lao": "Лаосский", "Kurdish": "Курдский",
"Latin": "Латинский", "Kyrgyz": "Киргизский",
"Latvian": "Латышский", "Lao": "Лаосский",
"Lithuanian": "Литовский", "Latin": "Латинский",
"Luxembourgish": "Люксембургский", "Latvian": "Латышский",
"Macedonian": "Македонский", "Lithuanian": "Литовский",
"Malagasy": "Малагасийский", "Luxembourgish": "Люксембургский",
"Malay": "Малайский", "Macedonian": "Македонский",
"Malayalam": "Малаялам", "Malagasy": "Малагасийский",
"Maltese": "Мальтийский", "Malay": "Малайский",
"Maori": "Маори", "Malayalam": "Малаялам",
"Marathi": "Маратхи", "Maltese": "Мальтийский",
"Mongolian": "Монгольская", "Maori": "Маори",
"Nepali": "Непальский", "Marathi": "Маратхи",
"Norwegian": "Норвежский", "Mongolian": "Монгольская",
"Nyanja": "Ньянджа", "Nepali": "Непальский",
"Pashto": "Пушту", "Norwegian": "Норвежский",
"Persian": "Персидский", "Nyanja": "Ньянджа",
"Polish": "Польский", "Pashto": "Пушту",
"Portuguese": "Португальский", "Persian": "Персидский",
"Punjabi": "Панджаби", "Polish": "Польский",
"Romanian": "Румынский", "Portuguese": "Португальский",
"Russian": "Русский", "Punjabi": "Панджаби",
"Samoan": "Самоанский", "Romanian": "Румынский",
"Scottish Gaelic": "Шотландский (гэльский)", "Russian": "Русский",
"Serbian": "Сербский", "Samoan": "Самоанский",
"Shona": "Шона", "Scottish Gaelic": "Шотландский (гэльский)",
"Sindhi": "Синдхи", "Serbian": "Сербский",
"Sinhala": "Сингальский", "Shona": "Шона",
"Slovak": "Словацкий", "Sindhi": "Синдхи",
"Slovenian": "Словенский", "Sinhala": "Сингальский",
"Somali": "Сомалийский", "Slovak": "Словацкий",
"Southern Sotho": "Сесото (южный сото)", "Slovenian": "Словенский",
"Spanish": "Испанский", "Somali": "Сомалийский",
"Spanish (Latin America)": "Испанский (Латинская Америка)", "Southern Sotho": "Сесото (южный сото)",
"Sundanese": "Сунданский", "Spanish": "Испанский",
"Swahili": "Суахили", "Spanish (Latin America)": "Испанский (Латинская Америка)",
"Swedish": "Шведский", "Sundanese": "Сунданский",
"Tajik": "Таджикский", "Swahili": "Суахили",
"Tamil": "Тамильский", "Swedish": "Шведский",
"Telugu": "Телугу", "Tajik": "Таджикский",
"Thai": "Тайский", "Tamil": "Тамильский",
"Turkish": "Турецкий", "Telugu": "Телугу",
"Ukrainian": "Украинский", "Thai": "Тайский",
"Urdu": "Урду", "Turkish": "Турецкий",
"Uzbek": "Узбекский", "Ukrainian": "Украинский",
"Vietnamese": "Вьетнамский", "Urdu": "Урду",
"Welsh": "Валлийский", "Uzbek": "Узбекский",
"Western Frisian": "Западнофризский", "Vietnamese": "Вьетнамский",
"Xhosa": "Коса", "Welsh": "Валлийский",
"Yiddish": "Идиш", "Western Frisian": "Западнофризский",
"Yoruba": "Йоруба", "Xhosa": "Коса",
"Zulu": "Зулусский", "Yiddish": "Идиш",
"`x` years": "`x` лет", "Yoruba": "Йоруба",
"`x` months": "`x` месяцев", "Zulu": "Зулусский",
"`x` weeks": "`x` недель", "`x` years": "`x` лет",
"`x` days": "`x` дней", "`x` months": "`x` месяцев",
"`x` hours": "`x` часов", "`x` weeks": "`x` недель",
"`x` minutes": "`x` минут", "`x` days": "`x` дней",
"`x` seconds": "`x` секунд", "`x` hours": "`x` часов",
"Fallback comments: ": "Резервные комментарии: ", "`x` minutes": "`x` минут",
"Popular": "Популярное", "`x` seconds": "`x` секунд",
"Top": "Топ", "Fallback comments: ": "Резервные комментарии: ",
"About": "О сайте", "Popular": "Популярное",
"Rating: ": "Рейтинг: ", "Top": "Топ",
"Language: ": "Язык: ", "About": "О сайте",
"Default": "По-умолчанию", "Rating: ": "Рейтинг: ",
"Music": "Музыка", "Language: ": "Язык: ",
"Gaming": "Игры", "Default": "По-умолчанию",
"News": "Новости", "Music": "Музыка",
"Movies": "Фильмы", "Gaming": "Игры",
"Download": "Скачать", "News": "Новости",
"Download as: ": "Скачать как: ", "Movies": "Фильмы",
"%A %B %-d, %Y": "%-d %B %Y, %A", "Download": "Скачать",
"(edited)": "(изменено)", "Download as: ": "Скачать как: ",
"Youtube permalink of the comment": "Прямая ссылка на YouTube", "%A %B %-d, %Y": "%-d %B %Y, %A",
"`x` marked it with a ❤": "❤ от автора канала \"`x`\"", "(edited)": "(изменено)",
"Audio mode": "Аудио режим", "Youtube permalink of the comment": "Прямая ссылка на YouTube",
"Video mode": "Видео режим", "`x` marked it with a ❤": "❤ от автора канала \"`x`\"",
"Videos": "Видео", "Audio mode": "Аудио режим",
"Playlists": "Плейлисты", "Video mode": "Видео режим",
"Current version: ": "Текущая версия: " "Videos": "Видео",
"Playlists": "Плейлисты",
"Current version: ": "Текущая версия: "
} }

View File

@ -242,6 +242,9 @@ get "/api/v1/comments/:id" do |env|
source = env.params.query["source"]? source = env.params.query["source"]?
source ||= "youtube" source ||= "youtube"
thin_mode = env.params.query["thin_mode"]?
thin_mode = thin_mode == "true"
format = env.params.query["format"]? format = env.params.query["format"]?
format ||= "json" format ||= "json"
@ -249,7 +252,7 @@ get "/api/v1/comments/:id" do |env|
if source == "youtube" if source == "youtube"
begin begin
comments = fetch_youtube_comments(id, continuation, proxies, format, locale, region) comments = fetch_youtube_comments(id, continuation, proxies, format, locale, thin_mode, region)
rescue ex rescue ex
error_message = {"error" => ex.message}.to_json error_message = {"error" => ex.message}.to_json
env.response.status_code = 500 env.response.status_code = 500
@ -1688,6 +1691,11 @@ get "/videoplayback" do |env|
fvip = query_params["fvip"]? || "3" fvip = query_params["fvip"]? || "3"
mns = query_params["mn"].split(",") mns = query_params["mn"].split(",")
if query_params["region"]?
region = query_params["region"]
query_params.delete("region")
end
if query_params["host"]? && !query_params["host"].empty? if query_params["host"]? && !query_params["host"].empty?
host = "https://#{query_params["host"]}" host = "https://#{query_params["host"]}"
query_params.delete("host") query_params.delete("host")
@ -1704,8 +1712,6 @@ get "/videoplayback" do |env|
end end
end end
region = query_params["region"]?
response = HTTP::Client::Response.new(403) response = HTTP::Client::Response.new(403)
5.times do 5.times do
begin begin
@ -1725,9 +1731,12 @@ get "/videoplayback" do |env|
if response.headers["Location"]? if response.headers["Location"]?
url = URI.parse(response.headers["Location"]) url = URI.parse(response.headers["Location"])
host = url.host
env.response.headers["Access-Control-Allow-Origin"] = "*" env.response.headers["Access-Control-Allow-Origin"] = "*"
url = url.full_path url = url.full_path
url += "&host=#{host}"
if region if region
url += "&region=#{region}" url += "&region=#{region}"
end end
@ -1744,15 +1753,30 @@ get "/videoplayback" do |env|
client.get(url, headers) do |response| client.get(url, headers) do |response|
env.response.status_code = response.status_code env.response.status_code = response.status_code
if title = env.params.query["title"]?
# https://blog.fastmail.com/2011/06/24/download-non-english-filenames/
env.response.headers["Content-Disposition"] = "attachment; filename=\"#{URI.escape(title)}\"; filename*=UTF-8''#{URI.escape(title)}"
end
response.headers.each do |key, value| response.headers.each do |key, value|
env.response.headers[key] = value env.response.headers[key] = value
end end
if response.headers["Location"]?
url = URI.parse(response.headers["Location"])
host = url.host
env.response.headers["Access-Control-Allow-Origin"] = "*"
url = url.full_path
url += "&host=#{host}"
if region
url += "&region=#{region}"
end
next env.redirect url
end
if title = query_params["title"]?
# https://blog.fastmail.com/2011/06/24/download-non-english-filenames/
env.response.headers["Content-Disposition"] = "attachment; filename=\"#{URI.escape(title)}\"; filename*=UTF-8''#{URI.escape(title)}"
end
env.response.headers["Access-Control-Allow-Origin"] = "*" env.response.headers["Access-Control-Allow-Origin"] = "*"
begin begin

View File

@ -1,4 +1,4 @@
class InvidiousChannel struct InvidiousChannel
add_mapping({ add_mapping({
id: String, id: String,
author: String, author: String,
@ -8,7 +8,7 @@ class InvidiousChannel
}) })
end end
class ChannelVideo struct ChannelVideo
add_mapping({ add_mapping({
id: String, id: String,
title: String, title: String,

View File

@ -29,7 +29,7 @@ class RedditComment
}) })
end end
class RedditLink struct RedditLink
JSON.mapping({ JSON.mapping({
author: String, author: String,
score: Int32, score: Int32,
@ -41,7 +41,7 @@ class RedditLink
}) })
end end
class RedditMore struct RedditMore
JSON.mapping({ JSON.mapping({
children: Array(String), children: Array(String),
count: Int32, count: Int32,
@ -56,7 +56,7 @@ class RedditListing
}) })
end end
def fetch_youtube_comments(id, continuation, proxies, format, locale, region) def fetch_youtube_comments(id, continuation, proxies, format, locale, thin_mode, region)
video = fetch_video(id, proxies, region: region) video = fetch_video(id, proxies, region: region)
session_token = video.info["session_token"]? session_token = video.info["session_token"]?
@ -232,7 +232,7 @@ def fetch_youtube_comments(id, continuation, proxies, format, locale, region)
if format == "html" if format == "html"
comments = JSON.parse(comments) comments = JSON.parse(comments)
content_html = template_youtube_comments(comments, locale) content_html = template_youtube_comments(comments, locale, thin_mode)
comments = JSON.build do |json| comments = JSON.build do |json|
json.object do json.object do
@ -278,7 +278,7 @@ def fetch_reddit_comments(id)
return comments, thread return comments, thread
end end
def template_youtube_comments(comments, locale) def template_youtube_comments(comments, locale, thin_mode)
html = "" html = ""
root = comments["comments"].as_a root = comments["comments"].as_a
@ -297,7 +297,11 @@ def template_youtube_comments(comments, locale)
END_HTML END_HTML
end end
author_thumbnail = "/ggpht#{URI.parse(child["authorThumbnails"][-1]["url"].as_s).full_path}" if !thin_mode
author_thumbnail = "/ggpht#{URI.parse(child["authorThumbnails"][-1]["url"].as_s).full_path}"
else
author_thumbnail = ""
end
html += <<-END_HTML html += <<-END_HTML
<div class="pure-g"> <div class="pure-g">
@ -318,7 +322,12 @@ def template_youtube_comments(comments, locale)
END_HTML END_HTML
if child["creatorHeart"]? if child["creatorHeart"]?
creator_thumbnail = "/ggpht#{URI.parse(child["creatorHeart"]["creatorThumbnail"].as_s).full_path}" if !thin_mode
creator_thumbnail = "/ggpht#{URI.parse(child["creatorHeart"]["creatorThumbnail"].as_s).full_path}"
else
creator_thumbnail = ""
end
html += <<-END_HTML html += <<-END_HTML
<span class="creator-heart-container" title="#{translate(locale, "`x` marked it with a ❤", child["creatorHeart"]["creatorName"].as_s)}"> <span class="creator-heart-container" title="#{translate(locale, "`x` marked it with a ❤", child["creatorHeart"]["creatorName"].as_s)}">
<div class="creator-heart"> <div class="creator-heart">

View File

@ -1,4 +1,4 @@
class Config struct Config
YAML.mapping({ YAML.mapping({
channel_threads: Int32, # Number of threads to use for crawling videos from channels (for updating subscriptions) channel_threads: Int32, # Number of threads to use for crawling videos from channels (for updating subscriptions)
feed_threads: Int32, # Number of threads to use for updating feeds feed_threads: Int32, # Number of threads to use for updating feeds

View File

@ -9,6 +9,17 @@ macro add_mapping(mapping)
DB.mapping({{mapping}}) DB.mapping({{mapping}})
end end
macro json_mapping(mapping)
def initialize({{*mapping.keys.map { |id| "@#{id}".id }}})
end
def to_a
return [{{*mapping.keys.map { |id| "@#{id}".id }}}]
end
JSON.mapping({{mapping}})
end
macro templated(filename, template = "template") macro templated(filename, template = "template")
render "src/invidious/views/#{{{filename}}}.ecr", "src/invidious/views/#{{{template}}}.ecr" render "src/invidious/views/#{{{filename}}}.ecr", "src/invidious/views/#{{{template}}}.ecr"
end end

View File

@ -106,7 +106,7 @@ def subscribe_to_feeds(db, logger, key, config)
if config.use_pubsub_feeds if config.use_pubsub_feeds
spawn do spawn do
loop do loop do
db.query_all("SELECT id FROM channels WHERE CURRENT_TIMESTAMP - subscribed > '4 days'") do |rs| db.query_all("SELECT id FROM channels WHERE CURRENT_TIMESTAMP - subscribed > '4 days' OR subscribed IS NULL") do |rs|
rs.each do rs.each do
ucid = rs.read(String) ucid = rs.read(String)
response = subscribe_pubsub(ucid, key, config) response = subscribe_pubsub(ucid, key, config)

View File

@ -1,4 +1,4 @@
class MixVideo struct MixVideo
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,
@ -10,7 +10,7 @@ class MixVideo
}) })
end end
class Mix struct Mix
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,

View File

@ -1,4 +1,4 @@
class PlaylistVideo struct PlaylistVideo
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,
@ -12,7 +12,7 @@ class PlaylistVideo
}) })
end end
class Playlist struct Playlist
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,

View File

@ -1,4 +1,4 @@
class SearchVideo struct SearchVideo
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,
@ -16,7 +16,7 @@ class SearchVideo
}) })
end end
class SearchPlaylistVideo struct SearchPlaylistVideo
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,
@ -24,7 +24,7 @@ class SearchPlaylistVideo
}) })
end end
class SearchPlaylist struct SearchPlaylist
add_mapping({ add_mapping({
title: String, title: String,
id: String, id: String,
@ -36,7 +36,7 @@ class SearchPlaylist
}) })
end end
class SearchChannel struct SearchChannel
add_mapping({ add_mapping({
author: String, author: String,
ucid: String, ucid: String,

View File

@ -1,12 +1,12 @@
require "crypto/bcrypt/password" require "crypto/bcrypt/password"
class User struct User
module PreferencesConverter module PreferencesConverter
def self.from_rs(rs) def self.from_rs(rs)
begin begin
Preferences.from_json(rs.read(String)) Preferences.from_json(rs.read(String))
rescue ex rescue ex
DEFAULT_USER_PREFERENCES Preferences.from_json("{}")
end end
end end
end end
@ -18,7 +18,6 @@ class User
email: String, email: String,
preferences: { preferences: {
type: Preferences, type: Preferences,
default: DEFAULT_USER_PREFERENCES,
converter: PreferencesConverter, converter: PreferencesConverter,
}, },
password: String?, password: String?,
@ -27,30 +26,30 @@ class User
}) })
end end
DEFAULT_USER_PREFERENCES = Preferences.from_json({ DEFAULT_USER_PREFERENCES = Preferences.new(
"video_loop" => false, video_loop: false,
"autoplay" => false, autoplay: false,
"continue" => false, continue: false,
"local" => false, local: false,
"listen" => false, listen: false,
"speed" => 1.0, speed: 1.0_f32,
"quality" => "hd720", quality: "hd720",
"volume" => 100, volume: 100,
"comments" => ["youtube", ""], comments: ["youtube", ""],
"captions" => ["", "", ""], captions: ["", "", ""],
"related_videos" => true, related_videos: true,
"redirect_feed" => false, redirect_feed: false,
"locale" => "en-US", locale: "en-US",
"dark_mode" => false, dark_mode: false,
"thin_mode" => false, thin_mode: false,
"max_results" => 40, max_results: 40,
"sort" => "published", sort: "published",
"latest_only" => false, latest_only: false,
"unseen_only" => false, unseen_only: false,
"notifications_only" => false, notifications_only: false,
}.to_json) )
class Preferences struct Preferences
module StringToArray module StringToArray
def self.to_json(value : Array(String), json : JSON::Builder) def self.to_json(value : Array(String), json : JSON::Builder)
json.array do json.array do
@ -74,58 +73,27 @@ class Preferences
end end
end end
JSON.mapping({ json_mapping({
video_loop: Bool, video_loop: {type: Bool, default: DEFAULT_USER_PREFERENCES.video_loop},
autoplay: Bool, autoplay: {type: Bool, default: DEFAULT_USER_PREFERENCES.autoplay},
continue: { continue: {type: Bool, default: DEFAULT_USER_PREFERENCES.continue},
type: Bool, local: {type: Bool, default: DEFAULT_USER_PREFERENCES.local},
default: DEFAULT_USER_PREFERENCES.continue, listen: {type: Bool, default: DEFAULT_USER_PREFERENCES.listen},
}, speed: {type: Float32, default: DEFAULT_USER_PREFERENCES.speed},
local: { quality: {type: String, default: DEFAULT_USER_PREFERENCES.quality},
type: Bool, volume: {type: Int32, default: DEFAULT_USER_PREFERENCES.volume},
default: DEFAULT_USER_PREFERENCES.local, comments: {type: Array(String), default: DEFAULT_USER_PREFERENCES.comments, converter: StringToArray},
}, captions: {type: Array(String), default: DEFAULT_USER_PREFERENCES.captions, converter: StringToArray},
listen: { redirect_feed: {type: Bool, default: DEFAULT_USER_PREFERENCES.redirect_feed},
type: Bool, related_videos: {type: Bool, default: DEFAULT_USER_PREFERENCES.related_videos},
default: DEFAULT_USER_PREFERENCES.listen, dark_mode: {type: Bool, default: DEFAULT_USER_PREFERENCES.dark_mode},
}, thin_mode: {type: Bool, default: DEFAULT_USER_PREFERENCES.thin_mode},
speed: Float32, max_results: {type: Int32, default: DEFAULT_USER_PREFERENCES.max_results},
quality: String, sort: {type: String, default: DEFAULT_USER_PREFERENCES.sort},
volume: Int32, latest_only: {type: Bool, default: DEFAULT_USER_PREFERENCES.latest_only},
comments: { unseen_only: {type: Bool, default: DEFAULT_USER_PREFERENCES.unseen_only},
type: Array(String), notifications_only: {type: Bool, default: DEFAULT_USER_PREFERENCES.notifications_only},
default: DEFAULT_USER_PREFERENCES.comments, locale: {type: String, default: DEFAULT_USER_PREFERENCES.locale},
converter: StringToArray,
},
captions: {
type: Array(String),
default: DEFAULT_USER_PREFERENCES.captions,
},
redirect_feed: {
type: Bool,
default: DEFAULT_USER_PREFERENCES.redirect_feed,
},
related_videos: {
type: Bool,
default: DEFAULT_USER_PREFERENCES.related_videos,
},
dark_mode: Bool,
thin_mode: {
type: Bool,
default: DEFAULT_USER_PREFERENCES.thin_mode,
},
max_results: Int32,
sort: String,
latest_only: Bool,
unseen_only: Bool,
notifications_only: {
type: Bool,
default: DEFAULT_USER_PREFERENCES.notifications_only,
},
locale: {
type: String,
default: DEFAULT_USER_PREFERENCES.locale,
},
}) })
end end

View File

@ -241,7 +241,7 @@ VIDEO_FORMATS = {
"251" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 160}, "251" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 160},
} }
class Video struct Video
property player_json : JSON::Any? property player_json : JSON::Any?
module HTTPParamConverter module HTTPParamConverter
@ -251,7 +251,7 @@ class Video
end end
def allow_ratings def allow_ratings
allow_ratings = player_response["videoDetails"].try &.["allowRatings"]?.try &.as_bool allow_ratings = player_response["videoDetails"]?.try &.["allowRatings"]?.try &.as_bool
if allow_ratings.nil? if allow_ratings.nil?
return true return true
@ -271,7 +271,7 @@ class Video
end end
def is_listed def is_listed
is_listed = player_response["videoDetails"].try &.["isCrawlable"]?.try &.as_bool is_listed = player_response["videoDetails"]?.try &.["isCrawlable"]?.try &.as_bool
if is_listed.nil? if is_listed.nil?
return true return true
@ -281,7 +281,7 @@ class Video
end end
def is_upcoming def is_upcoming
is_upcoming = player_response["videoDetails"].try &.["isUpcoming"]?.try &.as_bool is_upcoming = player_response["videoDetails"]?.try &.["isUpcoming"]?.try &.as_bool
if is_upcoming.nil? if is_upcoming.nil?
return false return false
@ -297,7 +297,7 @@ class Video
.try &.["liveStreamabilityRenderer"]? .try &.["liveStreamabilityRenderer"]?
.try &.["offlineSlate"]? .try &.["offlineSlate"]?
.try &.["liveStreamOfflineSlateRenderer"]? .try &.["liveStreamOfflineSlateRenderer"]?
.try &.["scheduledStartTime"].as_s.to_i64 .try &.["scheduledStartTime"]?.try &.as_s.to_i64
end end
if premiere_timestamp if premiere_timestamp
@ -549,7 +549,7 @@ class Video
}) })
end end
class Caption struct Caption
JSON.mapping( JSON.mapping(
name: CaptionName, name: CaptionName,
baseUrl: String, baseUrl: String,
@ -557,7 +557,7 @@ class Caption
) )
end end
class CaptionName struct CaptionName
JSON.mapping( JSON.mapping(
simpleText: String, simpleText: String,
) )