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: matrix:
stable: [true] stable: [true]
crystal: crystal:
- 1.0.0
- 1.1.1
- 1.2.2 - 1.2.2
- 1.3.2
- 1.4.0
include: include:
- crystal: nightly - crystal: nightly
stable: false stable: false

View file

@ -49,6 +49,42 @@ videojs.Vhs.xhr.beforeRequest = function(options) {
var player = videojs('player', 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 * Function for add time argument to url
* @param {String} 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 // Enable VR video support
if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) { if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) {
player.crossOrigin("anonymous") player.crossOrigin("anonymous")
@ -751,7 +766,7 @@ if (window.location.pathname.startsWith("/embed/")) {
// Create hyperlink for current instance // Create hyperlink for current instance
redirect_element = document.createElement("a"); 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")) redirect_element.appendChild(document.createTextNode("Invidious"))
watch_on_invidious_button.el().appendChild(redirect_element) 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 RUN apk add --no-cache sqlite-static yaml-static
ARG release ARG release

View file

@ -1,5 +1,5 @@
FROM alpine:3.15 AS builder FROM alpine:edge 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 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 ARG release
@ -34,7 +34,7 @@ RUN if [ ${release} == 1 ] ; then \
--link-flags "-lxml2 -llzma"; \ --link-flags "-lxml2 -llzma"; \
fi fi
FROM alpine:3.15 FROM alpine:edge
RUN apk add --no-cache librsvg ttf-opensans RUN apk add --no-cache librsvg ttf-opensans
WORKDIR /invidious WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \ RUN addgroup -g 1000 -S invidious && \

View file

@ -141,7 +141,6 @@
"Show less": "عرض اقل", "Show less": "عرض اقل",
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب", "Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
"Switch Invidious Instance": "تبديل المثيل Invidious", "Switch Invidious Instance": "تبديل المثيل Invidious",
"Broken? Try another Invidious Instance": "معطل؟ جرب مثيل Invidious آخر",
"Hide annotations": "إخفاء الملاحظات في الفيديو", "Hide annotations": "إخفاء الملاحظات في الفيديو",
"Show annotations": "عرض الملاحظات في الفيديو", "Show annotations": "عرض الملاحظات في الفيديو",
"Genre: ": "النوع: ", "Genre: ": "النوع: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "الأماكن", "search_filters_features_option_location": "الأماكن",
"search_filters_features_option_hdr": "وضع التباين العالي", "search_filters_features_option_hdr": "وضع التباين العالي",
"search_filters_label": "معامل الفرز",
"Current version: ": "الإصدار الحالي: ", "Current version: ": "الإصدار الحالي: ",
"next_steps_error_message": "بعد ذلك يجب أن تحاول: ", "next_steps_error_message": "بعد ذلك يجب أن تحاول: ",
"next_steps_error_message_refresh": "تحديث", "next_steps_error_message_refresh": "تحديث",
@ -459,5 +457,6 @@
"Portuguese (Brazil)": "البرتغالية (البرازيل)", "Portuguese (Brazil)": "البرتغالية (البرازيل)",
"Russian (auto-generated)": "الروسية (منشأة تلقائيا)", "Russian (auto-generated)": "الروسية (منشأة تلقائيا)",
"Spanish (Spain)": "الإسبانية (إسبانيا)", "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", "Video mode": "Videový režim",
"Videos": "Videa", "Videos": "Videa",
"Community": "Komunita", "Community": "Komunita",
"search_filters_sort_option_rating": "hodnocení", "search_filters_sort_option_rating": "Hodnocení",
"search_filters_sort_option_date": "datum", "search_filters_sort_option_date": "Datum nahrání",
"search_filters_sort_option_views": "zhlédnutí", "search_filters_sort_option_views": "Počet zhlédnutí",
"search_filters_duration_label": "délka", "search_filters_duration_label": "Délka",
"search_filters_date_option_hour": "hodina", "search_filters_date_option_hour": "Poslední hodina",
"search_filters_date_option_today": "dnes", "search_filters_date_option_today": "Dnes",
"search_filters_date_option_week": "týden", "search_filters_date_option_week": "Tento týden",
"search_filters_date_option_month": "měsíc", "search_filters_date_option_month": "Tento měsíc",
"search_filters_date_option_year": "rok", "search_filters_date_option_year": "Tento rok",
"search_filters_type_option_video": "video", "search_filters_type_option_video": "Video",
"search_filters_type_option_channel": "kanál", "search_filters_type_option_channel": "Kanál",
"search_filters_type_option_playlist": "playlist", "search_filters_type_option_playlist": "Playlist",
"search_filters_type_option_movie": "film", "search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "zobrazit", "search_filters_type_option_show": "Seriál",
"search_filters_features_option_hd": "HD", "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_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D", "search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "živě", "search_filters_features_option_live": "Živě",
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "umístění", "search_filters_features_option_location": "Umístění",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtr",
"generic_count_days_0": "{{count}} dnem", "generic_count_days_0": "{{count}} dnem",
"generic_count_days_1": "{{count}} dny", "generic_count_days_1": "{{count}} dny",
"generic_count_days_2": "{{count}} dny", "generic_count_days_2": "{{count}} dny",
@ -374,20 +373,15 @@
"generic_count_minutes_0": "{{count}} minutou", "generic_count_minutes_0": "{{count}} minutou",
"generic_count_minutes_1": "{{count}} minutami", "generic_count_minutes_1": "{{count}} minutami",
"generic_count_minutes_2": "{{count}} minutami", "generic_count_minutes_2": "{{count}} minutami",
"short": "Krátké (< 4 minuty)",
"long": "Dlouhé (> 20 minut)",
"footer_documentation": "Dokumentace", "footer_documentation": "Dokumentace",
"next_steps_error_message_refresh": "Obnovit stránku", "next_steps_error_message_refresh": "Obnovit stránku",
"Chinese": "Čínština", "Chinese": "Čínština",
"360": "360°",
"Dutch (auto-generated)": "Nizozemština (automaticky generováno)", "Dutch (auto-generated)": "Nizozemština (automaticky generováno)",
"Erroneous token": "Chybný token", "Erroneous token": "Chybný token",
"tokens_count_0": "{{count}} token", "tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokeny", "tokens_count_1": "{{count}} tokeny",
"tokens_count_2": "{{count}} tokenů", "tokens_count_2": "{{count}} tokenů",
"Portuguese (Brazil)": "Portugalština (Brazílie)", "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", "Token is expired, please try again": "Token vypršel, zkuste to prosím znovu",
"English (United States)": "Angličtina (Spojené státy)", "English (United States)": "Angličtina (Spojené státy)",
"Cantonese (Hong Kong)": "Kantonština (Hong Kong)", "Cantonese (Hong Kong)": "Kantonština (Hong Kong)",
@ -401,7 +395,6 @@
"%A %B %-d, %Y": "%A %B %-d, %Y", "%A %B %-d, %Y": "%A %B %-d, %Y",
"YouTube comment permalink": "Permanentní odkaz YouTube komentáře", "YouTube comment permalink": "Permanentní odkaz YouTube komentáře",
"permalink": "permalink", "permalink": "permalink",
"purchased": "Zakoupeno",
"footer_original_source_code": "Původní zdrojový kód", "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", "adminprefs_modified_source_code_url_label": "URL repozitáře s upraveným zdrojovým kódem",
"Video unavailable": "Video není dostupné", "Video unavailable": "Video není dostupné",
@ -434,11 +427,9 @@
"Erroneous CAPTCHA": "Chybná CAPTCHA", "Erroneous CAPTCHA": "Chybná CAPTCHA",
"Password is a required field": "Heslo je vyžadované pole", "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): ", "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", "Switch Invidious Instance": "Přepnout instanci Invidious",
"Empty playlist": "Prázdný playlist", "Empty playlist": "Prázdný playlist",
"footer_source_code": "Zdrojový kód", "footer_source_code": "Zdrojový kód",
"relevance": "Relevantnost",
"View YouTube comments": "Zobrazit YouTube komentáře", "View YouTube comments": "Zobrazit YouTube komentáře",
"Blacklisted regions: ": "Oblasti na černé listině: ", "Blacklisted regions: ": "Oblasti na černé listině: ",
"Wrong username or password": "Nesprávné uživatelské jméno nebo heslo", "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", "Deleted or invalid channel": "Smazaný nebo neplatný kanál",
"This channel does not exist.": "Tento kanál neexistuje.", "This channel does not exist.": "Tento kanál neexistuje.",
"Hidden field \"token\" is a required field": "Skryté pole \"token\" je vyžadované", "Hidden field \"token\" is a required field": "Skryté pole \"token\" je vyžadované",
"features": "Funkce",
"Wilson score: ": "Skóre Wilson: ", "Wilson score: ": "Skóre Wilson: ",
"Shared `x`": "Zveřejněno `x`", "Shared `x`": "Zveřejněno `x`",
"Premieres in `x`": "Premiéra za `x`", "Premieres in `x`": "Premiéra za `x`",
@ -477,5 +467,24 @@
"Erroneous challenge": "Chybná výzva", "Erroneous challenge": "Chybná výzva",
"Premieres `x`": "Premiéra `x`", "Premieres `x`": "Premiéra `x`",
"CAPTCHA is a required field": "CAPTCHA je vyžadované pole", "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", "permalink": "permalink",
"search_filters_sort_option_date": "Upload dato", "search_filters_sort_option_date": "Upload dato",
"search_filters_features_label": "Funktioner", "search_filters_features_label": "Funktioner",
"search_filters_label": "Filter",
"Khmer": "Khmer", "Khmer": "Khmer",
"Finnish": "Finsk", "Finnish": "Finsk",
"search_filters_date_option_week": "Denne uge", "search_filters_date_option_week": "Denne uge",
@ -349,7 +348,6 @@
"next_steps_error_message": "Efter det burde du prøve at: ", "next_steps_error_message": "Efter det burde du prøve at: ",
"Sinhala": "Singalesisk (Sinhala)", "Sinhala": "Singalesisk (Sinhala)",
"Thai": "Thai", "Thai": "Thai",
"Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans",
"No such user": "Brugeren findes ikke", "No such user": "Brugeren findes ikke",
"Token is expired, please try again": "Token er udløbet, prøv igen", "Token is expired, please try again": "Token er udløbet, prøv igen",
"Catalan": "Catalansk", "Catalan": "Catalansk",
@ -461,5 +459,6 @@
"generic_count_weeks_plural": "{{count}} uger", "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_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_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", "Show less": "Weniger anzeigen",
"Watch on YouTube": "Video auf YouTube ansehen", "Watch on YouTube": "Video auf YouTube ansehen",
"Switch Invidious Instance": "Invidious Instanz wechseln", "Switch Invidious Instance": "Invidious Instanz wechseln",
"Broken? Try another Invidious Instance": "Kaputt? Versuche eine andere Invidious Instanz",
"Hide annotations": "Anmerkungen ausblenden", "Hide annotations": "Anmerkungen ausblenden",
"Show annotations": "Anmerkungen anzeigen", "Show annotations": "Anmerkungen anzeigen",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Standort", "search_filters_features_option_location": "Standort",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtern",
"Current version: ": "Aktuelle Version: ", "Current version: ": "Aktuelle Version: ",
"next_steps_error_message": "Danach folgendes versuchen: ", "next_steps_error_message": "Danach folgendes versuchen: ",
"next_steps_error_message_refresh": "Aktualisieren", "next_steps_error_message_refresh": "Aktualisieren",
@ -461,5 +459,6 @@
"Chinese (China)": "Chinesisch (China)", "Chinese (China)": "Chinesisch (China)",
"Chinese (Taiwan)": "Chinesisch (Taiwan)", "Chinese (Taiwan)": "Chinesisch (Taiwan)",
"Korean (auto-generated)": "Koreanisch (automatisch generiert)", "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": "Αυτόν τον μήνα", "search_filters_date_option_month": "Αυτόν τον μήνα",
"Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο GitHub.", "Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο GitHub.",
"search_filters_sort_label": "Ταξινόμηση κατά", "search_filters_sort_label": "Ταξινόμηση κατά",
"search_filters_label": "Φίλτρο",
"search_filters_type_option_movie": "Ταινία", "search_filters_type_option_movie": "Ταινία",
"footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας", "footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας",
"search_filters_features_label": "Χαρακτηριστικά", "search_filters_features_label": "Χαρακτηριστικά",
@ -449,5 +448,6 @@
"videoinfo_youTube_embed_link": "Ενσωμάτωση", "videoinfo_youTube_embed_link": "Ενσωμάτωση",
"videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης", "videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης",
"search_filters_type_option_show": "Μπάρα προόδου διαβάσματος", "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", "Show less": "Montri malpli",
"Watch on YouTube": "Vidi filmeton en JuTubo", "Watch on YouTube": "Vidi filmeton en JuTubo",
"Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious", "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", "Hide annotations": "Kaŝi prinotojn",
"Show annotations": "Montri prinotojn", "Show annotations": "Montri prinotojn",
"Genre: ": "Ĝenro: ", "Genre: ": "Ĝenro: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "loko", "search_filters_features_option_location": "loko",
"search_filters_features_option_hdr": "granddinamikgama", "search_filters_features_option_hdr": "granddinamikgama",
"search_filters_label": "filtri",
"Current version: ": "Nuna versio: ", "Current version: ": "Nuna versio: ",
"next_steps_error_message": "Poste, vi provu: ", "next_steps_error_message": "Poste, vi provu: ",
"next_steps_error_message_refresh": "Reŝargi", "next_steps_error_message_refresh": "Reŝargi",
@ -369,5 +367,6 @@
"footer_original_source_code": "Originala fontkodo", "footer_original_source_code": "Originala fontkodo",
"footer_donate_page": "Donaci", "footer_donate_page": "Donaci",
"preferences_region_label": "Lando de la enhavo: ", "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", "Show less": "Mostrar menos",
"Watch on YouTube": "Ver el vídeo en YouTube", "Watch on YouTube": "Ver el vídeo en YouTube",
"Switch Invidious Instance": "Cambiar Instancia de Invidious", "Switch Invidious Instance": "Cambiar Instancia de Invidious",
"Broken? Try another Invidious Instance": "¿Algún error? Prueba otra instancia de Invidious",
"Hide annotations": "Ocultar anotaciones", "Hide annotations": "Ocultar anotaciones",
"Show annotations": "Mostrar anotaciones", "Show annotations": "Mostrar anotaciones",
"Genre: ": "Género: ", "Genre: ": "Género: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "ubicación", "search_filters_features_option_location": "ubicación",
"search_filters_features_option_hdr": "hdr", "search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtro",
"Current version: ": "Versión actual: ", "Current version: ": "Versión actual: ",
"next_steps_error_message": "Después de lo cual deberías intentar: ", "next_steps_error_message": "Después de lo cual deberías intentar: ",
"next_steps_error_message_refresh": "Recargar la página", "next_steps_error_message_refresh": "Recargar la página",
@ -459,5 +457,18 @@
"Korean (auto-generated)": "Coreano (generados automáticamente)", "Korean (auto-generated)": "Coreano (generados automáticamente)",
"Spanish (Mexico)": "Español (Méjico)", "Spanish (Mexico)": "Español (Méjico)",
"Spanish (auto-generated)": "Español (generados automáticamente)", "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", "Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da",
"German": "Alemaniarra", "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.", "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", "View YouTube comments": "YouTubeko iruzkinak ikusi",
"Google verification code": "Googleren berresteko kodea", "Google verification code": "Googleren berresteko kodea",
"`x` is live": "'x' bizirik darrai", "`x` is live": "'x' bizirik darrai",

View file

@ -148,7 +148,6 @@
"Show less": "نمایش کم‌تر", "Show less": "نمایش کم‌تر",
"Watch on YouTube": "تماشا در یوتیوب", "Watch on YouTube": "تماشا در یوتیوب",
"Switch Invidious Instance": "تعویض نمونه اینویدیوس", "Switch Invidious Instance": "تعویض نمونه اینویدیوس",
"Broken? Try another Invidious Instance": "کار نمی‌کند؟ نمونه دیگری از اینویدیوس را امتحان کنید",
"Hide annotations": "مخفی کردن حاشیه نویسی ها", "Hide annotations": "مخفی کردن حاشیه نویسی ها",
"Show annotations": "نمایش حاشیه نویسی ها", "Show annotations": "نمایش حاشیه نویسی ها",
"Genre: ": "ژانر: ", "Genre: ": "ژانر: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "مکان", "search_filters_features_option_location": "مکان",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "پالایه",
"Current version: ": "نسخه فعلی: ", "Current version: ": "نسخه فعلی: ",
"next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ", "next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ",
"next_steps_error_message_refresh": "تازه‌سازی", "next_steps_error_message_refresh": "تازه‌سازی",
@ -412,5 +410,6 @@
"footer_original_source_code": "کد منبع اصلی", "footer_original_source_code": "کد منبع اصلی",
"search_filters_duration_option_long": "بلند (> 20 دقیقه)", "search_filters_duration_option_long": "بلند (> 20 دقیقه)",
"adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده", "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", "Show less": "Näytä vähemmän",
"Watch on YouTube": "Katso YouTubessa", "Watch on YouTube": "Katso YouTubessa",
"Switch Invidious Instance": "Vaihda Invidious-instanssia", "Switch Invidious Instance": "Vaihda Invidious-instanssia",
"Broken? Try another Invidious Instance": "Rikki? Kokeile toista Invidious-instanssia",
"Hide annotations": "Piilota merkkaukset", "Hide annotations": "Piilota merkkaukset",
"Show annotations": "Näytä merkkaukset", "Show annotations": "Näytä merkkaukset",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
@ -354,7 +353,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Sijainti", "search_filters_features_option_location": "Sijainti",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Suodatin",
"Current version: ": "Tämänhetkinen versio: ", "Current version: ": "Tämänhetkinen versio: ",
"next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ", "next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ",
"next_steps_error_message_refresh": "Päivitä", "next_steps_error_message_refresh": "Päivitä",
@ -461,5 +459,16 @@
"Spanish (Mexico)": "Espanja (Meksiko)", "Spanish (Mexico)": "Espanja (Meksiko)",
"Spanish (Spain)": "Espanja (Espanja)", "Spanish (Spain)": "Espanja (Espanja)",
"Turkish (auto-generated)": "Turkki (automaattisesti luotu)", "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", "Show less": "Afficher moins",
"Watch on YouTube": "Voir la vidéo sur Youtube", "Watch on YouTube": "Voir la vidéo sur Youtube",
"Switch Invidious Instance": "Changer d'instance", "Switch Invidious Instance": "Changer d'instance",
"Broken? Try another Invidious Instance": "Instance Invidious défectueuse ? Essayez-en une autre",
"Hide annotations": "Masquer les annotations", "Hide annotations": "Masquer les annotations",
"Show annotations": "Afficher les annotations", "Show annotations": "Afficher les annotations",
"Genre: ": "Genre : ", "Genre: ": "Genre : ",
@ -361,33 +360,32 @@
"Videos": "Vidéos", "Videos": "Vidéos",
"Playlists": "Listes de lecture", "Playlists": "Listes de lecture",
"Community": "Communauté", "Community": "Communauté",
"search_filters_sort_option_relevance": "pertinence", "search_filters_sort_option_relevance": "Pertinence",
"search_filters_sort_option_rating": "évaluation", "search_filters_sort_option_rating": "Notation",
"search_filters_sort_option_date": "date", "search_filters_sort_option_date": "Date d'ajout",
"search_filters_sort_option_views": "nombre de vues", "search_filters_sort_option_views": "Nombre de vues",
"search_filters_type_label": "type", "search_filters_type_label": "Type de contenu",
"search_filters_duration_label": "durée", "search_filters_duration_label": "Durée",
"search_filters_features_label": "fonctionnalités", "search_filters_features_label": "Fonctionnalités",
"search_filters_sort_label": "Trier par", "search_filters_sort_label": "Trier par",
"search_filters_date_option_hour": "dernière heure", "search_filters_date_option_hour": "Dernière heure",
"search_filters_date_option_today": "aujourd'hui", "search_filters_date_option_today": "Aujourd'hui",
"search_filters_date_option_week": "semaine", "search_filters_date_option_week": "Cette semaine",
"search_filters_date_option_month": "mois", "search_filters_date_option_month": "Ce mois-ci",
"search_filters_date_option_year": "année", "search_filters_date_option_year": "Cette année",
"search_filters_type_option_video": "vidéo", "search_filters_type_option_video": "Vidéo",
"search_filters_type_option_channel": "chaîne", "search_filters_type_option_channel": "Chaîne",
"search_filters_type_option_playlist": "liste de lecture", "search_filters_type_option_playlist": "Liste de lecture",
"search_filters_type_option_movie": "film", "search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "émission", "search_filters_type_option_show": "Émission",
"search_filters_features_option_hd": "HD", "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_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D", "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_four_k": "4K",
"search_filters_features_option_location": "emplacement", "search_filters_features_option_location": "emplacement",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "filtrer",
"Current version: ": "Version actuelle : ", "Current version: ": "Version actuelle : ",
"next_steps_error_message": "Vous pouvez essayer de : ", "next_steps_error_message": "Vous pouvez essayer de : ",
"next_steps_error_message_refresh": "Rafraîchir la page", "next_steps_error_message_refresh": "Rafraîchir la page",
@ -420,7 +418,7 @@
"videoinfo_started_streaming_x_ago": "En stream depuis `x`", "videoinfo_started_streaming_x_ago": "En stream depuis `x`",
"videoinfo_watch_on_youTube": "Regarder sur YouTube", "videoinfo_watch_on_youTube": "Regarder sur YouTube",
"videoinfo_youTube_embed_link": "Intégrer", "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é", "videoinfo_invidious_embed_link": "Lien intégré",
"download_subtitles": "Sous-titres - `x` (.vtt)", "download_subtitles": "Sous-titres - `x` (.vtt)",
"user_saved_playlists": "`x` listes de lecture sauvegardées", "user_saved_playlists": "`x` listes de lecture sauvegardées",
@ -461,5 +459,16 @@
"Vietnamese (auto-generated)": "Vietnamien (auto-généré)", "Vietnamese (auto-generated)": "Vietnamien (auto-généré)",
"Russian (auto-generated)": "Russe (auto-généré)", "Russian (auto-generated)": "Russe (auto-généré)",
"Spanish (Spain)": "Espagnol (Espagne)", "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_four_k": "4K",
"search_filters_features_option_location": "מיקום", "search_filters_features_option_location": "מיקום",
"search_filters_features_option_hdr": "HDR", "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", "Show less": "Pokaži manje",
"Watch on YouTube": "Gledaj na YouTubeu", "Watch on YouTube": "Gledaj na YouTubeu",
"Switch Invidious Instance": "Promijeni Invidious instancu", "Switch Invidious Instance": "Promijeni Invidious instancu",
"Broken? Try another Invidious Instance": "Pokvarena? Probaj jednu drugu Invidious instancu",
"Hide annotations": "Sakrij napomene", "Hide annotations": "Sakrij napomene",
"Show annotations": "Prikaži napomene", "Show annotations": "Prikaži napomene",
"Genre: ": "Žanr: ", "Genre: ": "Žanr: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "lokacija", "search_filters_features_option_location": "lokacija",
"search_filters_features_option_hdr": "hdr", "search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtar",
"Current version: ": "Trenutačna verzija: ", "Current version: ": "Trenutačna verzija: ",
"next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ", "next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ",
"next_steps_error_message_refresh": "Aktualiziraj stranicu", "next_steps_error_message_refresh": "Aktualiziraj stranicu",
@ -477,5 +475,6 @@
"Korean (auto-generated)": "Korejski (automatski generiran)", "Korean (auto-generated)": "Korejski (automatski generiran)",
"Portuguese (auto-generated)": "Portugalski (automatski generiran)", "Portuguese (auto-generated)": "Portugalski (automatski generiran)",
"Spanish (auto-generated)": "Španjolski (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", "Released under the AGPLv3 on Github.": "AGPLv3 licenc alapján a GitHubon",
"search_filters_features_option_three_d": "3D-ben", "search_filters_features_option_three_d": "3D-ben",
"search_filters_features_option_live": "Élőben", "search_filters_features_option_live": "Élőben",
"search_filters_label": "Szűrők",
"next_steps_error_message_refresh": "Újratöltés", "next_steps_error_message_refresh": "Újratöltés",
"footer_donate_page": "Adakozás", "footer_donate_page": "Adakozás",
"footer_source_code": "Forráskód", "footer_source_code": "Forráskód",
@ -414,7 +413,6 @@
"search_filters_date_option_hour": "Az elmúlt órában", "search_filters_date_option_hour": "Az elmúlt órában",
"search_filters_type_option_movie": "Film", "search_filters_type_option_movie": "Film",
"search_filters_features_option_hdr": "HDR", "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ő", "search_filters_duration_label": "Játékidő",
"next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ", "next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ",
"Xhosa": "xhosza", "Xhosa": "xhosza",
@ -460,5 +458,6 @@
"Italian (auto-generated)": "olasz (automatikusan generált)", "Italian (auto-generated)": "olasz (automatikusan generált)",
"Dutch (auto-generated)": "holland (automatikusan generált)", "Dutch (auto-generated)": "holland (automatikusan generált)",
"French (auto-generated)": "francia (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", "Show less": "Tampilkan lebih sedikit",
"Watch on YouTube": "Tonton di YouTube", "Watch on YouTube": "Tonton di YouTube",
"Switch Invidious Instance": "Ganti peladen Invidious", "Switch Invidious Instance": "Ganti peladen Invidious",
"Broken? Try another Invidious Instance": "Rusak? Coba peladen Invidious yang lain",
"Hide annotations": "Sembunyikan anotasi", "Hide annotations": "Sembunyikan anotasi",
"Show annotations": "Tampilkan anotasi", "Show annotations": "Tampilkan anotasi",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Lokasi", "search_filters_features_option_location": "Lokasi",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Saring",
"Current version: ": "Versi saat ini: ", "Current version: ": "Versi saat ini: ",
"next_steps_error_message": "Setelah itu Anda harus mencoba: ", "next_steps_error_message": "Setelah itu Anda harus mencoba: ",
"next_steps_error_message_refresh": "Segarkan", "next_steps_error_message_refresh": "Segarkan",
@ -419,5 +417,6 @@
"crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:", "crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:",
"English (United States)": "Inggris (US)", "English (United States)": "Inggris (US)",
"preferences_watch_history_label": "Aktifkan riwayat tontonan: ", "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_four_k": "4K",
"search_filters_features_option_location": "Posizione", "search_filters_features_option_location": "Posizione",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtra",
"Current version: ": "Versione attuale: ", "Current version: ": "Versione attuale: ",
"preferences_quality_dash_option_240p": "240p", "preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_360p": "360p", "preferences_quality_dash_option_360p": "360p",
@ -409,22 +408,22 @@
"preferences_automatic_instance_redirect_label": "Reindirizzamento automatico dell'istanza (ripiego su redirect.invidious.io): ", "preferences_automatic_instance_redirect_label": "Reindirizzamento automatico dell'istanza (ripiego su redirect.invidious.io): ",
"Video unavailable": "Video non disponibile", "Video unavailable": "Video non disponibile",
"preferences_show_nick_label": "Mostra nickname in alto: ", "preferences_show_nick_label": "Mostra nickname in alto: ",
"short": "Corto (< 4 minuti)",
"videoinfo_youTube_embed_link": "Incorpora", "videoinfo_youTube_embed_link": "Incorpora",
"videoinfo_invidious_embed_link": "Incorpora collegamento", "videoinfo_invidious_embed_link": "Incorpora collegamento",
"user_created_playlists": "playlist create da `x`", "user_created_playlists": "playlist create da `x`",
"preferences_save_player_pos_label": "Memorizza il minutaggio raggiunto dal video: ", "preferences_save_player_pos_label": "Memorizza il minutaggio raggiunto dal video: ",
"purchased": "Acquistato",
"preferences_quality_option_dash": "DASH (qualità adattiva)", "preferences_quality_option_dash": "DASH (qualità adattiva)",
"preferences_region_label": "Nazione del contenuto: ", "preferences_region_label": "Nazione del contenuto: ",
"preferences_category_misc": "Preferenze varie", "preferences_category_misc": "Preferenze varie",
"show": "Serie",
"long": "Lungo (> 20 minuti)",
"next_steps_error_message": "Dopodiché dovresti provare a: ", "next_steps_error_message": "Dopodiché dovresti provare a: ",
"next_steps_error_message_refresh": "Aggiornare", "next_steps_error_message_refresh": "Aggiornare",
"footer_donate_page": "Dona", "footer_donate_page": "Dona",
"footer_source_code": "Codice sorgente", "footer_source_code": "Codice sorgente",
"adminprefs_modified_source_code_url_label": "Link per il repository del codice sorgente modificato", "adminprefs_modified_source_code_url_label": "Link per il repository del codice sorgente modificato",
"Show more": "Mostra di più", "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": "表示を減らす", "Show less": "表示を減らす",
"Watch on YouTube": "YouTube で視聴", "Watch on YouTube": "YouTube で視聴",
"Switch Invidious Instance": "Invidiousインスタンスの変更", "Switch Invidious Instance": "Invidiousインスタンスの変更",
"Broken? Try another Invidious Instance": "壊れる違うInvidiousインスタンスを試してみる",
"Hide annotations": "アノテーションを隠す", "Hide annotations": "アノテーションを隠す",
"Show annotations": "アノテーションを表示", "Show annotations": "アノテーションを表示",
"Genre: ": "ジャンル: ", "Genre: ": "ジャンル: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "場所", "search_filters_features_option_location": "場所",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "フィルタ",
"Current version: ": "現在のバージョン: ", "Current version: ": "現在のバージョン: ",
"next_steps_error_message": "下記のものを試して下さい: ", "next_steps_error_message": "下記のものを試して下さい: ",
"next_steps_error_message_refresh": "再読込", "next_steps_error_message_refresh": "再読込",
@ -434,5 +432,6 @@
"Spanish (Mexico)": "スペイン語 (メキシコ)", "Spanish (Mexico)": "スペイン語 (メキシコ)",
"Spanish (Spain)": "スペイン語 (スペイン)", "Spanish (Spain)": "スペイン語 (スペイン)",
"Vietnamese (auto-generated)": "ベトナム語 (自動生成)", "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_three_d": "3D",
"search_filters_features_option_location": "지역", "search_filters_features_option_location": "지역",
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_label": "필터",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"Current version: ": "현재 버전: ", "Current version: ": "현재 버전: ",
"next_steps_error_message_refresh": "새로 고침", "next_steps_error_message_refresh": "새로 고침",
@ -298,7 +297,6 @@
"Empty playlist": "재생목록 비어 있음", "Empty playlist": "재생목록 비어 있음",
"Show annotations": "주석 보이기", "Show annotations": "주석 보이기",
"Hide annotations": "주석 숨기기", "Hide annotations": "주석 숨기기",
"Broken? Try another Invidious Instance": "안되나요? 다른 Invidious 인스턴스를 시도해보세요",
"Switch Invidious Instance": "Invidious 인스턴스 변경", "Switch Invidious Instance": "Invidious 인스턴스 변경",
"Spanish": "스페인어", "Spanish": "스페인어",
"Southern Sotho": "소토어", "Southern Sotho": "소토어",
@ -382,5 +380,6 @@
"footer_source_code": "소스 코드", "footer_source_code": "소스 코드",
"footer_original_source_code": "원본 소스 코드", "footer_original_source_code": "원본 소스 코드",
"footer_modfied_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", "Show less": "Rodyti mažiau",
"Watch on YouTube": "Žiaurėti Youtube", "Watch on YouTube": "Žiaurėti Youtube",
"Switch Invidious Instance": "Keisti Invidious šaltinį", "Switch Invidious Instance": "Keisti Invidious šaltinį",
"Broken? Try another Invidious Instance": "Neveikia? Bandyk kitą Invidious šaltinį",
"Hide annotations": "Slėpti anotacijas", "Hide annotations": "Slėpti anotacijas",
"Show annotations": "Rodyti anotacijas", "Show annotations": "Rodyti anotacijas",
"Genre: ": "Žanras: ", "Genre: ": "Žanras: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Vietovė", "search_filters_features_option_location": "Vietovė",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtras",
"Current version: ": "Dabartinė versija: ", "Current version: ": "Dabartinė versija: ",
"next_steps_error_message": "Po to turėtumėte pabandyti: ", "next_steps_error_message": "Po to turėtumėte pabandyti: ",
"next_steps_error_message_refresh": "Atnaujinti", "next_steps_error_message_refresh": "Atnaujinti",
@ -372,5 +370,6 @@
"preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: ", "preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: ",
"preferences_quality_dash_option_best": "Geriausia", "preferences_quality_dash_option_best": "Geriausia",
"preferences_quality_dash_option_worst": "Blogiausia", "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", "Show less": "Vis mindre",
"Watch on YouTube": "Vis video på YouTube", "Watch on YouTube": "Vis video på YouTube",
"Switch Invidious Instance": "Bytt Invidious-instans", "Switch Invidious Instance": "Bytt Invidious-instans",
"Broken? Try another Invidious Instance": "Knekt? Forsøk en annen Invidious-instans",
"Hide annotations": "Skjul merknader", "Hide annotations": "Skjul merknader",
"Show annotations": "Vis merknader", "Show annotations": "Vis merknader",
"Genre: ": "Sjanger: ", "Genre: ": "Sjanger: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "sted", "search_filters_features_option_location": "sted",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "filtrer",
"Current version: ": "Gjeldende versjon: ", "Current version: ": "Gjeldende versjon: ",
"next_steps_error_message": "Etterpå bør du prøve dette: ", "next_steps_error_message": "Etterpå bør du prøve dette: ",
"next_steps_error_message_refresh": "Gjenoppfrisk", "next_steps_error_message_refresh": "Gjenoppfrisk",
@ -461,5 +459,6 @@
"Portuguese (auto-generated)": "Portugisisk (laget automatisk)", "Portuguese (auto-generated)": "Portugisisk (laget automatisk)",
"Russian (auto-generated)": "Russisk (laget automatisk)", "Russian (auto-generated)": "Russisk (laget automatisk)",
"Dutch (auto-generated)": "Nederlandsk (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_four_k": "4K",
"search_filters_features_option_location": "locatie", "search_filters_features_option_location": "locatie",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "verfijnen",
"Current version: ": "Huidige versie: ", "Current version: ": "Huidige versie: ",
"Switch Invidious Instance": "Schakel tussen de Invidious Instanties", "Switch Invidious Instance": "Schakel tussen de Invidious Instanties",
"preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ", "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_original_source_code": "Originele bron-code",
"footer_modfied_source_code": "Gewijzigde bron-code", "footer_modfied_source_code": "Gewijzigde bron-code",
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats", "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: ", "next_steps_error_message": "Waarna u moet proberen om: ",
"footer_source_code": "Bron-code", "footer_source_code": "Bron-code",
"search_filters_duration_option_long": "Lang (> 20 minuten)", "search_filters_duration_option_long": "Lang (> 20 minuten)",
@ -398,5 +396,6 @@
"preferences_save_player_pos_label": "Huidig afspeeltijdstip opslaan: ", "preferences_save_player_pos_label": "Huidig afspeeltijdstip opslaan: ",
"none": "geen", "none": "geen",
"search_filters_features_option_purchased": "Gekocht", "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", "Show less": "Pokaż mniej",
"Watch on YouTube": "Zobacz film na YouTube", "Watch on YouTube": "Zobacz film na YouTube",
"Switch Invidious Instance": "Przełącz instancję Invidious", "Switch Invidious Instance": "Przełącz instancję Invidious",
"Broken? Try another Invidious Instance": "Nie działa? Spróbuj innej instancji Invidious",
"Hide annotations": "Ukryj adnotacje", "Hide annotations": "Ukryj adnotacje",
"Show annotations": "Pokaż adnotacje", "Show annotations": "Pokaż adnotacje",
"Genre: ": "Gatunek: ", "Genre: ": "Gatunek: ",
@ -354,7 +353,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "Lokalizacja", "search_filters_features_option_location": "Lokalizacja",
"search_filters_features_option_hdr": "hdr", "search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtr",
"Current version: ": "Aktualna wersja: ", "Current version: ": "Aktualna wersja: ",
"next_steps_error_message": "Po czym powinien*ś spróbować: ", "next_steps_error_message": "Po czym powinien*ś spróbować: ",
"next_steps_error_message_refresh": "Odśwież", "next_steps_error_message_refresh": "Odśwież",
@ -476,5 +474,6 @@
"Japanese (auto-generated)": "japoński (wygenerowany automatycznie)", "Japanese (auto-generated)": "japoński (wygenerowany automatycznie)",
"Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)", "Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)",
"Portuguese (auto-generated)": "portugalski (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", "Show less": "Mostrar menos",
"Watch on YouTube": "Assistir no YouTube", "Watch on YouTube": "Assistir no YouTube",
"Switch Invidious Instance": "Mudar a instância do Invidious", "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", "Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações", "Show annotations": "Mostrar anotações",
"Genre: ": "Gênero: ", "Genre: ": "Gênero: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "localização", "search_filters_features_option_location": "localização",
"search_filters_features_option_hdr": "hdr", "search_filters_features_option_hdr": "hdr",
"search_filters_label": "filtro",
"Current version: ": "Versão atual: ", "Current version: ": "Versão atual: ",
"next_steps_error_message": "Depois disso, você deve tentar: ", "next_steps_error_message": "Depois disso, você deve tentar: ",
"next_steps_error_message_refresh": "Atualizar", "next_steps_error_message_refresh": "Atualizar",
@ -437,5 +435,6 @@
"user_created_playlists": "`x` listas de reprodução criadas", "user_created_playlists": "`x` listas de reprodução criadas",
"user_saved_playlists": "`x` listas de reprodução salvas", "user_saved_playlists": "`x` listas de reprodução salvas",
"Video unavailable": "Vídeo indisponível", "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", "Show less": "Mostrar menos",
"Watch on YouTube": "Ver no YouTube", "Watch on YouTube": "Ver no YouTube",
"Switch Invidious Instance": "Mudar a instância do Invidious", "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", "Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações", "Show annotations": "Mostrar anotações",
"Genre: ": "Género: ", "Genre: ": "Género: ",
@ -371,9 +370,9 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Localização", "search_filters_features_option_location": "Localização",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtro",
"Current version: ": "Versão atual: ", "Current version: ": "Versão atual: ",
"next_steps_error_message": "Pode tentar as seguintes opções: ", "next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Atualizar", "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_date": "Data de envio",
"search_filters_sort_option_rating": "Avaliação", "search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_relevance": "Relevância", "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", "Switch Invidious Instance": "Mudar a instância do Invidious",
"Show less": "Mostrar menos", "Show less": "Mostrar menos",
"Show more": "Mostrar mais", "Show more": "Mostrar mais",
@ -17,7 +16,6 @@
"next_steps_error_message_go_to_youtube": "Ir ao YouTube", "next_steps_error_message_go_to_youtube": "Ir ao YouTube",
"next_steps_error_message": "Pode tentar as seguintes opções: ", "next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Atualizar", "next_steps_error_message_refresh": "Atualizar",
"search_filters_label": "Filtro",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_features_option_location": "Localização", "search_filters_features_option_location": "Localização",
"search_filters_features_option_four_k": "4K", "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_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_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):", "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", "No": "Nu",
"Import and Export Data": "Importați și Exportați Datele", "Import and Export Data": "Importați și Exportați Datele",
"Import": "Importați", "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 YouTube subscriptions": "Importați abonamentele de pe YouTube",
"Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)", "Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)", "Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)",
@ -29,7 +29,7 @@
"Export": "Exportați", "Export": "Exportați",
"Export subscriptions as OPML": "Exportați abonamentele în format OPML", "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 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?", "Delete account?": "Sunteți siguri că doriți să vă ștergeți contul?",
"History": "Istoric", "History": "Istoric",
"An alternative front-end to YouTube": "O alternativă front-end pentru YouTube", "An alternative front-end to YouTube": "O alternativă front-end pentru YouTube",
@ -155,7 +155,7 @@
"Hide replies": "Ascundeți replicile", "Hide replies": "Ascundeți replicile",
"Show replies": "Afișați replicile", "Show replies": "Afișați replicile",
"Incorrect password": "Parolă incorectă", "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).", "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", "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.", "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", "Deleted or invalid channel": "Canal șters sau invalid",
"This channel does not exist.": "Acest canal nu există.", "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 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`", "`x` ago": "acum `x`",
"Load more": "Vedeți mai mult", "Load more": "Vedeți mai mult",
"Could not create mix.": "Nu am putut crea această listă de redare.", "Could not create mix.": "Nu am putut crea această listă de redare.",
@ -187,7 +187,7 @@
"Erroneous challenge": "Challenge invalid", "Erroneous challenge": "Challenge invalid",
"Erroneous token": "Token invalid", "Erroneous token": "Token invalid",
"No such user": "Acest utilizator nu există", "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": "Engleză",
"English (auto-generated)": "Engleză (generată automat)", "English (auto-generated)": "Engleză (generată automat)",
"Afrikaans": "Afrikaans", "Afrikaans": "Afrikaans",
@ -295,7 +295,7 @@
"Yoruba": "Yoruba", "Yoruba": "Yoruba",
"Zulu": "Zoulou", "Zulu": "Zoulou",
"Fallback comments: ": "Comentarii alternative: ", "Fallback comments: ": "Comentarii alternative: ",
"Popular": "Popular", "Popular": "Populare",
"Top": "Top", "Top": "Top",
"About": "Despre", "About": "Despre",
"Rating: ": "Evaluare: ", "Rating: ": "Evaluare: ",
@ -318,5 +318,173 @@
"Videos": "Videoclipuri", "Videos": "Videoclipuri",
"Playlists": "Liste de redare", "Playlists": "Liste de redare",
"Community": "Comunitate", "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": "Показать меньше", "Show less": "Показать меньше",
"Watch on YouTube": "Смотреть на YouTube", "Watch on YouTube": "Смотреть на YouTube",
"Switch Invidious Instance": "Сменить экземпляр Invidious", "Switch Invidious Instance": "Сменить экземпляр Invidious",
"Broken? Try another Invidious Instance": "Сломался? Попробуйте другой экземпляр Invidious",
"Hide annotations": "Скрыть аннотации", "Hide annotations": "Скрыть аннотации",
"Show annotations": "Показать аннотации", "Show annotations": "Показать аннотации",
"Genre: ": "Жанр: ", "Genre: ": "Жанр: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Местоположение", "search_filters_features_option_location": "Местоположение",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Фильтр",
"Current version: ": "Текущая версия: ", "Current version: ": "Текущая версия: ",
"next_steps_error_message": "После чего следует попробовать: ", "next_steps_error_message": "После чего следует попробовать: ",
"next_steps_error_message_refresh": "Обновить", "next_steps_error_message_refresh": "Обновить",
@ -477,5 +475,6 @@
"Video unavailable": "Видео недоступно", "Video unavailable": "Видео недоступно",
"preferences_save_player_pos_label": "Запоминать позицию: ", "preferences_save_player_pos_label": "Запоминать позицию: ",
"preferences_region_label": "Страна: ", "preferences_region_label": "Страна: ",
"preferences_watch_history_label": "Включить историю просмотров " "preferences_watch_history_label": "Включить историю просмотров ",
"search_filters_title": "Фильтр"
} }

View file

@ -18,15 +18,15 @@
"No": "Nie", "No": "Nie",
"Import and Export Data": "Import a Export údajov", "Import and Export Data": "Import a Export údajov",
"Import": "Import", "Import": "Import",
"Import Invidious data": "Importovať údaje Invidious", "Import Invidious data": "Importovať JSON údaje Invidious",
"Import YouTube subscriptions": "Importovať odbery YouTube", "Import YouTube subscriptions": "Importovať odbery YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)", "Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)", "Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)",
"Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)", "Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)",
"Export": "Export", "Export": "Export",
"Export subscriptions as OPML": "Exportovať odbery ako OPML", "Export subscriptions as OPML": "Exportovať odbery ako OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovať odbery ako OPML (pre NewPipe a FreeTube)", "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?", "Delete account?": "Zrušiť účet?",
"History": "História", "History": "História",
"An alternative front-end to YouTube": "Alternatívny front-end pre YouTube", "An alternative front-end to YouTube": "Alternatívny front-end pre YouTube",
@ -84,5 +84,23 @@
"preferences_unseen_only_label": "Zobraziť iba neprehrané: ", "preferences_unseen_only_label": "Zobraziť iba neprehrané: ",
"preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ", "preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ",
"Enable web notifications": "Povoliť webové upozornenia", "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", "Show less": "Shfaq më pak",
"Watch on YouTube": "Shiheni në YouTube", "Watch on YouTube": "Shiheni në YouTube",
"Switch Invidious Instance": "Ndërroni Instancë Invidious", "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", "Hide annotations": "Fshihi shënimet",
"Show annotations": "Shfaq shënime", "Show annotations": "Shfaq shënime",
"License: ": "Licencë: ", "License: ": "Licencë: ",
@ -371,7 +370,6 @@
"Nepali": "Nepaleze", "Nepali": "Nepaleze",
"Norwegian Bokmål": "Norvegjishte Bokmål", "Norwegian Bokmål": "Norvegjishte Bokmål",
"search_filters_features_option_three_sixty": "360°", "search_filters_features_option_three_sixty": "360°",
"search_filters_label": "Filtroji",
"Current version: ": "Versioni i tanishëm: ", "Current version: ": "Versioni i tanishëm: ",
"next_steps_error_message": "Pas të cilës duhet të provoni të: ", "next_steps_error_message": "Pas të cilës duhet të provoni të: ",
"next_steps_error_message_refresh": "Rifreskoje", "next_steps_error_message_refresh": "Rifreskoje",
@ -448,5 +446,6 @@
"Import YouTube subscriptions": "Importoni pajtime YouTube/OPML", "Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON", "Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ", "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_c_commons": "Creative Commons (Licenca)",
"search_filters_features_option_three_d": "3D", "search_filters_features_option_three_d": "3D",
"search_filters_features_option_hdr": "Video Visoke Rezolucije", "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": "Nakon čega bi trebali probati: ",
"next_steps_error_message_go_to_youtube": "Idi na YouTube", "next_steps_error_message_go_to_youtube": "Idi na YouTube",
"footer_documentation": "Dokumentacija", "footer_documentation": "Dokumentacija",
@ -226,7 +225,6 @@
"preferences_captions_label": "Podrazumevani titl: ", "preferences_captions_label": "Podrazumevani titl: ",
"Music": "Muzika", "Music": "Muzika",
"search_filters_type_label": "Tip", "search_filters_type_label": "Tip",
"Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu",
"Tamil": "Tamilski", "Tamil": "Tamilski",
"Save preferences": "Sačuvaj podešavanja", "Save preferences": "Sačuvaj podešavanja",
"Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ", "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", "unsubscribe": "prekini sa praćenjem",
"Blacklisted regions: ": "Zabranjene oblasti: ", "Blacklisted regions: ": "Zabranjene oblasti: ",
"Polish": "Poljski", "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_c_commons": "Creative Commons (Лиценца)",
"search_filters_features_option_live": "Уживо", "search_filters_features_option_live": "Уживо",
"search_filters_features_option_location": "Локација", "search_filters_features_option_location": "Локација",
"search_filters_label": "Филтер",
"next_steps_error_message": "Након чега би требали пробати: ", "next_steps_error_message": "Након чега би требали пробати: ",
"footer_donate_page": "Донирај", "footer_donate_page": "Донирај",
"footer_documentation": "Документација", "footer_documentation": "Документација",
@ -345,7 +344,6 @@
"search_filters_features_option_subtitles": "Титл/Превод", "search_filters_features_option_subtitles": "Титл/Превод",
"preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ", "preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ",
"Show less": "Прикажи мање", "Show less": "Прикажи мање",
"Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу",
"Family friendly? ": "Погодно за породицу? ", "Family friendly? ": "Погодно за породицу? ",
"Premieres `x`": ремерe у `x`", "Premieres `x`": ремерe у `x`",
"Bosnian": "Босански", "Bosnian": "Босански",
@ -369,5 +367,6 @@
"Hebrew": "Хебрејски", "Hebrew": "Хебрејски",
"Korean": "Корејски", "Korean": "Корејски",
"Kurdish": "Курдски", "Kurdish": "Курдски",
"Malay": "Малајски" "Malay": "Малајски",
"search_filters_title": "Филтер"
} }

View file

@ -139,7 +139,6 @@
"Show less": "Visa mindre", "Show less": "Visa mindre",
"Watch on YouTube": "Titta på YouTube", "Watch on YouTube": "Titta på YouTube",
"Switch Invidious Instance": "Byt Invidious Instans", "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", "Hide annotations": "Dölj länkar-i-video",
"Show annotations": "Visa länkar-i-video", "Show annotations": "Visa länkar-i-video",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
@ -353,7 +352,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "plats", "search_filters_features_option_location": "plats",
"search_filters_features_option_hdr": "hdr", "search_filters_features_option_hdr": "hdr",
"search_filters_label": "Filter",
"Current version: ": "Nuvarande version: ", "Current version: ": "Nuvarande version: ",
"next_steps_error_message_refresh": "Uppdatera", "next_steps_error_message_refresh": "Uppdatera",
"next_steps_error_message_go_to_youtube": "Gå till Youtube", "next_steps_error_message_go_to_youtube": "Gå till Youtube",
@ -361,5 +359,6 @@
"footer_source_code": "Källkod", "footer_source_code": "Källkod",
"search_filters_duration_option_long": "Lång (> 20 minuter)", "search_filters_duration_option_long": "Lång (> 20 minuter)",
"footer_documentation": "Dokumentation", "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", "Show less": "Daha az göster",
"Watch on YouTube": "YouTube'da izle", "Watch on YouTube": "YouTube'da izle",
"Switch Invidious Instance": "Invidious Örneğini Değiştir", "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", "Hide annotations": "Ek açıklamaları gizle",
"Show annotations": "Ek açıklamaları göster", "Show annotations": "Ek açıklamaları göster",
"Genre: ": "Tür: ", "Genre: ": "Tür: ",
@ -355,7 +354,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Konum", "search_filters_features_option_location": "Konum",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "Filtrele",
"Current version: ": "Şu anki sürüm: ", "Current version: ": "Şu anki sürüm: ",
"next_steps_error_message": "Bundan sonra şunları denemelisiniz: ", "next_steps_error_message": "Bundan sonra şunları denemelisiniz: ",
"next_steps_error_message_refresh": "Yenile", "next_steps_error_message_refresh": "Yenile",
@ -461,5 +459,16 @@
"Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)", "Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)",
"Spanish (Spain)": "İspanyolca (İspanya)", "Spanish (Spain)": "İspanyolca (İspanya)",
"Vietnamese (auto-generated)": "Vietnamca (otomatik oluşturuldu)", "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_0": "{{count}} годину",
"generic_count_hours_1": "{{count}} години", "generic_count_hours_1": "{{count}} години",
"generic_count_hours_2": "{{count}} годин", "generic_count_hours_2": "{{count}} годин",
"content_type": "Тип",
"crash_page_switch_instance": "спробуйте <a href=\"`x`\">використати інший сервер</a>", "crash_page_switch_instance": "спробуйте <a href=\"`x`\">використати інший сервер</a>",
"crash_page_read_the_faq": "прочитайте <a href=\"`x`\">часті питання (ЧаП)</a>", "crash_page_read_the_faq": "прочитайте <a href=\"`x`\">часті питання (ЧаП)</a>",
"crash_page_search_issue": "перегляньте <a href=\"`x`\">наявні обговорення на GitHub</a>", "crash_page_search_issue": "перегляньте <a href=\"`x`\">наявні обговорення на GitHub</a>",
@ -386,15 +385,6 @@
"Spanish (auto-generated)": "Іспанська (автогенератор)", "Spanish (auto-generated)": "Іспанська (автогенератор)",
"Spanish (Mexico)": "Іспанська (Мексика)", "Spanish (Mexico)": "Іспанська (Мексика)",
"Spanish (Spain)": "Іспанська (Іспанія)", "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", "next_steps_error_message_go_to_youtube": "Перейти до YouTube",
"footer_donate_page": "Пожертвувати", "footer_donate_page": "Пожертвувати",
"footer_documentation": "Документація", "footer_documentation": "Документація",
@ -415,29 +405,11 @@
"preferences_save_player_pos_label": "Зберегти позицію відтворення: ", "preferences_save_player_pos_label": "Зберегти позицію відтворення: ",
"preferences_show_nick_label": "Псевдонім угорі: ", "preferences_show_nick_label": "Псевдонім угорі: ",
"Show more": "Докладніше", "Show more": "Докладніше",
"week": "Цей тиждень",
"year": "Цей рік",
"video": "Відео",
"channel": "Канал",
"subtitles": "Субтитри",
"live": "Наживо",
"4k": "4K",
"filter": "Фільтр",
"next_steps_error_message": "Після чого спробуйте: ", "next_steps_error_message": "Після чого спробуйте: ",
"next_steps_error_message_refresh": "Оновити сторінку", "next_steps_error_message_refresh": "Оновити сторінку",
"relevance": "Доречність",
"rating": "Рейтинг",
"duration": "Тривалість",
"sort": "Порядок",
"movie": "Фільм",
"Search": "Пошук", "Search": "Пошук",
"location": "Місце",
"preferences_extend_desc_label": "Автоматично розширювати опис відео: ", "preferences_extend_desc_label": "Автоматично розширювати опис відео: ",
"month": "Цей місяць",
"features": "Функції",
"preferences_category_misc": "Різноманітні параметри", "preferences_category_misc": "Різноманітні параметри",
"date": "Дата вивантаження",
"hour": "Ця година",
"Show less": "Коротше", "Show less": "Коротше",
"preferences_quality_option_small": "Низька", "preferences_quality_option_small": "Низька",
"preferences_quality_dash_option_240p": "240p", "preferences_quality_dash_option_240p": "240p",
@ -453,18 +425,14 @@
"preferences_automatic_instance_redirect_label": "Автоматична зміна сервера (redirect.invidious.io як резерв): ", "preferences_automatic_instance_redirect_label": "Автоматична зміна сервера (redirect.invidious.io як резерв): ",
"Switch Invidious Instance": "Інший сервер Invidious", "Switch Invidious Instance": "Інший сервер Invidious",
"preferences_quality_dash_option_480p": "480p", "preferences_quality_dash_option_480p": "480p",
"Broken? Try another Invidious Instance": "Не працює? Спробуйте інший сервер Invidious",
"Chinese (Taiwan)": "Китайська (Тайвань)", "Chinese (Taiwan)": "Китайська (Тайвань)",
"Dutch (auto-generated)": "Нідерландська (автогенератор)", "Dutch (auto-generated)": "Нідерландська (автогенератор)",
"Indonesian (auto-generated)": "Індонезійська (автогенератор)", "Indonesian (auto-generated)": "Індонезійська (автогенератор)",
"Japanese (auto-generated)": "Японська (автогенератор)", "Japanese (auto-generated)": "Японська (автогенератор)",
"show": "Шоу",
"Korean (auto-generated)": "Корейська (автогенератор)", "Korean (auto-generated)": "Корейська (автогенератор)",
"generic_count_months_0": "{{count}} місяць", "generic_count_months_0": "{{count}} місяць",
"generic_count_months_1": "{{count}} місяці", "generic_count_months_1": "{{count}} місяці",
"generic_count_months_2": "{{count}} місяців", "generic_count_months_2": "{{count}} місяців",
"short": "Коротке (до 4 хвилин)",
"purchased": "Придбання",
"videoinfo_youTube_embed_link": "Вкласти", "videoinfo_youTube_embed_link": "Вкласти",
"generic_count_minutes_0": "{{count}} хвилину", "generic_count_minutes_0": "{{count}} хвилину",
"generic_count_minutes_1": "{{count}} хвилини", "generic_count_minutes_1": "{{count}} хвилини",
@ -477,5 +445,46 @@
"download_subtitles": "Субтитри — `x` (.vtt)", "download_subtitles": "Субтитри — `x` (.vtt)",
"comments_points_count_0": "{{count}} пункт", "comments_points_count_0": "{{count}} пункт",
"comments_points_count_1": "{{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", "Show less": "Hiện ít hơn",
"Watch on YouTube": "Xem trên YouTube", "Watch on YouTube": "Xem trên YouTube",
"Switch Invidious Instance": "Chuyển phiên bản Invidious", "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", "Hide annotations": "Ẩn chú thích",
"Show annotations": "Hiển thị chú thích", "Show annotations": "Hiển thị chú thích",
"Genre: ": "Thể loại: ", "Genre: ": "Thể loại: ",
@ -341,6 +340,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "vị trí", "search_filters_features_option_location": "vị trí",
"search_filters_features_option_hdr": "hdr", "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": "显示较少", "Show less": "显示较少",
"Watch on YouTube": "在 YouTube 观看", "Watch on YouTube": "在 YouTube 观看",
"Switch Invidious Instance": "切换 Invidious 实例", "Switch Invidious Instance": "切换 Invidious 实例",
"Broken? Try another Invidious Instance": "无法正常工作? 尝试另一个 Invidious 实例",
"Hide annotations": "隐藏注释", "Hide annotations": "隐藏注释",
"Show annotations": "显示注释", "Show annotations": "显示注释",
"Genre: ": "风格: ", "Genre: ": "风格: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4k", "search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "位置", "search_filters_features_option_location": "位置",
"search_filters_features_option_hdr": "hdr", "search_filters_features_option_hdr": "hdr",
"search_filters_label": "过滤器",
"Current version: ": "当前版本: ", "Current version: ": "当前版本: ",
"next_steps_error_message": "在此之后你应尝试: ", "next_steps_error_message": "在此之后你应尝试: ",
"next_steps_error_message_refresh": "刷新", "next_steps_error_message_refresh": "刷新",
@ -445,5 +443,16 @@
"French (auto-generated)": "法语 (自动生成)", "French (auto-generated)": "法语 (自动生成)",
"Turkish (auto-generated)": "土耳其语 (自动生成)", "Turkish (auto-generated)": "土耳其语 (自动生成)",
"Spanish (Spain)": "西班牙语 (西班牙)", "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": "顯示較少", "Show less": "顯示較少",
"Watch on YouTube": "在 YouTube 上觀看", "Watch on YouTube": "在 YouTube 上觀看",
"Switch Invidious Instance": "切換 Invidious 站台", "Switch Invidious Instance": "切換 Invidious 站台",
"Broken? Try another Invidious Instance": "故障了嗎?試試看其他 Invidious 站台吧",
"Hide annotations": "隱藏註釋", "Hide annotations": "隱藏註釋",
"Show annotations": "顯示註釋", "Show annotations": "顯示註釋",
"Genre: ": "風格: ", "Genre: ": "風格: ",
@ -371,7 +370,6 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "位置", "search_filters_features_option_location": "位置",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_label": "篩選條件",
"Current version: ": "目前版本: ", "Current version: ": "目前版本: ",
"next_steps_error_message": "之後您應該嘗試: ", "next_steps_error_message": "之後您應該嘗試: ",
"next_steps_error_message_refresh": "重新整理", "next_steps_error_message_refresh": "重新整理",
@ -445,5 +443,16 @@
"Portuguese (Brazil)": "葡萄牙語(巴西)", "Portuguese (Brazil)": "葡萄牙語(巴西)",
"Japanese (auto-generated)": "日語(自動產生)", "Japanese (auto-generated)": "日語(自動產生)",
"Portuguese (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: exception_page:
git: https://github.com/crystal-loot/exception_page.git git: https://github.com/crystal-loot/exception_page.git
version: 0.2.1 version: 0.2.2
kemal: kemal:
git: https://github.com/kemalcr/kemal.git git: https://github.com/kemalcr/kemal.git
version: 1.1.0 version: 1.1.2
kilt: kilt:
git: https://github.com/jeromegn/kilt.git git: https://github.com/jeromegn/kilt.git

View file

@ -18,7 +18,10 @@ dependencies:
version: ~> 0.18.0 version: ~> 0.18.0
kemal: kemal:
github: kemalcr/kemal github: kemalcr/kemal
version: ~> 1.1.0 version: ~> 1.1.2
kilt:
github: jeromegn/kilt
version: ~> 0.6.1
protodec: protodec:
github: iv-org/protodec github: iv-org/protodec
version: ~> 0.1.4 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 "digest/md5"
require "file_utils" require "file_utils"
# Require kemal, kilt, then our own overrides
require "kemal" require "kemal"
require "kilt"
require "./ext/kemal_content_for.cr"
require "./ext/kemal_static_file_handler.cr"
require "athena-negotiation" require "athena-negotiation"
require "openssl/hmac" require "openssl/hmac"
require "option_parser" require "option_parser"

View file

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

View file

@ -48,13 +48,19 @@ module JSON::Serializable
end end
end end
macro templated(filename, template = "template", navbar_search = true) macro templated(_filename, template = "template", navbar_search = true)
navbar_search = {{navbar_search}} 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 end
macro rendered(filename) macro rendered(filename)
render "src/invidious/views/#{{{filename}}}.ecr" Kilt.render("src/invidious/views/#{{{filename}}}.ecr")
end end
# Similar to Kemals halt method but works in a # 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] return filtered_instance_list.sample(1)[0]
end 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 xml.element("Period") do
i = 0 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 } mime_streams = audio_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type }
next if mime_streams.empty? 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} 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 } mime_streams = video_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type }
next if mime_streams.empty? next if mime_streams.empty?

View file

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

View file

@ -52,11 +52,11 @@
<% if !env.get("preferences").as(Preferences).thin_mode %> <% if !env.get("preferences").as(Preferences).thin_mode %>
<div class="thumbnail"> <div class="thumbnail">
<img loading="lazy" class="thumbnail" src="/vi/<%= item.id %>/mqdefault.jpg"/> <img loading="lazy" class="thumbnail" src="/vi/<%= item.id %>/mqdefault.jpg"/>
<% if plid = env.get?("remove_playlist_items") %> <% 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 %>&referer=<%= env.get("current_page") %>" method="post"> <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) || "") %>"> <input type="hidden" name="csrf_token" value="<%= HTML.escape(env.get?("csrf_token").try &.as(String) || "") %>">
<p class="watched"> <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"> <button type="submit" style="all:unset">
<i class="icon ion-md-trash"></i> <i class="icon ion-md-trash"></i>
</button> </button>
@ -117,11 +117,11 @@
</a> </a>
</p> </p>
</form> </form>
<% elsif plid = env.get? "add_playlist_items" %> <% 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 %>&referer=<%= env.get("current_page") %>" method="post"> <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) || "") %>"> <input type="hidden" name="csrf_token" value="<%= HTML.escape(env.get?("csrf_token").try &.as(String) || "") %>">
<p class="watched"> <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"> <button type="submit" style="all:unset">
<i class="icon ion-md-add"></i> <i class="icon ion-md-add"></i>
</button> </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"> <source src="<%= URI.parse(hlsvp).request_target %><% if params.local %>?local=true<% end %>" type="application/x-mpegURL" label="livestream">
<% else %> <% else %>
<% if params.listen %> <% if params.listen %>
<% audio_streams.each_with_index do |fmt, i| %> <% 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 %>"> 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 %> <% end %>
<% else %> <% else %>
<% if params.quality == "dash" %> <% if params.quality == "dash" %>
@ -28,6 +39,9 @@
selected = params.quality ? (params.quality == quality) : (i == 0) selected = params.quality ? (params.quality == quality) : (i == 0)
%> %>
<source src="<%= src_url %>" type="<%= mimetype %>" label="<%= quality %>" selected="<%= selected %>"> <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 %>
<% end %> <% end %>

View file

@ -24,7 +24,8 @@
"video_series" => video_series, "video_series" => video_series,
"params" => params, "params" => params,
"preferences" => preferences, "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 }.to_pretty_json
%> %>
</script> </script>

View file

@ -64,7 +64,8 @@ we're going to need to do it here in order to allow for translations.
"preferences" => preferences, "preferences" => preferences,
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix, "premiere_timestamp" => video.premiere_timestamp.try &.to_unix,
"vr" => video.is_vr, "vr" => video.is_vr,
"projection_type" => video.projection_type "projection_type" => video.projection_type,
"local_disabled" => CONFIG.disabled?("local")
}.to_pretty_json }.to_pretty_json
%> %>
</script> </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 # Due to a 'video append of' error (see #3011), we're stuck on 7.12.1.
# 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.
video.js: video.js:
version: 7.11.0 version: 7.12.1
shasum: e20747d890716085e7255a90d73c00f32324a224 shasum: 1d12eeb1f52e3679e8e4c987d9b9eb37e2247fa2
videojs-contrib-quality-levels: videojs-contrib-quality-levels:
version: 2.1.0 version: 2.1.0