Merge branch 'master' of github.com:iv-org/invidious

This commit is contained in:
テクニカル諏訪子 2022-04-26 16:06:04 +09:00
commit 4f5f0ffaea
58 changed files with 771 additions and 255 deletions

View file

@ -38,9 +38,9 @@ jobs:
matrix:
stable: [true]
crystal:
- 1.0.0
- 1.1.1
- 1.2.2
- 1.3.2
- 1.4.0
include:
- crystal: nightly
stable: false

View file

@ -49,6 +49,42 @@ videojs.Vhs.xhr.beforeRequest = function(options) {
var player = videojs('player', options);
player.on('error', () => {
if (video_data.params.quality !== 'dash') {
if (!player.currentSrc().includes("local=true") && !video_data.local_disabled) {
var currentSources = player.currentSources();
for (var i = 0; i < currentSources.length; i++) {
currentSources[i]["src"] += "&local=true"
}
player.src(currentSources)
}
else if (player.error().code === 2 || player.error().code === 4) {
setTimeout(function (event) {
console.log('An error occurred in the player, reloading...');
var currentTime = player.currentTime();
var playbackRate = player.playbackRate();
var paused = player.paused();
player.load();
if (currentTime > 0.5) currentTime -= 0.5;
player.currentTime(currentTime);
player.playbackRate(playbackRate);
if (!paused) player.play();
}, 10000);
}
}
});
if (video_data.params.quality == 'dash') {
player.reloadSourceOnError({
errorInterval: 10
});
}
/**
* Function for add time argument to url
* @param {String} url
@ -144,27 +180,6 @@ if (isMobile()) {
})
}
player.on('error', function (event) {
if (player.error().code === 2 || player.error().code === 4) {
setTimeout(function (event) {
console.log('An error occurred in the player, reloading...');
var currentTime = player.currentTime();
var playbackRate = player.playbackRate();
var paused = player.paused();
player.load();
if (currentTime > 0.5) currentTime -= 0.5;
player.currentTime(currentTime);
player.playbackRate(playbackRate);
if (!paused) player.play();
}, 5000);
}
});
// Enable VR video support
if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) {
player.crossOrigin("anonymous")
@ -751,7 +766,7 @@ if (window.location.pathname.startsWith("/embed/")) {
// Create hyperlink for current instance
redirect_element = document.createElement("a");
redirect_element.setAttribute("href", `http://${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
redirect_element.setAttribute("href", `//${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
redirect_element.appendChild(document.createTextNode("Invidious"))
watch_on_invidious_button.el().appendChild(redirect_element)

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
FROM crystallang/crystal:1.2.2-alpine AS builder
FROM crystallang/crystal:1.4.0-alpine AS builder
RUN apk add --no-cache sqlite-static yaml-static
ARG release

View file

@ -1,5 +1,5 @@
FROM alpine:3.15 AS builder
RUN apk add --no-cache 'crystal=1.2.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
FROM alpine:edge AS builder
RUN apk add --no-cache 'crystal=1.4.0-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
ARG release
@ -34,7 +34,7 @@ RUN if [ ${release} == 1 ] ; then \
--link-flags "-lxml2 -llzma"; \
fi
FROM alpine:3.15
FROM alpine:edge
RUN apk add --no-cache librsvg ttf-opensans
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \

View file

@ -141,7 +141,6 @@
"Show less": "عرض اقل",
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
"Switch Invidious Instance": "تبديل المثيل Invidious",
"Broken? Try another Invidious Instance": "معطل؟ جرب مثيل Invidious آخر",
"Hide annotations": "إخفاء الملاحظات في الفيديو",
"Show annotations": "عرض الملاحظات في الفيديو",
"Genre: ": "النوع: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "الأماكن",
"search_filters_features_option_hdr": "وضع التباين العالي",
"search_filters_label": "معامل الفرز",
"Current version: ": "الإصدار الحالي: ",
"next_steps_error_message": "بعد ذلك يجب أن تحاول: ",
"next_steps_error_message_refresh": "تحديث",
@ -459,5 +457,6 @@
"Portuguese (Brazil)": "البرتغالية (البرازيل)",
"Russian (auto-generated)": "الروسية (منشأة تلقائيا)",
"Spanish (Spain)": "الإسبانية (إسبانيا)",
"crash_page_search_issue": "بحثت عن <a href=\"`x`\"> المشكلات الموجودة على GitHub </a>"
"crash_page_search_issue": "بحثت عن <a href=\"`x`\"> المشكلات الموجودة على GitHub </a>",
"search_filters_title": "معامل الفرز"
}

View file

@ -262,29 +262,28 @@
"Video mode": "Videový režim",
"Videos": "Videa",
"Community": "Komunita",
"search_filters_sort_option_rating": "hodnocení",
"search_filters_sort_option_date": "datum",
"search_filters_sort_option_views": "zhlédnutí",
"search_filters_duration_label": "délka",
"search_filters_date_option_hour": "hodina",
"search_filters_date_option_today": "dnes",
"search_filters_date_option_week": "týden",
"search_filters_date_option_month": "měsíc",
"search_filters_date_option_year": "rok",
"search_filters_type_option_video": "video",
"search_filters_type_option_channel": "kanál",
"search_filters_type_option_playlist": "playlist",
"search_filters_type_option_movie": "film",
"search_filters_type_option_show": "zobrazit",
"search_filters_sort_option_rating": "Hodnocení",
"search_filters_sort_option_date": "Datum nahrání",
"search_filters_sort_option_views": "Počet zhlédnutí",
"search_filters_duration_label": "Délka",
"search_filters_date_option_hour": "Poslední hodina",
"search_filters_date_option_today": "Dnes",
"search_filters_date_option_week": "Tento týden",
"search_filters_date_option_month": "Tento měsíc",
"search_filters_date_option_year": "Tento rok",
"search_filters_type_option_video": "Video",
"search_filters_type_option_channel": "Kanál",
"search_filters_type_option_playlist": "Playlist",
"search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "Seriál",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "titulky",
"search_filters_features_option_subtitles": "Titulky",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "živě",
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "umístění",
"search_filters_features_option_live": "Živě",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Umístění",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtr",
"generic_count_days_0": "{{count}} dnem",
"generic_count_days_1": "{{count}} dny",
"generic_count_days_2": "{{count}} dny",
@ -374,20 +373,15 @@
"generic_count_minutes_0": "{{count}} minutou",
"generic_count_minutes_1": "{{count}} minutami",
"generic_count_minutes_2": "{{count}} minutami",
"short": "Krátké (< 4 minuty)",
"long": "Dlouhé (> 20 minut)",
"footer_documentation": "Dokumentace",
"next_steps_error_message_refresh": "Obnovit stránku",
"Chinese": "Čínština",
"360": "360°",
"Dutch (auto-generated)": "Nizozemština (automaticky generováno)",
"Erroneous token": "Chybný token",
"tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokeny",
"tokens_count_2": "{{count}} tokenů",
"Portuguese (Brazil)": "Portugalština (Brazílie)",
"content_type": "Typ",
"sort": "Řazení",
"Token is expired, please try again": "Token vypršel, zkuste to prosím znovu",
"English (United States)": "Angličtina (Spojené státy)",
"Cantonese (Hong Kong)": "Kantonština (Hong Kong)",
@ -401,7 +395,6 @@
"%A %B %-d, %Y": "%A %B %-d, %Y",
"YouTube comment permalink": "Permanentní odkaz YouTube komentáře",
"permalink": "permalink",
"purchased": "Zakoupeno",
"footer_original_source_code": "Původní zdrojový kód",
"adminprefs_modified_source_code_url_label": "URL repozitáře s upraveným zdrojovým kódem",
"Video unavailable": "Video není dostupné",
@ -434,11 +427,9 @@
"Erroneous CAPTCHA": "Chybná CAPTCHA",
"Password is a required field": "Heslo je vyžadované pole",
"preferences_automatic_instance_redirect_label": "Automatické přesměrování instance (fallback na redirect.invidious.io): ",
"Broken? Try another Invidious Instance": "Je něco rozbité? Zkuste jinou instanci Invidious",
"Switch Invidious Instance": "Přepnout instanci Invidious",
"Empty playlist": "Prázdný playlist",
"footer_source_code": "Zdrojový kód",
"relevance": "Relevantnost",
"View YouTube comments": "Zobrazit YouTube komentáře",
"Blacklisted regions: ": "Oblasti na černé listině: ",
"Wrong username or password": "Nesprávné uživatelské jméno nebo heslo",
@ -454,7 +445,6 @@
"Deleted or invalid channel": "Smazaný nebo neplatný kanál",
"This channel does not exist.": "Tento kanál neexistuje.",
"Hidden field \"token\" is a required field": "Skryté pole \"token\" je vyžadované",
"features": "Funkce",
"Wilson score: ": "Skóre Wilson: ",
"Shared `x`": "Zveřejněno `x`",
"Premieres in `x`": "Premiéra za `x`",
@ -477,5 +467,24 @@
"Erroneous challenge": "Chybná výzva",
"Premieres `x`": "Premiéra `x`",
"CAPTCHA is a required field": "CAPTCHA je vyžadované pole",
"`x` ago": "Před `x`"
"`x` ago": "Před `x`",
"search_message_change_filters_or_query": "Zkuste rozšířit vyhledávaný dotaz a/nebo změnit filtry.",
"search_filters_date_option_none": "Jakékoli datum",
"search_filters_date_label": "Datum nahrání",
"search_filters_type_option_all": "Jakýkoli typ",
"search_filters_duration_option_none": "Jakákoli délka",
"search_filters_type_label": "Typ",
"search_filters_duration_option_short": "Krátká (< 4 minuty)",
"search_message_no_results": "Nenalezeny žádné výsledky.",
"search_filters_title": "Filtry",
"search_filters_duration_option_medium": "Střední (4 - 20 minut)",
"search_filters_duration_option_long": "Dlouhá (> 20 minut)",
"search_message_use_another_instance": " Můžete také <a href=\"`x`\">hledat na jiné instanci</a>.",
"search_filters_features_label": "Vlastnosti",
"search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_vr180": "VR180",
"search_filters_features_option_purchased": "Zakoupeno",
"search_filters_sort_label": "Řadit dle",
"search_filters_sort_option_relevance": "Relevantnost",
"search_filters_apply_button": "Použít vybrané filtry"
}

View file

@ -215,7 +215,6 @@
"permalink": "permalink",
"search_filters_sort_option_date": "Upload dato",
"search_filters_features_label": "Funktioner",
"search_filters_label": "Filter",
"Khmer": "Khmer",
"Finnish": "Finsk",
"search_filters_date_option_week": "Denne uge",
@ -349,7 +348,6 @@
"next_steps_error_message": "Efter det burde du prøve at: ",
"Sinhala": "Singalesisk (Sinhala)",
"Thai": "Thai",
"Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans",
"No such user": "Brugeren findes ikke",
"Token is expired, please try again": "Token er udløbet, prøv igen",
"Catalan": "Catalansk",
@ -461,5 +459,6 @@
"generic_count_weeks_plural": "{{count}} uger",
"crash_page_you_found_a_bug": "Det ser ud til, at du har fundet en fejl i Invidious!",
"crash_page_read_the_faq": "læs <a href=\"`x`\">Ofte stillede spørgsmål (FAQ)</a>",
"crash_page_search_issue": "søgte efter <a href=\"`x`\">eksisterende problemer på GitHub</a>"
"crash_page_search_issue": "søgte efter <a href=\"`x`\">eksisterende problemer på GitHub</a>",
"search_filters_title": "Filter"
}

View file

@ -141,7 +141,6 @@
"Show less": "Weniger anzeigen",
"Watch on YouTube": "Video auf YouTube ansehen",
"Switch Invidious Instance": "Invidious Instanz wechseln",
"Broken? Try another Invidious Instance": "Kaputt? Versuche eine andere Invidious Instanz",
"Hide annotations": "Anmerkungen ausblenden",
"Show annotations": "Anmerkungen anzeigen",
"Genre: ": "Genre: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Standort",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtern",
"Current version: ": "Aktuelle Version: ",
"next_steps_error_message": "Danach folgendes versuchen: ",
"next_steps_error_message_refresh": "Aktualisieren",
@ -461,5 +459,6 @@
"Chinese (China)": "Chinesisch (China)",
"Chinese (Taiwan)": "Chinesisch (Taiwan)",
"Korean (auto-generated)": "Koreanisch (automatisch generiert)",
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)"
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)",
"search_filters_title": "Filtern"
}

View file

@ -405,7 +405,6 @@
"search_filters_date_option_month": "Αυτόν τον μήνα",
"Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο GitHub.",
"search_filters_sort_label": "Ταξινόμηση κατά",
"search_filters_label": "Φίλτρο",
"search_filters_type_option_movie": "Ταινία",
"footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας",
"search_filters_features_label": "Χαρακτηριστικά",
@ -449,5 +448,6 @@
"videoinfo_youTube_embed_link": "Ενσωμάτωση",
"videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης",
"search_filters_type_option_show": "Μπάρα προόδου διαβάσματος",
"preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: "
"preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: ",
"search_filters_title": "Φίλτρο"
}

View file

@ -141,7 +141,6 @@
"Show less": "Montri malpli",
"Watch on YouTube": "Vidi filmeton en JuTubo",
"Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious",
"Broken? Try another Invidious Instance": "Ĉu misfunkcio? Provu alian instalaĵon de Indivious",
"Hide annotations": "Kaŝi prinotojn",
"Show annotations": "Montri prinotojn",
"Genre: ": "Ĝenro: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "loko",
"search_filters_features_option_hdr": "granddinamikgama",
"search_filters_label": "filtri",
"Current version: ": "Nuna versio: ",
"next_steps_error_message": "Poste, vi provu: ",
"next_steps_error_message_refresh": "Reŝargi",
@ -369,5 +367,6 @@
"footer_original_source_code": "Originala fontkodo",
"footer_donate_page": "Donaci",
"preferences_region_label": "Lando de la enhavo: ",
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: "
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: ",
"search_filters_title": "Filtri"
}

View file

@ -141,7 +141,6 @@
"Show less": "Mostrar menos",
"Watch on YouTube": "Ver el vídeo en YouTube",
"Switch Invidious Instance": "Cambiar Instancia de Invidious",
"Broken? Try another Invidious Instance": "¿Algún error? Prueba otra instancia de Invidious",
"Hide annotations": "Ocultar anotaciones",
"Show annotations": "Mostrar anotaciones",
"Genre: ": "Género: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "ubicación",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtro",
"Current version: ": "Versión actual: ",
"next_steps_error_message": "Después de lo cual deberías intentar: ",
"next_steps_error_message_refresh": "Recargar la página",
@ -459,5 +457,18 @@
"Korean (auto-generated)": "Coreano (generados automáticamente)",
"Spanish (Mexico)": "Español (Méjico)",
"Spanish (auto-generated)": "Español (generados automáticamente)",
"preferences_watch_history_label": "Habilitar historial de reproducciones: "
"preferences_watch_history_label": "Habilitar historial de reproducciones: ",
"search_message_no_results": "No se han encontrado resultados.",
"search_message_change_filters_or_query": "Pruebe ampliar la consulta de búsqueda y/o a cambiar los filtros.",
"search_filters_title": "Filtros",
"search_filters_date_label": "Fecha de subida",
"search_filters_date_option_none": "Cualquier fecha",
"search_filters_type_option_all": "Cualquier tipo",
"search_filters_duration_option_none": "Cualquier duración",
"search_filters_features_option_vr180": "VR180",
"search_filters_apply_button": "Aplicar filtros seleccionados",
"tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} tokens",
"search_message_use_another_instance": " También puede <a href=\"`x`\">buscar en otra instancia</a>.",
"search_filters_duration_option_medium": "Medio (4 - 20 minutes)"
}

View file

@ -243,7 +243,6 @@
"Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da",
"German": "Alemaniarra",
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Ezin izena eman. Izan leike zure konturako berresteko bi faktoreak piztuta ez daudela.",
"Broken? Try another Invidious Instance": "Akatsaren bat? Invidiouseko beste adibide bat saiatu",
"View YouTube comments": "YouTubeko iruzkinak ikusi",
"Google verification code": "Googleren berresteko kodea",
"`x` is live": "'x' bizirik darrai",

View file

@ -148,7 +148,6 @@
"Show less": "نمایش کم‌تر",
"Watch on YouTube": "تماشا در یوتیوب",
"Switch Invidious Instance": "تعویض نمونه اینویدیوس",
"Broken? Try another Invidious Instance": "کار نمی‌کند؟ نمونه دیگری از اینویدیوس را امتحان کنید",
"Hide annotations": "مخفی کردن حاشیه نویسی ها",
"Show annotations": "نمایش حاشیه نویسی ها",
"Genre: ": "ژانر: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "مکان",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "پالایه",
"Current version: ": "نسخه فعلی: ",
"next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ",
"next_steps_error_message_refresh": "تازه‌سازی",
@ -412,5 +410,6 @@
"footer_original_source_code": "کد منبع اصلی",
"search_filters_duration_option_long": "بلند (> 20 دقیقه)",
"adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده",
"search_filters_duration_option_short": "کوتاه (< 4 دقیقه)"
"search_filters_duration_option_short": "کوتاه (< 4 دقیقه)",
"search_filters_title": "پالایه"
}

View file

@ -140,7 +140,6 @@
"Show less": "Näytä vähemmän",
"Watch on YouTube": "Katso YouTubessa",
"Switch Invidious Instance": "Vaihda Invidious-instanssia",
"Broken? Try another Invidious Instance": "Rikki? Kokeile toista Invidious-instanssia",
"Hide annotations": "Piilota merkkaukset",
"Show annotations": "Näytä merkkaukset",
"Genre: ": "Genre: ",
@ -354,7 +353,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Sijainti",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Suodatin",
"Current version: ": "Tämänhetkinen versio: ",
"next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ",
"next_steps_error_message_refresh": "Päivitä",
@ -461,5 +459,16 @@
"Spanish (Mexico)": "Espanja (Meksiko)",
"Spanish (Spain)": "Espanja (Espanja)",
"Turkish (auto-generated)": "Turkki (automaattisesti luotu)",
"Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)"
"Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)",
"search_filters_title": "Suodatin",
"search_message_no_results": "Ei tuloksia löydetty.",
"search_message_change_filters_or_query": "Yritä hakukyselysi laajentamista ja/tai suodattimien muuttamista.",
"search_filters_duration_option_none": "Mikä tahansa kesto",
"search_filters_features_option_vr180": "VR180",
"search_filters_apply_button": "Ota valitut suodattimet käyttöön",
"search_filters_date_label": "Latausaika",
"search_filters_duration_option_medium": "Keskipituinen (4 - 20 minuuttia)",
"search_message_use_another_instance": " Voit myös <a href=\"`x`\">hakea toisella instanssilla</a>.",
"search_filters_date_option_none": "Milloin tahansa",
"search_filters_type_option_all": "Mikä tahansa tyyppi"
}

View file

@ -155,7 +155,6 @@
"Show less": "Afficher moins",
"Watch on YouTube": "Voir la vidéo sur Youtube",
"Switch Invidious Instance": "Changer d'instance",
"Broken? Try another Invidious Instance": "Instance Invidious défectueuse ? Essayez-en une autre",
"Hide annotations": "Masquer les annotations",
"Show annotations": "Afficher les annotations",
"Genre: ": "Genre : ",
@ -361,33 +360,32 @@
"Videos": "Vidéos",
"Playlists": "Listes de lecture",
"Community": "Communauté",
"search_filters_sort_option_relevance": "pertinence",
"search_filters_sort_option_rating": "évaluation",
"search_filters_sort_option_date": "date",
"search_filters_sort_option_views": "nombre de vues",
"search_filters_type_label": "type",
"search_filters_duration_label": "durée",
"search_filters_features_label": "fonctionnalités",
"search_filters_sort_option_relevance": "Pertinence",
"search_filters_sort_option_rating": "Notation",
"search_filters_sort_option_date": "Date d'ajout",
"search_filters_sort_option_views": "Nombre de vues",
"search_filters_type_label": "Type de contenu",
"search_filters_duration_label": "Durée",
"search_filters_features_label": "Fonctionnalités",
"search_filters_sort_label": "Trier par",
"search_filters_date_option_hour": "dernière heure",
"search_filters_date_option_today": "aujourd'hui",
"search_filters_date_option_week": "semaine",
"search_filters_date_option_month": "mois",
"search_filters_date_option_year": "année",
"search_filters_type_option_video": "vidéo",
"search_filters_type_option_channel": "chaîne",
"search_filters_type_option_playlist": "liste de lecture",
"search_filters_type_option_movie": "film",
"search_filters_type_option_show": "émission",
"search_filters_date_option_hour": "Dernière heure",
"search_filters_date_option_today": "Aujourd'hui",
"search_filters_date_option_week": "Cette semaine",
"search_filters_date_option_month": "Ce mois-ci",
"search_filters_date_option_year": "Cette année",
"search_filters_type_option_video": "Vidéo",
"search_filters_type_option_channel": "Chaîne",
"search_filters_type_option_playlist": "Liste de lecture",
"search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "Émission",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "sous-titres / CC",
"search_filters_features_option_subtitles": "Sous-titres (CC)",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "en direct",
"search_filters_features_option_live": "En direct",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "emplacement",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "filtrer",
"Current version: ": "Version actuelle : ",
"next_steps_error_message": "Vous pouvez essayer de : ",
"next_steps_error_message_refresh": "Rafraîchir la page",
@ -420,7 +418,7 @@
"videoinfo_started_streaming_x_ago": "En stream depuis `x`",
"videoinfo_watch_on_youTube": "Regarder sur YouTube",
"videoinfo_youTube_embed_link": "Intégrer",
"search_filters_features_option_purchased": "Acheter",
"search_filters_features_option_purchased": "Acheté",
"videoinfo_invidious_embed_link": "Lien intégré",
"download_subtitles": "Sous-titres - `x` (.vtt)",
"user_saved_playlists": "`x` listes de lecture sauvegardées",
@ -461,5 +459,16 @@
"Vietnamese (auto-generated)": "Vietnamien (auto-généré)",
"Russian (auto-generated)": "Russe (auto-généré)",
"Spanish (Spain)": "Espagnol (Espagne)",
"preferences_watch_history_label": "Activer l'historique de visionnage : "
"preferences_watch_history_label": "Activer l'historique de visionnage : ",
"search_filters_title": "Filtres",
"search_message_change_filters_or_query": "Essayez d'élargir votre recherche et/ou de changer les filtres.",
"search_filters_date_option_none": "Toutes les dates",
"search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)",
"search_filters_apply_button": "Appliquer les filtres",
"search_message_no_results": "Aucun résultat.",
"search_message_use_another_instance": " Vous pouvez également <a href=\"`x`\">effectuer votre recherche sur une autre instance</a>.",
"search_filters_type_option_all": "Tous les types",
"search_filters_date_label": "Date d'ajout",
"search_filters_features_option_vr180": "VR180",
"search_filters_duration_option_none": "Toutes les durées"
}

View file

@ -300,6 +300,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "מיקום",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "סינון",
"Current version: ": "הגרסה הנוכחית: "
"Current version: ": "הגרסה הנוכחית: ",
"search_filters_title": "סינון"
}

View file

@ -141,7 +141,6 @@
"Show less": "Pokaži manje",
"Watch on YouTube": "Gledaj na YouTubeu",
"Switch Invidious Instance": "Promijeni Invidious instancu",
"Broken? Try another Invidious Instance": "Pokvarena? Probaj jednu drugu Invidious instancu",
"Hide annotations": "Sakrij napomene",
"Show annotations": "Prikaži napomene",
"Genre: ": "Žanr: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "lokacija",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtar",
"Current version: ": "Trenutačna verzija: ",
"next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ",
"next_steps_error_message_refresh": "Aktualiziraj stranicu",
@ -477,5 +475,6 @@
"Korean (auto-generated)": "Korejski (automatski generiran)",
"Portuguese (auto-generated)": "Portugalski (automatski generiran)",
"Spanish (auto-generated)": "Španjolski (automatski generiran)",
"preferences_watch_history_label": "Aktiviraj povijest gledanja: "
"preferences_watch_history_label": "Aktiviraj povijest gledanja: ",
"search_filters_title": "Filtar"
}

View file

@ -389,7 +389,6 @@
"Released under the AGPLv3 on Github.": "AGPLv3 licenc alapján a GitHubon",
"search_filters_features_option_three_d": "3D-ben",
"search_filters_features_option_live": "Élőben",
"search_filters_label": "Szűrők",
"next_steps_error_message_refresh": "Újratöltés",
"footer_donate_page": "Adakozás",
"footer_source_code": "Forráskód",
@ -414,7 +413,6 @@
"search_filters_date_option_hour": "Az elmúlt órában",
"search_filters_type_option_movie": "Film",
"search_filters_features_option_hdr": "HDR",
"Broken? Try another Invidious Instance": "Nem működik? Próbáld meg egy másik Invidious oldallal.",
"search_filters_duration_label": "Játékidő",
"next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ",
"Xhosa": "xhosza",
@ -460,5 +458,6 @@
"Italian (auto-generated)": "olasz (automatikusan generált)",
"Dutch (auto-generated)": "holland (automatikusan generált)",
"French (auto-generated)": "francia (automatikusan generált)",
"Vietnamese (auto-generated)": "vietnámi (automatikusan generált)"
"Vietnamese (auto-generated)": "vietnámi (automatikusan generált)",
"search_filters_title": "Szűrők"
}

View file

@ -148,7 +148,6 @@
"Show less": "Tampilkan lebih sedikit",
"Watch on YouTube": "Tonton di YouTube",
"Switch Invidious Instance": "Ganti peladen Invidious",
"Broken? Try another Invidious Instance": "Rusak? Coba peladen Invidious yang lain",
"Hide annotations": "Sembunyikan anotasi",
"Show annotations": "Tampilkan anotasi",
"Genre: ": "Genre: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Lokasi",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Saring",
"Current version: ": "Versi saat ini: ",
"next_steps_error_message": "Setelah itu Anda harus mencoba: ",
"next_steps_error_message_refresh": "Segarkan",
@ -419,5 +417,6 @@
"crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:",
"English (United States)": "Inggris (US)",
"preferences_watch_history_label": "Aktifkan riwayat tontonan: ",
"English (United Kingdom)": "Inggris (UK)"
"English (United Kingdom)": "Inggris (UK)",
"search_filters_title": "Saring"
}

View file

@ -372,7 +372,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Posizione",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtra",
"Current version: ": "Versione attuale: ",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_360p": "360p",
@ -409,22 +408,22 @@
"preferences_automatic_instance_redirect_label": "Reindirizzamento automatico dell'istanza (ripiego su redirect.invidious.io): ",
"Video unavailable": "Video non disponibile",
"preferences_show_nick_label": "Mostra nickname in alto: ",
"short": "Corto (< 4 minuti)",
"videoinfo_youTube_embed_link": "Incorpora",
"videoinfo_invidious_embed_link": "Incorpora collegamento",
"user_created_playlists": "playlist create da `x`",
"preferences_save_player_pos_label": "Memorizza il minutaggio raggiunto dal video: ",
"purchased": "Acquistato",
"preferences_quality_option_dash": "DASH (qualità adattiva)",
"preferences_region_label": "Nazione del contenuto: ",
"preferences_category_misc": "Preferenze varie",
"show": "Serie",
"long": "Lungo (> 20 minuti)",
"next_steps_error_message": "Dopodiché dovresti provare a: ",
"next_steps_error_message_refresh": "Aggiornare",
"footer_donate_page": "Dona",
"footer_source_code": "Codice sorgente",
"adminprefs_modified_source_code_url_label": "Link per il repository del codice sorgente modificato",
"Show more": "Mostra di più",
"Broken? Try another Invidious Instance": "Non funzionante? Prova unaltra istanza Invidious"
"search_filters_title": "Filtra",
"search_filters_type_option_show": "Serie",
"search_filters_duration_option_short": "Corto (< 4 minuti)",
"search_filters_duration_option_long": "Lungo (> 20 minuti)",
"search_filters_features_option_purchased": "Acquistato"
}

View file

@ -148,7 +148,6 @@
"Show less": "表示を減らす",
"Watch on YouTube": "YouTube で視聴",
"Switch Invidious Instance": "Invidiousインスタンスの変更",
"Broken? Try another Invidious Instance": "壊れる違うInvidiousインスタンスを試してみる",
"Hide annotations": "アノテーションを隠す",
"Show annotations": "アノテーションを表示",
"Genre: ": "ジャンル: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "場所",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "フィルタ",
"Current version: ": "現在のバージョン: ",
"next_steps_error_message": "下記のものを試して下さい: ",
"next_steps_error_message_refresh": "再読込",
@ -434,5 +432,6 @@
"Spanish (Mexico)": "スペイン語 (メキシコ)",
"Spanish (Spain)": "スペイン語 (スペイン)",
"Vietnamese (auto-generated)": "ベトナム語 (自動生成)",
"360": "360°"
"search_filters_title": "フィルタ",
"search_filters_features_option_three_sixty": "360°"
}

View file

@ -199,7 +199,6 @@
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_location": "지역",
"search_filters_features_option_four_k": "4K",
"search_filters_label": "필터",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "현재 버전: ",
"next_steps_error_message_refresh": "새로 고침",
@ -298,7 +297,6 @@
"Empty playlist": "재생목록 비어 있음",
"Show annotations": "주석 보이기",
"Hide annotations": "주석 숨기기",
"Broken? Try another Invidious Instance": "안되나요? 다른 Invidious 인스턴스를 시도해보세요",
"Switch Invidious Instance": "Invidious 인스턴스 변경",
"Spanish": "스페인어",
"Southern Sotho": "소토어",
@ -382,5 +380,6 @@
"footer_source_code": "소스 코드",
"footer_original_source_code": "원본 소스 코드",
"footer_modfied_source_code": "수정된 소스 코드",
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL"
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL",
"search_filters_title": "필터"
}

View file

@ -141,7 +141,6 @@
"Show less": "Rodyti mažiau",
"Watch on YouTube": "Žiaurėti Youtube",
"Switch Invidious Instance": "Keisti Invidious šaltinį",
"Broken? Try another Invidious Instance": "Neveikia? Bandyk kitą Invidious šaltinį",
"Hide annotations": "Slėpti anotacijas",
"Show annotations": "Rodyti anotacijas",
"Genre: ": "Žanras: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Vietovė",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtras",
"Current version: ": "Dabartinė versija: ",
"next_steps_error_message": "Po to turėtumėte pabandyti: ",
"next_steps_error_message_refresh": "Atnaujinti",
@ -372,5 +370,6 @@
"preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: ",
"preferences_quality_dash_option_best": "Geriausia",
"preferences_quality_dash_option_worst": "Blogiausia",
"preferences_quality_dash_option_auto": "Automatinis"
"preferences_quality_dash_option_auto": "Automatinis",
"search_filters_title": "Filtras"
}

View file

@ -141,7 +141,6 @@
"Show less": "Vis mindre",
"Watch on YouTube": "Vis video på YouTube",
"Switch Invidious Instance": "Bytt Invidious-instans",
"Broken? Try another Invidious Instance": "Knekt? Forsøk en annen Invidious-instans",
"Hide annotations": "Skjul merknader",
"Show annotations": "Vis merknader",
"Genre: ": "Sjanger: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "sted",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "filtrer",
"Current version: ": "Gjeldende versjon: ",
"next_steps_error_message": "Etterpå bør du prøve dette: ",
"next_steps_error_message_refresh": "Gjenoppfrisk",
@ -461,5 +459,6 @@
"Portuguese (auto-generated)": "Portugisisk (laget automatisk)",
"Russian (auto-generated)": "Russisk (laget automatisk)",
"Dutch (auto-generated)": "Nederlandsk (laget automatisk)",
"Turkish (auto-generated)": "Tyrkisk (laget automatisk)"
"Turkish (auto-generated)": "Tyrkisk (laget automatisk)",
"search_filters_title": "Filtrer"
}

View file

@ -349,7 +349,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "locatie",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "verfijnen",
"Current version: ": "Huidige versie: ",
"Switch Invidious Instance": "Schakel tussen de Invidious Instanties",
"preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ",
@ -366,7 +365,6 @@
"footer_original_source_code": "Originele bron-code",
"footer_modfied_source_code": "Gewijzigde bron-code",
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats",
"Broken? Try another Invidious Instance": "Kapot? Probeer een andere Invidious Instantie",
"next_steps_error_message": "Waarna u moet proberen om: ",
"footer_source_code": "Bron-code",
"search_filters_duration_option_long": "Lang (> 20 minuten)",
@ -398,5 +396,6 @@
"preferences_save_player_pos_label": "Huidig afspeeltijdstip opslaan: ",
"none": "geen",
"search_filters_features_option_purchased": "Gekocht",
"search_filters_features_option_three_sixty": "360º"
"search_filters_features_option_three_sixty": "360º",
"search_filters_title": "Verfijnen"
}

View file

@ -140,7 +140,6 @@
"Show less": "Pokaż mniej",
"Watch on YouTube": "Zobacz film na YouTube",
"Switch Invidious Instance": "Przełącz instancję Invidious",
"Broken? Try another Invidious Instance": "Nie działa? Spróbuj innej instancji Invidious",
"Hide annotations": "Ukryj adnotacje",
"Show annotations": "Pokaż adnotacje",
"Genre: ": "Gatunek: ",
@ -354,7 +353,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "Lokalizacja",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtr",
"Current version: ": "Aktualna wersja: ",
"next_steps_error_message": "Po czym powinien*ś spróbować: ",
"next_steps_error_message_refresh": "Odśwież",
@ -476,5 +474,6 @@
"Japanese (auto-generated)": "japoński (wygenerowany automatycznie)",
"Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)",
"Portuguese (auto-generated)": "portugalski (wygenerowany automatycznie)",
"Portuguese (Brazil)": "portugalski (Brazylia)"
"Portuguese (Brazil)": "portugalski (Brazylia)",
"search_filters_title": "Filtr"
}

View file

@ -143,7 +143,6 @@
"Show less": "Mostrar menos",
"Watch on YouTube": "Assistir no YouTube",
"Switch Invidious Instance": "Mudar a instância do Invidious",
"Broken? Try another Invidious Instance": "Quebrou? Tente outra Instância do Invidious",
"Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações",
"Genre: ": "Gênero: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "localização",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtro",
"Current version: ": "Versão atual: ",
"next_steps_error_message": "Depois disso, você deve tentar: ",
"next_steps_error_message_refresh": "Atualizar",
@ -437,5 +435,6 @@
"user_created_playlists": "`x` listas de reprodução criadas",
"user_saved_playlists": "`x` listas de reprodução salvas",
"Video unavailable": "Vídeo indisponível",
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`"
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`",
"search_filters_title": "Filtro"
}

View file

@ -143,7 +143,6 @@
"Show less": "Mostrar menos",
"Watch on YouTube": "Ver no YouTube",
"Switch Invidious Instance": "Mudar a instância do Invidious",
"Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious",
"Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações",
"Genre: ": "Género: ",
@ -371,9 +370,9 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Localização",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtro",
"Current version: ": "Versão atual: ",
"next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Atualizar",
"next_steps_error_message_go_to_youtube": "Ir ao YouTube"
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
"search_filters_title": "Filtro"
}

View file

@ -4,7 +4,6 @@
"search_filters_sort_option_date": "Data de envio",
"search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_relevance": "Relevância",
"Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious",
"Switch Invidious Instance": "Mudar a instância do Invidious",
"Show less": "Mostrar menos",
"Show more": "Mostrar mais",
@ -17,7 +16,6 @@
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
"next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Atualizar",
"search_filters_label": "Filtro",
"search_filters_features_option_hdr": "HDR",
"search_filters_features_option_location": "Localização",
"search_filters_features_option_four_k": "4K",
@ -437,5 +435,6 @@
"crash_page_read_the_faq": "leu as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
"crash_page_search_issue": "procurou se <a href=\"`x`\">o erro já foi reportado no GitHub</a>",
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto tal qual (NÃO o traduza):",
"user_created_playlists": "`x` listas de reprodução criadas"
"user_created_playlists": "`x` listas de reprodução criadas",
"search_filters_title": "Filtro"
}

View file

@ -21,7 +21,7 @@
"No": "Nu",
"Import and Export Data": "Importați și Exportați Datele",
"Import": "Importați",
"Import Invidious data": "Importați Datele de pe Invidious",
"Import Invidious data": "Importați datele JSON de pe Invidious",
"Import YouTube subscriptions": "Importați abonamentele de pe YouTube",
"Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)",
@ -29,7 +29,7 @@
"Export": "Exportați",
"Export subscriptions as OPML": "Exportați abonamentele în format OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportați abonamentele în format OPML (pentru NewPipe și FreeTube)",
"Export data as JSON": "Exportați datele în format JSON",
"Export data as JSON": "Exportați datele Invidious în format JSON",
"Delete account?": "Sunteți siguri că doriți să vă ștergeți contul?",
"History": "Istoric",
"An alternative front-end to YouTube": "O alternativă front-end pentru YouTube",
@ -155,7 +155,7 @@
"Hide replies": "Ascundeți replicile",
"Show replies": "Afișați replicile",
"Incorrect password": "Parolă incorectă",
"Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore.",
"Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore",
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Conectare eșuată. Dacă nu reușiți să vă conectați, verificați dacă ați activat autentificarea cu doi factori (Autentificator sau SMS).",
"Invalid TFA code": "Codul de autentificare cu doi factori este invalid",
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Conectare eșuată. Acest lucru ar putea fi cauzat de faptul că nu ați activat autentificarea cu doi factori.",
@ -174,7 +174,7 @@
"Deleted or invalid channel": "Canal șters sau invalid",
"This channel does not exist.": "Acest canal nu există.",
"Could not get channel info.": "Nu am putut primi informații despre acest canal.",
"Could not fetch comments": "Încărcarea comentariilor a eșuat.",
"Could not fetch comments": "Încărcarea comentariilor a eșuat",
"`x` ago": "acum `x`",
"Load more": "Vedeți mai mult",
"Could not create mix.": "Nu am putut crea această listă de redare.",
@ -187,7 +187,7 @@
"Erroneous challenge": "Challenge invalid",
"Erroneous token": "Token invalid",
"No such user": "Acest utilizator nu există",
"Token is expired, please try again": "Token-ul este expirat, vă rugăm să reîncercați.",
"Token is expired, please try again": "Jetonul a expirat, vă rugăm să încercați din nou",
"English": "Engleză",
"English (auto-generated)": "Engleză (generată automat)",
"Afrikaans": "Afrikaans",
@ -295,7 +295,7 @@
"Yoruba": "Yoruba",
"Zulu": "Zoulou",
"Fallback comments: ": "Comentarii alternative: ",
"Popular": "Popular",
"Popular": "Populare",
"Top": "Top",
"About": "Despre",
"Rating: ": "Evaluare: ",
@ -318,5 +318,173 @@
"Videos": "Videoclipuri",
"Playlists": "Liste de redare",
"Community": "Comunitate",
"Current version: ": "Versiunea actuală: "
"Current version: ": "Versiunea actuală: ",
"crash_page_read_the_faq": "citit lista <a href=\"`x`\">Întrebărilor Frecvente (FAQ)</a>",
"generic_count_days_0": "{{count}} zi",
"generic_count_days_1": "{{count}} zile",
"generic_count_days_2": "{{count}} de zile",
"generic_count_hours_0": "{{count}} oră",
"generic_count_hours_1": "{{count}} ore",
"generic_count_hours_2": "{{count}} de ore",
"generic_count_minutes_0": "{{count}} minut",
"generic_count_minutes_1": "{{count}} minute",
"generic_count_minutes_2": "{{count}} de minute",
"generic_views_count_0": "{{count}} vizionare",
"generic_views_count_1": "{{count}} vizionări",
"generic_views_count_2": "{{count}} de vizionări",
"subscriptions_unseen_notifs_count_0": "{{count}} notificare neverificată",
"subscriptions_unseen_notifs_count_1": "{{count}} notificări neverificate",
"subscriptions_unseen_notifs_count_2": "{{count}} de notificări neverificate",
"crash_page_refresh": "încercat să <a href=\"`x`\">reîmprospătați pagina</a>",
"crash_page_switch_instance": "am încercat să <a href=\"`x`\">folosim o altă instanță</a>",
"preferences_watch_history_label": "Activează istoricul: ",
"invidious": "Invidious",
"preferences_vr_mode_label": "Videoclipuri interactive de 360 de grade (necesită WebGL): ",
"English (United Kingdom)": "Engleză (Regatul Unit)",
"English (United States)": "Engleză (Statele Unite ale Americii)",
"Chinese": "Chineză",
"Chinese (China)": "Chineză (China)",
"Chinese (Hong Kong)": "Chineză (Hong Kong)",
"Chinese (Taiwan)": "Chineză (Taiwan)",
"Cantonese (Hong Kong)": "Cantoneză (Hong Kong)",
"Portuguese (auto-generated)": "Portugheză (generată automat)",
"Portuguese (Brazil)": "Portugheză (Brazilia)",
"Russian (auto-generated)": "Rusă (generată automat)",
"Turkish (auto-generated)": "Turcă (generată automat)",
"Vietnamese (auto-generated)": "Vietnameză (generată automat)",
"videoinfo_started_streaming_x_ago": "În direct de acum `x`",
"preferences_quality_dash_option_2160p": "2160p",
"footer_modfied_source_code": "Codul sursă modificat",
"preferences_quality_dash_label": "Calitatea video DASH preferată: ",
"generic_videos_count_0": "{{count}} videoclip",
"generic_videos_count_1": "{{count}} videoclipuri",
"generic_videos_count_2": "{{count}} de videoclipuri",
"generic_playlists_count_0": "{{count}} playlist",
"generic_playlists_count_1": "{{count}} playlisturi",
"generic_playlists_count_2": "{{count}} de playlisturi",
"tokens_count_0": "{{count}} jeton",
"tokens_count_1": "{{count}} jetoane",
"tokens_count_2": "{{count}} de jetoane",
"comments_points_count_0": "{{count}} punct",
"comments_points_count_1": "{{count}} puncte",
"comments_points_count_2": "{{count}} de puncte",
"Spanish (Spain)": "Spaniolă (Spania)",
"Video unavailable": "Videoclip indisponibil",
"crash_page_search_issue": "căutat <a href=\"`x`\">sugestiile existente pe GitHub</a>",
"Show more": "Afișați mai mult",
"Released under the AGPLv3 on Github.": "Lansat sub licența AGPLv3 pe GitHub.",
"preferences_quality_option_dash": "DASH (calitate adaptativă)",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_small": "Mică",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_1080p": "1080p",
"preferences_category_misc": "Setări diverse",
"preferences_automatic_instance_redirect_label": "Redirecționare automată de instanță (trecere prin redirect.invidious.io): ",
"preferences_quality_dash_option_480p": "480p",
"preferences_quality_option_medium": "Medie",
"Switch Invidious Instance": "Schimbă instanța Invidious",
"preferences_quality_dash_option_720p": "720p",
"preferences_quality_dash_option_auto": "Automatică",
"preferences_quality_dash_option_best": "Cea mai bună",
"preferences_quality_dash_option_worst": "Cea mai redusă",
"preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_option_360p": "360p",
"preferences_region_label": "Țară de conținut: ",
"preferences_extend_desc_label": "Extindeți automat descrierea: ",
"preferences_show_nick_label": "Afișați numele de utilizator pe partea de sus: ",
"generic_subscribers_count_0": "{{count}} abonat",
"generic_subscribers_count_1": "{{count}} abonați",
"generic_subscribers_count_2": "{{count}} de abonați",
"generic_subscriptions_count_0": "{{count}} abonament",
"generic_subscriptions_count_1": "{{count}} abonamente",
"generic_subscriptions_count_2": "{{count}} de abonamente",
"Search": "Căutați",
"search_filters_title": "Filtre",
"search_filters_date_label": "Data încărcării",
"none": "niciunul",
"search_message_use_another_instance": " Puteți <a href=\"`x`\">căuta într-o altă instanță</a>.",
"comments_view_x_replies_0": "Afișați {{count}} răspuns",
"comments_view_x_replies_1": "Afișați {{count}} răspunsuri",
"comments_view_x_replies_2": "Afișați {{count}} de răspunsuri",
"search_message_no_results": "Nu s-au găsit rezultate.",
"Dutch (auto-generated)": "Olandeză (generată automat)",
"Indonesian (auto-generated)": "Indoneziană (generată automat)",
"German (auto-generated)": "Germană (generată automat)",
"French (auto-generated)": "Franceză (generată automat)",
"Interlingue": "Interlingue",
"Italian (auto-generated)": "Italiană (generată automat)",
"Japanese (auto-generated)": "Japoneză (generată automat)",
"Korean (auto-generated)": "Coreeană (generată automat)",
"Spanish (auto-generated)": "Spaniolă (generată automat)",
"search_filters_date_option_none": "Oricând",
"search_filters_date_option_year": "an",
"search_filters_type_option_channel": "canal",
"Spanish (Mexico)": "Spaniolă (Mexic)",
"generic_count_weeks_0": "{{count}} săptămână",
"generic_count_weeks_1": "{{count}} săptămâni",
"generic_count_weeks_2": "{{count}} de săptămâni",
"generic_count_seconds_0": "{{count}} secundă",
"generic_count_seconds_1": "{{count}} secunde",
"generic_count_seconds_2": "{{count}} de secunde",
"search_filters_type_option_video": "videoclip",
"generic_count_years_0": "{{count}} an",
"generic_count_years_1": "{{count}} ani",
"generic_count_years_2": "{{count}} de ani",
"generic_count_months_0": "{{count}} lună",
"generic_count_months_1": "{{count}} luni",
"generic_count_months_2": "{{count}} de luni",
"search_filters_duration_label": "durată",
"search_filters_date_option_month": "lună",
"search_filters_type_label": "Tip",
"search_filters_date_option_today": "azi",
"search_filters_date_option_week": "săptămână",
"search_filters_features_option_vr180": "VR180",
"search_filters_type_option_playlist": "playlist",
"search_filters_type_option_movie": "film",
"search_filters_type_option_show": "emisiune",
"search_filters_duration_option_short": "Scurt (< 4 minute)",
"search_filters_duration_option_medium": "Medie (4 - 20 de minute)",
"search_filters_duration_option_none": "Fără limită",
"search_filters_duration_option_long": "Lungă (> 20 de minute)",
"search_filters_features_label": "atribute",
"search_filters_features_option_live": "în direct",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_subtitles": "subtitrări/CC",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_hdr": "HDR",
"search_filters_features_option_purchased": "Cumpărate",
"next_steps_error_message": "După ce ar trebui să încercați să: ",
"user_saved_playlists": "`x` playlisturi salvate",
"search_filters_features_option_location": "locație",
"search_filters_sort_label": "Sortați după",
"search_filters_sort_option_relevance": "relevanță",
"search_filters_sort_option_rating": "clasificare",
"search_filters_sort_option_date": "Data încărcării",
"search_filters_sort_option_views": "Numărul de vizionări",
"footer_source_code": "Codul sursă",
"search_filters_apply_button": "Aplicați filtrele selectate",
"footer_original_source_code": "Codul sursă original",
"next_steps_error_message_refresh": "Reîmprospătează",
"next_steps_error_message_go_to_youtube": "Mergeți pe YouTube",
"footer_donate_page": "Donați",
"adminprefs_modified_source_code_url_label": "URL către depozitul de cod sursă modificat",
"footer_documentation": "Documentație",
"videoinfo_youTube_embed_link": "Încorporați",
"videoinfo_watch_on_youTube": "Vizionați pe YouTube",
"videoinfo_invidious_embed_link": "Link de încorporare",
"download_subtitles": "Subtitrări - `x` (.vtt)",
"user_created_playlists": "`x` playlisturi create",
"preferences_save_player_pos_label": "Salvați poziția de redare: ",
"crash_page_you_found_a_bug": "Se pare că ați găsit un bug în aplicația Invidious!",
"crash_page_before_reporting": "Înainte de a reporta bugul, asigurați-vă că ați:",
"search_filters_date_option_hour": "oră",
"search_message_change_filters_or_query": "Încercați să lărgiți căutarea sau să modificați filtrele.",
"crash_page_report_issue": "Dacă niciuna dintre sugestiile de mai sus v-a ajutat, vă rugăm să <a href=\"`x`\">postați o nouă sugestie pe GitHub</a> (cel mai bine în engleză), și să includeți următorul text în post (să nu îl traduceți):",
"search_filters_type_option_all": "orice tip",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "144p",
"Show less": "Afișați mai puțin"
}

View file

@ -141,7 +141,6 @@
"Show less": "Показать меньше",
"Watch on YouTube": "Смотреть на YouTube",
"Switch Invidious Instance": "Сменить экземпляр Invidious",
"Broken? Try another Invidious Instance": "Сломался? Попробуйте другой экземпляр Invidious",
"Hide annotations": "Скрыть аннотации",
"Show annotations": "Показать аннотации",
"Genre: ": "Жанр: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Местоположение",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Фильтр",
"Current version: ": "Текущая версия: ",
"next_steps_error_message": "После чего следует попробовать: ",
"next_steps_error_message_refresh": "Обновить",
@ -477,5 +475,6 @@
"Video unavailable": "Видео недоступно",
"preferences_save_player_pos_label": "Запоминать позицию: ",
"preferences_region_label": "Страна: ",
"preferences_watch_history_label": "Включить историю просмотров "
"preferences_watch_history_label": "Включить историю просмотров ",
"search_filters_title": "Фильтр"
}

View file

@ -18,15 +18,15 @@
"No": "Nie",
"Import and Export Data": "Import a Export údajov",
"Import": "Import",
"Import Invidious data": "Importovať údaje Invidious",
"Import YouTube subscriptions": "Importovať odbery YouTube",
"Import Invidious data": "Importovať JSON údaje Invidious",
"Import YouTube subscriptions": "Importovať odbery YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)",
"Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)",
"Export": "Export",
"Export subscriptions as OPML": "Exportovať odbery ako OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovať odbery ako OPML (pre NewPipe a FreeTube)",
"Export data as JSON": "Export údajov ako JSON",
"Export data as JSON": "Exportovať údaje Invidious ako JSON",
"Delete account?": "Zrušiť účet?",
"History": "História",
"An alternative front-end to YouTube": "Alternatívny front-end pre YouTube",
@ -84,5 +84,23 @@
"preferences_unseen_only_label": "Zobraziť iba neprehrané: ",
"preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ",
"Enable web notifications": "Povoliť webové upozornenia",
"`x` uploaded a video": "`x` nahral(a) video"
"`x` uploaded a video": "`x` nahral(a) video",
"generic_views_count_0": "{{count}} zhliadnutie",
"generic_views_count_1": "{{count}} zhliadnutia",
"generic_views_count_2": "{{count}} zhliadnutí",
"generic_subscribers_count_0": "{{count}} odberateľ",
"generic_subscribers_count_1": "{{count}} odberatelia",
"generic_subscribers_count_2": "{{count}} odberateľov",
"Shared `x` ago": "Zverejnené pred `x`",
"generic_playlists_count_0": "{{count}} playlist",
"generic_playlists_count_1": "{{count}} playlisty",
"generic_playlists_count_2": "{{count}} playlistov",
"generic_videos_count_0": "{{count}} video",
"generic_videos_count_1": "{{count}} videá",
"generic_videos_count_2": "{{count}} videí",
"generic_subscriptions_count_0": "{{count}} odber",
"generic_subscriptions_count_1": "{{count}} odbery",
"generic_subscriptions_count_2": "{{count}} odberov",
"Authorize token for `x`?": "Autorizovať token pre `x`?",
"View playlist on YouTube": "Zobraziť playlist na YouTube"
}

View file

@ -147,7 +147,6 @@
"Show less": "Shfaq më pak",
"Watch on YouTube": "Shiheni në YouTube",
"Switch Invidious Instance": "Ndërroni Instancë Invidious",
"Broken? Try another Invidious Instance": "E prishur? Provoni një tjetër Instancë Invidious",
"Hide annotations": "Fshihi shënimet",
"Show annotations": "Shfaq shënime",
"License: ": "Licencë: ",
@ -371,7 +370,6 @@
"Nepali": "Nepaleze",
"Norwegian Bokmål": "Norvegjishte Bokmål",
"search_filters_features_option_three_sixty": "360°",
"search_filters_label": "Filtroji",
"Current version: ": "Versioni i tanishëm: ",
"next_steps_error_message": "Pas të cilës duhet të provoni të: ",
"next_steps_error_message_refresh": "Rifreskoje",
@ -448,5 +446,6 @@
"Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ",
"Shared `x`": "Ndau me të tjerë `x`"
"Shared `x`": "Ndau me të tjerë `x`",
"search_filters_title": "Filtra"
}

View file

@ -150,7 +150,6 @@
"search_filters_features_option_c_commons": "Creative Commons (Licenca)",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_hdr": "Video Visoke Rezolucije",
"search_filters_label": "Filter",
"next_steps_error_message": "Nakon čega bi trebali probati: ",
"next_steps_error_message_go_to_youtube": "Idi na YouTube",
"footer_documentation": "Dokumentacija",
@ -226,7 +225,6 @@
"preferences_captions_label": "Podrazumevani titl: ",
"Music": "Muzika",
"search_filters_type_label": "Tip",
"Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu",
"Tamil": "Tamilski",
"Save preferences": "Sačuvaj podešavanja",
"Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ",
@ -369,5 +367,6 @@
"unsubscribe": "prekini sa praćenjem",
"Blacklisted regions: ": "Zabranjene oblasti: ",
"Polish": "Poljski",
"Yoruba": "Joruba"
"Yoruba": "Joruba",
"search_filters_title": "Filter"
}

View file

@ -189,7 +189,6 @@
"search_filters_features_option_c_commons": "Creative Commons (Лиценца)",
"search_filters_features_option_live": "Уживо",
"search_filters_features_option_location": "Локација",
"search_filters_label": "Филтер",
"next_steps_error_message": "Након чега би требали пробати: ",
"footer_donate_page": "Донирај",
"footer_documentation": "Документација",
@ -345,7 +344,6 @@
"search_filters_features_option_subtitles": "Титл/Превод",
"preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ",
"Show less": "Прикажи мање",
"Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу",
"Family friendly? ": "Погодно за породицу? ",
"Premieres `x`": ремерe у `x`",
"Bosnian": "Босански",
@ -369,5 +367,6 @@
"Hebrew": "Хебрејски",
"Korean": "Корејски",
"Kurdish": "Курдски",
"Malay": "Малајски"
"Malay": "Малајски",
"search_filters_title": "Филтер"
}

View file

@ -139,7 +139,6 @@
"Show less": "Visa mindre",
"Watch on YouTube": "Titta på YouTube",
"Switch Invidious Instance": "Byt Invidious Instans",
"Broken? Try another Invidious Instance": "Trasig? Prova en annan Invidious Instance",
"Hide annotations": "Dölj länkar-i-video",
"Show annotations": "Visa länkar-i-video",
"Genre: ": "Genre: ",
@ -353,7 +352,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "plats",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "Filter",
"Current version: ": "Nuvarande version: ",
"next_steps_error_message_refresh": "Uppdatera",
"next_steps_error_message_go_to_youtube": "Gå till Youtube",
@ -361,5 +359,6 @@
"footer_source_code": "Källkod",
"search_filters_duration_option_long": "Lång (> 20 minuter)",
"footer_documentation": "Dokumentation",
"search_filters_duration_option_short": "Kort (< 4 minuter)"
"search_filters_duration_option_short": "Kort (< 4 minuter)",
"search_filters_title": "Filter"
}

View file

@ -141,7 +141,6 @@
"Show less": "Daha az göster",
"Watch on YouTube": "YouTube'da izle",
"Switch Invidious Instance": "Invidious Örneğini Değiştir",
"Broken? Try another Invidious Instance": "Bozuk mu? Başka bir Invidious örneğini deneyin",
"Hide annotations": "Ek açıklamaları gizle",
"Show annotations": "Ek açıklamaları göster",
"Genre: ": "Tür: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Konum",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtrele",
"Current version: ": "Şu anki sürüm: ",
"next_steps_error_message": "Bundan sonra şunları denemelisiniz: ",
"next_steps_error_message_refresh": "Yenile",
@ -461,5 +459,16 @@
"Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)",
"Spanish (Spain)": "İspanyolca (İspanya)",
"Vietnamese (auto-generated)": "Vietnamca (otomatik oluşturuldu)",
"preferences_watch_history_label": "İzleme geçmişini etkinleştir: "
"preferences_watch_history_label": "İzleme geçmişini etkinleştir: ",
"search_message_use_another_instance": " Ayrıca <a href=\"`x`\">başka bir örnekte arayabilirsiniz</a>.",
"search_filters_type_option_all": "Herhangi bir tür",
"search_filters_duration_option_none": "Herhangi bir süre",
"search_message_no_results": "Sonuç bulunamadı.",
"search_filters_date_label": "Yükleme tarihi",
"search_filters_apply_button": "Seçili filtreleri uygula",
"search_filters_date_option_none": "Herhangi bir tarih",
"search_filters_duration_option_medium": "Orta (4 - 20 dakika)",
"search_filters_features_option_vr180": "VR180",
"search_filters_title": "Filtreler",
"search_message_change_filters_or_query": "Arama sorgunuzu genişletmeyi ve/veya filtreleri değiştirmeyi deneyin."
}

View file

@ -355,7 +355,6 @@
"generic_count_hours_0": "{{count}} годину",
"generic_count_hours_1": "{{count}} години",
"generic_count_hours_2": "{{count}} годин",
"content_type": "Тип",
"crash_page_switch_instance": "спробуйте <a href=\"`x`\">використати інший сервер</a>",
"crash_page_read_the_faq": "прочитайте <a href=\"`x`\">часті питання (ЧаП)</a>",
"crash_page_search_issue": "перегляньте <a href=\"`x`\">наявні обговорення на GitHub</a>",
@ -386,15 +385,6 @@
"Spanish (auto-generated)": "Іспанська (автогенератор)",
"Spanish (Mexico)": "Іспанська (Мексика)",
"Spanish (Spain)": "Іспанська (Іспанія)",
"views": "Кількість переглядів",
"today": "Сьогодні",
"playlist": "Список відтворення",
"long": "Довге (понад 20 хвилин)",
"hd": "HD",
"creative_commons": "Creative Commons",
"3d": "3D",
"hdr": "HDR",
"360": "360°",
"next_steps_error_message_go_to_youtube": "Перейти до YouTube",
"footer_donate_page": "Пожертвувати",
"footer_documentation": "Документація",
@ -415,29 +405,11 @@
"preferences_save_player_pos_label": "Зберегти позицію відтворення: ",
"preferences_show_nick_label": "Псевдонім угорі: ",
"Show more": "Докладніше",
"week": "Цей тиждень",
"year": "Цей рік",
"video": "Відео",
"channel": "Канал",
"subtitles": "Субтитри",
"live": "Наживо",
"4k": "4K",
"filter": "Фільтр",
"next_steps_error_message": "Після чого спробуйте: ",
"next_steps_error_message_refresh": "Оновити сторінку",
"relevance": "Доречність",
"rating": "Рейтинг",
"duration": "Тривалість",
"sort": "Порядок",
"movie": "Фільм",
"Search": "Пошук",
"location": "Місце",
"preferences_extend_desc_label": "Автоматично розширювати опис відео: ",
"month": "Цей місяць",
"features": "Функції",
"preferences_category_misc": "Різноманітні параметри",
"date": "Дата вивантаження",
"hour": "Ця година",
"Show less": "Коротше",
"preferences_quality_option_small": "Низька",
"preferences_quality_dash_option_240p": "240p",
@ -453,18 +425,14 @@
"preferences_automatic_instance_redirect_label": "Автоматична зміна сервера (redirect.invidious.io як резерв): ",
"Switch Invidious Instance": "Інший сервер Invidious",
"preferences_quality_dash_option_480p": "480p",
"Broken? Try another Invidious Instance": "Не працює? Спробуйте інший сервер Invidious",
"Chinese (Taiwan)": "Китайська (Тайвань)",
"Dutch (auto-generated)": "Нідерландська (автогенератор)",
"Indonesian (auto-generated)": "Індонезійська (автогенератор)",
"Japanese (auto-generated)": "Японська (автогенератор)",
"show": "Шоу",
"Korean (auto-generated)": "Корейська (автогенератор)",
"generic_count_months_0": "{{count}} місяць",
"generic_count_months_1": "{{count}} місяці",
"generic_count_months_2": "{{count}} місяців",
"short": "Коротке (до 4 хвилин)",
"purchased": "Придбання",
"videoinfo_youTube_embed_link": "Вкласти",
"generic_count_minutes_0": "{{count}} хвилину",
"generic_count_minutes_1": "{{count}} хвилини",
@ -477,5 +445,46 @@
"download_subtitles": "Субтитри — `x` (.vtt)",
"comments_points_count_0": "{{count}} пункт",
"comments_points_count_1": "{{count}} пункти",
"comments_points_count_2": "{{count}} пунктів"
"comments_points_count_2": "{{count}} пунктів",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_location": "Геомітка",
"search_filters_duration_option_none": "Будь-які",
"search_filters_features_option_hd": "HD",
"search_message_change_filters_or_query": "Спробуйте ширший запит і/або інші фільтри.",
"search_filters_type_option_all": "Будь-що",
"search_filters_type_option_movie": "Фільм",
"search_filters_type_option_show": "Шоу",
"search_filters_duration_label": "Тривалість",
"search_filters_duration_option_short": "Короткі (до 4 хвилин)",
"search_message_no_results": "Результатів не знайдено.",
"search_filters_date_label": "Дата вивантаження",
"search_filters_date_option_none": "Будь-яка дата",
"search_filters_date_option_today": "Сьогодні",
"search_filters_date_option_week": "Цей тиждень",
"search_filters_type_label": "Тип",
"search_filters_type_option_channel": "Канал",
"search_message_use_another_instance": " Можете також <a href=\"`x`\">пошукати іншим сервером</a>.",
"search_filters_title": "Фільтри",
"search_filters_date_option_hour": "Остання година",
"search_filters_date_option_month": "Цей місяць",
"search_filters_date_option_year": "Цей рік",
"search_filters_type_option_video": "Відео",
"search_filters_type_option_playlist": "Добірка",
"search_filters_duration_option_medium": "Середні (420 хвилин)",
"search_filters_duration_option_long": "Довгі (понад 20 хвилин)",
"search_filters_features_label": "Особливості",
"search_filters_features_option_live": "Наживо",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_subtitles": "Субтитри",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_hdr": "HDR",
"search_filters_sort_label": "Спершу",
"search_filters_sort_option_date": "Нещодавні",
"search_filters_apply_button": "Застосувати фільтри",
"search_filters_features_option_vr180": "VR180",
"search_filters_features_option_purchased": "Придбано",
"search_filters_sort_option_relevance": "Відповідні",
"search_filters_sort_option_rating": "Рейтингові",
"search_filters_sort_option_views": "Популярні"
}

View file

@ -138,7 +138,6 @@
"Show less": "Hiện ít hơn",
"Watch on YouTube": "Xem trên YouTube",
"Switch Invidious Instance": "Chuyển phiên bản Invidious",
"Broken? Try another Invidious Instance": "Bị hỏng? Hãy thử một Phiên bản Invidious khác",
"Hide annotations": "Ẩn chú thích",
"Show annotations": "Hiển thị chú thích",
"Genre: ": "Thể loại: ",
@ -341,6 +340,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "vị trí",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "bộ lọc",
"Current version: ": "Phiên bản hiện tại: "
"Current version: ": "Phiên bản hiện tại: ",
"search_filters_title": "bộ lọc"
}

View file

@ -148,7 +148,6 @@
"Show less": "显示较少",
"Watch on YouTube": "在 YouTube 观看",
"Switch Invidious Instance": "切换 Invidious 实例",
"Broken? Try another Invidious Instance": "无法正常工作? 尝试另一个 Invidious 实例",
"Hide annotations": "隐藏注释",
"Show annotations": "显示注释",
"Genre: ": "风格: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "位置",
"search_filters_features_option_hdr": "hdr",
"search_filters_label": "过滤器",
"Current version: ": "当前版本: ",
"next_steps_error_message": "在此之后你应尝试: ",
"next_steps_error_message_refresh": "刷新",
@ -445,5 +443,16 @@
"French (auto-generated)": "法语 (自动生成)",
"Turkish (auto-generated)": "土耳其语 (自动生成)",
"Spanish (Spain)": "西班牙语 (西班牙)",
"preferences_watch_history_label": "启用观看历史: "
"preferences_watch_history_label": "启用观看历史: ",
"search_message_use_another_instance": " 你也可以 <a href=\"`x`\">在另一实例上搜索</a>。",
"search_filters_title": "过滤器",
"search_filters_date_label": "上传日期",
"search_filters_apply_button": "应用所选过滤器",
"search_message_no_results": "没找到结果。",
"search_filters_duration_option_medium": "中等4-20 分钟)",
"search_filters_date_option_none": "任意日期",
"search_message_change_filters_or_query": "尝试扩大你的搜索查询和/或更改过滤器。",
"search_filters_duration_option_none": "任意时长",
"search_filters_type_option_all": "任意类型",
"search_filters_features_option_vr180": "VR180"
}

View file

@ -148,7 +148,6 @@
"Show less": "顯示較少",
"Watch on YouTube": "在 YouTube 上觀看",
"Switch Invidious Instance": "切換 Invidious 站台",
"Broken? Try another Invidious Instance": "故障了嗎?試試看其他 Invidious 站台吧",
"Hide annotations": "隱藏註釋",
"Show annotations": "顯示註釋",
"Genre: ": "風格: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "位置",
"search_filters_features_option_hdr": "HDR",
"search_filters_label": "篩選條件",
"Current version: ": "目前版本: ",
"next_steps_error_message": "之後您應該嘗試: ",
"next_steps_error_message_refresh": "重新整理",
@ -445,5 +443,16 @@
"Portuguese (Brazil)": "葡萄牙語(巴西)",
"Japanese (auto-generated)": "日語(自動產生)",
"Portuguese (auto-generated)": "葡萄牙語(自動產生)",
"preferences_watch_history_label": "啟用觀看紀錄: "
"preferences_watch_history_label": "啟用觀看紀錄: ",
"search_message_change_filters_or_query": "嘗試擴大您的查詢字詞與/或變更過濾條件。",
"search_filters_apply_button": "套用選定的過濾條件",
"search_message_no_results": "找不到結果。",
"search_filters_duration_option_none": "任何時長",
"search_filters_duration_option_medium": "中等4到20分鐘",
"search_filters_features_option_vr180": "VR180",
"search_message_use_another_instance": " 您也可以<a href=\"`x`\">在其他站台上搜尋</a>。",
"search_filters_title": "過濾條件",
"search_filters_date_label": "上傳日期",
"search_filters_type_option_all": "任何類型",
"search_filters_date_option_none": "任何日期"
}

View file

@ -14,11 +14,11 @@ shards:
exception_page:
git: https://github.com/crystal-loot/exception_page.git
version: 0.2.1
version: 0.2.2
kemal:
git: https://github.com/kemalcr/kemal.git
version: 1.1.0
version: 1.1.2
kilt:
git: https://github.com/jeromegn/kilt.git

View file

@ -18,7 +18,10 @@ dependencies:
version: ~> 0.18.0
kemal:
github: kemalcr/kemal
version: ~> 1.1.0
version: ~> 1.1.2
kilt:
github: jeromegn/kilt
version: ~> 0.6.1
protodec:
github: iv-org/protodec
version: ~> 0.1.4

View file

@ -0,0 +1,200 @@
require "../../../src/invidious/search/filters"
require "../../../src/invidious/search/query"
require "http/params"
require "spectator"
Spectator.configure do |config|
config.fail_blank
config.randomize
end
Spectator.describe Invidious::Search::Query do
describe Type::Regular do
# -------------------
# Query parsing
# -------------------
it "parses query with URL prameters (q)" do
query = described_class.new(
HTTP::Params.parse("q=What+is+Love+10+hour&type=video&duration=long"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
expect(query.channel).to be_empty
expect(query.text).to eq("What is Love 10 hour")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
type: Invidious::Search::Filters::Type::Video,
duration: Invidious::Search::Filters::Duration::Long
)
)
end
it "parses query with URL prameters (search_query)" do
query = described_class.new(
HTTP::Params.parse("search_query=What+is+Love+10+hour&type=video&duration=long"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
expect(query.channel).to be_empty
expect(query.text).to eq("What is Love 10 hour")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
type: Invidious::Search::Filters::Type::Video,
duration: Invidious::Search::Filters::Duration::Long
)
)
end
it "parses query with legacy filters (q)" do
query = described_class.new(
HTTP::Params.parse("q=Nyan+cat+duration:long"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
expect(query.channel).to be_empty
expect(query.text).to eq("Nyan cat")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
duration: Invidious::Search::Filters::Duration::Long
)
)
end
it "parses query with legacy filters (search_query)" do
query = described_class.new(
HTTP::Params.parse("search_query=Nyan+cat+duration:long"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
expect(query.channel).to be_empty
expect(query.text).to eq("Nyan cat")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
duration: Invidious::Search::Filters::Duration::Long
)
)
end
it "parses query with both URL params and legacy filters" do
query = described_class.new(
HTTP::Params.parse("q=Vamos+a+la+playa+duration:long&type=Video&date=year"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
expect(query.channel).to be_empty
expect(query.text).to eq("Vamos a la playa duration:long")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
type: Invidious::Search::Filters::Type::Video,
date: Invidious::Search::Filters::Date::Year
)
)
end
# -------------------
# Type switching
# -------------------
it "switches to channel search (URL param)" do
query = described_class.new(
HTTP::Params.parse("q=thunderbolt+4&channel=UC0vBXGSyV14uvJ4hECDOl0Q"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
expect(query.channel).to eq("UC0vBXGSyV14uvJ4hECDOl0Q")
expect(query.text).to eq("thunderbolt 4")
expect(query.filters.default?).to be_true
end
it "switches to channel search (legacy)" do
query = described_class.new(
HTTP::Params.parse("q=channel%3AUCRPdsCVuH53rcbTcEkuY4uQ+rdna3"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
expect(query.channel).to eq("UCRPdsCVuH53rcbTcEkuY4uQ")
expect(query.text).to eq("rdna3")
expect(query.filters.default?).to be_true
end
it "switches to subscriptions search" do
query = described_class.new(
HTTP::Params.parse("q=subscriptions:true+tunak+tunak+tun"),
Invidious::Search::Query::Type::Regular, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions)
expect(query.channel).to be_empty
expect(query.text).to eq("tunak tunak tun")
expect(query.filters.default?).to be_true
end
end
describe Type::Channel do
it "ignores extra parameters" do
query = described_class.new(
HTTP::Params.parse("q=Take+on+me+channel%3AUC12345679&type=video&date=year"),
Invidious::Search::Query::Type::Channel, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
expect(query.channel).to be_empty
expect(query.text).to eq("Take on me")
expect(query.filters.default?).to be_true
end
end
describe Type::Subscriptions do
it "works" do
query = described_class.new(
HTTP::Params.parse("q=Harlem+shake&type=video&date=year"),
Invidious::Search::Query::Type::Subscriptions, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions)
expect(query.channel).to be_empty
expect(query.text).to eq("Harlem shake")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
type: Invidious::Search::Filters::Type::Video,
date: Invidious::Search::Filters::Date::Year
)
)
end
end
describe Type::Playlist do
it "ignores extra parameters" do
query = described_class.new(
HTTP::Params.parse("q=Harlem+shake+type:video+date:year&channel=UC12345679"),
Invidious::Search::Query::Type::Playlist, nil
)
expect(query.type).to eq(Invidious::Search::Query::Type::Playlist)
expect(query.channel).to be_empty
expect(query.text).to eq("Harlem shake")
expect(query.filters).to eq(
Invidious::Search::Filters.new(
type: Invidious::Search::Filters::Type::Video,
date: Invidious::Search::Filters::Date::Year
)
)
end
end
end

View file

@ -0,0 +1,16 @@
# Overrides for Kemal's `content_for` macro in order to keep using
# kilt as it was before Kemal v1.1.1 (Kemal PR #618).
require "kemal"
require "kilt"
macro content_for(key, file = __FILE__)
%proc = ->() {
__kilt_io__ = IO::Memory.new
{{ yield }}
__kilt_io__.to_s
}
CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, %proc
nil
end

View file

@ -16,7 +16,13 @@
require "digest/md5"
require "file_utils"
# Require kemal, kilt, then our own overrides
require "kemal"
require "kilt"
require "./ext/kemal_content_for.cr"
require "./ext/kemal_static_file_handler.cr"
require "athena-negotiation"
require "openssl/hmac"
require "option_parser"

View file

@ -574,31 +574,41 @@ def content_to_comment_html(content)
if run["navigationEndpoint"]?
if url = run["navigationEndpoint"]["urlEndpoint"]?.try &.["url"].as_s
url = URI.parse(url)
displayed_url = url
if url.host == "youtu.be"
url = "/watch?v=#{url.request_target.lstrip('/')}"
displayed_url = "youtube.com#{url}"
elsif url.host.nil? || url.host.not_nil!.ends_with?("youtube.com")
if url.path == "/redirect"
# Sometimes, links can be corrupted (why?) so make sure to fallback
# nicely. See https://github.com/iv-org/invidious/issues/2682
url = HTTP::Params.parse(url.query.not_nil!)["q"]? || ""
displayed_url = url
else
url = url.request_target
displayed_url = "youtube.com#{url}"
end
end
text = %(<a href="#{url}">#{text}</a>)
text = %(<a href="#{url}">#{reduce_uri(displayed_url)}</a>)
elsif watch_endpoint = run["navigationEndpoint"]["watchEndpoint"]?
length_seconds = watch_endpoint["startTimeSeconds"]?
video_id = watch_endpoint["videoId"].as_s
if length_seconds && length_seconds.as_i > 0
if length_seconds && length_seconds.as_i >= 0
text = %(<a href="javascript:void(0)" data-onclick="jump_to_time" data-jump-time="#{length_seconds}">#{text}</a>)
else
text = %(<a href="/watch?v=#{video_id}">#{text}</a>)
text = %(<a href="/watch?v=#{video_id}">#{"youtube.com/watch?v=#{video_id}"}</a>)
end
elsif url = run.dig?("navigationEndpoint", "commandMetadata", "webCommandMetadata", "url").try &.as_s
if text.starts_with?(/\s?@/)
# Handle "pings" in comments differently
# See: https://github.com/iv-org/invidious/issues/3038
text = %(<a href="#{url}">#{text}</a>)
else
text = %(<a href="#{url}">#{reduce_uri(url)}</a>)
end
end
end

View file

@ -48,13 +48,19 @@ module JSON::Serializable
end
end
macro templated(filename, template = "template", navbar_search = true)
macro templated(_filename, template = "template", navbar_search = true)
navbar_search = {{navbar_search}}
render "src/invidious/views/#{{{filename}}}.ecr", "src/invidious/views/#{{{template}}}.ecr"
{{ filename = "src/invidious/views/" + _filename + ".ecr" }}
{{ layout = "src/invidious/views/" + template + ".ecr" }}
__content_filename__ = {{filename}}
content = Kilt.render({{filename}})
Kilt.render({{layout}})
end
macro rendered(filename)
render "src/invidious/views/#{{{filename}}}.ecr"
Kilt.render("src/invidious/views/#{{{filename}}}.ecr")
end
# Similar to Kemals halt method but works in a

View file

@ -383,3 +383,11 @@ def fetch_random_instance
return filtered_instance_list.sample(1)[0]
end
def reduce_uri(uri : URI | String, max_length : Int32 = 50, suffix : String = "") : String
str = uri.to_s.sub(/^https?:\/\//, "")
if str.size > max_length
str = "#{str[0, max_length]}#{suffix}"
end
return str
end

View file

@ -56,7 +56,7 @@ module Invidious::Routes::API::Manifest
xml.element("Period") do
i = 0
{"audio/mp4", "audio/webm"}.each do |mime_type|
{"audio/mp4"}.each do |mime_type|
mime_streams = audio_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type }
next if mime_streams.empty?
@ -83,7 +83,7 @@ module Invidious::Routes::API::Manifest
potential_heights = {4320, 2160, 1440, 1080, 720, 480, 360, 240, 144}
{"video/mp4", "video/webm"}.each do |mime_type|
{"video/mp4"}.each do |mime_type|
mime_streams = video_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type }
next if mime_streams.empty?

View file

@ -10,7 +10,7 @@ module Invidious::Search
Playlist # "Add playlist item" search
end
@type : Type = Type::Regular
getter type : Type = Type::Regular
@raw_query : String
@query : String = ""
@ -63,14 +63,17 @@ module Invidious::Search
# Specific handling
case @type
when .playlist?, .channel?
# In "add playlist item" mode, filters are parsed from the query
# string itself (legacy), and the channel is ignored.
#
when .channel?
# In "channel search" mode, filters are ignored, but we still parse
# the query prevent transmission of legacy filters to youtube.
#
@filters, @query, @channel, _ = Filters.from_legacy_filters(@raw_query || "")
_, _, @query, _ = Filters.from_legacy_filters(@raw_query)
#
when .playlist?
# In "add playlist item" mode, filters are parsed from the query
# string itself (legacy), and the channel is ignored.
#
@filters, _, @query, _ = Filters.from_legacy_filters(@raw_query)
#
when .subscriptions?, .regular?
if params["sp"]?
@ -84,7 +87,7 @@ module Invidious::Search
if @filters.default? && @raw_query.includes?(':')
# Parse legacy filters from query
@filters, @query, @channel, subs = Filters.from_legacy_filters(@raw_query || "")
@filters, @channel, @query, subs = Filters.from_legacy_filters(@raw_query)
else
@query = @raw_query || ""
end

View file

@ -52,11 +52,11 @@
<% if !env.get("preferences").as(Preferences).thin_mode %>
<div class="thumbnail">
<img loading="lazy" class="thumbnail" src="/vi/<%= item.id %>/mqdefault.jpg"/>
<% if plid = env.get?("remove_playlist_items") %>
<form data-onsubmit="return_false" action="/playlist_ajax?action_remove_video=1&set_video_id=<%= item.index %>&playlist_id=<%= plid %>&referer=<%= env.get("current_page") %>" method="post">
<% if plid_form = env.get?("remove_playlist_items") %>
<form data-onsubmit="return_false" action="/playlist_ajax?action_remove_video=1&set_video_id=<%= item.index %>&playlist_id=<%= plid_form %>&referer=<%= env.get("current_page") %>" method="post">
<input type="hidden" name="csrf_token" value="<%= HTML.escape(env.get?("csrf_token").try &.as(String) || "") %>">
<p class="watched">
<a data-onclick="remove_playlist_item" data-index="<%= item.index %>" data-plid="<%= plid %>" href="javascript:void(0)">
<a data-onclick="remove_playlist_item" data-index="<%= item.index %>" data-plid="<%= plid_form %>" href="javascript:void(0)">
<button type="submit" style="all:unset">
<i class="icon ion-md-trash"></i>
</button>
@ -117,11 +117,11 @@
</a>
</p>
</form>
<% elsif plid = env.get? "add_playlist_items" %>
<form data-onsubmit="return_false" action="/playlist_ajax?action_add_video=1&video_id=<%= item.id %>&playlist_id=<%= plid %>&referer=<%= env.get("current_page") %>" method="post">
<% elsif plid_form = env.get? "add_playlist_items" %>
<form data-onsubmit="return_false" action="/playlist_ajax?action_add_video=1&video_id=<%= item.id %>&playlist_id=<%= plid_form %>&referer=<%= env.get("current_page") %>" method="post">
<input type="hidden" name="csrf_token" value="<%= HTML.escape(env.get?("csrf_token").try &.as(String) || "") %>">
<p class="watched">
<a data-onclick="add_playlist_item" data-id="<%= item.id %>" data-plid="<%= plid %>" href="javascript:void(0)">
<a data-onclick="add_playlist_item" data-id="<%= item.id %>" data-plid="<%= plid_form %>" href="javascript:void(0)">
<button type="submit" style="all:unset">
<i class="icon ion-md-add"></i>
</button>

View file

@ -7,8 +7,19 @@
<source src="<%= URI.parse(hlsvp).request_target %><% if params.local %>?local=true<% end %>" type="application/x-mpegURL" label="livestream">
<% else %>
<% if params.listen %>
<% audio_streams.each_with_index do |fmt, i| %>
<source src="/latest_version?id=<%= video.id %>&itag=<%= fmt["itag"] %><% if params.local %>&local=true<% end %>" type='<%= fmt["mimeType"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>">
<% audio_streams.each_with_index do |fmt, i|
src_url = "/latest_version?id=#{video.id}&itag=#{fmt["itag"]}"
src_url += "&local=true" if params.local
bitrate = fmt["bitrate"]
mimetype = HTML.escape(fmt["mimeType"].as_s)
selected = i == 0 ? true : false
%>
<source src="<%= src_url %>" type='<%= mimetype %>' label="<%= bitrate %>k" selected="<%= selected %>">
<% if !params.local && !CONFIG.disabled?("local") %>
<source src="<%= src_url %>&local=true" type='<%= mimetype %>' hidequalityoption="true">
<% end %>
<% end %>
<% else %>
<% if params.quality == "dash" %>
@ -28,6 +39,9 @@
selected = params.quality ? (params.quality == quality) : (i == 0)
%>
<source src="<%= src_url %>" type="<%= mimetype %>" label="<%= quality %>" selected="<%= selected %>">
<% if !params.local && !CONFIG.disabled?("local") %>
<source src="<%= src_url %>&local=true" type="<%= mimetype %>" hidequalityoption="true">
<% end %>
<% end %>
<% end %>

View file

@ -24,7 +24,8 @@
"video_series" => video_series,
"params" => params,
"preferences" => preferences,
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix,
"local_disabled" => CONFIG.disabled?("local")
}.to_pretty_json
%>
</script>

View file

@ -64,7 +64,8 @@ we're going to need to do it here in order to allow for translations.
"preferences" => preferences,
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix,
"vr" => video.is_vr,
"projection_type" => video.projection_type
"projection_type" => video.projection_type,
"local_disabled" => CONFIG.disabled?("local")
}.to_pretty_json
%>
</script>

View file

@ -1,9 +1,7 @@
# Due to an firefox issue, we're stuck on 7.11.0. If you're hosting a private instance
# and you're using a chromium based browser, feel free to bump this to the latest version
# in order to get support for higher resolutions on more videos.
# Due to a 'video append of' error (see #3011), we're stuck on 7.12.1.
video.js:
version: 7.11.0
shasum: e20747d890716085e7255a90d73c00f32324a224
version: 7.12.1
shasum: 1d12eeb1f52e3679e8e4c987d9b9eb37e2247fa2
videojs-contrib-quality-levels:
version: 2.1.0