Merge branch 'master' of github.com:iv-org/invidious
This commit is contained in:
commit
4f5f0ffaea
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
|
@ -38,9 +38,9 @@ jobs:
|
|||
matrix:
|
||||
stable: [true]
|
||||
crystal:
|
||||
- 1.0.0
|
||||
- 1.1.1
|
||||
- 1.2.2
|
||||
- 1.3.2
|
||||
- 1.4.0
|
||||
include:
|
||||
- crystal: nightly
|
||||
stable: false
|
||||
|
|
|
@ -49,6 +49,42 @@ videojs.Vhs.xhr.beforeRequest = function(options) {
|
|||
|
||||
var player = videojs('player', options);
|
||||
|
||||
player.on('error', () => {
|
||||
if (video_data.params.quality !== 'dash') {
|
||||
if (!player.currentSrc().includes("local=true") && !video_data.local_disabled) {
|
||||
var currentSources = player.currentSources();
|
||||
for (var i = 0; i < currentSources.length; i++) {
|
||||
currentSources[i]["src"] += "&local=true"
|
||||
}
|
||||
player.src(currentSources)
|
||||
}
|
||||
else if (player.error().code === 2 || player.error().code === 4) {
|
||||
setTimeout(function (event) {
|
||||
console.log('An error occurred in the player, reloading...');
|
||||
|
||||
var currentTime = player.currentTime();
|
||||
var playbackRate = player.playbackRate();
|
||||
var paused = player.paused();
|
||||
|
||||
player.load();
|
||||
|
||||
if (currentTime > 0.5) currentTime -= 0.5;
|
||||
|
||||
player.currentTime(currentTime);
|
||||
player.playbackRate(playbackRate);
|
||||
|
||||
if (!paused) player.play();
|
||||
}, 10000);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (video_data.params.quality == 'dash') {
|
||||
player.reloadSourceOnError({
|
||||
errorInterval: 10
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for add time argument to url
|
||||
* @param {String} url
|
||||
|
@ -144,27 +180,6 @@ if (isMobile()) {
|
|||
})
|
||||
}
|
||||
|
||||
player.on('error', function (event) {
|
||||
if (player.error().code === 2 || player.error().code === 4) {
|
||||
setTimeout(function (event) {
|
||||
console.log('An error occurred in the player, reloading...');
|
||||
|
||||
var currentTime = player.currentTime();
|
||||
var playbackRate = player.playbackRate();
|
||||
var paused = player.paused();
|
||||
|
||||
player.load();
|
||||
|
||||
if (currentTime > 0.5) currentTime -= 0.5;
|
||||
|
||||
player.currentTime(currentTime);
|
||||
player.playbackRate(playbackRate);
|
||||
|
||||
if (!paused) player.play();
|
||||
}, 5000);
|
||||
}
|
||||
});
|
||||
|
||||
// Enable VR video support
|
||||
if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) {
|
||||
player.crossOrigin("anonymous")
|
||||
|
@ -751,7 +766,7 @@ if (window.location.pathname.startsWith("/embed/")) {
|
|||
|
||||
// Create hyperlink for current instance
|
||||
redirect_element = document.createElement("a");
|
||||
redirect_element.setAttribute("href", `http://${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
|
||||
redirect_element.setAttribute("href", `//${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
|
||||
redirect_element.appendChild(document.createTextNode("Invidious"))
|
||||
|
||||
watch_on_invidious_button.el().appendChild(redirect_element)
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
|||
FROM crystallang/crystal:1.2.2-alpine AS builder
|
||||
FROM crystallang/crystal:1.4.0-alpine AS builder
|
||||
RUN apk add --no-cache sqlite-static yaml-static
|
||||
|
||||
ARG release
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
FROM alpine:3.15 AS builder
|
||||
RUN apk add --no-cache 'crystal=1.2.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
|
||||
FROM alpine:edge AS builder
|
||||
RUN apk add --no-cache 'crystal=1.4.0-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
|
||||
|
||||
ARG release
|
||||
|
||||
|
@ -34,7 +34,7 @@ RUN if [ ${release} == 1 ] ; then \
|
|||
--link-flags "-lxml2 -llzma"; \
|
||||
fi
|
||||
|
||||
FROM alpine:3.15
|
||||
FROM alpine:edge
|
||||
RUN apk add --no-cache librsvg ttf-opensans
|
||||
WORKDIR /invidious
|
||||
RUN addgroup -g 1000 -S invidious && \
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "عرض اقل",
|
||||
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
|
||||
"Switch Invidious Instance": "تبديل المثيل Invidious",
|
||||
"Broken? Try another Invidious Instance": "معطل؟ جرب مثيل Invidious آخر",
|
||||
"Hide annotations": "إخفاء الملاحظات في الفيديو",
|
||||
"Show annotations": "عرض الملاحظات في الفيديو",
|
||||
"Genre: ": "النوع: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "الأماكن",
|
||||
"search_filters_features_option_hdr": "وضع التباين العالي",
|
||||
"search_filters_label": "معامل الفرز",
|
||||
"Current version: ": "الإصدار الحالي: ",
|
||||
"next_steps_error_message": "بعد ذلك يجب أن تحاول: ",
|
||||
"next_steps_error_message_refresh": "تحديث",
|
||||
|
@ -459,5 +457,6 @@
|
|||
"Portuguese (Brazil)": "البرتغالية (البرازيل)",
|
||||
"Russian (auto-generated)": "الروسية (منشأة تلقائيا)",
|
||||
"Spanish (Spain)": "الإسبانية (إسبانيا)",
|
||||
"crash_page_search_issue": "بحثت عن <a href=\"`x`\"> المشكلات الموجودة على GitHub </a>"
|
||||
"crash_page_search_issue": "بحثت عن <a href=\"`x`\"> المشكلات الموجودة على GitHub </a>",
|
||||
"search_filters_title": "معامل الفرز"
|
||||
}
|
||||
|
|
|
@ -262,29 +262,28 @@
|
|||
"Video mode": "Videový režim",
|
||||
"Videos": "Videa",
|
||||
"Community": "Komunita",
|
||||
"search_filters_sort_option_rating": "hodnocení",
|
||||
"search_filters_sort_option_date": "datum",
|
||||
"search_filters_sort_option_views": "zhlédnutí",
|
||||
"search_filters_duration_label": "délka",
|
||||
"search_filters_date_option_hour": "hodina",
|
||||
"search_filters_date_option_today": "dnes",
|
||||
"search_filters_date_option_week": "týden",
|
||||
"search_filters_date_option_month": "měsíc",
|
||||
"search_filters_date_option_year": "rok",
|
||||
"search_filters_type_option_video": "video",
|
||||
"search_filters_type_option_channel": "kanál",
|
||||
"search_filters_type_option_playlist": "playlist",
|
||||
"search_filters_type_option_movie": "film",
|
||||
"search_filters_type_option_show": "zobrazit",
|
||||
"search_filters_sort_option_rating": "Hodnocení",
|
||||
"search_filters_sort_option_date": "Datum nahrání",
|
||||
"search_filters_sort_option_views": "Počet zhlédnutí",
|
||||
"search_filters_duration_label": "Délka",
|
||||
"search_filters_date_option_hour": "Poslední hodina",
|
||||
"search_filters_date_option_today": "Dnes",
|
||||
"search_filters_date_option_week": "Tento týden",
|
||||
"search_filters_date_option_month": "Tento měsíc",
|
||||
"search_filters_date_option_year": "Tento rok",
|
||||
"search_filters_type_option_video": "Video",
|
||||
"search_filters_type_option_channel": "Kanál",
|
||||
"search_filters_type_option_playlist": "Playlist",
|
||||
"search_filters_type_option_movie": "Film",
|
||||
"search_filters_type_option_show": "Seriál",
|
||||
"search_filters_features_option_hd": "HD",
|
||||
"search_filters_features_option_subtitles": "titulky",
|
||||
"search_filters_features_option_subtitles": "Titulky",
|
||||
"search_filters_features_option_c_commons": "Creative Commons",
|
||||
"search_filters_features_option_three_d": "3D",
|
||||
"search_filters_features_option_live": "živě",
|
||||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "umístění",
|
||||
"search_filters_features_option_live": "Živě",
|
||||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Umístění",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Filtr",
|
||||
"generic_count_days_0": "{{count}} dnem",
|
||||
"generic_count_days_1": "{{count}} dny",
|
||||
"generic_count_days_2": "{{count}} dny",
|
||||
|
@ -374,20 +373,15 @@
|
|||
"generic_count_minutes_0": "{{count}} minutou",
|
||||
"generic_count_minutes_1": "{{count}} minutami",
|
||||
"generic_count_minutes_2": "{{count}} minutami",
|
||||
"short": "Krátké (< 4 minuty)",
|
||||
"long": "Dlouhé (> 20 minut)",
|
||||
"footer_documentation": "Dokumentace",
|
||||
"next_steps_error_message_refresh": "Obnovit stránku",
|
||||
"Chinese": "Čínština",
|
||||
"360": "360°",
|
||||
"Dutch (auto-generated)": "Nizozemština (automaticky generováno)",
|
||||
"Erroneous token": "Chybný token",
|
||||
"tokens_count_0": "{{count}} token",
|
||||
"tokens_count_1": "{{count}} tokeny",
|
||||
"tokens_count_2": "{{count}} tokenů",
|
||||
"Portuguese (Brazil)": "Portugalština (Brazílie)",
|
||||
"content_type": "Typ",
|
||||
"sort": "Řazení",
|
||||
"Token is expired, please try again": "Token vypršel, zkuste to prosím znovu",
|
||||
"English (United States)": "Angličtina (Spojené státy)",
|
||||
"Cantonese (Hong Kong)": "Kantonština (Hong Kong)",
|
||||
|
@ -401,7 +395,6 @@
|
|||
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||
"YouTube comment permalink": "Permanentní odkaz YouTube komentáře",
|
||||
"permalink": "permalink",
|
||||
"purchased": "Zakoupeno",
|
||||
"footer_original_source_code": "Původní zdrojový kód",
|
||||
"adminprefs_modified_source_code_url_label": "URL repozitáře s upraveným zdrojovým kódem",
|
||||
"Video unavailable": "Video není dostupné",
|
||||
|
@ -434,11 +427,9 @@
|
|||
"Erroneous CAPTCHA": "Chybná CAPTCHA",
|
||||
"Password is a required field": "Heslo je vyžadované pole",
|
||||
"preferences_automatic_instance_redirect_label": "Automatické přesměrování instance (fallback na redirect.invidious.io): ",
|
||||
"Broken? Try another Invidious Instance": "Je něco rozbité? Zkuste jinou instanci Invidious",
|
||||
"Switch Invidious Instance": "Přepnout instanci Invidious",
|
||||
"Empty playlist": "Prázdný playlist",
|
||||
"footer_source_code": "Zdrojový kód",
|
||||
"relevance": "Relevantnost",
|
||||
"View YouTube comments": "Zobrazit YouTube komentáře",
|
||||
"Blacklisted regions: ": "Oblasti na černé listině: ",
|
||||
"Wrong username or password": "Nesprávné uživatelské jméno nebo heslo",
|
||||
|
@ -454,7 +445,6 @@
|
|||
"Deleted or invalid channel": "Smazaný nebo neplatný kanál",
|
||||
"This channel does not exist.": "Tento kanál neexistuje.",
|
||||
"Hidden field \"token\" is a required field": "Skryté pole \"token\" je vyžadované",
|
||||
"features": "Funkce",
|
||||
"Wilson score: ": "Skóre Wilson: ",
|
||||
"Shared `x`": "Zveřejněno `x`",
|
||||
"Premieres in `x`": "Premiéra za `x`",
|
||||
|
@ -477,5 +467,24 @@
|
|||
"Erroneous challenge": "Chybná výzva",
|
||||
"Premieres `x`": "Premiéra `x`",
|
||||
"CAPTCHA is a required field": "CAPTCHA je vyžadované pole",
|
||||
"`x` ago": "Před `x`"
|
||||
"`x` ago": "Před `x`",
|
||||
"search_message_change_filters_or_query": "Zkuste rozšířit vyhledávaný dotaz a/nebo změnit filtry.",
|
||||
"search_filters_date_option_none": "Jakékoli datum",
|
||||
"search_filters_date_label": "Datum nahrání",
|
||||
"search_filters_type_option_all": "Jakýkoli typ",
|
||||
"search_filters_duration_option_none": "Jakákoli délka",
|
||||
"search_filters_type_label": "Typ",
|
||||
"search_filters_duration_option_short": "Krátká (< 4 minuty)",
|
||||
"search_message_no_results": "Nenalezeny žádné výsledky.",
|
||||
"search_filters_title": "Filtry",
|
||||
"search_filters_duration_option_medium": "Střední (4 - 20 minut)",
|
||||
"search_filters_duration_option_long": "Dlouhá (> 20 minut)",
|
||||
"search_message_use_another_instance": " Můžete také <a href=\"`x`\">hledat na jiné instanci</a>.",
|
||||
"search_filters_features_label": "Vlastnosti",
|
||||
"search_filters_features_option_three_sixty": "360°",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_filters_features_option_purchased": "Zakoupeno",
|
||||
"search_filters_sort_label": "Řadit dle",
|
||||
"search_filters_sort_option_relevance": "Relevantnost",
|
||||
"search_filters_apply_button": "Použít vybrané filtry"
|
||||
}
|
||||
|
|
|
@ -215,7 +215,6 @@
|
|||
"permalink": "permalink",
|
||||
"search_filters_sort_option_date": "Upload dato",
|
||||
"search_filters_features_label": "Funktioner",
|
||||
"search_filters_label": "Filter",
|
||||
"Khmer": "Khmer",
|
||||
"Finnish": "Finsk",
|
||||
"search_filters_date_option_week": "Denne uge",
|
||||
|
@ -349,7 +348,6 @@
|
|||
"next_steps_error_message": "Efter det burde du prøve at: ",
|
||||
"Sinhala": "Singalesisk (Sinhala)",
|
||||
"Thai": "Thai",
|
||||
"Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans",
|
||||
"No such user": "Brugeren findes ikke",
|
||||
"Token is expired, please try again": "Token er udløbet, prøv igen",
|
||||
"Catalan": "Catalansk",
|
||||
|
@ -461,5 +459,6 @@
|
|||
"generic_count_weeks_plural": "{{count}} uger",
|
||||
"crash_page_you_found_a_bug": "Det ser ud til, at du har fundet en fejl i Invidious!",
|
||||
"crash_page_read_the_faq": "læs <a href=\"`x`\">Ofte stillede spørgsmål (FAQ)</a>",
|
||||
"crash_page_search_issue": "søgte efter <a href=\"`x`\">eksisterende problemer på GitHub</a>"
|
||||
"crash_page_search_issue": "søgte efter <a href=\"`x`\">eksisterende problemer på GitHub</a>",
|
||||
"search_filters_title": "Filter"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Weniger anzeigen",
|
||||
"Watch on YouTube": "Video auf YouTube ansehen",
|
||||
"Switch Invidious Instance": "Invidious Instanz wechseln",
|
||||
"Broken? Try another Invidious Instance": "Kaputt? Versuche eine andere Invidious Instanz",
|
||||
"Hide annotations": "Anmerkungen ausblenden",
|
||||
"Show annotations": "Anmerkungen anzeigen",
|
||||
"Genre: ": "Genre: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Standort",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Filtern",
|
||||
"Current version: ": "Aktuelle Version: ",
|
||||
"next_steps_error_message": "Danach folgendes versuchen: ",
|
||||
"next_steps_error_message_refresh": "Aktualisieren",
|
||||
|
@ -461,5 +459,6 @@
|
|||
"Chinese (China)": "Chinesisch (China)",
|
||||
"Chinese (Taiwan)": "Chinesisch (Taiwan)",
|
||||
"Korean (auto-generated)": "Koreanisch (automatisch generiert)",
|
||||
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)"
|
||||
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)",
|
||||
"search_filters_title": "Filtern"
|
||||
}
|
||||
|
|
|
@ -405,7 +405,6 @@
|
|||
"search_filters_date_option_month": "Αυτόν τον μήνα",
|
||||
"Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο GitHub.",
|
||||
"search_filters_sort_label": "Ταξινόμηση κατά",
|
||||
"search_filters_label": "Φίλτρο",
|
||||
"search_filters_type_option_movie": "Ταινία",
|
||||
"footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας",
|
||||
"search_filters_features_label": "Χαρακτηριστικά",
|
||||
|
@ -449,5 +448,6 @@
|
|||
"videoinfo_youTube_embed_link": "Ενσωμάτωση",
|
||||
"videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης",
|
||||
"search_filters_type_option_show": "Μπάρα προόδου διαβάσματος",
|
||||
"preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: "
|
||||
"preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: ",
|
||||
"search_filters_title": "Φίλτρο"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Montri malpli",
|
||||
"Watch on YouTube": "Vidi filmeton en JuTubo",
|
||||
"Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious",
|
||||
"Broken? Try another Invidious Instance": "Ĉu misfunkcio? Provu alian instalaĵon de Indivious",
|
||||
"Hide annotations": "Kaŝi prinotojn",
|
||||
"Show annotations": "Montri prinotojn",
|
||||
"Genre: ": "Ĝenro: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "loko",
|
||||
"search_filters_features_option_hdr": "granddinamikgama",
|
||||
"search_filters_label": "filtri",
|
||||
"Current version: ": "Nuna versio: ",
|
||||
"next_steps_error_message": "Poste, vi provu: ",
|
||||
"next_steps_error_message_refresh": "Reŝargi",
|
||||
|
@ -369,5 +367,6 @@
|
|||
"footer_original_source_code": "Originala fontkodo",
|
||||
"footer_donate_page": "Donaci",
|
||||
"preferences_region_label": "Lando de la enhavo: ",
|
||||
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: "
|
||||
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: ",
|
||||
"search_filters_title": "Filtri"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Mostrar menos",
|
||||
"Watch on YouTube": "Ver el vídeo en YouTube",
|
||||
"Switch Invidious Instance": "Cambiar Instancia de Invidious",
|
||||
"Broken? Try another Invidious Instance": "¿Algún error? Prueba otra instancia de Invidious",
|
||||
"Hide annotations": "Ocultar anotaciones",
|
||||
"Show annotations": "Mostrar anotaciones",
|
||||
"Genre: ": "Género: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "ubicación",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "filtro",
|
||||
"Current version: ": "Versión actual: ",
|
||||
"next_steps_error_message": "Después de lo cual deberías intentar: ",
|
||||
"next_steps_error_message_refresh": "Recargar la página",
|
||||
|
@ -459,5 +457,18 @@
|
|||
"Korean (auto-generated)": "Coreano (generados automáticamente)",
|
||||
"Spanish (Mexico)": "Español (Méjico)",
|
||||
"Spanish (auto-generated)": "Español (generados automáticamente)",
|
||||
"preferences_watch_history_label": "Habilitar historial de reproducciones: "
|
||||
"preferences_watch_history_label": "Habilitar historial de reproducciones: ",
|
||||
"search_message_no_results": "No se han encontrado resultados.",
|
||||
"search_message_change_filters_or_query": "Pruebe ampliar la consulta de búsqueda y/o a cambiar los filtros.",
|
||||
"search_filters_title": "Filtros",
|
||||
"search_filters_date_label": "Fecha de subida",
|
||||
"search_filters_date_option_none": "Cualquier fecha",
|
||||
"search_filters_type_option_all": "Cualquier tipo",
|
||||
"search_filters_duration_option_none": "Cualquier duración",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_filters_apply_button": "Aplicar filtros seleccionados",
|
||||
"tokens_count": "{{count}} token",
|
||||
"tokens_count_plural": "{{count}} tokens",
|
||||
"search_message_use_another_instance": " También puede <a href=\"`x`\">buscar en otra instancia</a>.",
|
||||
"search_filters_duration_option_medium": "Medio (4 - 20 minutes)"
|
||||
}
|
||||
|
|
|
@ -243,7 +243,6 @@
|
|||
"Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da",
|
||||
"German": "Alemaniarra",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Ezin izena eman. Izan leike zure konturako berresteko bi faktoreak piztuta ez daudela.",
|
||||
"Broken? Try another Invidious Instance": "Akatsaren bat? Invidiouseko beste adibide bat saiatu",
|
||||
"View YouTube comments": "YouTubeko iruzkinak ikusi",
|
||||
"Google verification code": "Googleren berresteko kodea",
|
||||
"`x` is live": "'x' bizirik darrai",
|
||||
|
|
|
@ -148,7 +148,6 @@
|
|||
"Show less": "نمایش کمتر",
|
||||
"Watch on YouTube": "تماشا در یوتیوب",
|
||||
"Switch Invidious Instance": "تعویض نمونه اینویدیوس",
|
||||
"Broken? Try another Invidious Instance": "کار نمیکند؟ نمونه دیگری از اینویدیوس را امتحان کنید",
|
||||
"Hide annotations": "مخفی کردن حاشیه نویسی ها",
|
||||
"Show annotations": "نمایش حاشیه نویسی ها",
|
||||
"Genre: ": "ژانر: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "مکان",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "پالایه",
|
||||
"Current version: ": "نسخه فعلی: ",
|
||||
"next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ",
|
||||
"next_steps_error_message_refresh": "تازهسازی",
|
||||
|
@ -412,5 +410,6 @@
|
|||
"footer_original_source_code": "کد منبع اصلی",
|
||||
"search_filters_duration_option_long": "بلند (> 20 دقیقه)",
|
||||
"adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده",
|
||||
"search_filters_duration_option_short": "کوتاه (< 4 دقیقه)"
|
||||
"search_filters_duration_option_short": "کوتاه (< 4 دقیقه)",
|
||||
"search_filters_title": "پالایه"
|
||||
}
|
||||
|
|
|
@ -140,7 +140,6 @@
|
|||
"Show less": "Näytä vähemmän",
|
||||
"Watch on YouTube": "Katso YouTubessa",
|
||||
"Switch Invidious Instance": "Vaihda Invidious-instanssia",
|
||||
"Broken? Try another Invidious Instance": "Rikki? Kokeile toista Invidious-instanssia",
|
||||
"Hide annotations": "Piilota merkkaukset",
|
||||
"Show annotations": "Näytä merkkaukset",
|
||||
"Genre: ": "Genre: ",
|
||||
|
@ -354,7 +353,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Sijainti",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Suodatin",
|
||||
"Current version: ": "Tämänhetkinen versio: ",
|
||||
"next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ",
|
||||
"next_steps_error_message_refresh": "Päivitä",
|
||||
|
@ -461,5 +459,16 @@
|
|||
"Spanish (Mexico)": "Espanja (Meksiko)",
|
||||
"Spanish (Spain)": "Espanja (Espanja)",
|
||||
"Turkish (auto-generated)": "Turkki (automaattisesti luotu)",
|
||||
"Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)"
|
||||
"Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)",
|
||||
"search_filters_title": "Suodatin",
|
||||
"search_message_no_results": "Ei tuloksia löydetty.",
|
||||
"search_message_change_filters_or_query": "Yritä hakukyselysi laajentamista ja/tai suodattimien muuttamista.",
|
||||
"search_filters_duration_option_none": "Mikä tahansa kesto",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_filters_apply_button": "Ota valitut suodattimet käyttöön",
|
||||
"search_filters_date_label": "Latausaika",
|
||||
"search_filters_duration_option_medium": "Keskipituinen (4 - 20 minuuttia)",
|
||||
"search_message_use_another_instance": " Voit myös <a href=\"`x`\">hakea toisella instanssilla</a>.",
|
||||
"search_filters_date_option_none": "Milloin tahansa",
|
||||
"search_filters_type_option_all": "Mikä tahansa tyyppi"
|
||||
}
|
||||
|
|
|
@ -155,7 +155,6 @@
|
|||
"Show less": "Afficher moins",
|
||||
"Watch on YouTube": "Voir la vidéo sur Youtube",
|
||||
"Switch Invidious Instance": "Changer d'instance",
|
||||
"Broken? Try another Invidious Instance": "Instance Invidious défectueuse ? Essayez-en une autre",
|
||||
"Hide annotations": "Masquer les annotations",
|
||||
"Show annotations": "Afficher les annotations",
|
||||
"Genre: ": "Genre : ",
|
||||
|
@ -361,33 +360,32 @@
|
|||
"Videos": "Vidéos",
|
||||
"Playlists": "Listes de lecture",
|
||||
"Community": "Communauté",
|
||||
"search_filters_sort_option_relevance": "pertinence",
|
||||
"search_filters_sort_option_rating": "évaluation",
|
||||
"search_filters_sort_option_date": "date",
|
||||
"search_filters_sort_option_views": "nombre de vues",
|
||||
"search_filters_type_label": "type",
|
||||
"search_filters_duration_label": "durée",
|
||||
"search_filters_features_label": "fonctionnalités",
|
||||
"search_filters_sort_option_relevance": "Pertinence",
|
||||
"search_filters_sort_option_rating": "Notation",
|
||||
"search_filters_sort_option_date": "Date d'ajout",
|
||||
"search_filters_sort_option_views": "Nombre de vues",
|
||||
"search_filters_type_label": "Type de contenu",
|
||||
"search_filters_duration_label": "Durée",
|
||||
"search_filters_features_label": "Fonctionnalités",
|
||||
"search_filters_sort_label": "Trier par",
|
||||
"search_filters_date_option_hour": "dernière heure",
|
||||
"search_filters_date_option_today": "aujourd'hui",
|
||||
"search_filters_date_option_week": "semaine",
|
||||
"search_filters_date_option_month": "mois",
|
||||
"search_filters_date_option_year": "année",
|
||||
"search_filters_type_option_video": "vidéo",
|
||||
"search_filters_type_option_channel": "chaîne",
|
||||
"search_filters_type_option_playlist": "liste de lecture",
|
||||
"search_filters_type_option_movie": "film",
|
||||
"search_filters_type_option_show": "émission",
|
||||
"search_filters_date_option_hour": "Dernière heure",
|
||||
"search_filters_date_option_today": "Aujourd'hui",
|
||||
"search_filters_date_option_week": "Cette semaine",
|
||||
"search_filters_date_option_month": "Ce mois-ci",
|
||||
"search_filters_date_option_year": "Cette année",
|
||||
"search_filters_type_option_video": "Vidéo",
|
||||
"search_filters_type_option_channel": "Chaîne",
|
||||
"search_filters_type_option_playlist": "Liste de lecture",
|
||||
"search_filters_type_option_movie": "Film",
|
||||
"search_filters_type_option_show": "Émission",
|
||||
"search_filters_features_option_hd": "HD",
|
||||
"search_filters_features_option_subtitles": "sous-titres / CC",
|
||||
"search_filters_features_option_subtitles": "Sous-titres (CC)",
|
||||
"search_filters_features_option_c_commons": "Creative Commons",
|
||||
"search_filters_features_option_three_d": "3D",
|
||||
"search_filters_features_option_live": "en direct",
|
||||
"search_filters_features_option_live": "En direct",
|
||||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "emplacement",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "filtrer",
|
||||
"Current version: ": "Version actuelle : ",
|
||||
"next_steps_error_message": "Vous pouvez essayer de : ",
|
||||
"next_steps_error_message_refresh": "Rafraîchir la page",
|
||||
|
@ -420,7 +418,7 @@
|
|||
"videoinfo_started_streaming_x_ago": "En stream depuis `x`",
|
||||
"videoinfo_watch_on_youTube": "Regarder sur YouTube",
|
||||
"videoinfo_youTube_embed_link": "Intégrer",
|
||||
"search_filters_features_option_purchased": "Acheter",
|
||||
"search_filters_features_option_purchased": "Acheté",
|
||||
"videoinfo_invidious_embed_link": "Lien intégré",
|
||||
"download_subtitles": "Sous-titres - `x` (.vtt)",
|
||||
"user_saved_playlists": "`x` listes de lecture sauvegardées",
|
||||
|
@ -461,5 +459,16 @@
|
|||
"Vietnamese (auto-generated)": "Vietnamien (auto-généré)",
|
||||
"Russian (auto-generated)": "Russe (auto-généré)",
|
||||
"Spanish (Spain)": "Espagnol (Espagne)",
|
||||
"preferences_watch_history_label": "Activer l'historique de visionnage : "
|
||||
"preferences_watch_history_label": "Activer l'historique de visionnage : ",
|
||||
"search_filters_title": "Filtres",
|
||||
"search_message_change_filters_or_query": "Essayez d'élargir votre recherche et/ou de changer les filtres.",
|
||||
"search_filters_date_option_none": "Toutes les dates",
|
||||
"search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)",
|
||||
"search_filters_apply_button": "Appliquer les filtres",
|
||||
"search_message_no_results": "Aucun résultat.",
|
||||
"search_message_use_another_instance": " Vous pouvez également <a href=\"`x`\">effectuer votre recherche sur une autre instance</a>.",
|
||||
"search_filters_type_option_all": "Tous les types",
|
||||
"search_filters_date_label": "Date d'ajout",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_filters_duration_option_none": "Toutes les durées"
|
||||
}
|
||||
|
|
|
@ -300,6 +300,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "מיקום",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "סינון",
|
||||
"Current version: ": "הגרסה הנוכחית: "
|
||||
"Current version: ": "הגרסה הנוכחית: ",
|
||||
"search_filters_title": "סינון"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Pokaži manje",
|
||||
"Watch on YouTube": "Gledaj na YouTubeu",
|
||||
"Switch Invidious Instance": "Promijeni Invidious instancu",
|
||||
"Broken? Try another Invidious Instance": "Pokvarena? Probaj jednu drugu Invidious instancu",
|
||||
"Hide annotations": "Sakrij napomene",
|
||||
"Show annotations": "Prikaži napomene",
|
||||
"Genre: ": "Žanr: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "lokacija",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "filtar",
|
||||
"Current version: ": "Trenutačna verzija: ",
|
||||
"next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ",
|
||||
"next_steps_error_message_refresh": "Aktualiziraj stranicu",
|
||||
|
@ -477,5 +475,6 @@
|
|||
"Korean (auto-generated)": "Korejski (automatski generiran)",
|
||||
"Portuguese (auto-generated)": "Portugalski (automatski generiran)",
|
||||
"Spanish (auto-generated)": "Španjolski (automatski generiran)",
|
||||
"preferences_watch_history_label": "Aktiviraj povijest gledanja: "
|
||||
"preferences_watch_history_label": "Aktiviraj povijest gledanja: ",
|
||||
"search_filters_title": "Filtar"
|
||||
}
|
||||
|
|
|
@ -389,7 +389,6 @@
|
|||
"Released under the AGPLv3 on Github.": "AGPLv3 licenc alapján a GitHubon",
|
||||
"search_filters_features_option_three_d": "3D-ben",
|
||||
"search_filters_features_option_live": "Élőben",
|
||||
"search_filters_label": "Szűrők",
|
||||
"next_steps_error_message_refresh": "Újratöltés",
|
||||
"footer_donate_page": "Adakozás",
|
||||
"footer_source_code": "Forráskód",
|
||||
|
@ -414,7 +413,6 @@
|
|||
"search_filters_date_option_hour": "Az elmúlt órában",
|
||||
"search_filters_type_option_movie": "Film",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"Broken? Try another Invidious Instance": "Nem működik? Próbáld meg egy másik Invidious oldallal.",
|
||||
"search_filters_duration_label": "Játékidő",
|
||||
"next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ",
|
||||
"Xhosa": "xhosza",
|
||||
|
@ -460,5 +458,6 @@
|
|||
"Italian (auto-generated)": "olasz (automatikusan generált)",
|
||||
"Dutch (auto-generated)": "holland (automatikusan generált)",
|
||||
"French (auto-generated)": "francia (automatikusan generált)",
|
||||
"Vietnamese (auto-generated)": "vietnámi (automatikusan generált)"
|
||||
"Vietnamese (auto-generated)": "vietnámi (automatikusan generált)",
|
||||
"search_filters_title": "Szűrők"
|
||||
}
|
||||
|
|
|
@ -148,7 +148,6 @@
|
|||
"Show less": "Tampilkan lebih sedikit",
|
||||
"Watch on YouTube": "Tonton di YouTube",
|
||||
"Switch Invidious Instance": "Ganti peladen Invidious",
|
||||
"Broken? Try another Invidious Instance": "Rusak? Coba peladen Invidious yang lain",
|
||||
"Hide annotations": "Sembunyikan anotasi",
|
||||
"Show annotations": "Tampilkan anotasi",
|
||||
"Genre: ": "Genre: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Lokasi",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Saring",
|
||||
"Current version: ": "Versi saat ini: ",
|
||||
"next_steps_error_message": "Setelah itu Anda harus mencoba: ",
|
||||
"next_steps_error_message_refresh": "Segarkan",
|
||||
|
@ -419,5 +417,6 @@
|
|||
"crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:",
|
||||
"English (United States)": "Inggris (US)",
|
||||
"preferences_watch_history_label": "Aktifkan riwayat tontonan: ",
|
||||
"English (United Kingdom)": "Inggris (UK)"
|
||||
"English (United Kingdom)": "Inggris (UK)",
|
||||
"search_filters_title": "Saring"
|
||||
}
|
||||
|
|
|
@ -372,7 +372,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Posizione",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Filtra",
|
||||
"Current version: ": "Versione attuale: ",
|
||||
"preferences_quality_dash_option_240p": "240p",
|
||||
"preferences_quality_dash_option_360p": "360p",
|
||||
|
@ -409,22 +408,22 @@
|
|||
"preferences_automatic_instance_redirect_label": "Reindirizzamento automatico dell'istanza (ripiego su redirect.invidious.io): ",
|
||||
"Video unavailable": "Video non disponibile",
|
||||
"preferences_show_nick_label": "Mostra nickname in alto: ",
|
||||
"short": "Corto (< 4 minuti)",
|
||||
"videoinfo_youTube_embed_link": "Incorpora",
|
||||
"videoinfo_invidious_embed_link": "Incorpora collegamento",
|
||||
"user_created_playlists": "playlist create da `x`",
|
||||
"preferences_save_player_pos_label": "Memorizza il minutaggio raggiunto dal video: ",
|
||||
"purchased": "Acquistato",
|
||||
"preferences_quality_option_dash": "DASH (qualità adattiva)",
|
||||
"preferences_region_label": "Nazione del contenuto: ",
|
||||
"preferences_category_misc": "Preferenze varie",
|
||||
"show": "Serie",
|
||||
"long": "Lungo (> 20 minuti)",
|
||||
"next_steps_error_message": "Dopodiché dovresti provare a: ",
|
||||
"next_steps_error_message_refresh": "Aggiornare",
|
||||
"footer_donate_page": "Dona",
|
||||
"footer_source_code": "Codice sorgente",
|
||||
"adminprefs_modified_source_code_url_label": "Link per il repository del codice sorgente modificato",
|
||||
"Show more": "Mostra di più",
|
||||
"Broken? Try another Invidious Instance": "Non funzionante? Prova un’altra 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"
|
||||
}
|
||||
|
|
|
@ -148,7 +148,6 @@
|
|||
"Show less": "表示を減らす",
|
||||
"Watch on YouTube": "YouTube で視聴",
|
||||
"Switch Invidious Instance": "Invidiousインスタンスの変更",
|
||||
"Broken? Try another Invidious Instance": "壊れる?違うInvidiousインスタンスを試してみる",
|
||||
"Hide annotations": "アノテーションを隠す",
|
||||
"Show annotations": "アノテーションを表示",
|
||||
"Genre: ": "ジャンル: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "場所",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "フィルタ",
|
||||
"Current version: ": "現在のバージョン: ",
|
||||
"next_steps_error_message": "下記のものを試して下さい: ",
|
||||
"next_steps_error_message_refresh": "再読込",
|
||||
|
@ -434,5 +432,6 @@
|
|||
"Spanish (Mexico)": "スペイン語 (メキシコ)",
|
||||
"Spanish (Spain)": "スペイン語 (スペイン)",
|
||||
"Vietnamese (auto-generated)": "ベトナム語 (自動生成)",
|
||||
"360": "360°"
|
||||
"search_filters_title": "フィルタ",
|
||||
"search_filters_features_option_three_sixty": "360°"
|
||||
}
|
||||
|
|
|
@ -199,7 +199,6 @@
|
|||
"search_filters_features_option_three_d": "3D",
|
||||
"search_filters_features_option_location": "지역",
|
||||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_label": "필터",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"Current version: ": "현재 버전: ",
|
||||
"next_steps_error_message_refresh": "새로 고침",
|
||||
|
@ -298,7 +297,6 @@
|
|||
"Empty playlist": "재생목록 비어 있음",
|
||||
"Show annotations": "주석 보이기",
|
||||
"Hide annotations": "주석 숨기기",
|
||||
"Broken? Try another Invidious Instance": "안되나요? 다른 Invidious 인스턴스를 시도해보세요",
|
||||
"Switch Invidious Instance": "Invidious 인스턴스 변경",
|
||||
"Spanish": "스페인어",
|
||||
"Southern Sotho": "소토어",
|
||||
|
@ -382,5 +380,6 @@
|
|||
"footer_source_code": "소스 코드",
|
||||
"footer_original_source_code": "원본 소스 코드",
|
||||
"footer_modfied_source_code": "수정된 소스 코드",
|
||||
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL"
|
||||
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL",
|
||||
"search_filters_title": "필터"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Rodyti mažiau",
|
||||
"Watch on YouTube": "Žiaurėti Youtube",
|
||||
"Switch Invidious Instance": "Keisti Invidious šaltinį",
|
||||
"Broken? Try another Invidious Instance": "Neveikia? Bandyk kitą Invidious šaltinį",
|
||||
"Hide annotations": "Slėpti anotacijas",
|
||||
"Show annotations": "Rodyti anotacijas",
|
||||
"Genre: ": "Žanras: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Vietovė",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Filtras",
|
||||
"Current version: ": "Dabartinė versija: ",
|
||||
"next_steps_error_message": "Po to turėtumėte pabandyti: ",
|
||||
"next_steps_error_message_refresh": "Atnaujinti",
|
||||
|
@ -372,5 +370,6 @@
|
|||
"preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: ",
|
||||
"preferences_quality_dash_option_best": "Geriausia",
|
||||
"preferences_quality_dash_option_worst": "Blogiausia",
|
||||
"preferences_quality_dash_option_auto": "Automatinis"
|
||||
"preferences_quality_dash_option_auto": "Automatinis",
|
||||
"search_filters_title": "Filtras"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Vis mindre",
|
||||
"Watch on YouTube": "Vis video på YouTube",
|
||||
"Switch Invidious Instance": "Bytt Invidious-instans",
|
||||
"Broken? Try another Invidious Instance": "Knekt? Forsøk en annen Invidious-instans",
|
||||
"Hide annotations": "Skjul merknader",
|
||||
"Show annotations": "Vis merknader",
|
||||
"Genre: ": "Sjanger: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "sted",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "filtrer",
|
||||
"Current version: ": "Gjeldende versjon: ",
|
||||
"next_steps_error_message": "Etterpå bør du prøve dette: ",
|
||||
"next_steps_error_message_refresh": "Gjenoppfrisk",
|
||||
|
@ -461,5 +459,6 @@
|
|||
"Portuguese (auto-generated)": "Portugisisk (laget automatisk)",
|
||||
"Russian (auto-generated)": "Russisk (laget automatisk)",
|
||||
"Dutch (auto-generated)": "Nederlandsk (laget automatisk)",
|
||||
"Turkish (auto-generated)": "Tyrkisk (laget automatisk)"
|
||||
"Turkish (auto-generated)": "Tyrkisk (laget automatisk)",
|
||||
"search_filters_title": "Filtrer"
|
||||
}
|
||||
|
|
|
@ -349,7 +349,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "locatie",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "verfijnen",
|
||||
"Current version: ": "Huidige versie: ",
|
||||
"Switch Invidious Instance": "Schakel tussen de Invidious Instanties",
|
||||
"preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ",
|
||||
|
@ -366,7 +365,6 @@
|
|||
"footer_original_source_code": "Originele bron-code",
|
||||
"footer_modfied_source_code": "Gewijzigde bron-code",
|
||||
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats",
|
||||
"Broken? Try another Invidious Instance": "Kapot? Probeer een andere Invidious Instantie",
|
||||
"next_steps_error_message": "Waarna u moet proberen om: ",
|
||||
"footer_source_code": "Bron-code",
|
||||
"search_filters_duration_option_long": "Lang (> 20 minuten)",
|
||||
|
@ -398,5 +396,6 @@
|
|||
"preferences_save_player_pos_label": "Huidig afspeeltijdstip opslaan: ",
|
||||
"none": "geen",
|
||||
"search_filters_features_option_purchased": "Gekocht",
|
||||
"search_filters_features_option_three_sixty": "360º"
|
||||
"search_filters_features_option_three_sixty": "360º",
|
||||
"search_filters_title": "Verfijnen"
|
||||
}
|
||||
|
|
|
@ -140,7 +140,6 @@
|
|||
"Show less": "Pokaż mniej",
|
||||
"Watch on YouTube": "Zobacz film na YouTube",
|
||||
"Switch Invidious Instance": "Przełącz instancję Invidious",
|
||||
"Broken? Try another Invidious Instance": "Nie działa? Spróbuj innej instancji Invidious",
|
||||
"Hide annotations": "Ukryj adnotacje",
|
||||
"Show annotations": "Pokaż adnotacje",
|
||||
"Genre: ": "Gatunek: ",
|
||||
|
@ -354,7 +353,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "Lokalizacja",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "filtr",
|
||||
"Current version: ": "Aktualna wersja: ",
|
||||
"next_steps_error_message": "Po czym powinien*ś spróbować: ",
|
||||
"next_steps_error_message_refresh": "Odśwież",
|
||||
|
@ -476,5 +474,6 @@
|
|||
"Japanese (auto-generated)": "japoński (wygenerowany automatycznie)",
|
||||
"Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)",
|
||||
"Portuguese (auto-generated)": "portugalski (wygenerowany automatycznie)",
|
||||
"Portuguese (Brazil)": "portugalski (Brazylia)"
|
||||
"Portuguese (Brazil)": "portugalski (Brazylia)",
|
||||
"search_filters_title": "Filtr"
|
||||
}
|
||||
|
|
|
@ -143,7 +143,6 @@
|
|||
"Show less": "Mostrar menos",
|
||||
"Watch on YouTube": "Assistir no YouTube",
|
||||
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
||||
"Broken? Try another Invidious Instance": "Quebrou? Tente outra Instância do Invidious",
|
||||
"Hide annotations": "Ocultar anotações",
|
||||
"Show annotations": "Mostrar anotações",
|
||||
"Genre: ": "Gênero: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "localização",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "filtro",
|
||||
"Current version: ": "Versão atual: ",
|
||||
"next_steps_error_message": "Depois disso, você deve tentar: ",
|
||||
"next_steps_error_message_refresh": "Atualizar",
|
||||
|
@ -437,5 +435,6 @@
|
|||
"user_created_playlists": "`x` listas de reprodução criadas",
|
||||
"user_saved_playlists": "`x` listas de reprodução salvas",
|
||||
"Video unavailable": "Vídeo indisponível",
|
||||
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`"
|
||||
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`",
|
||||
"search_filters_title": "Filtro"
|
||||
}
|
||||
|
|
|
@ -143,7 +143,6 @@
|
|||
"Show less": "Mostrar menos",
|
||||
"Watch on YouTube": "Ver no YouTube",
|
||||
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
||||
"Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious",
|
||||
"Hide annotations": "Ocultar anotações",
|
||||
"Show annotations": "Mostrar anotações",
|
||||
"Genre: ": "Género: ",
|
||||
|
@ -371,9 +370,9 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Localização",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Filtro",
|
||||
"Current version: ": "Versão atual: ",
|
||||
"next_steps_error_message": "Pode tentar as seguintes opções: ",
|
||||
"next_steps_error_message_refresh": "Atualizar",
|
||||
"next_steps_error_message_go_to_youtube": "Ir ao YouTube"
|
||||
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
|
||||
"search_filters_title": "Filtro"
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
"search_filters_sort_option_date": "Data de envio",
|
||||
"search_filters_sort_option_rating": "Avaliação",
|
||||
"search_filters_sort_option_relevance": "Relevância",
|
||||
"Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious",
|
||||
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
||||
"Show less": "Mostrar menos",
|
||||
"Show more": "Mostrar mais",
|
||||
|
@ -17,7 +16,6 @@
|
|||
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
|
||||
"next_steps_error_message": "Pode tentar as seguintes opções: ",
|
||||
"next_steps_error_message_refresh": "Atualizar",
|
||||
"search_filters_label": "Filtro",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_features_option_location": "Localização",
|
||||
"search_filters_features_option_four_k": "4K",
|
||||
|
@ -437,5 +435,6 @@
|
|||
"crash_page_read_the_faq": "leu as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
|
||||
"crash_page_search_issue": "procurou se <a href=\"`x`\">o erro já foi reportado no GitHub</a>",
|
||||
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto tal qual (NÃO o traduza):",
|
||||
"user_created_playlists": "`x` listas de reprodução criadas"
|
||||
"user_created_playlists": "`x` listas de reprodução criadas",
|
||||
"search_filters_title": "Filtro"
|
||||
}
|
||||
|
|
182
locales/ro.json
182
locales/ro.json
|
@ -21,7 +21,7 @@
|
|||
"No": "Nu",
|
||||
"Import and Export Data": "Importați și Exportați Datele",
|
||||
"Import": "Importați",
|
||||
"Import Invidious data": "Importați Datele de pe Invidious",
|
||||
"Import Invidious data": "Importați datele JSON de pe Invidious",
|
||||
"Import YouTube subscriptions": "Importați abonamentele de pe YouTube",
|
||||
"Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)",
|
||||
|
@ -29,7 +29,7 @@
|
|||
"Export": "Exportați",
|
||||
"Export subscriptions as OPML": "Exportați abonamentele în format OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportați abonamentele în format OPML (pentru NewPipe și FreeTube)",
|
||||
"Export data as JSON": "Exportați datele în format JSON",
|
||||
"Export data as JSON": "Exportați datele Invidious în format JSON",
|
||||
"Delete account?": "Sunteți siguri că doriți să vă ștergeți contul?",
|
||||
"History": "Istoric",
|
||||
"An alternative front-end to YouTube": "O alternativă front-end pentru YouTube",
|
||||
|
@ -155,7 +155,7 @@
|
|||
"Hide replies": "Ascundeți replicile",
|
||||
"Show replies": "Afișați replicile",
|
||||
"Incorrect password": "Parolă incorectă",
|
||||
"Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore.",
|
||||
"Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Conectare eșuată. Dacă nu reușiți să vă conectați, verificați dacă ați activat autentificarea cu doi factori (Autentificator sau SMS).",
|
||||
"Invalid TFA code": "Codul de autentificare cu doi factori este invalid",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Conectare eșuată. Acest lucru ar putea fi cauzat de faptul că nu ați activat autentificarea cu doi factori.",
|
||||
|
@ -174,7 +174,7 @@
|
|||
"Deleted or invalid channel": "Canal șters sau invalid",
|
||||
"This channel does not exist.": "Acest canal nu există.",
|
||||
"Could not get channel info.": "Nu am putut primi informații despre acest canal.",
|
||||
"Could not fetch comments": "Încărcarea comentariilor a eșuat.",
|
||||
"Could not fetch comments": "Încărcarea comentariilor a eșuat",
|
||||
"`x` ago": "acum `x`",
|
||||
"Load more": "Vedeți mai mult",
|
||||
"Could not create mix.": "Nu am putut crea această listă de redare.",
|
||||
|
@ -187,7 +187,7 @@
|
|||
"Erroneous challenge": "Challenge invalid",
|
||||
"Erroneous token": "Token invalid",
|
||||
"No such user": "Acest utilizator nu există",
|
||||
"Token is expired, please try again": "Token-ul este expirat, vă rugăm să reîncercați.",
|
||||
"Token is expired, please try again": "Jetonul a expirat, vă rugăm să încercați din nou",
|
||||
"English": "Engleză",
|
||||
"English (auto-generated)": "Engleză (generată automat)",
|
||||
"Afrikaans": "Afrikaans",
|
||||
|
@ -295,7 +295,7 @@
|
|||
"Yoruba": "Yoruba",
|
||||
"Zulu": "Zoulou",
|
||||
"Fallback comments: ": "Comentarii alternative: ",
|
||||
"Popular": "Popular",
|
||||
"Popular": "Populare",
|
||||
"Top": "Top",
|
||||
"About": "Despre",
|
||||
"Rating: ": "Evaluare: ",
|
||||
|
@ -318,5 +318,173 @@
|
|||
"Videos": "Videoclipuri",
|
||||
"Playlists": "Liste de redare",
|
||||
"Community": "Comunitate",
|
||||
"Current version: ": "Versiunea actuală: "
|
||||
"Current version: ": "Versiunea actuală: ",
|
||||
"crash_page_read_the_faq": "citit lista <a href=\"`x`\">Întrebărilor Frecvente (FAQ)</a>",
|
||||
"generic_count_days_0": "{{count}} zi",
|
||||
"generic_count_days_1": "{{count}} zile",
|
||||
"generic_count_days_2": "{{count}} de zile",
|
||||
"generic_count_hours_0": "{{count}} oră",
|
||||
"generic_count_hours_1": "{{count}} ore",
|
||||
"generic_count_hours_2": "{{count}} de ore",
|
||||
"generic_count_minutes_0": "{{count}} minut",
|
||||
"generic_count_minutes_1": "{{count}} minute",
|
||||
"generic_count_minutes_2": "{{count}} de minute",
|
||||
"generic_views_count_0": "{{count}} vizionare",
|
||||
"generic_views_count_1": "{{count}} vizionări",
|
||||
"generic_views_count_2": "{{count}} de vizionări",
|
||||
"subscriptions_unseen_notifs_count_0": "{{count}} notificare neverificată",
|
||||
"subscriptions_unseen_notifs_count_1": "{{count}} notificări neverificate",
|
||||
"subscriptions_unseen_notifs_count_2": "{{count}} de notificări neverificate",
|
||||
"crash_page_refresh": "încercat să <a href=\"`x`\">reîmprospătați pagina</a>",
|
||||
"crash_page_switch_instance": "am încercat să <a href=\"`x`\">folosim o altă instanță</a>",
|
||||
"preferences_watch_history_label": "Activează istoricul: ",
|
||||
"invidious": "Invidious",
|
||||
"preferences_vr_mode_label": "Videoclipuri interactive de 360 de grade (necesită WebGL): ",
|
||||
"English (United Kingdom)": "Engleză (Regatul Unit)",
|
||||
"English (United States)": "Engleză (Statele Unite ale Americii)",
|
||||
"Chinese": "Chineză",
|
||||
"Chinese (China)": "Chineză (China)",
|
||||
"Chinese (Hong Kong)": "Chineză (Hong Kong)",
|
||||
"Chinese (Taiwan)": "Chineză (Taiwan)",
|
||||
"Cantonese (Hong Kong)": "Cantoneză (Hong Kong)",
|
||||
"Portuguese (auto-generated)": "Portugheză (generată automat)",
|
||||
"Portuguese (Brazil)": "Portugheză (Brazilia)",
|
||||
"Russian (auto-generated)": "Rusă (generată automat)",
|
||||
"Turkish (auto-generated)": "Turcă (generată automat)",
|
||||
"Vietnamese (auto-generated)": "Vietnameză (generată automat)",
|
||||
"videoinfo_started_streaming_x_ago": "În direct de acum `x`",
|
||||
"preferences_quality_dash_option_2160p": "2160p",
|
||||
"footer_modfied_source_code": "Codul sursă modificat",
|
||||
"preferences_quality_dash_label": "Calitatea video DASH preferată: ",
|
||||
"generic_videos_count_0": "{{count}} videoclip",
|
||||
"generic_videos_count_1": "{{count}} videoclipuri",
|
||||
"generic_videos_count_2": "{{count}} de videoclipuri",
|
||||
"generic_playlists_count_0": "{{count}} playlist",
|
||||
"generic_playlists_count_1": "{{count}} playlisturi",
|
||||
"generic_playlists_count_2": "{{count}} de playlisturi",
|
||||
"tokens_count_0": "{{count}} jeton",
|
||||
"tokens_count_1": "{{count}} jetoane",
|
||||
"tokens_count_2": "{{count}} de jetoane",
|
||||
"comments_points_count_0": "{{count}} punct",
|
||||
"comments_points_count_1": "{{count}} puncte",
|
||||
"comments_points_count_2": "{{count}} de puncte",
|
||||
"Spanish (Spain)": "Spaniolă (Spania)",
|
||||
"Video unavailable": "Videoclip indisponibil",
|
||||
"crash_page_search_issue": "căutat <a href=\"`x`\">sugestiile existente pe GitHub</a>",
|
||||
"Show more": "Afișați mai mult",
|
||||
"Released under the AGPLv3 on Github.": "Lansat sub licența AGPLv3 pe GitHub.",
|
||||
"preferences_quality_option_dash": "DASH (calitate adaptativă)",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"preferences_quality_option_small": "Mică",
|
||||
"preferences_quality_dash_option_1440p": "1440p",
|
||||
"preferences_quality_dash_option_1080p": "1080p",
|
||||
"preferences_category_misc": "Setări diverse",
|
||||
"preferences_automatic_instance_redirect_label": "Redirecționare automată de instanță (trecere prin redirect.invidious.io): ",
|
||||
"preferences_quality_dash_option_480p": "480p",
|
||||
"preferences_quality_option_medium": "Medie",
|
||||
"Switch Invidious Instance": "Schimbă instanța Invidious",
|
||||
"preferences_quality_dash_option_720p": "720p",
|
||||
"preferences_quality_dash_option_auto": "Automatică",
|
||||
"preferences_quality_dash_option_best": "Cea mai bună",
|
||||
"preferences_quality_dash_option_worst": "Cea mai redusă",
|
||||
"preferences_quality_dash_option_4320p": "4320p",
|
||||
"preferences_quality_dash_option_360p": "360p",
|
||||
"preferences_region_label": "Țară de conținut: ",
|
||||
"preferences_extend_desc_label": "Extindeți automat descrierea: ",
|
||||
"preferences_show_nick_label": "Afișați numele de utilizator pe partea de sus: ",
|
||||
"generic_subscribers_count_0": "{{count}} abonat",
|
||||
"generic_subscribers_count_1": "{{count}} abonați",
|
||||
"generic_subscribers_count_2": "{{count}} de abonați",
|
||||
"generic_subscriptions_count_0": "{{count}} abonament",
|
||||
"generic_subscriptions_count_1": "{{count}} abonamente",
|
||||
"generic_subscriptions_count_2": "{{count}} de abonamente",
|
||||
"Search": "Căutați",
|
||||
"search_filters_title": "Filtre",
|
||||
"search_filters_date_label": "Data încărcării",
|
||||
"none": "niciunul",
|
||||
"search_message_use_another_instance": " Puteți <a href=\"`x`\">căuta într-o altă instanță</a>.",
|
||||
"comments_view_x_replies_0": "Afișați {{count}} răspuns",
|
||||
"comments_view_x_replies_1": "Afișați {{count}} răspunsuri",
|
||||
"comments_view_x_replies_2": "Afișați {{count}} de răspunsuri",
|
||||
"search_message_no_results": "Nu s-au găsit rezultate.",
|
||||
"Dutch (auto-generated)": "Olandeză (generată automat)",
|
||||
"Indonesian (auto-generated)": "Indoneziană (generată automat)",
|
||||
"German (auto-generated)": "Germană (generată automat)",
|
||||
"French (auto-generated)": "Franceză (generată automat)",
|
||||
"Interlingue": "Interlingue",
|
||||
"Italian (auto-generated)": "Italiană (generată automat)",
|
||||
"Japanese (auto-generated)": "Japoneză (generată automat)",
|
||||
"Korean (auto-generated)": "Coreeană (generată automat)",
|
||||
"Spanish (auto-generated)": "Spaniolă (generată automat)",
|
||||
"search_filters_date_option_none": "Oricând",
|
||||
"search_filters_date_option_year": "an",
|
||||
"search_filters_type_option_channel": "canal",
|
||||
"Spanish (Mexico)": "Spaniolă (Mexic)",
|
||||
"generic_count_weeks_0": "{{count}} săptămână",
|
||||
"generic_count_weeks_1": "{{count}} săptămâni",
|
||||
"generic_count_weeks_2": "{{count}} de săptămâni",
|
||||
"generic_count_seconds_0": "{{count}} secundă",
|
||||
"generic_count_seconds_1": "{{count}} secunde",
|
||||
"generic_count_seconds_2": "{{count}} de secunde",
|
||||
"search_filters_type_option_video": "videoclip",
|
||||
"generic_count_years_0": "{{count}} an",
|
||||
"generic_count_years_1": "{{count}} ani",
|
||||
"generic_count_years_2": "{{count}} de ani",
|
||||
"generic_count_months_0": "{{count}} lună",
|
||||
"generic_count_months_1": "{{count}} luni",
|
||||
"generic_count_months_2": "{{count}} de luni",
|
||||
"search_filters_duration_label": "durată",
|
||||
"search_filters_date_option_month": "lună",
|
||||
"search_filters_type_label": "Tip",
|
||||
"search_filters_date_option_today": "azi",
|
||||
"search_filters_date_option_week": "săptămână",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_filters_type_option_playlist": "playlist",
|
||||
"search_filters_type_option_movie": "film",
|
||||
"search_filters_type_option_show": "emisiune",
|
||||
"search_filters_duration_option_short": "Scurt (< 4 minute)",
|
||||
"search_filters_duration_option_medium": "Medie (4 - 20 de minute)",
|
||||
"search_filters_duration_option_none": "Fără limită",
|
||||
"search_filters_duration_option_long": "Lungă (> 20 de minute)",
|
||||
"search_filters_features_label": "atribute",
|
||||
"search_filters_features_option_live": "în direct",
|
||||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_c_commons": "Creative Commons",
|
||||
"search_filters_features_option_three_sixty": "360°",
|
||||
"search_filters_features_option_three_d": "3D",
|
||||
"search_filters_features_option_subtitles": "subtitrări/CC",
|
||||
"search_filters_features_option_hd": "HD",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_features_option_purchased": "Cumpărate",
|
||||
"next_steps_error_message": "După ce ar trebui să încercați să: ",
|
||||
"user_saved_playlists": "`x` playlisturi salvate",
|
||||
"search_filters_features_option_location": "locație",
|
||||
"search_filters_sort_label": "Sortați după",
|
||||
"search_filters_sort_option_relevance": "relevanță",
|
||||
"search_filters_sort_option_rating": "clasificare",
|
||||
"search_filters_sort_option_date": "Data încărcării",
|
||||
"search_filters_sort_option_views": "Numărul de vizionări",
|
||||
"footer_source_code": "Codul sursă",
|
||||
"search_filters_apply_button": "Aplicați filtrele selectate",
|
||||
"footer_original_source_code": "Codul sursă original",
|
||||
"next_steps_error_message_refresh": "Reîmprospătează",
|
||||
"next_steps_error_message_go_to_youtube": "Mergeți pe YouTube",
|
||||
"footer_donate_page": "Donați",
|
||||
"adminprefs_modified_source_code_url_label": "URL către depozitul de cod sursă modificat",
|
||||
"footer_documentation": "Documentație",
|
||||
"videoinfo_youTube_embed_link": "Încorporați",
|
||||
"videoinfo_watch_on_youTube": "Vizionați pe YouTube",
|
||||
"videoinfo_invidious_embed_link": "Link de încorporare",
|
||||
"download_subtitles": "Subtitrări - `x` (.vtt)",
|
||||
"user_created_playlists": "`x` playlisturi create",
|
||||
"preferences_save_player_pos_label": "Salvați poziția de redare: ",
|
||||
"crash_page_you_found_a_bug": "Se pare că ați găsit un bug în aplicația Invidious!",
|
||||
"crash_page_before_reporting": "Înainte de a reporta bugul, asigurați-vă că ați:",
|
||||
"search_filters_date_option_hour": "oră",
|
||||
"search_message_change_filters_or_query": "Încercați să lărgiți căutarea sau să modificați filtrele.",
|
||||
"crash_page_report_issue": "Dacă niciuna dintre sugestiile de mai sus v-a ajutat, vă rugăm să <a href=\"`x`\">postați o nouă sugestie pe GitHub</a> (cel mai bine în engleză), și să includeți următorul text în post (să nu îl traduceți):",
|
||||
"search_filters_type_option_all": "orice tip",
|
||||
"preferences_quality_dash_option_240p": "240p",
|
||||
"preferences_quality_dash_option_144p": "144p",
|
||||
"Show less": "Afișați mai puțin"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Показать меньше",
|
||||
"Watch on YouTube": "Смотреть на YouTube",
|
||||
"Switch Invidious Instance": "Сменить экземпляр Invidious",
|
||||
"Broken? Try another Invidious Instance": "Сломался? Попробуйте другой экземпляр Invidious",
|
||||
"Hide annotations": "Скрыть аннотации",
|
||||
"Show annotations": "Показать аннотации",
|
||||
"Genre: ": "Жанр: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Местоположение",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Фильтр",
|
||||
"Current version: ": "Текущая версия: ",
|
||||
"next_steps_error_message": "После чего следует попробовать: ",
|
||||
"next_steps_error_message_refresh": "Обновить",
|
||||
|
@ -477,5 +475,6 @@
|
|||
"Video unavailable": "Видео недоступно",
|
||||
"preferences_save_player_pos_label": "Запоминать позицию: ",
|
||||
"preferences_region_label": "Страна: ",
|
||||
"preferences_watch_history_label": "Включить историю просмотров "
|
||||
"preferences_watch_history_label": "Включить историю просмотров ",
|
||||
"search_filters_title": "Фильтр"
|
||||
}
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
"No": "Nie",
|
||||
"Import and Export Data": "Import a Export údajov",
|
||||
"Import": "Import",
|
||||
"Import Invidious data": "Importovať údaje Invidious",
|
||||
"Import YouTube subscriptions": "Importovať odbery YouTube",
|
||||
"Import Invidious data": "Importovať JSON údaje Invidious",
|
||||
"Import YouTube subscriptions": "Importovať odbery YouTube/OPML",
|
||||
"Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)",
|
||||
"Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)",
|
||||
"Export": "Export",
|
||||
"Export subscriptions as OPML": "Exportovať odbery ako OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovať odbery ako OPML (pre NewPipe a FreeTube)",
|
||||
"Export data as JSON": "Export údajov ako JSON",
|
||||
"Export data as JSON": "Exportovať údaje Invidious ako JSON",
|
||||
"Delete account?": "Zrušiť účet?",
|
||||
"History": "História",
|
||||
"An alternative front-end to YouTube": "Alternatívny front-end pre YouTube",
|
||||
|
@ -84,5 +84,23 @@
|
|||
"preferences_unseen_only_label": "Zobraziť iba neprehrané: ",
|
||||
"preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ",
|
||||
"Enable web notifications": "Povoliť webové upozornenia",
|
||||
"`x` uploaded a video": "`x` nahral(a) video"
|
||||
"`x` uploaded a video": "`x` nahral(a) video",
|
||||
"generic_views_count_0": "{{count}} zhliadnutie",
|
||||
"generic_views_count_1": "{{count}} zhliadnutia",
|
||||
"generic_views_count_2": "{{count}} zhliadnutí",
|
||||
"generic_subscribers_count_0": "{{count}} odberateľ",
|
||||
"generic_subscribers_count_1": "{{count}} odberatelia",
|
||||
"generic_subscribers_count_2": "{{count}} odberateľov",
|
||||
"Shared `x` ago": "Zverejnené pred `x`",
|
||||
"generic_playlists_count_0": "{{count}} playlist",
|
||||
"generic_playlists_count_1": "{{count}} playlisty",
|
||||
"generic_playlists_count_2": "{{count}} playlistov",
|
||||
"generic_videos_count_0": "{{count}} video",
|
||||
"generic_videos_count_1": "{{count}} videá",
|
||||
"generic_videos_count_2": "{{count}} videí",
|
||||
"generic_subscriptions_count_0": "{{count}} odber",
|
||||
"generic_subscriptions_count_1": "{{count}} odbery",
|
||||
"generic_subscriptions_count_2": "{{count}} odberov",
|
||||
"Authorize token for `x`?": "Autorizovať token pre `x`?",
|
||||
"View playlist on YouTube": "Zobraziť playlist na YouTube"
|
||||
}
|
||||
|
|
|
@ -147,7 +147,6 @@
|
|||
"Show less": "Shfaq më pak",
|
||||
"Watch on YouTube": "Shiheni në YouTube",
|
||||
"Switch Invidious Instance": "Ndërroni Instancë Invidious",
|
||||
"Broken? Try another Invidious Instance": "E prishur? Provoni një tjetër Instancë Invidious",
|
||||
"Hide annotations": "Fshihi shënimet",
|
||||
"Show annotations": "Shfaq shënime",
|
||||
"License: ": "Licencë: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"Nepali": "Nepaleze",
|
||||
"Norwegian Bokmål": "Norvegjishte Bokmål",
|
||||
"search_filters_features_option_three_sixty": "360°",
|
||||
"search_filters_label": "Filtroji",
|
||||
"Current version: ": "Versioni i tanishëm: ",
|
||||
"next_steps_error_message": "Pas të cilës duhet të provoni të: ",
|
||||
"next_steps_error_message_refresh": "Rifreskoje",
|
||||
|
@ -448,5 +446,6 @@
|
|||
"Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
|
||||
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
|
||||
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ",
|
||||
"Shared `x`": "Ndau me të tjerë `x`"
|
||||
"Shared `x`": "Ndau me të tjerë `x`",
|
||||
"search_filters_title": "Filtra"
|
||||
}
|
||||
|
|
|
@ -150,7 +150,6 @@
|
|||
"search_filters_features_option_c_commons": "Creative Commons (Licenca)",
|
||||
"search_filters_features_option_three_d": "3D",
|
||||
"search_filters_features_option_hdr": "Video Visoke Rezolucije",
|
||||
"search_filters_label": "Filter",
|
||||
"next_steps_error_message": "Nakon čega bi trebali probati: ",
|
||||
"next_steps_error_message_go_to_youtube": "Idi na YouTube",
|
||||
"footer_documentation": "Dokumentacija",
|
||||
|
@ -226,7 +225,6 @@
|
|||
"preferences_captions_label": "Podrazumevani titl: ",
|
||||
"Music": "Muzika",
|
||||
"search_filters_type_label": "Tip",
|
||||
"Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu",
|
||||
"Tamil": "Tamilski",
|
||||
"Save preferences": "Sačuvaj podešavanja",
|
||||
"Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ",
|
||||
|
@ -369,5 +367,6 @@
|
|||
"unsubscribe": "prekini sa praćenjem",
|
||||
"Blacklisted regions: ": "Zabranjene oblasti: ",
|
||||
"Polish": "Poljski",
|
||||
"Yoruba": "Joruba"
|
||||
"Yoruba": "Joruba",
|
||||
"search_filters_title": "Filter"
|
||||
}
|
||||
|
|
|
@ -189,7 +189,6 @@
|
|||
"search_filters_features_option_c_commons": "Creative Commons (Лиценца)",
|
||||
"search_filters_features_option_live": "Уживо",
|
||||
"search_filters_features_option_location": "Локација",
|
||||
"search_filters_label": "Филтер",
|
||||
"next_steps_error_message": "Након чега би требали пробати: ",
|
||||
"footer_donate_page": "Донирај",
|
||||
"footer_documentation": "Документација",
|
||||
|
@ -345,7 +344,6 @@
|
|||
"search_filters_features_option_subtitles": "Титл/Превод",
|
||||
"preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ",
|
||||
"Show less": "Прикажи мање",
|
||||
"Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу",
|
||||
"Family friendly? ": "Погодно за породицу? ",
|
||||
"Premieres `x`": "Премерe у `x`",
|
||||
"Bosnian": "Босански",
|
||||
|
@ -369,5 +367,6 @@
|
|||
"Hebrew": "Хебрејски",
|
||||
"Korean": "Корејски",
|
||||
"Kurdish": "Курдски",
|
||||
"Malay": "Малајски"
|
||||
"Malay": "Малајски",
|
||||
"search_filters_title": "Филтер"
|
||||
}
|
||||
|
|
|
@ -139,7 +139,6 @@
|
|||
"Show less": "Visa mindre",
|
||||
"Watch on YouTube": "Titta på YouTube",
|
||||
"Switch Invidious Instance": "Byt Invidious Instans",
|
||||
"Broken? Try another Invidious Instance": "Trasig? Prova en annan Invidious Instance",
|
||||
"Hide annotations": "Dölj länkar-i-video",
|
||||
"Show annotations": "Visa länkar-i-video",
|
||||
"Genre: ": "Genre: ",
|
||||
|
@ -353,7 +352,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "plats",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "Filter",
|
||||
"Current version: ": "Nuvarande version: ",
|
||||
"next_steps_error_message_refresh": "Uppdatera",
|
||||
"next_steps_error_message_go_to_youtube": "Gå till Youtube",
|
||||
|
@ -361,5 +359,6 @@
|
|||
"footer_source_code": "Källkod",
|
||||
"search_filters_duration_option_long": "Lång (> 20 minuter)",
|
||||
"footer_documentation": "Dokumentation",
|
||||
"search_filters_duration_option_short": "Kort (< 4 minuter)"
|
||||
"search_filters_duration_option_short": "Kort (< 4 minuter)",
|
||||
"search_filters_title": "Filter"
|
||||
}
|
||||
|
|
|
@ -141,7 +141,6 @@
|
|||
"Show less": "Daha az göster",
|
||||
"Watch on YouTube": "YouTube'da izle",
|
||||
"Switch Invidious Instance": "Invidious Örneğini Değiştir",
|
||||
"Broken? Try another Invidious Instance": "Bozuk mu? Başka bir Invidious örneğini deneyin",
|
||||
"Hide annotations": "Ek açıklamaları gizle",
|
||||
"Show annotations": "Ek açıklamaları göster",
|
||||
"Genre: ": "Tür: ",
|
||||
|
@ -355,7 +354,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "Konum",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "Filtrele",
|
||||
"Current version: ": "Şu anki sürüm: ",
|
||||
"next_steps_error_message": "Bundan sonra şunları denemelisiniz: ",
|
||||
"next_steps_error_message_refresh": "Yenile",
|
||||
|
@ -461,5 +459,16 @@
|
|||
"Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)",
|
||||
"Spanish (Spain)": "İspanyolca (İspanya)",
|
||||
"Vietnamese (auto-generated)": "Vietnamca (otomatik oluşturuldu)",
|
||||
"preferences_watch_history_label": "İzleme geçmişini etkinleştir: "
|
||||
"preferences_watch_history_label": "İzleme geçmişini etkinleştir: ",
|
||||
"search_message_use_another_instance": " Ayrıca <a href=\"`x`\">başka bir örnekte arayabilirsiniz</a>.",
|
||||
"search_filters_type_option_all": "Herhangi bir tür",
|
||||
"search_filters_duration_option_none": "Herhangi bir süre",
|
||||
"search_message_no_results": "Sonuç bulunamadı.",
|
||||
"search_filters_date_label": "Yükleme tarihi",
|
||||
"search_filters_apply_button": "Seçili filtreleri uygula",
|
||||
"search_filters_date_option_none": "Herhangi bir tarih",
|
||||
"search_filters_duration_option_medium": "Orta (4 - 20 dakika)",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_filters_title": "Filtreler",
|
||||
"search_message_change_filters_or_query": "Arama sorgunuzu genişletmeyi ve/veya filtreleri değiştirmeyi deneyin."
|
||||
}
|
||||
|
|
|
@ -355,7 +355,6 @@
|
|||
"generic_count_hours_0": "{{count}} годину",
|
||||
"generic_count_hours_1": "{{count}} години",
|
||||
"generic_count_hours_2": "{{count}} годин",
|
||||
"content_type": "Тип",
|
||||
"crash_page_switch_instance": "спробуйте <a href=\"`x`\">використати інший сервер</a>",
|
||||
"crash_page_read_the_faq": "прочитайте <a href=\"`x`\">часті питання (ЧаП)</a>",
|
||||
"crash_page_search_issue": "перегляньте <a href=\"`x`\">наявні обговорення на GitHub</a>",
|
||||
|
@ -386,15 +385,6 @@
|
|||
"Spanish (auto-generated)": "Іспанська (автогенератор)",
|
||||
"Spanish (Mexico)": "Іспанська (Мексика)",
|
||||
"Spanish (Spain)": "Іспанська (Іспанія)",
|
||||
"views": "Кількість переглядів",
|
||||
"today": "Сьогодні",
|
||||
"playlist": "Список відтворення",
|
||||
"long": "Довге (понад 20 хвилин)",
|
||||
"hd": "HD",
|
||||
"creative_commons": "Creative Commons",
|
||||
"3d": "3D",
|
||||
"hdr": "HDR",
|
||||
"360": "360°",
|
||||
"next_steps_error_message_go_to_youtube": "Перейти до YouTube",
|
||||
"footer_donate_page": "Пожертвувати",
|
||||
"footer_documentation": "Документація",
|
||||
|
@ -415,29 +405,11 @@
|
|||
"preferences_save_player_pos_label": "Зберегти позицію відтворення: ",
|
||||
"preferences_show_nick_label": "Псевдонім угорі: ",
|
||||
"Show more": "Докладніше",
|
||||
"week": "Цей тиждень",
|
||||
"year": "Цей рік",
|
||||
"video": "Відео",
|
||||
"channel": "Канал",
|
||||
"subtitles": "Субтитри",
|
||||
"live": "Наживо",
|
||||
"4k": "4K",
|
||||
"filter": "Фільтр",
|
||||
"next_steps_error_message": "Після чого спробуйте: ",
|
||||
"next_steps_error_message_refresh": "Оновити сторінку",
|
||||
"relevance": "Доречність",
|
||||
"rating": "Рейтинг",
|
||||
"duration": "Тривалість",
|
||||
"sort": "Порядок",
|
||||
"movie": "Фільм",
|
||||
"Search": "Пошук",
|
||||
"location": "Місце",
|
||||
"preferences_extend_desc_label": "Автоматично розширювати опис відео: ",
|
||||
"month": "Цей місяць",
|
||||
"features": "Функції",
|
||||
"preferences_category_misc": "Різноманітні параметри",
|
||||
"date": "Дата вивантаження",
|
||||
"hour": "Ця година",
|
||||
"Show less": "Коротше",
|
||||
"preferences_quality_option_small": "Низька",
|
||||
"preferences_quality_dash_option_240p": "240p",
|
||||
|
@ -453,18 +425,14 @@
|
|||
"preferences_automatic_instance_redirect_label": "Автоматична зміна сервера (redirect.invidious.io як резерв): ",
|
||||
"Switch Invidious Instance": "Інший сервер Invidious",
|
||||
"preferences_quality_dash_option_480p": "480p",
|
||||
"Broken? Try another Invidious Instance": "Не працює? Спробуйте інший сервер Invidious",
|
||||
"Chinese (Taiwan)": "Китайська (Тайвань)",
|
||||
"Dutch (auto-generated)": "Нідерландська (автогенератор)",
|
||||
"Indonesian (auto-generated)": "Індонезійська (автогенератор)",
|
||||
"Japanese (auto-generated)": "Японська (автогенератор)",
|
||||
"show": "Шоу",
|
||||
"Korean (auto-generated)": "Корейська (автогенератор)",
|
||||
"generic_count_months_0": "{{count}} місяць",
|
||||
"generic_count_months_1": "{{count}} місяці",
|
||||
"generic_count_months_2": "{{count}} місяців",
|
||||
"short": "Коротке (до 4 хвилин)",
|
||||
"purchased": "Придбання",
|
||||
"videoinfo_youTube_embed_link": "Вкласти",
|
||||
"generic_count_minutes_0": "{{count}} хвилину",
|
||||
"generic_count_minutes_1": "{{count}} хвилини",
|
||||
|
@ -477,5 +445,46 @@
|
|||
"download_subtitles": "Субтитри — `x` (.vtt)",
|
||||
"comments_points_count_0": "{{count}} пункт",
|
||||
"comments_points_count_1": "{{count}} пункти",
|
||||
"comments_points_count_2": "{{count}} пунктів"
|
||||
"comments_points_count_2": "{{count}} пунктів",
|
||||
"search_filters_features_option_three_d": "3D",
|
||||
"search_filters_features_option_location": "Геомітка",
|
||||
"search_filters_duration_option_none": "Будь-які",
|
||||
"search_filters_features_option_hd": "HD",
|
||||
"search_message_change_filters_or_query": "Спробуйте ширший запит і/або інші фільтри.",
|
||||
"search_filters_type_option_all": "Будь-що",
|
||||
"search_filters_type_option_movie": "Фільм",
|
||||
"search_filters_type_option_show": "Шоу",
|
||||
"search_filters_duration_label": "Тривалість",
|
||||
"search_filters_duration_option_short": "Короткі (до 4 хвилин)",
|
||||
"search_message_no_results": "Результатів не знайдено.",
|
||||
"search_filters_date_label": "Дата вивантаження",
|
||||
"search_filters_date_option_none": "Будь-яка дата",
|
||||
"search_filters_date_option_today": "Сьогодні",
|
||||
"search_filters_date_option_week": "Цей тиждень",
|
||||
"search_filters_type_label": "Тип",
|
||||
"search_filters_type_option_channel": "Канал",
|
||||
"search_message_use_another_instance": " Можете також <a href=\"`x`\">пошукати іншим сервером</a>.",
|
||||
"search_filters_title": "Фільтри",
|
||||
"search_filters_date_option_hour": "Остання година",
|
||||
"search_filters_date_option_month": "Цей місяць",
|
||||
"search_filters_date_option_year": "Цей рік",
|
||||
"search_filters_type_option_video": "Відео",
|
||||
"search_filters_type_option_playlist": "Добірка",
|
||||
"search_filters_duration_option_medium": "Середні (4–20 хвилин)",
|
||||
"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": "Популярні"
|
||||
}
|
||||
|
|
|
@ -138,7 +138,6 @@
|
|||
"Show less": "Hiện ít hơn",
|
||||
"Watch on YouTube": "Xem trên YouTube",
|
||||
"Switch Invidious Instance": "Chuyển phiên bản Invidious",
|
||||
"Broken? Try another Invidious Instance": "Bị hỏng? Hãy thử một Phiên bản Invidious khác",
|
||||
"Hide annotations": "Ẩn chú thích",
|
||||
"Show annotations": "Hiển thị chú thích",
|
||||
"Genre: ": "Thể loại: ",
|
||||
|
@ -341,6 +340,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "vị trí",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "bộ lọc",
|
||||
"Current version: ": "Phiên bản hiện tại: "
|
||||
"Current version: ": "Phiên bản hiện tại: ",
|
||||
"search_filters_title": "bộ lọc"
|
||||
}
|
||||
|
|
|
@ -148,7 +148,6 @@
|
|||
"Show less": "显示较少",
|
||||
"Watch on YouTube": "在 YouTube 观看",
|
||||
"Switch Invidious Instance": "切换 Invidious 实例",
|
||||
"Broken? Try another Invidious Instance": "无法正常工作? 尝试另一个 Invidious 实例",
|
||||
"Hide annotations": "隐藏注释",
|
||||
"Show annotations": "显示注释",
|
||||
"Genre: ": "风格: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"search_filters_features_option_four_k": "4k",
|
||||
"search_filters_features_option_location": "位置",
|
||||
"search_filters_features_option_hdr": "hdr",
|
||||
"search_filters_label": "过滤器",
|
||||
"Current version: ": "当前版本: ",
|
||||
"next_steps_error_message": "在此之后你应尝试: ",
|
||||
"next_steps_error_message_refresh": "刷新",
|
||||
|
@ -445,5 +443,16 @@
|
|||
"French (auto-generated)": "法语 (自动生成)",
|
||||
"Turkish (auto-generated)": "土耳其语 (自动生成)",
|
||||
"Spanish (Spain)": "西班牙语 (西班牙)",
|
||||
"preferences_watch_history_label": "启用观看历史: "
|
||||
"preferences_watch_history_label": "启用观看历史: ",
|
||||
"search_message_use_another_instance": " 你也可以 <a href=\"`x`\">在另一实例上搜索</a>。",
|
||||
"search_filters_title": "过滤器",
|
||||
"search_filters_date_label": "上传日期",
|
||||
"search_filters_apply_button": "应用所选过滤器",
|
||||
"search_message_no_results": "没找到结果。",
|
||||
"search_filters_duration_option_medium": "中等(4-20 分钟)",
|
||||
"search_filters_date_option_none": "任意日期",
|
||||
"search_message_change_filters_or_query": "尝试扩大你的搜索查询和/或更改过滤器。",
|
||||
"search_filters_duration_option_none": "任意时长",
|
||||
"search_filters_type_option_all": "任意类型",
|
||||
"search_filters_features_option_vr180": "VR180"
|
||||
}
|
||||
|
|
|
@ -148,7 +148,6 @@
|
|||
"Show less": "顯示較少",
|
||||
"Watch on YouTube": "在 YouTube 上觀看",
|
||||
"Switch Invidious Instance": "切換 Invidious 站台",
|
||||
"Broken? Try another Invidious Instance": "故障了嗎?試試看其他 Invidious 站台吧",
|
||||
"Hide annotations": "隱藏註釋",
|
||||
"Show annotations": "顯示註釋",
|
||||
"Genre: ": "風格: ",
|
||||
|
@ -371,7 +370,6 @@
|
|||
"search_filters_features_option_four_k": "4K",
|
||||
"search_filters_features_option_location": "位置",
|
||||
"search_filters_features_option_hdr": "HDR",
|
||||
"search_filters_label": "篩選條件",
|
||||
"Current version: ": "目前版本: ",
|
||||
"next_steps_error_message": "之後您應該嘗試: ",
|
||||
"next_steps_error_message_refresh": "重新整理",
|
||||
|
@ -445,5 +443,16 @@
|
|||
"Portuguese (Brazil)": "葡萄牙語(巴西)",
|
||||
"Japanese (auto-generated)": "日語(自動產生)",
|
||||
"Portuguese (auto-generated)": "葡萄牙語(自動產生)",
|
||||
"preferences_watch_history_label": "啟用觀看紀錄: "
|
||||
"preferences_watch_history_label": "啟用觀看紀錄: ",
|
||||
"search_message_change_filters_or_query": "嘗試擴大您的查詢字詞與/或變更過濾條件。",
|
||||
"search_filters_apply_button": "套用選定的過濾條件",
|
||||
"search_message_no_results": "找不到結果。",
|
||||
"search_filters_duration_option_none": "任何時長",
|
||||
"search_filters_duration_option_medium": "中等(4到20分鐘)",
|
||||
"search_filters_features_option_vr180": "VR180",
|
||||
"search_message_use_another_instance": " 您也可以<a href=\"`x`\">在其他站台上搜尋</a>。",
|
||||
"search_filters_title": "過濾條件",
|
||||
"search_filters_date_label": "上傳日期",
|
||||
"search_filters_type_option_all": "任何類型",
|
||||
"search_filters_date_option_none": "任何日期"
|
||||
}
|
||||
|
|
|
@ -14,11 +14,11 @@ shards:
|
|||
|
||||
exception_page:
|
||||
git: https://github.com/crystal-loot/exception_page.git
|
||||
version: 0.2.1
|
||||
version: 0.2.2
|
||||
|
||||
kemal:
|
||||
git: https://github.com/kemalcr/kemal.git
|
||||
version: 1.1.0
|
||||
version: 1.1.2
|
||||
|
||||
kilt:
|
||||
git: https://github.com/jeromegn/kilt.git
|
||||
|
|
|
@ -18,7 +18,10 @@ dependencies:
|
|||
version: ~> 0.18.0
|
||||
kemal:
|
||||
github: kemalcr/kemal
|
||||
version: ~> 1.1.0
|
||||
version: ~> 1.1.2
|
||||
kilt:
|
||||
github: jeromegn/kilt
|
||||
version: ~> 0.6.1
|
||||
protodec:
|
||||
github: iv-org/protodec
|
||||
version: ~> 0.1.4
|
||||
|
|
200
spec/invidious/search/query_spec.cr
Normal file
200
spec/invidious/search/query_spec.cr
Normal 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
|
16
src/ext/kemal_content_for.cr
Normal file
16
src/ext/kemal_content_for.cr
Normal 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
|
|
@ -16,7 +16,13 @@
|
|||
|
||||
require "digest/md5"
|
||||
require "file_utils"
|
||||
|
||||
# Require kemal, kilt, then our own overrides
|
||||
require "kemal"
|
||||
require "kilt"
|
||||
require "./ext/kemal_content_for.cr"
|
||||
require "./ext/kemal_static_file_handler.cr"
|
||||
|
||||
require "athena-negotiation"
|
||||
require "openssl/hmac"
|
||||
require "option_parser"
|
||||
|
|
|
@ -574,31 +574,41 @@ def content_to_comment_html(content)
|
|||
if run["navigationEndpoint"]?
|
||||
if url = run["navigationEndpoint"]["urlEndpoint"]?.try &.["url"].as_s
|
||||
url = URI.parse(url)
|
||||
displayed_url = url
|
||||
|
||||
if url.host == "youtu.be"
|
||||
url = "/watch?v=#{url.request_target.lstrip('/')}"
|
||||
displayed_url = "youtube.com#{url}"
|
||||
elsif url.host.nil? || url.host.not_nil!.ends_with?("youtube.com")
|
||||
if url.path == "/redirect"
|
||||
# Sometimes, links can be corrupted (why?) so make sure to fallback
|
||||
# nicely. See https://github.com/iv-org/invidious/issues/2682
|
||||
url = HTTP::Params.parse(url.query.not_nil!)["q"]? || ""
|
||||
displayed_url = url
|
||||
else
|
||||
url = url.request_target
|
||||
displayed_url = "youtube.com#{url}"
|
||||
end
|
||||
end
|
||||
|
||||
text = %(<a href="#{url}">#{text}</a>)
|
||||
text = %(<a href="#{url}">#{reduce_uri(displayed_url)}</a>)
|
||||
elsif watch_endpoint = run["navigationEndpoint"]["watchEndpoint"]?
|
||||
length_seconds = watch_endpoint["startTimeSeconds"]?
|
||||
video_id = watch_endpoint["videoId"].as_s
|
||||
|
||||
if length_seconds && length_seconds.as_i > 0
|
||||
if length_seconds && length_seconds.as_i >= 0
|
||||
text = %(<a href="javascript:void(0)" data-onclick="jump_to_time" data-jump-time="#{length_seconds}">#{text}</a>)
|
||||
else
|
||||
text = %(<a href="/watch?v=#{video_id}">#{text}</a>)
|
||||
text = %(<a href="/watch?v=#{video_id}">#{"youtube.com/watch?v=#{video_id}"}</a>)
|
||||
end
|
||||
elsif url = run.dig?("navigationEndpoint", "commandMetadata", "webCommandMetadata", "url").try &.as_s
|
||||
if text.starts_with?(/\s?@/)
|
||||
# Handle "pings" in comments differently
|
||||
# See: https://github.com/iv-org/invidious/issues/3038
|
||||
text = %(<a href="#{url}">#{text}</a>)
|
||||
else
|
||||
text = %(<a href="#{url}">#{reduce_uri(url)}</a>)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -48,13 +48,19 @@ module JSON::Serializable
|
|||
end
|
||||
end
|
||||
|
||||
macro templated(filename, template = "template", navbar_search = true)
|
||||
macro templated(_filename, template = "template", navbar_search = true)
|
||||
navbar_search = {{navbar_search}}
|
||||
render "src/invidious/views/#{{{filename}}}.ecr", "src/invidious/views/#{{{template}}}.ecr"
|
||||
|
||||
{{ filename = "src/invidious/views/" + _filename + ".ecr" }}
|
||||
{{ layout = "src/invidious/views/" + template + ".ecr" }}
|
||||
|
||||
__content_filename__ = {{filename}}
|
||||
content = Kilt.render({{filename}})
|
||||
Kilt.render({{layout}})
|
||||
end
|
||||
|
||||
macro rendered(filename)
|
||||
render "src/invidious/views/#{{{filename}}}.ecr"
|
||||
Kilt.render("src/invidious/views/#{{{filename}}}.ecr")
|
||||
end
|
||||
|
||||
# Similar to Kemals halt method but works in a
|
||||
|
|
|
@ -383,3 +383,11 @@ def fetch_random_instance
|
|||
|
||||
return filtered_instance_list.sample(1)[0]
|
||||
end
|
||||
|
||||
def reduce_uri(uri : URI | String, max_length : Int32 = 50, suffix : String = "…") : String
|
||||
str = uri.to_s.sub(/^https?:\/\//, "")
|
||||
if str.size > max_length
|
||||
str = "#{str[0, max_length]}#{suffix}"
|
||||
end
|
||||
return str
|
||||
end
|
||||
|
|
|
@ -56,7 +56,7 @@ module Invidious::Routes::API::Manifest
|
|||
xml.element("Period") do
|
||||
i = 0
|
||||
|
||||
{"audio/mp4", "audio/webm"}.each do |mime_type|
|
||||
{"audio/mp4"}.each do |mime_type|
|
||||
mime_streams = audio_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type }
|
||||
next if mime_streams.empty?
|
||||
|
||||
|
@ -83,7 +83,7 @@ module Invidious::Routes::API::Manifest
|
|||
|
||||
potential_heights = {4320, 2160, 1440, 1080, 720, 480, 360, 240, 144}
|
||||
|
||||
{"video/mp4", "video/webm"}.each do |mime_type|
|
||||
{"video/mp4"}.each do |mime_type|
|
||||
mime_streams = video_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type }
|
||||
next if mime_streams.empty?
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ module Invidious::Search
|
|||
Playlist # "Add playlist item" search
|
||||
end
|
||||
|
||||
@type : Type = Type::Regular
|
||||
getter type : Type = Type::Regular
|
||||
|
||||
@raw_query : String
|
||||
@query : String = ""
|
||||
|
@ -63,14 +63,17 @@ module Invidious::Search
|
|||
|
||||
# Specific handling
|
||||
case @type
|
||||
when .playlist?, .channel?
|
||||
# In "add playlist item" mode, filters are parsed from the query
|
||||
# string itself (legacy), and the channel is ignored.
|
||||
#
|
||||
when .channel?
|
||||
# In "channel search" mode, filters are ignored, but we still parse
|
||||
# the query prevent transmission of legacy filters to youtube.
|
||||
#
|
||||
@filters, @query, @channel, _ = Filters.from_legacy_filters(@raw_query || "")
|
||||
_, _, @query, _ = Filters.from_legacy_filters(@raw_query)
|
||||
#
|
||||
when .playlist?
|
||||
# In "add playlist item" mode, filters are parsed from the query
|
||||
# string itself (legacy), and the channel is ignored.
|
||||
#
|
||||
@filters, _, @query, _ = Filters.from_legacy_filters(@raw_query)
|
||||
#
|
||||
when .subscriptions?, .regular?
|
||||
if params["sp"]?
|
||||
|
@ -84,7 +87,7 @@ module Invidious::Search
|
|||
|
||||
if @filters.default? && @raw_query.includes?(':')
|
||||
# Parse legacy filters from query
|
||||
@filters, @query, @channel, subs = Filters.from_legacy_filters(@raw_query || "")
|
||||
@filters, @channel, @query, subs = Filters.from_legacy_filters(@raw_query)
|
||||
else
|
||||
@query = @raw_query || ""
|
||||
end
|
||||
|
|
|
@ -52,11 +52,11 @@
|
|||
<% if !env.get("preferences").as(Preferences).thin_mode %>
|
||||
<div class="thumbnail">
|
||||
<img loading="lazy" class="thumbnail" src="/vi/<%= item.id %>/mqdefault.jpg"/>
|
||||
<% if plid = env.get?("remove_playlist_items") %>
|
||||
<form data-onsubmit="return_false" action="/playlist_ajax?action_remove_video=1&set_video_id=<%= item.index %>&playlist_id=<%= plid %>&referer=<%= env.get("current_page") %>" method="post">
|
||||
<% if plid_form = env.get?("remove_playlist_items") %>
|
||||
<form data-onsubmit="return_false" action="/playlist_ajax?action_remove_video=1&set_video_id=<%= item.index %>&playlist_id=<%= plid_form %>&referer=<%= env.get("current_page") %>" method="post">
|
||||
<input type="hidden" name="csrf_token" value="<%= HTML.escape(env.get?("csrf_token").try &.as(String) || "") %>">
|
||||
<p class="watched">
|
||||
<a data-onclick="remove_playlist_item" data-index="<%= item.index %>" data-plid="<%= plid %>" href="javascript:void(0)">
|
||||
<a data-onclick="remove_playlist_item" data-index="<%= item.index %>" data-plid="<%= plid_form %>" href="javascript:void(0)">
|
||||
<button type="submit" style="all:unset">
|
||||
<i class="icon ion-md-trash"></i>
|
||||
</button>
|
||||
|
@ -117,11 +117,11 @@
|
|||
</a>
|
||||
</p>
|
||||
</form>
|
||||
<% elsif plid = env.get? "add_playlist_items" %>
|
||||
<form data-onsubmit="return_false" action="/playlist_ajax?action_add_video=1&video_id=<%= item.id %>&playlist_id=<%= plid %>&referer=<%= env.get("current_page") %>" method="post">
|
||||
<% elsif plid_form = env.get? "add_playlist_items" %>
|
||||
<form data-onsubmit="return_false" action="/playlist_ajax?action_add_video=1&video_id=<%= item.id %>&playlist_id=<%= plid_form %>&referer=<%= env.get("current_page") %>" method="post">
|
||||
<input type="hidden" name="csrf_token" value="<%= HTML.escape(env.get?("csrf_token").try &.as(String) || "") %>">
|
||||
<p class="watched">
|
||||
<a data-onclick="add_playlist_item" data-id="<%= item.id %>" data-plid="<%= plid %>" href="javascript:void(0)">
|
||||
<a data-onclick="add_playlist_item" data-id="<%= item.id %>" data-plid="<%= plid_form %>" href="javascript:void(0)">
|
||||
<button type="submit" style="all:unset">
|
||||
<i class="icon ion-md-add"></i>
|
||||
</button>
|
||||
|
|
|
@ -7,8 +7,19 @@
|
|||
<source src="<%= URI.parse(hlsvp).request_target %><% if params.local %>?local=true<% end %>" type="application/x-mpegURL" label="livestream">
|
||||
<% else %>
|
||||
<% if params.listen %>
|
||||
<% audio_streams.each_with_index do |fmt, i| %>
|
||||
<source src="/latest_version?id=<%= video.id %>&itag=<%= fmt["itag"] %><% if params.local %>&local=true<% end %>" type='<%= fmt["mimeType"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>">
|
||||
<% audio_streams.each_with_index do |fmt, i|
|
||||
src_url = "/latest_version?id=#{video.id}&itag=#{fmt["itag"]}"
|
||||
src_url += "&local=true" if params.local
|
||||
|
||||
bitrate = fmt["bitrate"]
|
||||
mimetype = HTML.escape(fmt["mimeType"].as_s)
|
||||
|
||||
selected = i == 0 ? true : false
|
||||
%>
|
||||
<source src="<%= src_url %>" type='<%= mimetype %>' label="<%= bitrate %>k" selected="<%= selected %>">
|
||||
<% if !params.local && !CONFIG.disabled?("local") %>
|
||||
<source src="<%= src_url %>&local=true" type='<%= mimetype %>' hidequalityoption="true">
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<% if params.quality == "dash" %>
|
||||
|
@ -28,6 +39,9 @@
|
|||
selected = params.quality ? (params.quality == quality) : (i == 0)
|
||||
%>
|
||||
<source src="<%= src_url %>" type="<%= mimetype %>" label="<%= quality %>" selected="<%= selected %>">
|
||||
<% if !params.local && !CONFIG.disabled?("local") %>
|
||||
<source src="<%= src_url %>&local=true" type="<%= mimetype %>" hidequalityoption="true">
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
|
|
|
@ -24,7 +24,8 @@
|
|||
"video_series" => video_series,
|
||||
"params" => params,
|
||||
"preferences" => preferences,
|
||||
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix
|
||||
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix,
|
||||
"local_disabled" => CONFIG.disabled?("local")
|
||||
}.to_pretty_json
|
||||
%>
|
||||
</script>
|
||||
|
|
|
@ -64,7 +64,8 @@ we're going to need to do it here in order to allow for translations.
|
|||
"preferences" => preferences,
|
||||
"premiere_timestamp" => video.premiere_timestamp.try &.to_unix,
|
||||
"vr" => video.is_vr,
|
||||
"projection_type" => video.projection_type
|
||||
"projection_type" => video.projection_type,
|
||||
"local_disabled" => CONFIG.disabled?("local")
|
||||
}.to_pretty_json
|
||||
%>
|
||||
</script>
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
# Due to an firefox issue, we're stuck on 7.11.0. If you're hosting a private instance
|
||||
# and you're using a chromium based browser, feel free to bump this to the latest version
|
||||
# in order to get support for higher resolutions on more videos.
|
||||
# Due to a 'video append of' error (see #3011), we're stuck on 7.12.1.
|
||||
video.js:
|
||||
version: 7.11.0
|
||||
shasum: e20747d890716085e7255a90d73c00f32324a224
|
||||
version: 7.12.1
|
||||
shasum: 1d12eeb1f52e3679e8e4c987d9b9eb37e2247fa2
|
||||
|
||||
videojs-contrib-quality-levels:
|
||||
version: 2.1.0
|
||||
|
|
Loading…
Reference in a new issue