summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--locales/ar.json9
-rw-r--r--locales/bn_BD.json9
-rw-r--r--locales/cs.json9
-rw-r--r--locales/da.json9
-rw-r--r--locales/de.json9
-rw-r--r--locales/el.json9
-rw-r--r--locales/en-US.json9
-rw-r--r--locales/eo.json9
-rw-r--r--locales/es.json9
-rw-r--r--locales/eu.json9
-rw-r--r--locales/fa.json9
-rw-r--r--locales/fi.json9
-rw-r--r--locales/fr.json9
-rw-r--r--locales/he.json9
-rw-r--r--locales/hr.json9
-rw-r--r--locales/hu-HU.json9
-rw-r--r--locales/id.json9
-rw-r--r--locales/is.json9
-rw-r--r--locales/it.json9
-rw-r--r--locales/ja.json9
-rw-r--r--locales/nb-NO.json9
-rw-r--r--locales/nl.json9
-rw-r--r--locales/pl.json9
-rw-r--r--locales/pt-BR.json9
-rw-r--r--locales/pt-PT.json9
-rw-r--r--locales/ro.json9
-rw-r--r--locales/ru.json9
-rw-r--r--locales/si.json9
-rw-r--r--locales/sk.json9
-rw-r--r--locales/sr.json7
-rw-r--r--locales/sr_Cyrl.json9
-rw-r--r--locales/sv-SE.json9
-rw-r--r--locales/tr.json9
-rw-r--r--locales/uk.json9
-rw-r--r--locales/zh-CN.json9
-rw-r--r--locales/zh-TW.json9
-rw-r--r--src/invidious.cr1
-rw-r--r--src/invidious/helpers/errors.cr35
-rw-r--r--src/invidious/helpers/helpers.cr1
-rw-r--r--src/invidious/helpers/utils.cr62
-rw-r--r--src/invidious/routes/misc.cr11
-rw-r--r--src/invidious/routes/preferences.cr61
-rw-r--r--src/invidious/users.cr1
-rw-r--r--src/invidious/views/channel.ecr3
-rw-r--r--src/invidious/views/community.ecr3
-rw-r--r--src/invidious/views/components/item.ecr21
-rw-r--r--src/invidious/views/error.ecr1
-rw-r--r--src/invidious/views/playlist.ecr5
-rw-r--r--src/invidious/views/playlists.ecr5
-rw-r--r--src/invidious/views/preferences.ecr7
-rw-r--r--src/invidious/views/search.ecr183
-rw-r--r--src/invidious/views/watch.ecr3
52 files changed, 567 insertions, 158 deletions
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:
<pre style="padding: 20px; background: rgba(0, 0, 0, 0.12345);">#{issue_template}</pre>
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
+ <p style="margin-bottom: 4px;">#{next_steps_text}</p>
+ <ul>
+ <li>
+ <a href="#{env.request.resource}">#{refresh}</a>
+ </li>
+ <li>
+ <a href="/redirect?referer=#{env.get("current_page")}">#{switch_instance}</a>
+ </li>
+ <li>
+ <a href="https://youtube.com#{env.request.resource}">#{go_to_youtube}</a>
+ </li>
+ </ul>
+ 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 @@
<div class="pure-g h-box">
<div class="pure-u-1-3">
<a href="https://www.youtube.com/channel/<%= channel.ucid %>"><%= translate(locale, "View channel on YouTube") %></a>
+ <div class="pure-u-1 pure-md-1-3">
+ <a href="/redirect?referer=<%= env.get?("current_page") %>"><%= translate(locale, "Switch Invidious Instance") %></a>
+ </div>
<% if !channel.auto_generated %>
<div class="pure-u-1 pure-md-1-3">
<b><%= translate(locale, "Videos") %></b>
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 @@
<div class="pure-g h-box">
<div class="pure-u-1-3">
<a href="https://www.youtube.com/channel/<%= channel.ucid %>/community"><%= translate(locale, "View channel on YouTube") %></a>
+ <div class="pure-u-1 pure-md-1-3">
+ <a href="/redirect?referer=<%= env.get?("current_page") %>"><%= translate(locale, "Switch Invidious Instance") %></a>
+ </div>
<% if !channel.auto_generated %>
<div class="pure-u-1 pure-md-1-3">
<a href="/channel/<%= channel.ucid %>"><%= translate(locale, "Videos") %></a>
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 @@
</a>
<% end %>
<p><a href="/watch?v=<%= item.id %>"><%= HTML.escape(item.title) %></a></p>
- <p style="display: flex;">
+ <div style="display: flex">
<b style="flex: 1;">
<a style="width:100%" href="/channel/<%= item.ucid %>"><%= item.author %></a>
</b>
- <a title="<%=translate(locale, "Watch on YouTube")%>" href="https://www.youtube.com/watch?v=<%= item.id %>" style="margin-right: 5px;">
- <i class="icon ion-logo-youtube"></i>
- </a>
- <a title="<%=translate(locale, "Audio mode")%>" href="/watch?v=<%= item.id %>&amp;listen=1">
- <i class="icon ion-md-headset"></i>
- </a>
- </p>
+ <div class="icon-buttons">
+ <a title="<%=translate(locale, "Watch on YouTube")%>" href="https://www.youtube.com/watch?v=<%= item.id %>">
+ <i class="icon ion-logo-youtube"></i>
+ </a>
+ <a title="<%=translate(locale, "Audio mode")%>" href="/watch?v=<%= item.id %>&amp;listen=1">
+ <i class="icon ion-md-headset"></i>
+ </a>
+ <a title="<%=translate(locale, "Switch Invidious Instance")%>" href="/redirect?referer=<%=HTML.escape("watch?v=#{item.id}")%>">
+ <i class="icon ion-md-jet"></i>
+ </a>
+ </div>
+ </div>
<h5 class="pure-g">
<% 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 @@
<div class="h-box">
<%= error_message %>
+ <%= next_steps %>
</div>
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 @@
<a href="https://www.youtube.com/playlist?list=<%= playlist.id %>">
<%= translate(locale, "View playlist on YouTube") %>
</a>
+ <span> | </span>
+ <a href="/redirect?referer=<%= env.get?("current_page") %>">
+ <%= translate(locale, "Switch Invidious Instance") %>
+ </a>
+
</div>
<% end %>
</div>
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 @@
<div class="pure-u-1 pure-md-1-3">
<a href="https://www.youtube.com/channel/<%= channel.ucid %>/playlists"><%= translate(locale, "View channel on YouTube") %></a>
</div>
+
+ <div class="pure-u-1 pure-md-1-3">
+ <a href="/redirect?referer=<%= env.get?("current_page") %>"><%= translate(locale, "Switch Invidious Instance") %></a>
+ </div>
+
<div class="pure-u-1 pure-md-1-3">
<a href="/channel/<%= channel.ucid %>"><%= translate(locale, "Videos") %></a>
</div>
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 %>
</div>
+ <legend><%= translate(locale, "Miscellaneous preferences") %></legend>
+
+ <div class="pure-control-group">
+ <label for="automatic_instance_redirect"><%= translate(locale, "Automaticatic instance redirection (fallback to redirect.invidious.io): ") %></label>
+ <input name="automatic_instance_redirect" id="automatic_instance_redirect" type="checkbox" <% if preferences.automatic_instance_redirect %>checked<% end %>>
+ </div>
+
<% if env.get? "user" %>
<legend><%= translate(locale, "Subscription preferences") %></legend>
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 @@
<title><%= search_query.not_nil!.size > 30 ? HTML.escape(query.not_nil![0,30].rstrip(".") + "...") : HTML.escape(query.not_nil!) %> - Invidious</title>
<% end %>
-<details id="filters">
- <summary>
- <h3 style="display:inline"> <%= translate(locale, "filter") %> </h3>
- </summary>
- <div id="filters" class="pure-g h-box">
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "date") %></b>
- <hr/>
- <% ["hour", "today", "week", "month", "year"].each do |date| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("date", "all") == date %>
- <b><%= translate(locale, date) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?date:[a-z]+/, "") + " date:" + date) %>&page=<%= page %>">
- <%= translate(locale, date) %>
- </a>
- <% end %>
- </div>
- <% end %>
+<!-- Search redirection and filtering UI -->
+<% if count == 0 %>
+ <h3 style="text-align: center">
+ <a href="/redirect?referer=<%= env.get?("current_page") %>"><%= translate(locale, "Broken? Try another Invidious Instance!") %></a>
+ </h3>
+<% else %>
+ <details id="filters">
+ <summary>
+ <h3 style="display:inline"> <%= translate(locale, "filter") %> </h3>
+ </summary>
+ <div id="filters" class="pure-g h-box">
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "date") %></b>
+ <hr/>
+ <% ["hour", "today", "week", "month", "year"].each do |date| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("date", "all") == date %>
+ <b><%= translate(locale, date) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?date:[a-z]+/, "") + " date:" + date) %>&page=<%= page %>">
+ <%= translate(locale, date) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "content_type") %></b>
+ <hr/>
+ <% ["video", "channel", "playlist", "movie", "show"].each do |content_type| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("content_type", "all") == content_type %>
+ <b><%= translate(locale, content_type) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?content_type:[a-z]+/, "") + " content_type:" + content_type) %>&page=<%= page %>">
+ <%= translate(locale, content_type) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "duration") %></b>
+ <hr/>
+ <% ["short", "long"].each do |duration| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("duration", "all") == duration %>
+ <b><%= translate(locale, duration) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?duration:[a-z]+/, "") + " duration:" + duration) %>&page=<%= page %>">
+ <%= translate(locale, duration) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "features") %></b>
+ <hr/>
+ <% ["hd", "subtitles", "creative_commons", "3d", "live", "purchased", "4k", "360", "location", "hdr"].each do |feature| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("features", "all").includes?(feature) %>
+ <b><%= translate(locale, feature) %></b>
+ <% elsif operator_hash.has_key?("features") %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/features:/, "features:" + feature + ",")) %>&page=<%= page %>">
+ <%= translate(locale, feature) %>
+ </a>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil! + " features:" + feature) %>&page=<%= page %>">
+ <%= translate(locale, feature) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "sort") %></b>
+ <hr/>
+ <% ["relevance", "rating", "date", "views"].each do |sort| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("sort", "relevance") == sort %>
+ <b><%= translate(locale, sort) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?sort:[a-z]+/, "") + " sort:" + sort) %>&page=<%= page %>">
+ <%= translate(locale, sort) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
</div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "content_type") %></b>
- <hr/>
- <% ["video", "channel", "playlist", "movie", "show"].each do |content_type| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("content_type", "all") == content_type %>
- <b><%= translate(locale, content_type) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?content_type:[a-z]+/, "") + " content_type:" + content_type) %>&page=<%= page %>">
- <%= translate(locale, content_type) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "duration") %></b>
- <hr/>
- <% ["short", "long"].each do |duration| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("duration", "all") == duration %>
- <b><%= translate(locale, duration) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?duration:[a-z]+/, "") + " duration:" + duration) %>&page=<%= page %>">
- <%= translate(locale, duration) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "features") %></b>
- <hr/>
- <% ["hd", "subtitles", "creative_commons", "3d", "live", "purchased", "4k", "360", "location", "hdr"].each do |feature| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("features", "all").includes?(feature) %>
- <b><%= translate(locale, feature) %></b>
- <% elsif operator_hash.has_key?("features") %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/features:/, "features:" + feature + ",")) %>&page=<%= page %>">
- <%= translate(locale, feature) %>
- </a>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil! + " features:" + feature) %>&page=<%= page %>">
- <%= translate(locale, feature) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "sort") %></b>
- <hr/>
- <% ["relevance", "rating", "date", "views"].each do |sort| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("sort", "relevance") == sort %>
- <b><%= translate(locale, sort) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?sort:[a-z]+/, "") + " sort:" + sort) %>&page=<%= page %>">
- <%= translate(locale, sort) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- </div>
-</details>
+ </details>
+<% end %>
-<hr/>
+<% if count == 0 %>
+ <hr style="margin: 0;"/>
+<% else %>
+ <hr/>
+<% end %>
<div class="pure-g h-box v-box">
<div class="pure-u-1 pure-u-lg-1-5">
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.
<a href="https://www.youtube.com/watch?v=<%= video.id %>"><%= translate(locale, "Watch on YouTube") %></a>
(<a href="https://www.youtube.com/embed/<%= video.id %>"><%= translate(locale, "Embed") %></a>)
</span>
+ <p id="watch-on-another-invidious-instance">
+ <a href="/redirect?referer=<%= env.get?("current_page") %>"><%= translate(locale, "Switch Invidious Instance") %></a>
+ </p>
<p id="embed-link">
<a href="<%= embed_link %>"><%= translate(locale, "Embed Link") %></a>
</p>