diff --git a/locales/ar.json b/locales/ar.json index 779ea61d..119c36e4 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -86,6 +86,8 @@ "dark": "غامق (اسود)", "light": "فاتح (ابيض)", "Thin mode: ": "الوضع الخفيف: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "تفضيلات الإشتراك", "Show annotations by default for subscribed channels: ": "عرض الملاحظات في الفيديوهات تلقائيا في القنوات المشترك بها فقط: ", "Redirect homepage to feed: ": "إعادة التوجية من الصفحة الرئيسية لصفحة المشتركين (لرؤية اخر فيديوهات المشتركين): ", @@ -161,6 +163,8 @@ "Show more": "أظهر المزيد", "Show less": "عرض اقل", "Watch on YouTube": "مشاهدة الفيديو على اليوتيوب", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "إخفاء الملاحظات فى الفيديو", "Show annotations": "عرض الملاحظات فى الفيديو", "Genre: ": "النوع: ", @@ -415,5 +419,8 @@ "location": "الاماكن", "hdr": "وضع التباين العالي", "filter": "معامل الفرز", - "Current version: ": "الإصدار الحالي: " + "Current version: ": "الإصدار الحالي: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/bn_BD.json b/locales/bn_BD.json index 2d3ace82..83bd6555 100644 --- a/locales/bn_BD.json +++ b/locales/bn_BD.json @@ -80,6 +80,8 @@ "dark": "", "light": "", "Thin mode: ": "", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "", "Show annotations by default for subscribed channels: ": "", "Redirect homepage to feed: ": "", @@ -149,6 +151,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "", "Show annotations": "", "Genre: ": "", @@ -354,5 +358,8 @@ "Videos": "", "Playlists": "", "Community": "", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/cs.json b/locales/cs.json index 4cacf6b9..c8320a07 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -86,6 +86,8 @@ "dark": "tmavý", "light": "světlý", "Thin mode: ": "Kompaktní režim: ", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "Nastavení předplatných", "Show annotations by default for subscribed channels: ": "Ve výchozím nastavení zobrazovat poznámky u odebíraných kanálů: ", "Redirect homepage to feed: ": "Přesměrovávat domovskou stránku na informační kanál: ", @@ -161,6 +163,8 @@ "Show more": "Zobrazit více", "Show less": "Zobrazit méně", "Watch on YouTube": "Sledovat na YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Skrýt vysvětlivky", "Show annotations": "Zobrazit vysvětlivky", "Genre: ": "Žánr: ", @@ -415,5 +419,8 @@ "location": "umístění", "hdr": "HDR", "filter": "filtr", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/da.json b/locales/da.json index cf997bb9..d207939c 100644 --- a/locales/da.json +++ b/locales/da.json @@ -86,6 +86,8 @@ "dark": "mørk", "light": "lys", "Thin mode: ": "Tynd tilstand: ", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "Abonnements præferencer", "Show annotations by default for subscribed channels: ": "Vis annotationer som standard for abonnerede kanaler: ", "Redirect homepage to feed: ": "Omdiriger startside til feed: ", @@ -161,6 +163,8 @@ "Show more": "Vis mere", "Show less": "Vis mindre", "Watch on YouTube": "Se på YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Skjul annotationer", "Show annotations": "Vis annotationer", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/de.json b/locales/de.json index 42e12815..1a8870ec 100644 --- a/locales/de.json +++ b/locales/de.json @@ -86,6 +86,8 @@ "dark": "Nachtmodus", "light": "heller Modus", "Thin mode: ": "Schlanker Modus: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Abonnementeinstellungen", "Show annotations by default for subscribed channels: ": "Anmerkungen für abonnierte Kanäle standardmäßig anzeigen? ", "Redirect homepage to feed: ": "Startseite zu Feed umleiten: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Video auf YouTube ansehen", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Anmerkungen ausblenden", "Show annotations": "Anmerkungen anzeigen", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "Standort", "hdr": "HDR", "filter": "Filtern", - "Current version: ": "Aktuelle Version: " + "Current version: ": "Aktuelle Version: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/el.json b/locales/el.json index c55db8ef..e6aec01a 100644 --- a/locales/el.json +++ b/locales/el.json @@ -86,6 +86,8 @@ "dark": "σκοτεινό", "light": "φωτεινό", "Thin mode: ": "Ελαφριά λειτουργία: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Προτιμήσεις συνδρομών", "Show annotations by default for subscribed channels: ": "Προβολή σημειώσεων μόνο για κανάλια στα οποία είστε συνδρομητής; ", "Redirect homepage to feed: ": "Ανακατεύθυνση αρχικής στη ροή συνδρομών: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Προβολή στο YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Απόκρυψη σημειώσεων", "Show annotations": "Προβολή σημειώσεων", "Genre: ": "Είδος: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Τρέχουσα έκδοση: " + "Current version: ": "Τρέχουσα έκδοση: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/en-US.json b/locales/en-US.json index 01ccdae0..0cddb4c0 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -86,6 +86,8 @@ "dark": "dark", "light": "light", "Thin mode: ": "Thin mode: ", + "Miscellaneous preferences": "Miscellaneous preferences", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "Automaticatic instance redirection (fallback to redirect.invidious.io): ", "Subscription preferences": "Subscription preferences", "Show annotations by default for subscribed channels: ": "Show annotations by default for subscribed channels? ", "Redirect homepage to feed: ": "Redirect homepage to feed: ", @@ -161,6 +163,8 @@ "Show more": "Show more", "Show less": "Show less", "Watch on YouTube": "Watch on YouTube", + "Switch Invidious Instance": "Switch Invidious Instance", + "Broken? Try another Invidious Instance": "Broken? Try another Invidious Instance", "Hide annotations": "Hide annotations", "Show annotations": "Show annotations", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "Location", "hdr": "HDR", "filter": "Filter", - "Current version: ": "Current version: " + "Current version: ": "Current version: ", + "next_steps_error_message": "After which you should try to: ", + "next_steps_error_message_refresh": "Refresh", + "next_steps_error_message_go_to_youtube": "Go to Youtube" } diff --git a/locales/eo.json b/locales/eo.json index 23da15ab..8be07305 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -86,6 +86,8 @@ "dark": "malhela", "light": "hela", "Thin mode: ": "Maldika reĝimo: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Abonaj agordoj", "Show annotations by default for subscribed channels: ": "Ĉu montri prinotojn defaŭlte por abonitaj kanaloj? ", "Redirect homepage to feed: ": "Alidirekti hejmpâgon al fluo: ", @@ -161,6 +163,8 @@ "Show more": "Montri pli", "Show less": "Montri malpli", "Watch on YouTube": "Vidi filmeton en JuTubo", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Kaŝi prinotojn", "Show annotations": "Montri prinotojn", "Genre: ": "Ĝenro: ", @@ -415,5 +419,8 @@ "location": "loko", "hdr": "granddinamikgama", "filter": "filtri", - "Current version: ": "Nuna versio: " + "Current version: ": "Nuna versio: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/es.json b/locales/es.json index 3727cb15..fa377151 100644 --- a/locales/es.json +++ b/locales/es.json @@ -86,6 +86,8 @@ "dark": "oscuro", "light": "claro", "Thin mode: ": "Modo compacto: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferencias de la suscripción", "Show annotations by default for subscribed channels: ": "¿Mostrar anotaciones por defecto para los canales suscritos? ", "Redirect homepage to feed: ": "Redirigir la página de inicio a la fuente: ", @@ -161,6 +163,8 @@ "Show more": "Mostrar más", "Show less": "Mostrar menos", "Watch on YouTube": "Ver el vídeo en Youtube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Ocultar anotaciones", "Show annotations": "Mostrar anotaciones", "Genre: ": "Género: ", @@ -415,5 +419,8 @@ "location": "ubicación", "hdr": "hdr", "filter": "filtro", - "Current version: ": "Versión actual: " + "Current version: ": "Versión actual: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/eu.json b/locales/eu.json index ff1c67b7..34820a50 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -77,6 +77,8 @@ "dark": "iluna", "light": "argia", "Thin mode: ": "", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "Harpidetzen hobespenak", "Show annotations by default for subscribed channels: ": "", "Redirect homepage to feed: ": "", @@ -143,6 +145,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "", "Show annotations": "", "Genre: ": "", @@ -337,5 +341,8 @@ "Videos": "", "Playlists": "", "Community": "", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/fa.json b/locales/fa.json index f8c33b8f..145479ad 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -86,6 +86,8 @@ "dark": "تاریک", "light": "روشن", "Thin mode: ": "حالت نازک: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "ترجیحات اشتراک", "Show annotations by default for subscribed channels: ": "نمایش حاشیه نویسی ها به طور پیشفرض برای کانال های مشترک شده: ", "Redirect homepage to feed: ": "تغییر مسیر صفحه خانه به خوراک: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "تماشا در یوتیوب", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "مخفی کردن حاشیه نویسی ها", "Show annotations": "نمایش حاشیه نویسی ها", "Genre: ": "ژانر: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "نسخه فعلی: " + "Current version: ": "نسخه فعلی: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/fi.json b/locales/fi.json index 2092e994..e9cee129 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -86,6 +86,8 @@ "dark": "tumma", "light": "vaalea", "Thin mode: ": "Kapea tila ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Tilausten asetukset", "Show annotations by default for subscribed channels: ": "Näytä oletuksena tilattujen kanavien huomautukset: ", "Redirect homepage to feed: ": "Uudelleenohjaa kotisivu syötteeseen: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Katso YouTubessa", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Piilota merkkaukset", "Show annotations": "Näytä merkkaukset", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Tämänhetkinen versio: " + "Current version: ": "Tämänhetkinen versio: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/fr.json b/locales/fr.json index e912f913..9bb2fe16 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -87,6 +87,8 @@ "light": "clair", "Thin mode: ": "Mode léger : ", "Subscription preferences": "Préférences des abonnements", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", + "Miscellaneous preferences": "", "Show annotations by default for subscribed channels: ": "Afficher les annotations par défaut sur les chaînes auxquelles vous êtes abonnés : ", "Redirect homepage to feed: ": "Rediriger la page d'accueil vers la page d'abonnements : ", "Number of videos shown in feed: ": "Nombre de vidéos affichées dans la page d'abonnements : ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Voir la vidéo sur Youtube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Masquer les annotations", "Show annotations": "Afficher les annotations", "Genre: ": "Genre : ", @@ -415,5 +419,8 @@ "location": "emplacement", "hdr": "HDR", "filter": "filtrer", - "Current version: ": "Version actuelle : " + "Current version: ": "Version actuelle : ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/he.json b/locales/he.json index d924e11b..5345b93d 100644 --- a/locales/he.json +++ b/locales/he.json @@ -86,6 +86,8 @@ "dark": "כהה", "light": "בהיר", "Thin mode: ": "", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "העדפות מינויים", "Show annotations by default for subscribed channels: ": "Show annotations by default for subscribed channels? ", "Redirect homepage to feed: ": "", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "צפייה ב־YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "", "Show annotations": "", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "מיקום", "hdr": "HDR", "filter": "סינון", - "Current version: ": "הגרסה הנוכחית: " + "Current version: ": "הגרסה הנוכחית: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/hr.json b/locales/hr.json index bebd3859..2f78469b 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -86,6 +86,8 @@ "dark": "tamno", "light": "svijetlo", "Thin mode: ": "Pojednostavljen prikaz: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Postavke pretplata", "Show annotations by default for subscribed channels: ": "Standardno prikaži napomene za pretplaćene kanale: ", "Redirect homepage to feed: ": "Preusmjeri početnu stranicu na feed: ", @@ -161,6 +163,8 @@ "Show more": "Pokaži više", "Show less": "Pokaži manje", "Watch on YouTube": "Gledaj na YouTubeu", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Sakrij napomene", "Show annotations": "Prikaži napomene", "Genre: ": "Žanr: ", @@ -415,5 +419,8 @@ "location": "lokacija", "hdr": "hdr", "filter": "filtar", - "Current version: ": "Trenutačna verzija: " + "Current version: ": "Trenutačna verzija: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/hu-HU.json b/locales/hu-HU.json index 859fdef2..a0c6c17f 100644 --- a/locales/hu-HU.json +++ b/locales/hu-HU.json @@ -77,6 +77,8 @@ "dark": "sötét", "light": "világos", "Thin mode: ": "Vékony mód: ", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "Feliratkozási beállítások", "Show annotations by default for subscribed channels: ": "Szövegmagyarázatok mutatása alapértelmezésben feliratkozott csatornák esetében: ", "Redirect homepage to feed: ": "Kezdő oldal átirányitása a feed-re: ", @@ -145,6 +147,8 @@ "Watch on YouTube": "Megtekintés a YouTube-on", "Hide annotations": "Szövegmagyarázat elrejtése", "Show annotations": "Szövegmagyarázat mutatása", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Genre: ": "Műfaj: ", "License: ": "Licensz: ", "Family friendly? ": "Családbarát? ", @@ -336,5 +340,8 @@ "Videos": "Videók", "Playlists": "Lejátszási listák", "Community": "Közösség", - "Current version: ": "Jelenlegi verzió: " + "Current version: ": "Jelenlegi verzió: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/id.json b/locales/id.json index ce98f87b..679a3403 100644 --- a/locales/id.json +++ b/locales/id.json @@ -86,6 +86,8 @@ "dark": "gelap", "light": "terang", "Thin mode: ": "Mode tipis: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferensi langganan", "Show annotations by default for subscribed channels: ": "Tampilkan anotasi secara default untuk kanal langganan: ", "Redirect homepage to feed: ": "Arahkan kembali laman beranda ke umpan: ", @@ -161,6 +163,8 @@ "Show more": "Tampilkan lainnya", "Show less": "Tampilkan lebih sedikit", "Watch on YouTube": "Tonton di YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Sembunyikan anotasi", "Show annotations": "Tampilkan anotasi", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "lokasi", "hdr": "hdr", "filter": "saring", - "Current version: ": "Versi saat ini: " + "Current version: ": "Versi saat ini: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/is.json b/locales/is.json index a847080a..05893333 100644 --- a/locales/is.json +++ b/locales/is.json @@ -86,6 +86,8 @@ "dark": "dimmt", "light": "ljóst", "Thin mode: ": "Þunnt ham: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Áskriftarstillingar", "Show annotations by default for subscribed channels: ": "Á að sýna glósur sjálfgefið fyrir áskriftarrásir? ", "Redirect homepage to feed: ": "Endurbeina heimasíðu að straumi: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Horfa á YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Fela glósur", "Show annotations": "Sýna glósur", "Genre: ": "Tegund: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Núverandi útgáfa: " + "Current version: ": "Núverandi útgáfa: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/it.json b/locales/it.json index 09b5b447..ec45d2eb 100644 --- a/locales/it.json +++ b/locales/it.json @@ -86,6 +86,8 @@ "dark": "scuro", "light": "chiaro", "Thin mode: ": "Modalità per connessioni lente: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferenze iscrizioni", "Show annotations by default for subscribed channels: ": "Mostrare annotazioni in modo predefinito per i canali sottoscritti: ", "Redirect homepage to feed: ": "Reindirizza la pagina principale a quella delle iscrizioni: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Guarda su YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Nascondi annotazioni", "Show annotations": "Mostra annotazioni", "Genre: ": "Genere: ", @@ -415,5 +419,8 @@ "location": "Posizione", "hdr": "HDR", "filter": "Filtra", - "Current version: ": "Versione attuale: " + "Current version: ": "Versione attuale: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/ja.json b/locales/ja.json index 41d727db..af5dac7a 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -86,6 +86,8 @@ "dark": "ダーク", "light": "ライト", "Thin mode: ": "最小モード: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "登録チャンネル設定", "Show annotations by default for subscribed channels: ": "デフォルトで登録チャンネルのアノテーションを表示しますか? ", "Redirect homepage to feed: ": "ホームからフィードにリダイレクト: ", @@ -161,6 +163,8 @@ "Show more": "表示を増やす", "Show less": "表示を減らす", "Watch on YouTube": "YouTube で視聴", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "アノテーションを隠す", "Show annotations": "アノテーションを表示", "Genre: ": "ジャンル: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "HDR", "filter": "フィルタ", - "Current version: ": "現在のバージョン: " + "Current version: ": "現在のバージョン: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/nb-NO.json b/locales/nb-NO.json index cb95c2dc..6d66527d 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -86,6 +86,8 @@ "dark": "Mørk", "light": "Lys", "Thin mode: ": "Tynt modus: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Abonnementsinnstillinger", "Show annotations by default for subscribed channels: ": "Vis merknader som forvalg for kanaler det abonneres på? ", "Redirect homepage to feed: ": "Videresend hjemmeside til kilde: ", @@ -161,6 +163,8 @@ "Show more": "Vis mer", "Show less": "Vis mindre", "Watch on YouTube": "Vis video på YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Skjul merknader", "Show annotations": "Vis merknader", "Genre: ": "Sjanger: ", @@ -415,5 +419,8 @@ "location": "sted", "hdr": "HDR", "filter": "filtrer", - "Current version: ": "Gjeldende versjon: " + "Current version: ": "Gjeldende versjon: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/nl.json b/locales/nl.json index c9da1875..5f2fa265 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -86,6 +86,8 @@ "dark": "donker", "light": "licht", "Thin mode: ": "Smalle modus: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Abonnementsinstellingen", "Show annotations by default for subscribed channels: ": "Standaard annotaties tonen voor geabonneerde kanalen? ", "Redirect homepage to feed: ": "Startpagina omleiden naar feed: ", @@ -161,6 +163,8 @@ "Show more": "Toon meer", "Show less": "Toon minder", "Watch on YouTube": "Video bekijken op YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Annotaties verbergen", "Show annotations": "Annotaties tonen", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "locatie", "hdr": "HDR", "filter": "verfijnen", - "Current version: ": "Huidige versie: " + "Current version: ": "Huidige versie: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/pl.json b/locales/pl.json index f31293d3..227a9cbb 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -86,6 +86,8 @@ "dark": "ciemny", "light": "jasny", "Thin mode: ": "Tryb minimalny: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferencje subskrybcji", "Show annotations by default for subscribed channels: ": "Domyślnie wyświetlaj adnotacje dla subskrybowanych kanałów: ", "Redirect homepage to feed: ": "Przekieruj stronę główną do subskrybcji: ", @@ -161,6 +163,8 @@ "Show more": "Pokaż więcej", "Show less": "Pokaż mniej", "Watch on YouTube": "Zobacz film na YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Ukryj adnotacje", "Show annotations": "Pokaż adnotacje", "Genre: ": "Gatunek: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "hdr", "filter": "filtr", - "Current version: ": "Aktualna wersja: " + "Current version: ": "Aktualna wersja: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/pt-BR.json b/locales/pt-BR.json index 04971d6c..7810671e 100644 --- a/locales/pt-BR.json +++ b/locales/pt-BR.json @@ -86,6 +86,8 @@ "dark": "escuro", "light": "claro", "Thin mode: ": "Modo compacto: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferências de inscrições", "Show annotations by default for subscribed channels: ": "Sempre mostrar anotações dos vídeos de canais inscritos: ", "Redirect homepage to feed: ": "Redirecionar página inicial para o feed: ", @@ -161,6 +163,8 @@ "Show more": "Mostrar mais", "Show less": "Mostrar menos", "Watch on YouTube": "Assistir no YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Ocultar anotações", "Show annotations": "Mostrar anotações", "Genre: ": "Gênero: ", @@ -415,5 +419,8 @@ "location": "localização", "hdr": "hdr", "filter": "filtro", - "Current version: ": "Versão atual: " + "Current version: ": "Versão atual: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/pt-PT.json b/locales/pt-PT.json index 43ffc7d8..0aa19d3f 100644 --- a/locales/pt-PT.json +++ b/locales/pt-PT.json @@ -86,6 +86,8 @@ "dark": "escuro", "light": "claro", "Thin mode: ": "Modo compacto: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferências de subscrições", "Show annotations by default for subscribed channels: ": "Mostrar sempre anotações aos canais subscritos: ", "Redirect homepage to feed: ": "Redirecionar página inicial para subscrições: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Ver no YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Ocultar anotações", "Show annotations": "Mostrar anotações", "Genre: ": "Género: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Versão atual: " + "Current version: ": "Versão atual: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/ro.json b/locales/ro.json index 498104d8..71e50ca5 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -86,6 +86,8 @@ "dark": "întunecat", "light": "luminos", "Thin mode: ": "Mod lejer: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Preferințele paginii de abonamente", "Show annotations by default for subscribed channels: ": "Afișați adnotările în mod implicit pentru canalele la care v-ați abonat: ", "Redirect homepage to feed: ": "Redirecționați pagina principală la pagina de abonamente: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Urmăriți videoclipul pe YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Ascundeți adnotările", "Show annotations": "Afișați adnotările", "Genre: ": "Categorie: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Versiunea actuală: " + "Current version: ": "Versiunea actuală: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/ru.json b/locales/ru.json index 7d238cd0..15d97862 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -86,6 +86,8 @@ "dark": "темная", "light": "светлая", "Thin mode: ": "Облегчённое оформление: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Настройки подписок", "Show annotations by default for subscribed channels: ": "Всегда показывать аннотации в видео каналов, на которые вы подписаны? ", "Redirect homepage to feed: ": "Отображать видео с каналов, на которые вы подписаны, как главную страницу: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Смотреть на YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Скрыть аннотации", "Show annotations": "Показать аннотации", "Genre: ": "Жанр: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Текущая версия: " + "Current version: ": "Текущая версия: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/si.json b/locales/si.json index 57ed22a3..cbc9bdde 100644 --- a/locales/si.json +++ b/locales/si.json @@ -86,6 +86,8 @@ "dark": "", "light": "", "Thin mode: ": "", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "", "Show annotations by default for subscribed channels: ": "", "Redirect homepage to feed: ": "", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "", "Show annotations": "", "Genre: ": "", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/sk.json b/locales/sk.json index 30495e9a..9330232e 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -80,6 +80,8 @@ "dark": "tmavá", "light": "svetlá", "Thin mode: ": "Tenký režim: ", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "Nastavenia predplatného", "Show annotations by default for subscribed channels: ": "Predvolene zobraziť anotácie odoberaných kanálov: ", "Redirect homepage to feed: ": "Presmerovanie domovskej stránky na informačný kanál: ", @@ -149,6 +151,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "", "Show annotations": "", "Genre: ": "", @@ -354,5 +358,8 @@ "Videos": "", "Playlists": "", "Community": "", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/sr.json b/locales/sr.json index 76f9fab6..4835e9a3 100644 --- a/locales/sr.json +++ b/locales/sr.json @@ -86,6 +86,8 @@ "dark": "", "light": "", "Thin mode: ": "", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "", "Show annotations by default for subscribed channels: ": "", "Redirect homepage to feed: ": "", @@ -415,5 +417,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "" + "Current version: ": "", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json index 6c72c9ed..7ac90fc8 100644 --- a/locales/sr_Cyrl.json +++ b/locales/sr_Cyrl.json @@ -77,6 +77,8 @@ "dark": "тамна", "light": "светла", "Thin mode: ": "Узани режим: ", + "Miscellaneous preferences": "", + "Automatically redirect to another Instance: ": "", "Subscription preferences": "Подешавања о праћењима", "Show annotations by default for subscribed channels: ": "Увек приказуј анотације за канале које пратим: ", "Redirect homepage to feed: ": "Прикажи праћења као почетну страницу: ", @@ -143,6 +145,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Гледајте на YouTube-у", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Сакриј анотације", "Show annotations": "Прикажи анотације", "Genre: ": "Жанр: ", @@ -337,5 +341,8 @@ "Videos": "", "Playlists": "", "Community": "", - "Current version: ": "Тренутна верзија: " + "Current version: ": "Тренутна верзија: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/sv-SE.json b/locales/sv-SE.json index 8b093e7d..911df096 100644 --- a/locales/sv-SE.json +++ b/locales/sv-SE.json @@ -86,6 +86,8 @@ "dark": "Mörkt", "light": "Ljust", "Thin mode: ": "Lättviktigt läge: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Prenumerationsinställningar", "Show annotations by default for subscribed channels: ": "Visa länkar-i-videor som förval för kanaler som prenumereras på? ", "Redirect homepage to feed: ": "Omdirigera hemsida till flöde: ", @@ -161,6 +163,8 @@ "Show more": "Visa mer", "Show less": "Visa mindre", "Watch on YouTube": "Titta på YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Dölj länkar-i-video", "Show annotations": "Visa länkar-i-video", "Genre: ": "Genre: ", @@ -415,5 +419,8 @@ "location": "plats", "hdr": "hdr", "filter": "", - "Current version: ": "Nuvarande version: " + "Current version: ": "Nuvarande version: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/tr.json b/locales/tr.json index e16c1217..436cb512 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -86,6 +86,8 @@ "dark": "karanlık", "light": "aydınlık", "Thin mode: ": "İnce mod: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Abonelik tercihleri", "Show annotations by default for subscribed channels: ": "Abone olunan kanallar için ek açıklamaları öntanımlı olarak göster: ", "Redirect homepage to feed: ": "Ana sayfayı akışa yönlendir: ", @@ -161,6 +163,8 @@ "Show more": "Daha fazla göster", "Show less": "Daha az göster", "Watch on YouTube": "YouTube'da izle", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Ek açıklamaları gizle", "Show annotations": "Ek açıklamaları göster", "Genre: ": "Tür: ", @@ -415,5 +419,8 @@ "location": "konum", "hdr": "HDR", "filter": "filtrele", - "Current version: ": "Şu anki sürüm: " + "Current version: ": "Şu anki sürüm: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/uk.json b/locales/uk.json index 371ecafa..91ac8626 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -86,6 +86,8 @@ "dark": "темна", "light": "Світла", "Thin mode: ": "Полегшене оформлення: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "Налаштування підписок", "Show annotations by default for subscribed channels: ": "Завжди показувати анотації у відео каналів, на які ви підписані? ", "Redirect homepage to feed: ": "Показувати відео з каналів, на які підписані, як головну сторінку: ", @@ -161,6 +163,8 @@ "Show more": "", "Show less": "", "Watch on YouTube": "Дивитися на YouTube", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "Приховати анотації", "Show annotations": "Показати анотації", "Genre: ": "Жанр: ", @@ -415,5 +419,8 @@ "location": "", "hdr": "", "filter": "", - "Current version: ": "Поточна версія: " + "Current version: ": "Поточна версія: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 050e3071..e7150627 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -86,6 +86,8 @@ "dark": "暗色", "light": "亮色", "Thin mode: ": "窄页模式: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "订阅设置", "Show annotations by default for subscribed channels: ": "默认情况下显示已订阅频道的注释: ", "Redirect homepage to feed: ": "跳转主页到 feed: ", @@ -161,6 +163,8 @@ "Show more": "显示更多", "Show less": "显示较少", "Watch on YouTube": "在 YouTube 观看", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "隐藏注释", "Show annotations": "显示注释", "Genre: ": "风格: ", @@ -415,5 +419,8 @@ "location": "位置", "hdr": "hdr", "filter": "过滤器", - "Current version: ": "当前版本: " + "Current version: ": "当前版本: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 1affeb3f..d9a486ef 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -86,6 +86,8 @@ "dark": "深色", "light": "淺色", "Thin mode: ": "精簡模式: ", + "Miscellaneous preferences": "", + "Automaticatic instance redirection (fallback to redirect.invidious.io): ": "", "Subscription preferences": "訂閱偏好設定", "Show annotations by default for subscribed channels: ": "預設為已訂閱的頻道顯示註釋: ", "Redirect homepage to feed: ": "重新導向首頁至 feed: ", @@ -161,6 +163,8 @@ "Show more": "顯示更多", "Show less": "顯示較少", "Watch on YouTube": "在 YouTube 上觀看", + "Switch Invidious Instance": "", + "Broken? Try another Invidious Instance": "", "Hide annotations": "隱藏註釋", "Show annotations": "顯示註釋", "Genre: ": "風格: ", @@ -415,5 +419,8 @@ "location": "位置", "hdr": "HDR", "filter": "篩選條件", - "Current version: ": "目前版本: " + "Current version: ": "目前版本: ", + "next_steps_error_message": "", + "next_steps_error_message_refresh": "", + "next_steps_error_message_go_to_youtube": "" } diff --git a/src/invidious.cr b/src/invidious.cr index 7037ecfe..b1ee1525 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -314,6 +314,7 @@ Invidious::Routing.get "/shorts/:id", Invidious::Routes::Watch, :redirect Invidious::Routing.get "/w/:id", Invidious::Routes::Watch, :redirect Invidious::Routing.get "/v/:id", Invidious::Routes::Watch, :redirect Invidious::Routing.get "/e/:id", Invidious::Routes::Watch, :redirect +Invidious::Routing.get "/redirect", Invidious::Routes::Misc, :cross_instance_redirect Invidious::Routing.get "/embed/", Invidious::Routes::Embed, :redirect Invidious::Routing.get "/embed/:id", Invidious::Routes::Embed, :show diff --git a/src/invidious/helpers/errors.cr b/src/invidious/helpers/errors.cr index 68ced430..e1d02563 100644 --- a/src/invidious/helpers/errors.cr +++ b/src/invidious/helpers/errors.cr @@ -40,6 +40,9 @@ def error_template_helper(env : HTTP::Server::Context, locale : Hash(String, JSO and include the following text in your message:
#{issue_template}
END_HTML + + next_steps = error_redirect_helper(env, locale) + return templated "error" end @@ -47,6 +50,7 @@ def error_template_helper(env : HTTP::Server::Context, locale : Hash(String, JSO env.response.content_type = "text/html" env.response.status_code = status_code error_message = translate(locale, message) + next_steps = error_redirect_helper(env, locale) return templated "error" end @@ -103,3 +107,34 @@ end def error_json_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil, status_code : Int32, message : String) error_json_helper(env, locale, status_code, message, nil) end + +def error_redirect_helper(env : HTTP::Server::Context, locale : Hash(String, JSON::Any) | Nil) + request_path = env.request.path + + if request_path.starts_with?("/search") || request_path.starts_with?("/watch") || + request_path.starts_with?("/channel") || request_path.starts_with?("/playlist?list=PL") + next_steps_text = translate(locale, "next_steps_error_message") + refresh = translate(locale, "next_steps_error_message_refresh") + go_to_youtube = translate(locale, "next_steps_error_message_go_to_youtube") + switch_instance = translate(locale, "Switch Invidious Instance") + + return <<-END_HTML +

#{next_steps_text}

+ + END_HTML + + return next_step_html + else + return "" + end +end diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index 1f92c4ce..0c70cb02 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -44,6 +44,7 @@ struct ConfigPreferences property quality_dash : String = "auto" property default_home : String? = "Popular" property feed_menu : Array(String) = ["Popular", "Trending", "Subscriptions", "Playlists"] + property automatic_instance_redirect : Bool = false property related_videos : Bool = true property sort : String = "published" property speed : Float32 = 1.0_f32 diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index 66ad6961..6ee07d7a 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -409,3 +409,65 @@ def convert_theme(theme) theme end end + +def fetch_random_instance + begin + instance_api_client = HTTP::Client.new(URI.parse("https://api.invidious.io")) + + # Timeouts + instance_api_client.connect_timeout = 10.seconds + instance_api_client.dns_timeout = 10.seconds + + instance_list = JSON.parse(instance_api_client.get("/instances.json").body).as_a + instance_api_client.close + rescue Socket::ConnectError | IO::TimeoutError | JSON::ParseException + instance_list = [] of JSON::Any + end + + filtered_instance_list = [] of String + + instance_list.each do |data| + # TODO Check if current URL is onion instance and use .onion types if so. + if data[1]["type"] == "https" + # Instances can have statisitics disabled, which is an requirement of version validation. + # as_nil? doesn't exist. Thus we'll have to handle the error rasied if as_nil fails. + begin + data[1]["stats"].as_nil + next + rescue TypeCastError + end + + # stats endpoint could also lack the software dict. + next if data[1]["stats"]["software"]?.nil? + + # Makes sure the instance isn't too outdated. + if remote_version = data[1]["stats"]?.try &.["software"]?.try &.["version"] + remote_commit_date = remote_version.as_s.match(/\d{4}\.\d{2}\.\d{2}/) + next if !remote_commit_date + + remote_commit_date = Time.parse(remote_commit_date[0], "%Y.%m.%d", Time::Location::UTC) + local_commit_date = Time.parse(CURRENT_VERSION, "%Y.%m.%d", Time::Location::UTC) + + next if (remote_commit_date - local_commit_date).abs.days > 30 + + begin + data[1]["monitor"].as_nil + health = data[1]["monitor"].as_h["dailyRatios"][0].as_h["ratio"] + filtered_instance_list << data[0].as_s if health.to_s.to_f > 90 + rescue TypeCastError + # We can't check the health if the monitoring is broken. Thus we'll just add it to the list + # and move on. Ideally we'll ignore any instance that has broken health monitoring but due to the fact that + # it's an error that often occurs with all the instances at the same time, we have to just skip the check. + filtered_instance_list << data[0].as_s + end + end + end + end + + # If for some reason no instances managed to get fetched successfully then we'll just redirect to redirect.invidious.io + if filtered_instance_list.size == 0 + return "redirect.invidious.io" + end + + return filtered_instance_list.sample(1)[0] +end diff --git a/src/invidious/routes/misc.cr b/src/invidious/routes/misc.cr index d32ba892..336f7e33 100644 --- a/src/invidious/routes/misc.cr +++ b/src/invidious/routes/misc.cr @@ -35,4 +35,15 @@ class Invidious::Routes::Misc < Invidious::Routes::BaseRoute locale = LOCALES[env.get("preferences").as(Preferences).locale]? rendered "licenses" end + + def cross_instance_redirect(env) + referer = get_referer(env) + + if !env.get("preferences").as(Preferences).automatic_instance_redirect + return env.redirect("https://redirect.invidious.io#{referer}") + end + + instance_url = fetch_random_instance + env.redirect "https://#{instance_url}#{referer}" + end end diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index f98c7a5e..d6002ffd 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -92,6 +92,10 @@ class Invidious::Routes::PreferencesRoute < Invidious::Routes::BaseRoute end end + automatic_instance_redirect = env.params.body["automatic_instance_redirect"]?.try &.as(String) + automatic_instance_redirect ||= "off" + automatic_instance_redirect = automatic_instance_redirect == "on" + locale = env.params.body["locale"]?.try &.as(String) locale ||= CONFIG.default_user_preferences.locale @@ -122,34 +126,35 @@ class Invidious::Routes::PreferencesRoute < Invidious::Routes::BaseRoute # Convert to JSON and back again to take advantage of converters used for compatability preferences = Preferences.from_json({ - annotations: annotations, - annotations_subscribed: annotations_subscribed, - autoplay: autoplay, - captions: captions, - comments: comments, - continue: continue, - continue_autoplay: continue_autoplay, - dark_mode: dark_mode, - latest_only: latest_only, - listen: listen, - local: local, - locale: locale, - max_results: max_results, - notifications_only: notifications_only, - player_style: player_style, - quality: quality, - quality_dash: quality_dash, - default_home: default_home, - feed_menu: feed_menu, - related_videos: related_videos, - sort: sort, - speed: speed, - thin_mode: thin_mode, - unseen_only: unseen_only, - video_loop: video_loop, - volume: volume, - extend_desc: extend_desc, - vr_mode: vr_mode, + annotations: annotations, + annotations_subscribed: annotations_subscribed, + autoplay: autoplay, + captions: captions, + comments: comments, + continue: continue, + continue_autoplay: continue_autoplay, + dark_mode: dark_mode, + latest_only: latest_only, + listen: listen, + local: local, + locale: locale, + max_results: max_results, + notifications_only: notifications_only, + player_style: player_style, + quality: quality, + quality_dash: quality_dash, + default_home: default_home, + feed_menu: feed_menu, + automatic_instance_redirect: automatic_instance_redirect, + related_videos: related_videos, + sort: sort, + speed: speed, + thin_mode: thin_mode, + unseen_only: unseen_only, + video_loop: video_loop, + volume: volume, + extend_desc: extend_desc, + vr_mode: vr_mode, }.to_json).to_json if user = env.get? "user" diff --git a/src/invidious/users.cr b/src/invidious/users.cr index d774ee12..98ef8792 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -36,6 +36,7 @@ struct Preferences property annotations : Bool = CONFIG.default_user_preferences.annotations property annotations_subscribed : Bool = CONFIG.default_user_preferences.annotations_subscribed property autoplay : Bool = CONFIG.default_user_preferences.autoplay + property automatic_instance_redirect : Bool = CONFIG.default_user_preferences.automatic_instance_redirect @[JSON::Field(converter: Preferences::StringToArray)] @[YAML::Field(converter: Preferences::StringToArray)] diff --git a/src/invidious/views/channel.ecr b/src/invidious/views/channel.ecr index 061d7eec..21038394 100644 --- a/src/invidious/views/channel.ecr +++ b/src/invidious/views/channel.ecr @@ -41,6 +41,9 @@
<%= translate(locale, "View channel on YouTube") %> + <% if !channel.auto_generated %>
<%= translate(locale, "Videos") %> diff --git a/src/invidious/views/community.ecr b/src/invidious/views/community.ecr index 3c4eaabb..b0092e5f 100644 --- a/src/invidious/views/community.ecr +++ b/src/invidious/views/community.ecr @@ -40,6 +40,9 @@
<%= translate(locale, "View channel on YouTube") %> + <% if !channel.auto_generated %>
<%= translate(locale, "Videos") %> diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr index 9dfa047e..6f027bee 100644 --- a/src/invidious/views/components/item.ecr +++ b/src/invidious/views/components/item.ecr @@ -137,17 +137,22 @@ <% end %>

<%= HTML.escape(item.title) %>

-

+

<% if item.responds_to?(:premiere_timestamp) && item.premiere_timestamp.try &.> Time.utc %> diff --git a/src/invidious/views/error.ecr b/src/invidious/views/error.ecr index d0752e5b..04eb74d5 100644 --- a/src/invidious/views/error.ecr +++ b/src/invidious/views/error.ecr @@ -4,4 +4,5 @@
<%= error_message %> + <%= next_steps %>
diff --git a/src/invidious/views/playlist.ecr b/src/invidious/views/playlist.ecr index 91156028..a19dd182 100644 --- a/src/invidious/views/playlist.ecr +++ b/src/invidious/views/playlist.ecr @@ -36,6 +36,11 @@ <%= translate(locale, "View playlist on YouTube") %> + | + "> + <%= translate(locale, "Switch Invidious Instance") %> + +
<% end %>
diff --git a/src/invidious/views/playlists.ecr b/src/invidious/views/playlists.ecr index 44bdb94d..975ccd6c 100644 --- a/src/invidious/views/playlists.ecr +++ b/src/invidious/views/playlists.ecr @@ -42,6 +42,11 @@ + + + diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr index 1e1e8cae..c5b64ad6 100644 --- a/src/invidious/views/preferences.ecr +++ b/src/invidious/views/preferences.ecr @@ -176,6 +176,13 @@ <% end %>
+ <%= translate(locale, "Miscellaneous preferences") %> + +
+ + checked<% end %>> +
+ <% if env.get? "user" %> <%= translate(locale, "Subscription preferences") %> diff --git a/src/invidious/views/search.ecr b/src/invidious/views/search.ecr index fefc9fbb..15389dce 100644 --- a/src/invidious/views/search.ecr +++ b/src/invidious/views/search.ecr @@ -2,94 +2,105 @@ <%= search_query.not_nil!.size > 30 ? HTML.escape(query.not_nil![0,30].rstrip(".") + "...") : HTML.escape(query.not_nil!) %> - Invidious <% end %> -
- -

<%= translate(locale, "filter") %>

-
-
-
- <%= translate(locale, "date") %> -
- <% ["hour", "today", "week", "month", "year"].each do |date| %> -
- <% if operator_hash.fetch("date", "all") == date %> - <%= translate(locale, date) %> - <% else %> - &page=<%= page %>"> - <%= translate(locale, date) %> - - <% end %> -
- <% end %> + +<% if count == 0 %> +

+ "><%= translate(locale, "Broken? Try another Invidious Instance!") %> +

+<% else %> +
+ +

<%= translate(locale, "filter") %>

+
+
+
+ <%= translate(locale, "date") %> +
+ <% ["hour", "today", "week", "month", "year"].each do |date| %> +
+ <% if operator_hash.fetch("date", "all") == date %> + <%= translate(locale, date) %> + <% else %> + &page=<%= page %>"> + <%= translate(locale, date) %> + + <% end %> +
+ <% end %> +
+
+ <%= translate(locale, "content_type") %> +
+ <% ["video", "channel", "playlist", "movie", "show"].each do |content_type| %> +
+ <% if operator_hash.fetch("content_type", "all") == content_type %> + <%= translate(locale, content_type) %> + <% else %> + &page=<%= page %>"> + <%= translate(locale, content_type) %> + + <% end %> +
+ <% end %> +
+
+ <%= translate(locale, "duration") %> +
+ <% ["short", "long"].each do |duration| %> +
+ <% if operator_hash.fetch("duration", "all") == duration %> + <%= translate(locale, duration) %> + <% else %> + &page=<%= page %>"> + <%= translate(locale, duration) %> + + <% end %> +
+ <% end %> +
+
+ <%= translate(locale, "features") %> +
+ <% ["hd", "subtitles", "creative_commons", "3d", "live", "purchased", "4k", "360", "location", "hdr"].each do |feature| %> +
+ <% if operator_hash.fetch("features", "all").includes?(feature) %> + <%= translate(locale, feature) %> + <% elsif operator_hash.has_key?("features") %> + &page=<%= page %>"> + <%= translate(locale, feature) %> + + <% else %> + &page=<%= page %>"> + <%= translate(locale, feature) %> + + <% end %> +
+ <% end %> +
+
+ <%= translate(locale, "sort") %> +
+ <% ["relevance", "rating", "date", "views"].each do |sort| %> +
+ <% if operator_hash.fetch("sort", "relevance") == sort %> + <%= translate(locale, sort) %> + <% else %> + &page=<%= page %>"> + <%= translate(locale, sort) %> + + <% end %> +
+ <% end %> +
-
- <%= translate(locale, "content_type") %> -
- <% ["video", "channel", "playlist", "movie", "show"].each do |content_type| %> -
- <% if operator_hash.fetch("content_type", "all") == content_type %> - <%= translate(locale, content_type) %> - <% else %> - &page=<%= page %>"> - <%= translate(locale, content_type) %> - - <% end %> -
- <% end %> -
-
- <%= translate(locale, "duration") %> -
- <% ["short", "long"].each do |duration| %> -
- <% if operator_hash.fetch("duration", "all") == duration %> - <%= translate(locale, duration) %> - <% else %> - &page=<%= page %>"> - <%= translate(locale, duration) %> - - <% end %> -
- <% end %> -
-
- <%= translate(locale, "features") %> -
- <% ["hd", "subtitles", "creative_commons", "3d", "live", "purchased", "4k", "360", "location", "hdr"].each do |feature| %> -
- <% if operator_hash.fetch("features", "all").includes?(feature) %> - <%= translate(locale, feature) %> - <% elsif operator_hash.has_key?("features") %> - &page=<%= page %>"> - <%= translate(locale, feature) %> - - <% else %> - &page=<%= page %>"> - <%= translate(locale, feature) %> - - <% end %> -
- <% end %> -
-
- <%= translate(locale, "sort") %> -
- <% ["relevance", "rating", "date", "views"].each do |sort| %> -
- <% if operator_hash.fetch("sort", "relevance") == sort %> - <%= translate(locale, sort) %> - <% else %> - &page=<%= page %>"> - <%= translate(locale, sort) %> - - <% end %> -
- <% end %> -
-
-
+ +<% end %> -
+<% if count == 0 %> +
+<% else %> +
+<% end %>
diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index baffa08b..91e03725 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -109,6 +109,9 @@ we're going to need to do it here in order to allow for translations. <%= translate(locale, "Watch on YouTube") %> (<%= translate(locale, "Embed") %>) +

+ "><%= translate(locale, "Switch Invidious Instance") %> +