From 8445d3ae120c52eba531183caa1fa63d5701f322 Mon Sep 17 00:00:00 2001 From: Brahim Hadriche Date: Sun, 19 Feb 2023 19:01:28 -0500 Subject: [PATCH 01/54] Fix watch history order --- src/invidious/database/users.cr | 1 + src/invidious/routes/watch.cr | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/invidious/database/users.cr b/src/invidious/database/users.cr index 0a4a4fd8..f8422874 100644 --- a/src/invidious/database/users.cr +++ b/src/invidious/database/users.cr @@ -50,6 +50,7 @@ module Invidious::Database::Users end def mark_watched(user : User, vid : String) + mark_unwatched(user, vid) request = <<-SQL UPDATE users SET watched = array_append(watched, $1) diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index 5d3845c3..813cb0f4 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -76,7 +76,7 @@ module Invidious::Routes::Watch end env.params.query.delete_all("iv_load_policy") - if watched && preferences.watch_history && !watched.includes? id + if watched && preferences.watch_history Invidious::Database::Users.mark_watched(user.as(User), id) end @@ -259,9 +259,7 @@ module Invidious::Routes::Watch case action when "action_mark_watched" - if !user.watched.includes? id - Invidious::Database::Users.mark_watched(user, id) - end + Invidious::Database::Users.mark_watched(user, id) when "action_mark_unwatched" Invidious::Database::Users.mark_unwatched(user, id) else From 20289a4d014d36c9a7bd50d8b1549bf36f78eb59 Mon Sep 17 00:00:00 2001 From: Brahim Hadriche Date: Mon, 20 Feb 2023 14:56:38 -0500 Subject: [PATCH 02/54] Fix order for import --- src/invidious/user/imports.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/invidious/user/imports.cr b/src/invidious/user/imports.cr index 20ae0d47..aa947456 100644 --- a/src/invidious/user/imports.cr +++ b/src/invidious/user/imports.cr @@ -48,7 +48,7 @@ struct Invidious::User if data["watch_history"]? user.watched += data["watch_history"].as_a.map(&.as_s) - user.watched.uniq! + user.watched.reverse!.uniq!.reverse! Invidious::Database::Users.update_watch_history(user) end From 025e7555420a88757aa8709419e8f09ba654854d Mon Sep 17 00:00:00 2001 From: Brahim Hadriche Date: Sat, 4 Mar 2023 19:14:28 -0500 Subject: [PATCH 03/54] Use single db call --- src/invidious/database/users.cr | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/invidious/database/users.cr b/src/invidious/database/users.cr index f8422874..d54e6a76 100644 --- a/src/invidious/database/users.cr +++ b/src/invidious/database/users.cr @@ -50,10 +50,9 @@ module Invidious::Database::Users end def mark_watched(user : User, vid : String) - mark_unwatched(user, vid) request = <<-SQL UPDATE users - SET watched = array_append(watched, $1) + SET watched = array_append(array_remove(watched, $1), $1) WHERE email = $2 SQL From 5517a4eadb980ae06d4dde08afd10fec8c83f9b4 Mon Sep 17 00:00:00 2001 From: chunky programmer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:29:50 -0400 Subject: [PATCH 04/54] fix fetching community continuations --- src/invidious/channels/community.cr | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/invidious/channels/community.cr b/src/invidious/channels/community.cr index ce34ff82..ad786f3a 100644 --- a/src/invidious/channels/community.cr +++ b/src/invidious/channels/community.cr @@ -31,18 +31,16 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode) session_token: session_token, } - response = YT_POOL.client &.post("/comment_service_ajax?action_get_comments=1&ctoken=#{continuation}&continuation=#{continuation}&hl=en&gl=US", headers, form: post_req) - body = JSON.parse(response.body) + body = YoutubeAPI.browse(continuation) - body = body["response"]["continuationContents"]["itemSectionContinuation"]? || - body["response"]["continuationContents"]["backstageCommentsContinuation"]? + body = body.dig?("continuationContents", "itemSectionContinuation") || + body.dig?("continuationContents", "backstageCommentsContinuation") if !body raise InfoException.new("Could not extract continuation.") end end - continuation = body["continuations"]?.try &.[0]["nextContinuationData"]["continuation"].as_s posts = body["contents"].as_a if message = posts[0]["messageRenderer"]? @@ -270,10 +268,8 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode) end end end - - if body["continuations"]? - continuation = body["continuations"][0]["nextContinuationData"]["continuation"].as_s - json.field "continuation", extract_channel_community_cursor(continuation) + if cont = posts.dig?(-1, "continuationItemRenderer", "continuationEndpoint", "continuationCommand", "token") + json.field "continuation", extract_channel_community_cursor(cont.as_s) end end end From 0107b774f29b0f4cc0a7fabe546db347390337ec Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Fri, 28 Apr 2023 17:23:40 +0200 Subject: [PATCH 05/54] Trending: Don't extract items from categories --- src/invidious/trending.cr | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/invidious/trending.cr b/src/invidious/trending.cr index 134eb437..74bab1bd 100644 --- a/src/invidious/trending.cr +++ b/src/invidious/trending.cr @@ -17,7 +17,9 @@ def fetch_trending(trending_type, region, locale) client_config = YoutubeAPI::ClientConfig.new(region: region) initial_data = YoutubeAPI.browse("FEtrending", params: params, client_config: client_config) - trending = extract_videos(initial_data) - return {trending, plid} + items, _ = extract_items(initial_data) + + # Return items, but ignore categories (e.g featured content) + return items.reject!(Category), plid end From 7afa03d821365673e955468eff58009b5fb5c4c8 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Fri, 28 Apr 2023 17:27:06 +0200 Subject: [PATCH 06/54] Search: Don't extract items from categories too --- src/invidious/search/processors.cr | 4 ++-- src/invidious/search/query.cr | 23 +---------------------- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/invidious/search/processors.cr b/src/invidious/search/processors.cr index 7e909590..25edb936 100644 --- a/src/invidious/search/processors.cr +++ b/src/invidious/search/processors.cr @@ -10,7 +10,7 @@ module Invidious::Search initial_data = YoutubeAPI.search(query.text, search_params, client_config: client_config) items, _ = extract_items(initial_data) - return items + return items.reject!(Category) end # Search a youtube channel @@ -32,7 +32,7 @@ module Invidious::Search response_json = YoutubeAPI.browse(continuation) items, _ = extract_items(response_json, "", ucid) - return items + return items.reject!(Category) end # Search inside of user subscriptions diff --git a/src/invidious/search/query.cr b/src/invidious/search/query.cr index 24e79609..e38845d9 100644 --- a/src/invidious/search/query.cr +++ b/src/invidious/search/query.cr @@ -113,7 +113,7 @@ module Invidious::Search case @type when .regular?, .playlist? - items = unnest_items(Processors.regular(self)) + items = Processors.regular(self) # when .channel? items = Processors.channel(self) @@ -136,26 +136,5 @@ module Invidious::Search return params end - - # TODO: clean code - private def unnest_items(all_items) : Array(SearchItem) - items = [] of SearchItem - - # Light processing to flatten search results out of Categories. - # They should ideally be supported in the future. - all_items.each do |i| - if i.is_a? Category - i.contents.each do |nest_i| - if !nest_i.is_a? Video - items << nest_i - end - end - else - items << i - end - end - - return items - end end end From 3cfbc19ccc031ec4640f5e06568d2a52ebf90627 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Fri, 28 Apr 2023 17:30:01 +0200 Subject: [PATCH 07/54] Extractors: Add utility function to extract items from categories --- src/invidious/yt_backend/extractors_utils.cr | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/invidious/yt_backend/extractors_utils.cr b/src/invidious/yt_backend/extractors_utils.cr index 0cb3c079..b247dca8 100644 --- a/src/invidious/yt_backend/extractors_utils.cr +++ b/src/invidious/yt_backend/extractors_utils.cr @@ -68,19 +68,16 @@ rescue ex return false end -def extract_videos(initial_data : Hash(String, JSON::Any), author_fallback : String? = nil, author_id_fallback : String? = nil) : Array(SearchVideo) - extracted, _ = extract_items(initial_data, author_fallback, author_id_fallback) +# This function extracts the SearchItems from a Category. +# Categories are commonly returned in search results and trending pages. +def extract_category(category : Category) : Array(SearchVideo) + items = [] of SearchItem - target = [] of (SearchItem | Continuation) - extracted.each do |i| - if i.is_a?(Category) - i.contents.each { |cate_i| target << cate_i if !cate_i.is_a? Video } - else - target << i - end + category.contents.each do |item| + target << cate_i if item.is_a?(SearchItem) end - return target.select(SearchVideo) + return items end def extract_selected_tab(tabs) From 67859113fdaac70f4524c44fd24913824889b691 Mon Sep 17 00:00:00 2001 From: AHOHNMYC Date: Wed, 22 Mar 2023 06:57:05 +0000 Subject: [PATCH 08/54] Update Russian translation --- locales/ru.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/ru.json b/locales/ru.json index 7ca5cf1f..d2d7c86d 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -495,5 +495,8 @@ "channel_tab_shorts_label": "Shorts", "Music in this video": "Музыка в этом видео", "Artist: ": "Исполнитель: ", - "Album: ": "Альбом: " + "Album: ": "Альбом: ", + "Song: ": "Композиция: ", + "Standard YouTube license": "Стандартная лицензия YouTube", + "Channel Sponsor": "Спонсор канала" } From 17ecdbaf7db2843e9b8d0977228cc5c8c18ecf39 Mon Sep 17 00:00:00 2001 From: Ashirg-ch Date: Wed, 22 Mar 2023 09:19:19 +0000 Subject: [PATCH 09/54] Update German translation --- locales/de.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index c2941d6d..0df86663 100644 --- a/locales/de.json +++ b/locales/de.json @@ -479,5 +479,8 @@ "Artist: ": "Künstler: ", "Album: ": "Album: ", "channel_tab_playlists_label": "Wiedergabelisten", - "channel_tab_channels_label": "Kanäle" + "channel_tab_channels_label": "Kanäle", + "Channel Sponsor": "Kanalsponsor", + "Standard YouTube license": "Standard YouTube-Lizenz", + "Song: ": "Musik: " } From 155f5fef97c75ad242f623c0b97b1422ee832ec5 Mon Sep 17 00:00:00 2001 From: Matthaiks Date: Mon, 20 Mar 2023 19:10:20 +0000 Subject: [PATCH 10/54] Update Polish translation --- locales/pl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/pl.json b/locales/pl.json index 3c713e70..2b6768d9 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -498,5 +498,6 @@ "Artist: ": "Wykonawca: ", "Album: ": "Album: ", "Song: ": "Piosenka: ", - "Channel Sponsor": "Sponsor kanału" + "Channel Sponsor": "Sponsor kanału", + "Standard YouTube license": "Standardowa licencja YouTube" } From d1393343765268f8131fab13cc8e95520f4f99ac Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Mon, 20 Mar 2023 22:14:09 +0000 Subject: [PATCH 11/54] Update Arabic translation --- locales/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ar.json b/locales/ar.json index 3ce34c2d..fb9e7564 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -545,5 +545,6 @@ "Album: ": "الألبوم: ", "Artist: ": "الفنان: ", "Song: ": "أغنية: ", - "Channel Sponsor": "راعي القناة" + "Channel Sponsor": "راعي القناة", + "Standard YouTube license": "ترخيص YouTube القياسي" } From b97b5b5859ea0e0755745f7d2138e4d21ecaec0c Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Mon, 20 Mar 2023 20:03:55 +0000 Subject: [PATCH 12/54] Update Spanish translation --- locales/es.json | 75 +++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/locales/es.json b/locales/es.json index bb082c06..aa03f124 100644 --- a/locales/es.json +++ b/locales/es.json @@ -398,37 +398,51 @@ "search_filters_features_option_three_sixty": "360°", "videoinfo_watch_on_youTube": "Ver en YouTube", "preferences_save_player_pos_label": "Guardar posición de reproducción: ", - "generic_views_count": "{{count}} visualización", - "generic_views_count_plural": "{{count}} visualizaciones", - "generic_subscribers_count": "{{count}} suscriptor", - "generic_subscribers_count_plural": "{{count}} suscriptores", - "generic_subscriptions_count": "{{count}} suscripción", - "generic_subscriptions_count_plural": "{{count}} suscripciones", - "subscriptions_unseen_notifs_count": "{{count}} notificación no vista", - "subscriptions_unseen_notifs_count_plural": "{{count}} notificaciones no vistas", - "generic_count_days": "{{count}} día", - "generic_count_days_plural": "{{count}} días", - "comments_view_x_replies": "Ver {{count}} respuesta", - "comments_view_x_replies_plural": "Ver {{count}} respuestas", - "generic_count_weeks": "{{count}} semana", - "generic_count_weeks_plural": "{{count}} semanas", - "generic_playlists_count": "{{count}} lista de reproducción", - "generic_playlists_count_plural": "{{count}} listas de reproducción", + "generic_views_count_0": "{{count}} visualización", + "generic_views_count_1": "{{count}} visualizaciones", + "generic_views_count_2": "{{count}} visualizaciones", + "generic_subscribers_count_0": "{{count}} suscriptor", + "generic_subscribers_count_1": "{{count}} suscriptores", + "generic_subscribers_count_2": "{{count}} suscriptores", + "generic_subscriptions_count_0": "{{count}} suscripción", + "generic_subscriptions_count_1": "{{count}} suscripciones", + "generic_subscriptions_count_2": "{{count}} suscripciones", + "subscriptions_unseen_notifs_count_0": "{{count}} notificación no vista", + "subscriptions_unseen_notifs_count_1": "{{count}} notificaciones no vistas", + "subscriptions_unseen_notifs_count_2": "{{count}} notificaciones no vistas", + "generic_count_days_0": "{{count}} día", + "generic_count_days_1": "{{count}} días", + "generic_count_days_2": "{{count}} días", + "comments_view_x_replies_0": "Ver {{count}} respuesta", + "comments_view_x_replies_1": "Ver {{count}} respuestas", + "comments_view_x_replies_2": "Ver {{count}} respuestas", + "generic_count_weeks_0": "{{count}} semana", + "generic_count_weeks_1": "{{count}} semanas", + "generic_count_weeks_2": "{{count}} semanas", + "generic_playlists_count_0": "{{count}} lista de reproducción", + "generic_playlists_count_1": "{{count}} listas de reproducciones", + "generic_playlists_count_2": "{{count}} listas de reproducciones", "generic_videos_count_0": "{{count}} video", "generic_videos_count_1": "{{count}} videos", "generic_videos_count_2": "{{count}} videos", - "generic_count_months": "{{count}} mes", - "generic_count_months_plural": "{{count}} meses", - "comments_points_count": "{{count}} punto", - "comments_points_count_plural": "{{count}} puntos", - "generic_count_years": "{{count}} año", - "generic_count_years_plural": "{{count}} años", - "generic_count_hours": "{{count}} hora", - "generic_count_hours_plural": "{{count}} horas", - "generic_count_minutes": "{{count}} minuto", - "generic_count_minutes_plural": "{{count}} minutos", - "generic_count_seconds": "{{count}} segundo", - "generic_count_seconds_plural": "{{count}} segundos", + "generic_count_months_0": "{{count}} mes", + "generic_count_months_1": "{{count}} meses", + "generic_count_months_2": "{{count}} meses", + "comments_points_count_0": "{{count}} punto", + "comments_points_count_1": "{{count}} puntos", + "comments_points_count_2": "{{count}} puntos", + "generic_count_years_0": "{{count}} año", + "generic_count_years_1": "{{count}} años", + "generic_count_years_2": "{{count}} años", + "generic_count_hours_0": "{{count}} hora", + "generic_count_hours_1": "{{count}} horas", + "generic_count_hours_2": "{{count}} horas", + "generic_count_minutes_0": "{{count}} minuto", + "generic_count_minutes_1": "{{count}} minutos", + "generic_count_minutes_2": "{{count}} minutos", + "generic_count_seconds_0": "{{count}} segundo", + "generic_count_seconds_1": "{{count}} segundos", + "generic_count_seconds_2": "{{count}} segundos", "crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:", "crash_page_switch_instance": "probado a usar otra instancia", "crash_page_read_the_faq": "leído las Preguntas Frecuentes", @@ -469,8 +483,9 @@ "search_filters_duration_option_none": "Cualquier duración", "search_filters_features_option_vr180": "VR180", "search_filters_apply_button": "Aplicar filtros", - "tokens_count": "{{count}} ficha", - "tokens_count_plural": "{{count}} fichas", + "tokens_count_0": "{{count}} ficha", + "tokens_count_1": "{{count}} fichas", + "tokens_count_2": "{{count}} fichas", "search_message_use_another_instance": " También puede buscar en otra instancia.", "Popular enabled: ": "¿Habilitar la sección popular? ", "error_video_not_in_playlist": "El video que solicitaste no existe en esta lista de reproducción. Haz clic aquí para acceder a la página de inicio de la lista de reproducción.", From 5c24bf1322f470ef46c1db34a24d4167f04ca987 Mon Sep 17 00:00:00 2001 From: Jorge Maldonado Ventura Date: Mon, 20 Mar 2023 18:46:59 +0000 Subject: [PATCH 13/54] Update Spanish translation --- locales/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index aa03f124..4f9250d4 100644 --- a/locales/es.json +++ b/locales/es.json @@ -497,5 +497,6 @@ "Artist: ": "Artista: ", "Album: ": "Álbum: ", "Song: ": "Canción: ", - "Channel Sponsor": "Patrocinador del canal" + "Channel Sponsor": "Patrocinador del canal", + "Standard YouTube license": "Licencia de YouTube estándar" } From 9eafbbdcbbcbdef86b5645219793f4e6cfe86a83 Mon Sep 17 00:00:00 2001 From: Jorge Maldonado Ventura Date: Mon, 20 Mar 2023 18:47:21 +0000 Subject: [PATCH 14/54] Update Esperanto translation --- locales/eo.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/eo.json b/locales/eo.json index 9f37c7cb..a70b71d3 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -479,5 +479,8 @@ "channel_tab_shorts_label": "Mallongaj", "Music in this video": "Muziko en ĉi tiu video", "Artist: ": "Artisto: ", - "Album: ": "Albumo: " + "Album: ": "Albumo: ", + "Channel Sponsor": "Kanala sponsoro", + "Song: ": "Muzikaĵo: ", + "Standard YouTube license": "Implicita YouTube-licenco" } From ec1d6ee851953c52a0128b2ce303e3a9decf2b87 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 20 Mar 2023 19:35:31 +0000 Subject: [PATCH 15/54] Update Ukrainian translation --- locales/uk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/uk.json b/locales/uk.json index 4d748e7f..e9c90287 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -497,5 +497,6 @@ "Artist: ": "Виконавець: ", "Album: ": "Альбом: ", "Song: ": "Пісня: ", - "Channel Sponsor": "Спонсор каналу" + "Channel Sponsor": "Спонсор каналу", + "Standard YouTube license": "Стандартна ліцензія YouTube" } From f46cc98654dc26ac58f61f856e6f4516f25031a7 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 21 Mar 2023 03:48:53 +0000 Subject: [PATCH 16/54] Update Chinese (Simplified) translation --- locales/zh-CN.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/zh-CN.json b/locales/zh-CN.json index f202cf88..634175cb 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -465,5 +465,6 @@ "channel_tab_shorts_label": "短视频", "channel_tab_channels_label": "频道", "Song: ": "歌曲: ", - "Channel Sponsor": "频道赞助者" + "Channel Sponsor": "频道赞助者", + "Standard YouTube license": "标准 YouTube 许可证" } From 4aa2c406ff6f7f704d4243c7d7a79eaec0e4ec7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Mon, 20 Mar 2023 19:07:59 +0000 Subject: [PATCH 17/54] Update Turkish translation --- locales/tr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/tr.json b/locales/tr.json index 6e0bc175..c5381f4c 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -481,5 +481,6 @@ "Music in this video": "Bu videodaki müzik", "Artist: ": "Sanatçı: ", "Channel Sponsor": "Kanal Sponsoru", - "Song: ": "Şarkı: " + "Song: ": "Şarkı: ", + "Standard YouTube license": "Standart YouTube lisansı" } From a9fcfcf7c9b15a7550349c76621b4006ce261a8c Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 22 Mar 2023 02:36:12 +0000 Subject: [PATCH 18/54] Update Chinese (Traditional) translation --- locales/zh-TW.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 54090d3d..4100931c 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -465,5 +465,6 @@ "Album: ": "專輯: ", "Music in this video": "此影片中的音樂", "Channel Sponsor": "頻道贊助者", - "Song: ": "歌曲: " + "Song: ": "歌曲: ", + "Standard YouTube license": "標準 YouTube 授權條款" } From 4078fc5818d27c0d4365f335e1ccbe0fd27c9f2f Mon Sep 17 00:00:00 2001 From: Parsa Date: Thu, 23 Mar 2023 07:24:05 +0000 Subject: [PATCH 19/54] Update Persian translation --- locales/fa.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/fa.json b/locales/fa.json index 56685f64..29a0c527 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -450,5 +450,8 @@ "Music in this video": "آهنگ در این ویدیو", "Artist: ": "هنرمند: ", "Album: ": "آلبوم: ", - "Song: ": "آهنگ: " + "Song: ": "آهنگ: ", + "Channel Sponsor": "اسپانسر کانال", + "Standard YouTube license": "پروانه استاندارد YouTube", + "search_message_use_another_instance": " شما همچنین می‌توانید در نمونه دیگر هم جستجو کنید." } From a3e587657fdb62738115efda75d36bc078c93b77 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Thu, 23 Mar 2023 19:43:36 +0000 Subject: [PATCH 20/54] Update Croatian translation --- locales/hr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/hr.json b/locales/hr.json index ade732ad..bbd899c9 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -497,5 +497,6 @@ "Album: ": "Album: ", "Artist: ": "Izvođač: ", "Channel Sponsor": "Sponzor kanala", - "Song: ": "Pjesma: " + "Song: ": "Pjesma: ", + "Standard YouTube license": "Standardna YouTube licenca" } From 1825b8edb3917000efaaeffd527c56e343c659c1 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Tue, 21 Mar 2023 14:04:39 +0000 Subject: [PATCH 21/54] Update Czech translation --- locales/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/cs.json b/locales/cs.json index 4611c4fd..38c3a8d2 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -497,5 +497,6 @@ "Artist: ": "Umělec: ", "Album: ": "Album: ", "Channel Sponsor": "Sponzor kanálu", - "Song: ": "Skladba: " + "Song: ": "Skladba: ", + "Standard YouTube license": "Standardní licence YouTube" } From fe1648e72eca3e23fa7c4a7d811aee13ac230ba2 Mon Sep 17 00:00:00 2001 From: SC Date: Sat, 25 Mar 2023 11:38:22 +0000 Subject: [PATCH 22/54] Update Portuguese translation --- locales/pt.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/pt.json b/locales/pt.json index 310381ae..79d8f354 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -481,5 +481,6 @@ "Artist: ": "Artista: ", "Album: ": "Álbum: ", "Song: ": "Canção: ", - "Channel Sponsor": "Patrocinador do canal" + "Channel Sponsor": "Patrocinador do canal", + "Standard YouTube license": "Licença padrão do YouTube" } From 778edf63cb79ee7ff1d7fc1c20cef3d6f17a184e Mon Sep 17 00:00:00 2001 From: victor dargallo Date: Tue, 21 Mar 2023 20:27:50 +0000 Subject: [PATCH 23/54] Update Catalan translation --- locales/ca.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index 54a0b177..59396c11 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -66,7 +66,7 @@ "Malay": "Malai", "Persian": "Persa", "Slovak": "Eslovac", - "Search": "Busca", + "Search": "Cerca", "Show annotations": "Mostra anotacions", "preferences_region_label": "País del contingut: ", "preferences_sort_label": "Ordena vídeos per: ", @@ -481,5 +481,6 @@ "Top": "Millors", "preferences_max_results_label": "Nombre de vídeos mostrats al feed: ", "Engagement: ": "Atracció: ", - "Redirect homepage to feed: ": "Redirigeix la pàgina d'inici al feed: " + "Redirect homepage to feed: ": "Redirigeix la pàgina d'inici al feed: ", + "Standard YouTube license": "Llicència estàndard de YouTube" } From 7b4e3639cf034abab14cc984f0cce30f698baacb Mon Sep 17 00:00:00 2001 From: Damjan Gerl Date: Tue, 21 Mar 2023 16:42:49 +0000 Subject: [PATCH 24/54] Update Slovenian translation --- locales/sl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/sl.json b/locales/sl.json index 47f295e0..ec1decaf 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -511,5 +511,8 @@ "channel_tab_streams_label": "Prenosi v živo", "Artist: ": "Umetnik/ca: ", "Music in this video": "Glasba v tem videoposnetku", - "Album: ": "Album: " + "Album: ": "Album: ", + "Song: ": "Pesem: ", + "Standard YouTube license": "Standardna licenca YouTube", + "Channel Sponsor": "Sponzor kanala" } From 231fb3481efda5a2e9b394dbe0cb35f3f9ae5793 Mon Sep 17 00:00:00 2001 From: maboroshin Date: Wed, 29 Mar 2023 01:13:39 +0000 Subject: [PATCH 25/54] Update Japanese translation --- locales/ja.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ja.json b/locales/ja.json index 8a4537d4..d1813bcd 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -465,5 +465,6 @@ "Artist: ": "アーティスト: ", "Album: ": "アルバム: ", "Song: ": "曲: ", - "Channel Sponsor": "チャンネルのスポンサー" + "Channel Sponsor": "チャンネルのスポンサー", + "Standard YouTube license": "標準 Youtube ライセンス" } From d5a516d76cae1ec0b9bb89cb55b0fb884437b8a4 Mon Sep 17 00:00:00 2001 From: victor dargallo Date: Wed, 29 Mar 2023 20:35:14 +0000 Subject: [PATCH 26/54] Update Catalan translation --- locales/ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ca.json b/locales/ca.json index 59396c11..efc8cc8a 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -75,7 +75,7 @@ "Title": "Títol", "Belarusian": "Bielorús", "Enable web notifications": "Activa notificacions web", - "search": "cerca", + "search": "Cerca", "Catalan": "Català", "Croatian": "Croat", "preferences_category_admin": "Preferències d'administrador", From 66e671237f74da17d251f4951e902fd211a484aa Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sat, 1 Apr 2023 10:56:05 +0000 Subject: [PATCH 27/54] Update Spanish translation --- locales/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index 4f9250d4..af82b2a3 100644 --- a/locales/es.json +++ b/locales/es.json @@ -498,5 +498,6 @@ "Album: ": "Álbum: ", "Song: ": "Canción: ", "Channel Sponsor": "Patrocinador del canal", - "Standard YouTube license": "Licencia de YouTube estándar" + "Standard YouTube license": "Licencia de YouTube estándar", + "Download is disabled": "La descarga está deshabilitada" } From d8337252a86dd0ad508a4d10cd6d68a9468f7c99 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 31 Mar 2023 21:24:47 +0000 Subject: [PATCH 28/54] Update Ukrainian translation --- locales/uk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/uk.json b/locales/uk.json index e9c90287..61bf3d31 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -498,5 +498,6 @@ "Album: ": "Альбом: ", "Song: ": "Пісня: ", "Channel Sponsor": "Спонсор каналу", - "Standard YouTube license": "Стандартна ліцензія YouTube" + "Standard YouTube license": "Стандартна ліцензія YouTube", + "Download is disabled": "Завантаження вимкнено" } From 9d52ddbf8decbec7cd2a34c75917ba08b46786d8 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 1 Apr 2023 04:06:41 +0000 Subject: [PATCH 29/54] Update Chinese (Simplified) translation --- locales/zh-CN.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 634175cb..df31812a 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -466,5 +466,6 @@ "channel_tab_channels_label": "频道", "Song: ": "歌曲: ", "Channel Sponsor": "频道赞助者", - "Standard YouTube license": "标准 YouTube 许可证" + "Standard YouTube license": "标准 YouTube 许可证", + "Download is disabled": "已禁用下载" } From 657486c19ade93dd2ce45ea6b9fd68e3a5445cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 31 Mar 2023 20:56:20 +0000 Subject: [PATCH 30/54] Update Turkish translation --- locales/tr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/tr.json b/locales/tr.json index c5381f4c..a2fdd573 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -482,5 +482,6 @@ "Artist: ": "Sanatçı: ", "Channel Sponsor": "Kanal Sponsoru", "Song: ": "Şarkı: ", - "Standard YouTube license": "Standart YouTube lisansı" + "Standard YouTube license": "Standart YouTube lisansı", + "Download is disabled": "İndirme devre dışı" } From d857ee5a7ca2082ab15be24130a14575f2e7485f Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Sun, 2 Apr 2023 01:02:29 +0000 Subject: [PATCH 31/54] Update Arabic translation --- locales/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ar.json b/locales/ar.json index fb9e7564..7303915b 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -546,5 +546,6 @@ "Artist: ": "الفنان: ", "Song: ": "أغنية: ", "Channel Sponsor": "راعي القناة", - "Standard YouTube license": "ترخيص YouTube القياسي" + "Standard YouTube license": "ترخيص YouTube القياسي", + "Download is disabled": "تم تعطيل التحميلات" } From c60c14851b5f950d49958fe5bf5fad6262662a91 Mon Sep 17 00:00:00 2001 From: Jorge Maldonado Ventura Date: Sun, 2 Apr 2023 19:53:43 +0000 Subject: [PATCH 32/54] Update Esperanto translation --- locales/eo.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/eo.json b/locales/eo.json index a70b71d3..464d16ca 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -482,5 +482,6 @@ "Album: ": "Albumo: ", "Channel Sponsor": "Kanala sponsoro", "Song: ": "Muzikaĵo: ", - "Standard YouTube license": "Implicita YouTube-licenco" + "Standard YouTube license": "Implicita YouTube-licenco", + "Download is disabled": "Elŝuto estas malebligita" } From 4c541489dd4dae5e5cb0761d3c993d6c40a24357 Mon Sep 17 00:00:00 2001 From: abyan akhtar Date: Sun, 2 Apr 2023 04:31:13 +0000 Subject: [PATCH 33/54] Update Indonesian translation --- locales/id.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/id.json b/locales/id.json index 51d6d55c..f0adfdb1 100644 --- a/locales/id.json +++ b/locales/id.json @@ -453,5 +453,6 @@ "crash_page_switch_instance": "mencoba untuk menggunakan peladen lainnya", "crash_page_read_the_faq": "baca Soal Sering Ditanya (SSD/FAQ)", "crash_page_search_issue": "mencari isu yang ada di GitHub", - "crash_page_report_issue": "Jika yang di atas tidak membantu, buka isu baru di GitHub (sebaiknya dalam bahasa Inggris) dan sertakan teks berikut dalam pesan Anda (JANGAN terjemahkan teks tersebut):" + "crash_page_report_issue": "Jika yang di atas tidak membantu, buka isu baru di GitHub (sebaiknya dalam bahasa Inggris) dan sertakan teks berikut dalam pesan Anda (JANGAN terjemahkan teks tersebut):", + "Popular enabled: ": "Populer diaktifkan: " } From f81bc96da08494263c187e37ed1a3bb39b570d95 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Mon, 3 Apr 2023 16:37:54 +0000 Subject: [PATCH 34/54] Update Croatian translation --- locales/hr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/hr.json b/locales/hr.json index bbd899c9..b87a7729 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -498,5 +498,6 @@ "Artist: ": "Izvođač: ", "Channel Sponsor": "Sponzor kanala", "Song: ": "Pjesma: ", - "Standard YouTube license": "Standardna YouTube licenca" + "Standard YouTube license": "Standardna YouTube licenca", + "Download is disabled": "Preuzimanje je deaktivirano" } From e6ba3e3dab4ddf3034597ce03fc9f7cf421f3674 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Mon, 3 Apr 2023 20:35:59 +0000 Subject: [PATCH 35/54] Update Czech translation --- locales/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/cs.json b/locales/cs.json index 38c3a8d2..0e8610bf 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -498,5 +498,6 @@ "Album: ": "Album: ", "Channel Sponsor": "Sponzor kanálu", "Song: ": "Skladba: ", - "Standard YouTube license": "Standardní licence YouTube" + "Standard YouTube license": "Standardní licence YouTube", + "Download is disabled": "Stahování je zakázáno" } From cb0e837a5ec7615e521ba86866f5e313583aa6a3 Mon Sep 17 00:00:00 2001 From: victor dargallo Date: Wed, 5 Apr 2023 13:55:57 +0000 Subject: [PATCH 36/54] Update Catalan translation --- locales/ca.json | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index efc8cc8a..901249ac 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -122,8 +122,8 @@ "search_filters_features_option_location": "Ubicació", "search_filters_apply_button": "Aplica els filtres seleccionats", "videoinfo_started_streaming_x_ago": "Ha començat el directe fa `x`", - "next_steps_error_message_go_to_youtube": "Anar a YouTube", - "footer_donate_page": "Donar", + "next_steps_error_message_go_to_youtube": "Vés a YouTube", + "footer_donate_page": "Feu un donatiu", "footer_original_source_code": "Codi font original", "videoinfo_watch_on_youTube": "Veure a YouTube", "user_saved_playlists": "`x` llistes de reproducció guardades", @@ -164,7 +164,7 @@ "crash_page_report_issue": "Si cap de les anteriors no ha ajudat, obre un nou issue a GitHub (preferiblement en anglès) i inclou el text següent al missatge (NO tradueixis aquest text):", "generic_subscriptions_count": "{{count}} subscripció", "generic_subscriptions_count_plural": "{{count}} subscripcions", - "error_video_not_in_playlist": "El vídeo sol·licitat no existeix en aquesta llista de reproducció. Fes clic aquí per a la pàgina d'inici de la llista de reproducció.", + "error_video_not_in_playlist": "El vídeo sol·licitat no existeix en aquesta llista de reproducció. Feu clic aquí per a la pàgina d'inici de la llista de reproducció.", "comments_points_count": "{{count}} punt", "comments_points_count_plural": "{{count}} punts", "%A %B %-d, %Y": "%A %B %-d, %Y", @@ -175,7 +175,7 @@ "preferences_unseen_only_label": "Mostra només no vistos: ", "preferences_listen_label": "Escolta per defecte: ", "Import": "Importar", - "Token": "Senyal", + "Token": "Testimoni", "Wilson score: ": "Puntuació de Wilson: ", "search_filters_date_label": "Data de càrrega", "search_filters_features_option_three_sixty": "360°", @@ -184,10 +184,10 @@ "preferences_comments_label": "Comentaris per defecte: ", "`x` uploaded a video": "`x` ha penjat un vídeo", "Released under the AGPLv3 on Github.": "Publicat sota l'AGPLv3 a GitHub.", - "Token manager": "Gestor de tokens", + "Token manager": "Gestor de testimonis", "Watch history": "Historial de reproduccions", "Cannot change password for Google accounts": "No es pot canviar la contrasenya dels comptes de Google", - "Authorize token?": "Autoritzar senyal?", + "Authorize token?": "Autoritzar testimoni?", "Source available here.": "Font disponible aquí.", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Exporta subscripcions com a OPML (per a NewPipe i FreeTube)", "Log in": "Inicia sessió", @@ -197,7 +197,7 @@ "Public": "Públic", "View all playlists": "Veure totes les llistes de reproducció", "reddit": "Reddit", - "Manage tokens": "Gestiona senyals", + "Manage tokens": "Gestiona testimonis", "Not a playlist.": "No és una llista de reproducció.", "preferences_local_label": "Vídeos de Proxy: ", "View channel on YouTube": "Veure canal a Youtube", @@ -272,7 +272,7 @@ "Khmer": "Khmer", "This channel does not exist.": "Aquest canal no existeix.", "Song: ": "Cançó: ", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Error a l'iniciar sessió. Això pot ser perquè l'autenticació de dos factors no està activada per al vostre compte.", + "Login failed. This may be because two-factor authentication is not turned on for your account.": "S'ha produït un error en iniciar sessió. Això pot ser perquè l'autenticació de dos factors no està activada per al vostre compte.", "channel:`x`": "canal: `x`", "Deleted or invalid channel": "Canal suprimit o no vàlid", "Could not get channel info.": "No s'ha pogut obtenir la informació del canal.", @@ -298,10 +298,10 @@ "generic_views_count_plural": "{{count}} visualitzacions", "generic_videos_count": "{{count}} vídeo", "generic_videos_count_plural": "{{count}} vídeos", - "Token is expired, please try again": "La senyal ha caducat, torna-ho a provar", + "Token is expired, please try again": "El testimoni ha caducat, torna-ho a provar", "English": "Anglès", "Kannada": "Kanarès", - "Erroneous token": "Senyal errònia", + "Erroneous token": "Testimoni erroni", "`x` ago": "fa `x`", "Empty playlist": "Llista de reproducció buida", "Playlist does not exist.": "La llista de reproducció no existeix.", @@ -376,7 +376,7 @@ "Clear watch history": "Neteja l'historial de reproduccions", "Mongolian": "Mongol", "preferences_quality_dash_option_best": "Millor", - "Authorize token for `x`?": "Autoritzar senyal per a `x`?", + "Authorize token for `x`?": "Autoritzar testimoni per a `x`?", "Report statistics: ": "Estadístiques de l'informe: ", "Switch Invidious Instance": "Canvia la instància d'Invidious", "History": "Historial", @@ -410,7 +410,7 @@ "Export": "Exportar", "preferences_quality_dash_option_4320p": "4320p", "JavaScript license information": "Informació de la llicència de JavaScript", - "Hidden field \"token\" is a required field": "El camp ocult \"senyal\" és un camp obligatori", + "Hidden field \"token\" is a required field": "El camp ocult \"testimoni\" és un camp obligatori", "Shona": "Xona", "Family friendly? ": "Apte per a tots els públics? ", "preferences_quality_dash_label": "Qualitat de vídeo DASH preferida: ", @@ -443,7 +443,7 @@ "unsubscribe": "cancel·la la subscripció", "View playlist on YouTube": "Veure llista de reproducció a YouTube", "Import NewPipe subscriptions (.json)": "Importar subscripcions de NewPipe (.json)", - "crash_page_you_found_a_bug": "Sembla que has trobat un error a Invidious!", + "crash_page_you_found_a_bug": "Heu trobat un error a Invidious!", "Subscribe": "Subscriu-me", "Quota exceeded, try again in a few hours": "S'ha superat la quota, torna-ho a provar d'aquí a unes hores", "generic_count_days": "{{count}} dia", @@ -468,8 +468,8 @@ "revoke": "revocar", "English (United Kingdom)": "Anglès (Regne Unit)", "preferences_quality_option_hd720": "HD720", - "tokens_count": "{{count}} senyal", - "tokens_count_plural": "{{count}} senyals", + "tokens_count": "{{count}} testimoni", + "tokens_count_plural": "{{count}} testimonis", "subscriptions_unseen_notifs_count": "{{count}} notificació no vista", "subscriptions_unseen_notifs_count_plural": "{{count}} notificacions no vistes", "generic_subscribers_count": "{{count}} subscriptor", @@ -482,5 +482,6 @@ "preferences_max_results_label": "Nombre de vídeos mostrats al feed: ", "Engagement: ": "Atracció: ", "Redirect homepage to feed: ": "Redirigeix la pàgina d'inici al feed: ", - "Standard YouTube license": "Llicència estàndard de YouTube" + "Standard YouTube license": "Llicència estàndard de YouTube", + "Download is disabled": "Les baixades s'han inhabilitat" } From 6667bdcd92c998abc6aa594a79e6a4f164da98fd Mon Sep 17 00:00:00 2001 From: Damjan Gerl Date: Tue, 4 Apr 2023 12:16:45 +0000 Subject: [PATCH 37/54] Update Slovenian translation --- locales/sl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/sl.json b/locales/sl.json index ec1decaf..410b432c 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -514,5 +514,6 @@ "Album: ": "Album: ", "Song: ": "Pesem: ", "Standard YouTube license": "Standardna licenca YouTube", - "Channel Sponsor": "Sponzor kanala" + "Channel Sponsor": "Sponzor kanala", + "Download is disabled": "Prenos je onemogočen" } From 919997e41c753ffec015783851abf6170d29dd9b Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 7 Apr 2023 02:25:36 +0000 Subject: [PATCH 38/54] Update Chinese (Traditional) translation --- locales/zh-TW.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 4100931c..daa22493 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -466,5 +466,6 @@ "Music in this video": "此影片中的音樂", "Channel Sponsor": "頻道贊助者", "Song: ": "歌曲: ", - "Standard YouTube license": "標準 YouTube 授權條款" + "Standard YouTube license": "標準 YouTube 授權條款", + "Download is disabled": "已停用下載" } From 72f83d4aa2004f3e43947622b2b5ac01601c9859 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 8 Apr 2023 08:18:06 +0000 Subject: [PATCH 39/54] Update Russian translation --- locales/ru.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ru.json b/locales/ru.json index d2d7c86d..33a7931e 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -498,5 +498,6 @@ "Album: ": "Альбом: ", "Song: ": "Композиция: ", "Standard YouTube license": "Стандартная лицензия YouTube", - "Channel Sponsor": "Спонсор канала" + "Channel Sponsor": "Спонсор канала", + "Download is disabled": "Загрузка отключена" } From b9932b113bc5dedb924afdb3558151c6bd5a6347 Mon Sep 17 00:00:00 2001 From: atilluF Date: Sat, 8 Apr 2023 13:15:43 +0000 Subject: [PATCH 40/54] Update Italian translation --- locales/it.json | 86 ++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/locales/it.json b/locales/it.json index c60f760b..5991304e 100644 --- a/locales/it.json +++ b/locales/it.json @@ -1,10 +1,13 @@ { - "generic_subscribers_count": "{{count}} iscritto", - "generic_subscribers_count_plural": "{{count}} iscritti", - "generic_videos_count": "{{count}} video", - "generic_videos_count_plural": "{{count}} video", - "generic_playlists_count": "{{count}} playlist", - "generic_playlists_count_plural": "{{count}} playlist", + "generic_subscribers_count_0": "{{count}} iscritto", + "generic_subscribers_count_1": "{{count}} iscritti", + "generic_subscribers_count_2": "{{count}} iscritti", + "generic_videos_count_0": "{{count}} video", + "generic_videos_count_1": "{{count}} video", + "generic_videos_count_2": "{{count}} video", + "generic_playlists_count_0": "{{count}} playlist", + "generic_playlists_count_1": "{{count}} playlist", + "generic_playlists_count_2": "{{count}} playlist", "LIVE": "IN DIRETTA", "Shared `x` ago": "Condiviso `x` fa", "Unsubscribe": "Disiscriviti", @@ -116,16 +119,19 @@ "Subscription manager": "Gestione delle iscrizioni", "Token manager": "Gestione dei gettoni", "Token": "Gettone", - "generic_subscriptions_count": "{{count}} iscrizione", - "generic_subscriptions_count_plural": "{{count}} iscrizioni", - "tokens_count": "{{count}} gettone", - "tokens_count_plural": "{{count}} gettoni", + "generic_subscriptions_count_0": "{{count}} iscrizione", + "generic_subscriptions_count_1": "{{count}} iscrizioni", + "generic_subscriptions_count_2": "{{count}} iscrizioni", + "tokens_count_0": "{{count}} gettone", + "tokens_count_1": "{{count}} gettoni", + "tokens_count_2": "{{count}} gettoni", "Import/export": "Importa/esporta", "unsubscribe": "disiscriviti", "revoke": "revoca", "Subscriptions": "Iscrizioni", - "subscriptions_unseen_notifs_count": "{{count}} notifica non visualizzata", - "subscriptions_unseen_notifs_count_plural": "{{count}} notifiche non visualizzate", + "subscriptions_unseen_notifs_count_0": "{{count}} notifica non visualizzata", + "subscriptions_unseen_notifs_count_1": "{{count}} notifiche non visualizzate", + "subscriptions_unseen_notifs_count_2": "{{count}} notifiche non visualizzate", "search": "Cerca", "Log out": "Esci", "Source available here.": "Codice sorgente.", @@ -154,8 +160,9 @@ "Whitelisted regions: ": "Regioni in lista bianca: ", "Blacklisted regions: ": "Regioni in lista nera: ", "Shared `x`": "Condiviso `x`", - "generic_views_count": "{{count}} visualizzazione", - "generic_views_count_plural": "{{count}} visualizzazioni", + "generic_views_count_0": "{{count}} visualizzazione", + "generic_views_count_1": "{{count}} visualizzazioni", + "generic_views_count_2": "{{count}} visualizzazioni", "Premieres in `x`": "In anteprima in `x`", "Premieres `x`": "In anteprima `x`", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Ciao, Sembra che tu abbia disattivato JavaScript. Clicca qui per visualizzare i commenti, ma considera che il caricamento potrebbe richiedere più tempo.", @@ -308,20 +315,27 @@ "Yiddish": "Yiddish", "Yoruba": "Yoruba", "Zulu": "Zulu", - "generic_count_years": "{{count}} anno", - "generic_count_years_plural": "{{count}} anni", - "generic_count_months": "{{count}} mese", - "generic_count_months_plural": "{{count}} mesi", - "generic_count_weeks": "{{count}} settimana", - "generic_count_weeks_plural": "{{count}} settimane", - "generic_count_days": "{{count}} giorno", - "generic_count_days_plural": "{{count}} giorni", - "generic_count_hours": "{{count}} ora", - "generic_count_hours_plural": "{{count}} ore", - "generic_count_minutes": "{{count}} minuto", - "generic_count_minutes_plural": "{{count}} minuti", - "generic_count_seconds": "{{count}} secondo", - "generic_count_seconds_plural": "{{count}} secondi", + "generic_count_years_0": "{{count}} anno", + "generic_count_years_1": "{{count}} anni", + "generic_count_years_2": "{{count}} anni", + "generic_count_months_0": "{{count}} mese", + "generic_count_months_1": "{{count}} mesi", + "generic_count_months_2": "{{count}} mesi", + "generic_count_weeks_0": "{{count}} settimana", + "generic_count_weeks_1": "{{count}} settimane", + "generic_count_weeks_2": "{{count}} settimane", + "generic_count_days_0": "{{count}} giorno", + "generic_count_days_1": "{{count}} giorni", + "generic_count_days_2": "{{count}} giorni", + "generic_count_hours_0": "{{count}} ora", + "generic_count_hours_1": "{{count}} ore", + "generic_count_hours_2": "{{count}} ore", + "generic_count_minutes_0": "{{count}} minuto", + "generic_count_minutes_1": "{{count}} minuti", + "generic_count_minutes_2": "{{count}} minuti", + "generic_count_seconds_0": "{{count}} secondo", + "generic_count_seconds_1": "{{count}} secondi", + "generic_count_seconds_2": "{{count}} secondi", "Fallback comments: ": "Commenti alternativi: ", "Popular": "Popolare", "Search": "Cerca", @@ -425,10 +439,12 @@ "search_filters_duration_option_short": "Corto (< 4 minuti)", "search_filters_duration_option_long": "Lungo (> 20 minuti)", "search_filters_features_option_purchased": "Acquistato", - "comments_view_x_replies": "Vedi {{count}} risposta", - "comments_view_x_replies_plural": "Vedi {{count}} risposte", - "comments_points_count": "{{count}} punto", - "comments_points_count_plural": "{{count}} punti", + "comments_view_x_replies_0": "Vedi {{count}} risposta", + "comments_view_x_replies_1": "Vedi {{count}} risposte", + "comments_view_x_replies_2": "Vedi {{count}} risposte", + "comments_points_count_0": "{{count}} punto", + "comments_points_count_1": "{{count}} punti", + "comments_points_count_2": "{{count}} punti", "Portuguese (auto-generated)": "Portoghese (generati automaticamente)", "crash_page_you_found_a_bug": "Sembra che tu abbia trovato un bug in Invidious!", "crash_page_switch_instance": "provato a usare un'altra istanza", @@ -479,5 +495,9 @@ "channel_tab_community_label": "Comunità", "Music in this video": "Musica in questo video", "Artist: ": "Artista: ", - "Album: ": "Album: " + "Album: ": "Album: ", + "Download is disabled": "Il download è disabilitato", + "Song: ": "Canzone: ", + "Standard YouTube license": "Licenza standard di YouTube", + "Channel Sponsor": "Sponsor del canale" } From 7d48b961733714b55f2d8d25a0bd254665176089 Mon Sep 17 00:00:00 2001 From: Ernestas Date: Sun, 9 Apr 2023 21:33:21 +0000 Subject: [PATCH 41/54] Update Lithuanian translation --- locales/lt.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/lt.json b/locales/lt.json index 9bfcfdba..91c7febe 100644 --- a/locales/lt.json +++ b/locales/lt.json @@ -488,5 +488,6 @@ "preferences_save_player_pos_label": "Išsaugoti atkūrimo padėtį: ", "videoinfo_youTube_embed_link": "Įterpti", "videoinfo_invidious_embed_link": "Įterpti nuorodą", - "crash_page_refresh": "pabandėte atnaujinti puslapį" + "crash_page_refresh": "pabandėte atnaujinti puslapį", + "Album: ": "Albumas " } From 346f32855a704efc23e46013376435cecc5f0462 Mon Sep 17 00:00:00 2001 From: SC Date: Mon, 10 Apr 2023 14:45:36 +0000 Subject: [PATCH 42/54] Update Portuguese translation --- locales/pt.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/pt.json b/locales/pt.json index 79d8f354..cbce0e5a 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -482,5 +482,6 @@ "Album: ": "Álbum: ", "Song: ": "Canção: ", "Channel Sponsor": "Patrocinador do canal", - "Standard YouTube license": "Licença padrão do YouTube" + "Standard YouTube license": "Licença padrão do YouTube", + "Download is disabled": "A descarga está desativada" } From 14053821ac7ac48f4ff276fbd12e3d29c4a2a917 Mon Sep 17 00:00:00 2001 From: AHOHNMYC Date: Sun, 16 Apr 2023 03:54:12 +0000 Subject: [PATCH 43/54] Update Russian translation --- locales/ru.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index 33a7931e..4ce82bff 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -69,11 +69,11 @@ "preferences_vr_mode_label": "Интерактивные 360-градусные видео (необходим WebGL): ", "preferences_category_visual": "Настройки сайта", "preferences_player_style_label": "Стиль проигрывателя: ", - "Dark mode: ": "Темное оформление: ", + "Dark mode: ": "Тёмное оформление: ", "preferences_dark_mode_label": "Тема: ", - "dark": "темная", + "dark": "тёмная", "light": "светлая", - "preferences_thin_mode_label": "Облегченное оформление: ", + "preferences_thin_mode_label": "Облегчённое оформление: ", "preferences_category_misc": "Прочие настройки", "preferences_automatic_instance_redirect_label": "Автоматическая смена зеркала (переход на redirect.invidious.io): ", "preferences_category_subscription": "Настройки подписок", @@ -147,13 +147,13 @@ "License: ": "Лицензия: ", "Family friendly? ": "Семейный просмотр: ", "Wilson score: ": "Оценка Уилсона: ", - "Engagement: ": "Вовлеченность: ", + "Engagement: ": "Вовлечённость: ", "Whitelisted regions: ": "Доступно в регионах: ", "Blacklisted regions: ": "Недоступно в регионах: ", "Shared `x`": "Опубликовано `x`", "Premieres in `x`": "Премьера через `x`", "Premieres `x`": "Премьера `x`", - "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Похоже, у вас отключен JavaScript. Нажмите сюда, чтобы увидеть комментарии. Но учтите: они могут загружаться немного медленнее.", + "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Похоже, у вас отключён JavaScript. Нажмите сюда, чтобы увидеть комментарии. Но учтите: они могут загружаться немного медленнее.", "View YouTube comments": "Показать комментарии с YouTube", "View more comments on Reddit": "Посмотреть больше комментариев на Reddit", "View `x` comments": { @@ -180,23 +180,23 @@ "Please log in": "Пожалуйста, войдите", "Invidious Private Feed for `x`": "Приватная лента Invidious для `x`", "channel:`x`": "канал: `x`", - "Deleted or invalid channel": "Канал удален или не найден", + "Deleted or invalid channel": "Канал удалён или не найден", "This channel does not exist.": "Такого канала не существует.", - "Could not get channel info.": "Не удается получить информацию об этом канале.", - "Could not fetch comments": "Не удается загрузить комментарии", + "Could not get channel info.": "Не удаётся получить информацию об этом канале.", + "Could not fetch comments": "Не удаётся загрузить комментарии", "`x` ago": "`x` назад", - "Load more": "Загрузить еще", + "Load more": "Загрузить ещё", "Could not create mix.": "Не удалось создать микс.", "Empty playlist": "Плейлист пуст", "Not a playlist.": "Это не плейлист.", "Playlist does not exist.": "Плейлист не существует.", - "Could not pull trending pages.": "Не удается загрузить страницы «в тренде».", + "Could not pull trending pages.": "Не удаётся загрузить страницы «в тренде».", "Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле «challenge»", "Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле «токен»", "Erroneous challenge": "Неправильный ответ в «challenge»", "Erroneous token": "Неправильный токен", "No such user": "Пользователь не найден", - "Token is expired, please try again": "Срок действия токена истек, попробуйте позже", + "Token is expired, please try again": "Срок действия токена истёк, попробуйте позже", "English": "Английский", "English (auto-generated)": "Английский (созданы автоматически)", "Afrikaans": "Африкаанс", @@ -379,7 +379,7 @@ "Turkish (auto-generated)": "Турецкий (созданы автоматически)", "Vietnamese (auto-generated)": "Вьетнамский (созданы автоматически)", "footer_documentation": "Документация", - "adminprefs_modified_source_code_url_label": "URL-адрес репозитория измененного исходного кода", + "adminprefs_modified_source_code_url_label": "Ссылка на репозиторий с измененными исходными кодами", "none": "ничего", "videoinfo_watch_on_youTube": "Смотреть на YouTube", "videoinfo_youTube_embed_link": "Версия для встраивания", @@ -453,8 +453,8 @@ "Portuguese (Brazil)": "Португальский (Бразилия)", "footer_source_code": "Исходный код", "footer_original_source_code": "Оригинальный исходный код", - "footer_modfied_source_code": "Измененный исходный код", - "user_saved_playlists": "`x` сохраненных плейлистов", + "footer_modfied_source_code": "Изменённый исходный код", + "user_saved_playlists": "`x` сохранённых плейлистов", "crash_page_search_issue": "поискали похожую проблему на GitHub", "comments_points_count_0": "{{count}} плюс", "comments_points_count_1": "{{count}} плюса", From 732fb7c499e3b3a9b5fcbd759d7d6edcc67d7772 Mon Sep 17 00:00:00 2001 From: John Donne Date: Sun, 16 Apr 2023 18:31:55 +0000 Subject: [PATCH 44/54] Update French translation --- locales/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 9d3e117f..d1093868 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -476,5 +476,7 @@ "channel_tab_shorts_label": "Clips", "channel_tab_streams_label": "En direct", "channel_tab_playlists_label": "Listes de lecture", - "channel_tab_channels_label": "Chaînes" + "channel_tab_channels_label": "Chaînes", + "Song: ": "Chanson : ", + "Artist: ": "Artiste : " } From 1f12323ee6ee35c90a9c9b145195b26c35b6321c Mon Sep 17 00:00:00 2001 From: Nicolas Dommanget-Muller Date: Sun, 16 Apr 2023 18:48:36 +0000 Subject: [PATCH 45/54] Update French translation --- locales/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index d1093868..908ff5eb 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -478,5 +478,6 @@ "channel_tab_playlists_label": "Listes de lecture", "channel_tab_channels_label": "Chaînes", "Song: ": "Chanson : ", - "Artist: ": "Artiste : " + "Artist: ": "Artiste : ", + "Album: ": "Album: " } From 49e04192c04de8c0501c336d6bf6ef331ca193a4 Mon Sep 17 00:00:00 2001 From: John Donne Date: Sun, 16 Apr 2023 18:51:37 +0000 Subject: [PATCH 46/54] Update French translation --- locales/fr.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 908ff5eb..bb40916b 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -474,10 +474,14 @@ "search_filters_duration_option_none": "Toutes les durées", "error_video_not_in_playlist": "La vidéo demandée n'existe pas dans cette liste de lecture. Cliquez ici pour retourner à la liste de lecture.", "channel_tab_shorts_label": "Clips", - "channel_tab_streams_label": "En direct", + "channel_tab_streams_label": "Vidéos en direct", "channel_tab_playlists_label": "Listes de lecture", "channel_tab_channels_label": "Chaînes", "Song: ": "Chanson : ", "Artist: ": "Artiste : ", - "Album: ": "Album: " + "Album: ": "Album : ", + "Standard YouTube license": "Licence YouTube Standard", + "Music in this video": "Musique dans cette vidéo", + "Channel Sponsor": "Soutien de la chaîne", + "Download is disabled": "Le téléchargement est désactivé" } From e6471feadc35674b8e987e645d3f52296c779a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D1=83=D0=B1=D0=B0=D0=B9?= Date: Sun, 23 Apr 2023 09:02:34 +0000 Subject: [PATCH 47/54] Update Russian translation --- locales/ru.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index 4ce82bff..1bece168 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -14,7 +14,7 @@ "Clear watch history?": "Очистить историю просмотров?", "New password": "Новый пароль", "New passwords must match": "Новые пароли не совпадают", - "Cannot change password for Google accounts": "Изменить пароль аккаунта Google невозможно", + "Cannot change password for Google accounts": "Изменить пароль учётной записи Google невозможно", "Authorize token?": "Авторизовать токен?", "Authorize token for `x`?": "Авторизовать токен для `x`?", "Yes": "Да", @@ -30,7 +30,7 @@ "Export subscriptions as OPML": "Экспортировать подписки в формате OPML", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Экспортировать подписки в формате OPML (для NewPipe и FreeTube)", "Export data as JSON": "Экспортировать данные Invidious в формате JSON", - "Delete account?": "Удалить аккаунт?", + "Delete account?": "Удалить учётку?", "History": "История", "An alternative front-end to YouTube": "Альтернативный фронтенд для YouTube", "JavaScript license information": "Информация о лицензиях JavaScript", @@ -38,14 +38,14 @@ "Log in": "Войти", "Log in/register": "Войти или зарегистрироваться", "Log in with Google": "Войти через Google", - "User ID": "ID пользователя", + "User ID": "ИД пользователя", "Password": "Пароль", "Time (h:mm:ss):": "Время (ч:мм:сс):", "Text CAPTCHA": "Текстовая капча (англ.)", "Image CAPTCHA": "Капча-картинка", "Sign In": "Войти", "Register": "Зарегистрироваться", - "E-mail": "Электронная почта", + "E-mail": "Эл. почта", "Google verification code": "Код подтверждения Google", "Preferences": "Настройки", "preferences_category_player": "Настройки проигрывателя", @@ -171,7 +171,7 @@ "Wrong answer": "Неправильный ответ", "Erroneous CAPTCHA": "Неправильная капча", "CAPTCHA is a required field": "Необходимо решить капчу", - "User ID is a required field": "Необходимо ввести ID пользователя", + "User ID is a required field": "Необходимо ввести идентификатор пользователя", "Password is a required field": "Необходимо ввести пароль", "Wrong username or password": "Неправильный логин или пароль", "Please sign in using 'Log in with Google'": "Пожалуйста, нажмите «Войти через Google»", @@ -213,7 +213,7 @@ "Burmese": "Бирманский", "Catalan": "Каталонский", "Cebuano": "Себуанский", - "Chinese (Simplified)": "Китайский (упрощенный)", + "Chinese (Simplified)": "Китайский (упрощённый)", "Chinese (Traditional)": "Китайский (традиционный)", "Corsican": "Корсиканский", "Croatian": "Хорватский", From 70a79f343dd771be0842b9aef97edd357750a6fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D1=83=D0=B1=D0=B0=D0=B9?= Date: Mon, 24 Apr 2023 16:34:03 +0000 Subject: [PATCH 48/54] Update Russian translation --- locales/ru.json | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/locales/ru.json b/locales/ru.json index 1bece168..0031f79a 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -4,7 +4,7 @@ "Unsubscribe": "Отписаться", "Subscribe": "Подписаться", "View channel on YouTube": "Смотреть канал на YouTube", - "View playlist on YouTube": "Посмотреть плейлист на YouTube", + "View playlist on YouTube": "Просмотреть подборку на ютубе", "newest": "сначала новые", "oldest": "сначала старые", "popular": "популярные", @@ -129,14 +129,14 @@ "Public": "Публичный", "Unlisted": "Нет в списке", "Private": "Приватный", - "View all playlists": "Посмотреть все плейлисты", + "View all playlists": "Просмотреть все подборки", "Updated `x` ago": "Обновлено `x` назад", - "Delete playlist `x`?": "Удалить плейлист `x`?", - "Delete playlist": "Удалить плейлист", - "Create playlist": "Создать плейлист", + "Delete playlist `x`?": "Удалить подборку `x`?", + "Delete playlist": "Удалить подборку", + "Create playlist": "Создать подборку", "Title": "Заголовок", - "Playlist privacy": "Видимость плейлиста", - "Editing playlist `x`": "Редактирование плейлиста `x`", + "Playlist privacy": "Видимость подборки", + "Editing playlist `x`": "Изменение подборки `x`", "Show more": "Развернуть", "Show less": "Свернуть", "Watch on YouTube": "Смотреть на YouTube", @@ -187,9 +187,9 @@ "`x` ago": "`x` назад", "Load more": "Загрузить ещё", "Could not create mix.": "Не удалось создать микс.", - "Empty playlist": "Плейлист пуст", - "Not a playlist.": "Это не плейлист.", - "Playlist does not exist.": "Плейлист не существует.", + "Empty playlist": "Подборка пуста", + "Not a playlist.": "Это не подборка.", + "Playlist does not exist.": "Подборка не существует.", "Could not pull trending pages.": "Не удаётся загрузить страницы «в тренде».", "Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле «challenge»", "Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле «токен»", @@ -310,7 +310,7 @@ "About": "О сайте", "Rating: ": "Рейтинг: ", "preferences_locale_label": "Язык: ", - "View as playlist": "Смотреть как плейлист", + "View as playlist": "Смотреть как подборку", "Default": "По умолчанию", "Music": "Музыка", "Gaming": "Игры", @@ -326,7 +326,7 @@ "Audio mode": "Аудио режим", "Video mode": "Видео режим", "channel_tab_videos_label": "Видео", - "Playlists": "Плейлисты", + "Playlists": "Подборки", "channel_tab_community_label": "Сообщество", "search_filters_sort_option_relevance": "по актуальности", "search_filters_sort_option_rating": "по рейтингу", @@ -343,7 +343,7 @@ "search_filters_date_option_year": "Этот год", "search_filters_type_option_video": "Видео", "search_filters_type_option_channel": "Канал", - "search_filters_type_option_playlist": "Плейлист", + "search_filters_type_option_playlist": "Подборка", "search_filters_type_option_movie": "Фильм", "search_filters_type_option_show": "Сериал", "search_filters_features_option_hd": "HD", @@ -385,7 +385,7 @@ "videoinfo_youTube_embed_link": "Версия для встраивания", "videoinfo_invidious_embed_link": "Ссылка для встраивания", "download_subtitles": "Субтитры - `x` (.vtt)", - "user_created_playlists": "`x` созданных плейлистов", + "user_created_playlists": "`x` созданных подборок", "crash_page_you_found_a_bug": "Похоже, вы нашли ошибку в Invidious!", "crash_page_before_reporting": "Прежде чем сообщать об ошибке, убедитесь, что вы:", "crash_page_refresh": "пробовали перезагрузить страницу", @@ -393,9 +393,9 @@ "generic_videos_count_0": "{{count}} видео", "generic_videos_count_1": "{{count}} видео", "generic_videos_count_2": "{{count}} видео", - "generic_playlists_count_0": "{{count}} плейлист", - "generic_playlists_count_1": "{{count}} плейлиста", - "generic_playlists_count_2": "{{count}} плейлистов", + "generic_playlists_count_0": "{{count}} подборка", + "generic_playlists_count_1": "{{count}} подборки", + "generic_playlists_count_2": "{{count}} подборок", "tokens_count_0": "{{count}} токен", "tokens_count_1": "{{count}} токена", "tokens_count_2": "{{count}} токенов", @@ -454,7 +454,7 @@ "footer_source_code": "Исходный код", "footer_original_source_code": "Оригинальный исходный код", "footer_modfied_source_code": "Изменённый исходный код", - "user_saved_playlists": "`x` сохранённых плейлистов", + "user_saved_playlists": "`x` сохранённых подборок", "crash_page_search_issue": "поискали похожую проблему на GitHub", "comments_points_count_0": "{{count}} плюс", "comments_points_count_1": "{{count}} плюса", @@ -488,8 +488,8 @@ "search_filters_duration_option_medium": "Средние (4 - 20 минут)", "search_filters_apply_button": "Применить фильтры", "Popular enabled: ": "Популярное включено: ", - "error_video_not_in_playlist": "Запрошенного видео нет в этом плейлисте. Нажмите тут, чтобы вернуться к странице плейлиста.", - "channel_tab_playlists_label": "Плейлисты", + "error_video_not_in_playlist": "Запрошенного видео нет в этой подборке. Нажмите тут, чтобы вернуться к странице подборки.", + "channel_tab_playlists_label": "Подборки", "channel_tab_channels_label": "Каналы", "channel_tab_streams_label": "Живое вещание", "channel_tab_shorts_label": "Shorts", From deed4d10f28574500891bc5c5892799a09cded6c Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Sun, 30 Apr 2023 19:31:59 +0200 Subject: [PATCH 49/54] Fix broken Spanish/Italian locales (i18next v3->v4 mixup) --- locales/es.json | 75 +++++++++++++++++++--------------------------- locales/it.json | 80 ++++++++++++++++++++----------------------------- 2 files changed, 62 insertions(+), 93 deletions(-) diff --git a/locales/es.json b/locales/es.json index af82b2a3..09f510a7 100644 --- a/locales/es.json +++ b/locales/es.json @@ -398,51 +398,37 @@ "search_filters_features_option_three_sixty": "360°", "videoinfo_watch_on_youTube": "Ver en YouTube", "preferences_save_player_pos_label": "Guardar posición de reproducción: ", - "generic_views_count_0": "{{count}} visualización", - "generic_views_count_1": "{{count}} visualizaciones", - "generic_views_count_2": "{{count}} visualizaciones", - "generic_subscribers_count_0": "{{count}} suscriptor", - "generic_subscribers_count_1": "{{count}} suscriptores", - "generic_subscribers_count_2": "{{count}} suscriptores", - "generic_subscriptions_count_0": "{{count}} suscripción", - "generic_subscriptions_count_1": "{{count}} suscripciones", - "generic_subscriptions_count_2": "{{count}} suscripciones", - "subscriptions_unseen_notifs_count_0": "{{count}} notificación no vista", - "subscriptions_unseen_notifs_count_1": "{{count}} notificaciones no vistas", - "subscriptions_unseen_notifs_count_2": "{{count}} notificaciones no vistas", - "generic_count_days_0": "{{count}} día", - "generic_count_days_1": "{{count}} días", - "generic_count_days_2": "{{count}} días", - "comments_view_x_replies_0": "Ver {{count}} respuesta", - "comments_view_x_replies_1": "Ver {{count}} respuestas", - "comments_view_x_replies_2": "Ver {{count}} respuestas", - "generic_count_weeks_0": "{{count}} semana", - "generic_count_weeks_1": "{{count}} semanas", - "generic_count_weeks_2": "{{count}} semanas", - "generic_playlists_count_0": "{{count}} lista de reproducción", - "generic_playlists_count_1": "{{count}} listas de reproducciones", - "generic_playlists_count_2": "{{count}} listas de reproducciones", + "generic_views_count": "{{count}} visualización", + "generic_views_count_plural": "{{count}} visualizaciones", + "generic_subscribers_count": "{{count}} suscriptor", + "generic_subscribers_count_plural": "{{count}} suscriptores", + "generic_subscriptions_count": "{{count}} suscripción", + "generic_subscriptions_count_plural": "{{count}} suscripciones", + "subscriptions_unseen_notifs_count": "{{count}} notificación no vista", + "subscriptions_unseen_notifs_count_plural": "{{count}} notificaciones no vistas", + "generic_count_days": "{{count}} día", + "generic_count_days_plural": "{{count}} días", + "comments_view_x_replies": "Ver {{count}} respuesta", + "comments_view_x_replies_plural": "Ver {{count}} respuestas", + "generic_count_weeks": "{{count}} semana", + "generic_count_weeks_plural": "{{count}} semanas", + "generic_playlists_count": "{{count}} lista de reproducción", + "generic_playlists_count_plural": "{{count}} listas de reproducción", "generic_videos_count_0": "{{count}} video", "generic_videos_count_1": "{{count}} videos", "generic_videos_count_2": "{{count}} videos", - "generic_count_months_0": "{{count}} mes", - "generic_count_months_1": "{{count}} meses", - "generic_count_months_2": "{{count}} meses", - "comments_points_count_0": "{{count}} punto", - "comments_points_count_1": "{{count}} puntos", - "comments_points_count_2": "{{count}} puntos", - "generic_count_years_0": "{{count}} año", - "generic_count_years_1": "{{count}} años", - "generic_count_years_2": "{{count}} años", - "generic_count_hours_0": "{{count}} hora", - "generic_count_hours_1": "{{count}} horas", - "generic_count_hours_2": "{{count}} horas", - "generic_count_minutes_0": "{{count}} minuto", - "generic_count_minutes_1": "{{count}} minutos", - "generic_count_minutes_2": "{{count}} minutos", - "generic_count_seconds_0": "{{count}} segundo", - "generic_count_seconds_1": "{{count}} segundos", - "generic_count_seconds_2": "{{count}} segundos", + "generic_count_months": "{{count}} mes", + "generic_count_months_plural": "{{count}} meses", + "comments_points_count": "{{count}} punto", + "comments_points_count_plural": "{{count}} puntos", + "generic_count_years": "{{count}} año", + "generic_count_years_plural": "{{count}} años", + "generic_count_hours": "{{count}} hora", + "generic_count_hours_plural": "{{count}} horas", + "generic_count_minutes": "{{count}} minuto", + "generic_count_minutes_plural": "{{count}} minutos", + "generic_count_seconds": "{{count}} segundo", + "generic_count_seconds_plural": "{{count}} segundos", "crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:", "crash_page_switch_instance": "probado a usar otra instancia", "crash_page_read_the_faq": "leído las Preguntas Frecuentes", @@ -483,9 +469,8 @@ "search_filters_duration_option_none": "Cualquier duración", "search_filters_features_option_vr180": "VR180", "search_filters_apply_button": "Aplicar filtros", - "tokens_count_0": "{{count}} ficha", - "tokens_count_1": "{{count}} fichas", - "tokens_count_2": "{{count}} fichas", + "tokens_count": "{{count}} ficha", + "tokens_count_plural": "{{count}} fichas", "search_message_use_another_instance": " También puede buscar en otra instancia.", "Popular enabled: ": "¿Habilitar la sección popular? ", "error_video_not_in_playlist": "El video que solicitaste no existe en esta lista de reproducción. Haz clic aquí para acceder a la página de inicio de la lista de reproducción.", diff --git a/locales/it.json b/locales/it.json index 5991304e..0797b387 100644 --- a/locales/it.json +++ b/locales/it.json @@ -1,13 +1,10 @@ { - "generic_subscribers_count_0": "{{count}} iscritto", - "generic_subscribers_count_1": "{{count}} iscritti", - "generic_subscribers_count_2": "{{count}} iscritti", - "generic_videos_count_0": "{{count}} video", - "generic_videos_count_1": "{{count}} video", - "generic_videos_count_2": "{{count}} video", - "generic_playlists_count_0": "{{count}} playlist", - "generic_playlists_count_1": "{{count}} playlist", - "generic_playlists_count_2": "{{count}} playlist", + "generic_subscribers_count": "{{count}} iscritto", + "generic_subscribers_count_plural": "{{count}} iscritti", + "generic_videos_count": "{{count}} video", + "generic_videos_count_plural": "{{count}} video", + "generic_playlists_count": "{{count}} playlist", + "generic_playlists_count_plural": "{{count}} playlist", "LIVE": "IN DIRETTA", "Shared `x` ago": "Condiviso `x` fa", "Unsubscribe": "Disiscriviti", @@ -119,19 +116,16 @@ "Subscription manager": "Gestione delle iscrizioni", "Token manager": "Gestione dei gettoni", "Token": "Gettone", - "generic_subscriptions_count_0": "{{count}} iscrizione", - "generic_subscriptions_count_1": "{{count}} iscrizioni", - "generic_subscriptions_count_2": "{{count}} iscrizioni", - "tokens_count_0": "{{count}} gettone", - "tokens_count_1": "{{count}} gettoni", - "tokens_count_2": "{{count}} gettoni", + "generic_subscriptions_count": "{{count}} iscrizione", + "generic_subscriptions_count_plural": "{{count}} iscrizioni", + "tokens_count": "{{count}} gettone", + "tokens_count_plural": "{{count}} gettoni", "Import/export": "Importa/esporta", "unsubscribe": "disiscriviti", "revoke": "revoca", "Subscriptions": "Iscrizioni", - "subscriptions_unseen_notifs_count_0": "{{count}} notifica non visualizzata", - "subscriptions_unseen_notifs_count_1": "{{count}} notifiche non visualizzate", - "subscriptions_unseen_notifs_count_2": "{{count}} notifiche non visualizzate", + "subscriptions_unseen_notifs_count": "{{count}} notifica non visualizzata", + "subscriptions_unseen_notifs_count_plural": "{{count}} notifiche non visualizzate", "search": "Cerca", "Log out": "Esci", "Source available here.": "Codice sorgente.", @@ -160,9 +154,8 @@ "Whitelisted regions: ": "Regioni in lista bianca: ", "Blacklisted regions: ": "Regioni in lista nera: ", "Shared `x`": "Condiviso `x`", - "generic_views_count_0": "{{count}} visualizzazione", - "generic_views_count_1": "{{count}} visualizzazioni", - "generic_views_count_2": "{{count}} visualizzazioni", + "generic_views_count": "{{count}} visualizzazione", + "generic_views_count_plural": "{{count}} visualizzazioni", "Premieres in `x`": "In anteprima in `x`", "Premieres `x`": "In anteprima `x`", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Ciao, Sembra che tu abbia disattivato JavaScript. Clicca qui per visualizzare i commenti, ma considera che il caricamento potrebbe richiedere più tempo.", @@ -315,27 +308,20 @@ "Yiddish": "Yiddish", "Yoruba": "Yoruba", "Zulu": "Zulu", - "generic_count_years_0": "{{count}} anno", - "generic_count_years_1": "{{count}} anni", - "generic_count_years_2": "{{count}} anni", - "generic_count_months_0": "{{count}} mese", - "generic_count_months_1": "{{count}} mesi", - "generic_count_months_2": "{{count}} mesi", - "generic_count_weeks_0": "{{count}} settimana", - "generic_count_weeks_1": "{{count}} settimane", - "generic_count_weeks_2": "{{count}} settimane", - "generic_count_days_0": "{{count}} giorno", - "generic_count_days_1": "{{count}} giorni", - "generic_count_days_2": "{{count}} giorni", - "generic_count_hours_0": "{{count}} ora", - "generic_count_hours_1": "{{count}} ore", - "generic_count_hours_2": "{{count}} ore", - "generic_count_minutes_0": "{{count}} minuto", - "generic_count_minutes_1": "{{count}} minuti", - "generic_count_minutes_2": "{{count}} minuti", - "generic_count_seconds_0": "{{count}} secondo", - "generic_count_seconds_1": "{{count}} secondi", - "generic_count_seconds_2": "{{count}} secondi", + "generic_count_years": "{{count}} anno", + "generic_count_years_plural": "{{count}} anni", + "generic_count_months": "{{count}} mese", + "generic_count_months_plural": "{{count}} mesi", + "generic_count_weeks": "{{count}} settimana", + "generic_count_weeks_plural": "{{count}} settimane", + "generic_count_days": "{{count}} giorno", + "generic_count_days_plural": "{{count}} giorni", + "generic_count_hours": "{{count}} ora", + "generic_count_hours_plural": "{{count}} ore", + "generic_count_minutes": "{{count}} minuto", + "generic_count_minutes_plural": "{{count}} minuti", + "generic_count_seconds": "{{count}} secondo", + "generic_count_seconds_plural": "{{count}} secondi", "Fallback comments: ": "Commenti alternativi: ", "Popular": "Popolare", "Search": "Cerca", @@ -439,12 +425,10 @@ "search_filters_duration_option_short": "Corto (< 4 minuti)", "search_filters_duration_option_long": "Lungo (> 20 minuti)", "search_filters_features_option_purchased": "Acquistato", - "comments_view_x_replies_0": "Vedi {{count}} risposta", - "comments_view_x_replies_1": "Vedi {{count}} risposte", - "comments_view_x_replies_2": "Vedi {{count}} risposte", - "comments_points_count_0": "{{count}} punto", - "comments_points_count_1": "{{count}} punti", - "comments_points_count_2": "{{count}} punti", + "comments_view_x_replies": "Vedi {{count}} risposta", + "comments_view_x_replies_plural": "Vedi {{count}} risposte", + "comments_points_count": "{{count}} punto", + "comments_points_count_plural": "{{count}} punti", "Portuguese (auto-generated)": "Portoghese (generati automaticamente)", "crash_page_you_found_a_bug": "Sembra che tu abbia trovato un bug in Invidious!", "crash_page_switch_instance": "provato a usare un'altra istanza", From d420741cc15dce656da641f5143120ec88e59bc8 Mon Sep 17 00:00:00 2001 From: chunky programmer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Wed, 19 Apr 2023 20:59:06 -0400 Subject: [PATCH 50/54] Allow channel urls to be displayed in YT description --- src/invidious/videos/description.cr | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/invidious/videos/description.cr b/src/invidious/videos/description.cr index 2017955d..0a9d84f8 100644 --- a/src/invidious/videos/description.cr +++ b/src/invidious/videos/description.cr @@ -6,13 +6,19 @@ def parse_command(command : JSON::Any?, string : String) : String? # 3rd party URL, extract original URL from YouTube tracking URL if url_endpoint = on_tap.try &.["urlEndpoint"]? - youtube_url = URI.parse url_endpoint["url"].as_s - - original_url = youtube_url.query_params["q"]? - if original_url.nil? - return "" + if url_endpoint["url"].as_s.includes? "youtube.com/redirect" + youtube_url = URI.parse url_endpoint["url"].as_s + original_url = youtube_url.query_params["q"]? + if original_url.nil? + return "" + else + return "#{original_url}" + end else - return "#{original_url}" + # not a redirect url, some first party url + # see https://github.com/iv-org/invidious/issues/3751 + first_party_url = url_endpoint["url"].as_s + return "#{first_party_url}" end # 1st party watch URL elsif watch_endpoint = on_tap.try &.["watchEndpoint"]? From 1b10446e5ecfb50d84fae88b6b8953ed19bfe1fb Mon Sep 17 00:00:00 2001 From: chunky programmer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Mon, 24 Apr 2023 17:40:58 -0400 Subject: [PATCH 51/54] move url parsing to utils method --- src/invidious/comments.cr | 51 +------------------------ src/invidious/helpers/utils.cr | 53 ++++++++++++++++++++++++++ src/invidious/videos/description.cr | 59 +++-------------------------- src/invidious/videos/parser.cr | 2 +- 4 files changed, 62 insertions(+), 103 deletions(-) diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index fd2be73d..0c863977 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -635,55 +635,8 @@ def content_to_comment_html(content, video_id : String? = "") text = HTML.escape(run["text"].as_s) - if run["navigationEndpoint"]? - if url = run["navigationEndpoint"]["urlEndpoint"]?.try &.["url"].as_s - url = URI.parse(url) - displayed_url = text - - if url.host == "youtu.be" - url = "/watch?v=#{url.request_target.lstrip('/')}" - 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 = url.query_params["q"]? || "" - displayed_url = url - else - url = url.request_target - displayed_url = "youtube.com#{url}" - end - end - - text = %(#{reduce_uri(displayed_url)}) - elsif watch_endpoint = run["navigationEndpoint"]["watchEndpoint"]? - start_time = watch_endpoint["startTimeSeconds"]?.try &.as_i - link_video_id = watch_endpoint["videoId"].as_s - - url = "/watch?v=#{link_video_id}" - url += "&t=#{start_time}" if !start_time.nil? - - # If the current video ID (passed through from the caller function) - # is the same as the video ID in the link, add HTML attributes for - # the JS handler function that bypasses page reload. - # - # See: https://github.com/iv-org/invidious/issues/3063 - if link_video_id == video_id - start_time ||= 0 - text = %(#{reduce_uri(text)}) - else - text = %(#{text}) - end - elsif url = run.dig?("navigationEndpoint", "commandMetadata", "webCommandMetadata", "url").try &.as_s - if text.starts_with?(/\s?[@#]/) - # Handle "pings" in comments and hasthags differently - # See: - # - https://github.com/iv-org/invidious/issues/3038 - # - https://github.com/iv-org/invidious/issues/3062 - text = %(#{text}) - else - text = %(#{reduce_uri(url)}) - end - end + if navigationEndpoint = run.dig?("navigationEndpoint") + text = parse_link_endpoint(navigationEndpoint, text, video_id) end text = "#{text}" if run["bold"]? diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index 500a2582..bcf7c963 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -389,3 +389,56 @@ def reduce_uri(uri : URI | String, max_length : Int32 = 50, suffix : String = " end return str end + +# Get the html link from a NavigationEndpoint or an innertubeCommand +def parse_link_endpoint(endpoint : JSON::Any, text : String, video_id : String) + if url = endpoint.dig?("urlEndpoint", "url").try &.as_s + url = URI.parse(url) + displayed_url = text + + if url.host == "youtu.be" + url = "/watch?v=#{url.request_target.lstrip('/')}" + 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 = url.query_params["q"]? || "" + displayed_url = url + else + url = url.request_target + displayed_url = "youtube.com#{url}" + end + end + + text = %(#{reduce_uri(displayed_url)}) + elsif watch_endpoint = endpoint.dig?("watchEndpoint") + start_time = watch_endpoint["startTimeSeconds"]?.try &.as_i + link_video_id = watch_endpoint["videoId"].as_s + + url = "/watch?v=#{link_video_id}" + url += "&t=#{start_time}" if !start_time.nil? + + # If the current video ID (passed through from the caller function) + # is the same as the video ID in the link, add HTML attributes for + # the JS handler function that bypasses page reload. + # + # See: https://github.com/iv-org/invidious/issues/3063 + if link_video_id == video_id + start_time ||= 0 + text = %(#{reduce_uri(text)}) + else + text = %(#{text}) + end + elsif url = endpoint.dig?("commandMetadata", "webCommandMetadata", "url").try &.as_s + if text.starts_with?(/\s?[@#]/) + # Handle "pings" in comments and hasthags differently + # See: + # - https://github.com/iv-org/invidious/issues/3038 + # - https://github.com/iv-org/invidious/issues/3062 + text = %(#{text}) + else + text = %(#{reduce_uri(url)}) + end + end + return text +end diff --git a/src/invidious/videos/description.cr b/src/invidious/videos/description.cr index 0a9d84f8..542cb416 100644 --- a/src/invidious/videos/description.cr +++ b/src/invidious/videos/description.cr @@ -1,57 +1,6 @@ require "json" require "uri" -def parse_command(command : JSON::Any?, string : String) : String? - on_tap = command.dig?("onTap", "innertubeCommand") - - # 3rd party URL, extract original URL from YouTube tracking URL - if url_endpoint = on_tap.try &.["urlEndpoint"]? - if url_endpoint["url"].as_s.includes? "youtube.com/redirect" - youtube_url = URI.parse url_endpoint["url"].as_s - original_url = youtube_url.query_params["q"]? - if original_url.nil? - return "" - else - return "#{original_url}" - end - else - # not a redirect url, some first party url - # see https://github.com/iv-org/invidious/issues/3751 - first_party_url = url_endpoint["url"].as_s - return "#{first_party_url}" - end - # 1st party watch URL - elsif watch_endpoint = on_tap.try &.["watchEndpoint"]? - video_id = watch_endpoint["videoId"].as_s - time = watch_endpoint["startTimeSeconds"].as_i - - url = "/watch?v=#{video_id}&t=#{time}s" - - # if string is a timestamp, use the string instead - # this is a lazy regex for validating timestamps - if /(?:\d{1,2}:){1,2}\d{2}/ =~ string - return "#{string}" - else - return "#{url}" - end - # hashtag/other browse URLs - elsif browse_endpoint = on_tap.try &.dig?("commandMetadata", "webCommandMetadata") - url = browse_endpoint["url"].try &.as_s - - # remove unnecessary character in a channel name - if browse_endpoint["webPageType"]?.try &.as_s == "WEB_PAGE_TYPE_CHANNEL" - name = string.match(/@[\w\d.-]+/) - if name.try &.[0]? - return "#{name.try &.[0]}" - end - end - - return "#{string}" - end - - return "(unknown YouTube desc command)" -end - private def copy_string(str : String::Builder, iter : Iterator, count : Int) : Int copied = 0 while copied < count @@ -68,7 +17,7 @@ private def copy_string(str : String::Builder, iter : Iterator, count : Int) : I return copied end -def parse_description(desc : JSON::Any?) : String? +def parse_description(desc, video_id : String) : String? return "" if desc.nil? content = desc["content"].as_s @@ -100,7 +49,11 @@ def parse_description(desc : JSON::Any?) : String? copy_string(str2, iter, cmd_length) end - str << parse_command(command, cmd_content) + link = cmd_content + if on_tap = command.dig?("onTap", "innertubeCommand") + link = parse_link_endpoint(on_tap, cmd_content, video_id) + end + str << link index += cmd_length end diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 1c6d118d..2e8eecc3 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -287,7 +287,7 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any # description_html = video_secondary_renderer.try &.dig?("description", "runs") # .try &.as_a.try { |t| content_to_comment_html(t, video_id) } - description_html = parse_description(video_secondary_renderer.try &.dig?("attributedDescription")) + description_html = parse_description(video_secondary_renderer.try &.dig?("attributedDescription"), video_id) # Video metadata From 28584f22c52b243da740061eeb834e300f36b7c1 Mon Sep 17 00:00:00 2001 From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Tue, 11 Apr 2023 20:50:23 -0400 Subject: [PATCH 52/54] Fix index out of bounds error --- src/invidious/comments.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index fd2be73d..b5815bb4 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -604,7 +604,7 @@ def text_to_parsed_content(text : String) : JSON::Any currentNode = {"text" => urlMatch[0], "navigationEndpoint" => {"urlEndpoint" => {"url" => urlMatch[0]}}} currentNodes << (JSON.parse(currentNode.to_json)) # If text remain after match create new simple node with text after match - afterNode = {"text" => splittedLastNode.size > 0 ? splittedLastNode[1] : ""} + afterNode = {"text" => splittedLastNode.size > 1 ? splittedLastNode[1] : ""} currentNodes << (JSON.parse(afterNode.to_json)) end From 384a8e200c953ed5be3ba6a01762e933fd566e45 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Tue, 2 May 2023 23:18:40 +0200 Subject: [PATCH 53/54] Trending: fix mistakes from #3773 --- src/invidious/trending.cr | 18 ++++++++++++++++-- src/invidious/yt_backend/extractors_utils.cr | 13 +++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/invidious/trending.cr b/src/invidious/trending.cr index 74bab1bd..fcaf60d1 100644 --- a/src/invidious/trending.cr +++ b/src/invidious/trending.cr @@ -20,6 +20,20 @@ def fetch_trending(trending_type, region, locale) items, _ = extract_items(initial_data) - # Return items, but ignore categories (e.g featured content) - return items.reject!(Category), plid + extracted = [] of SearchItem + + items.each do |itm| + if itm.is_a?(Category) + # Ignore the smaller categories, as they generally contain a sponsored + # channel, which brings a lot of noise on the trending page. + # See: https://github.com/iv-org/invidious/issues/2989 + next if itm.contents.size < 24 + + extracted.concat extract_category(itm) + else + extracted << itm + end + end + + return extracted, plid end diff --git a/src/invidious/yt_backend/extractors_utils.cr b/src/invidious/yt_backend/extractors_utils.cr index b247dca8..11d95958 100644 --- a/src/invidious/yt_backend/extractors_utils.cr +++ b/src/invidious/yt_backend/extractors_utils.cr @@ -68,16 +68,17 @@ rescue ex return false end -# This function extracts the SearchItems from a Category. +# This function extracts SearchVideo items from a Category. # Categories are commonly returned in search results and trending pages. def extract_category(category : Category) : Array(SearchVideo) - items = [] of SearchItem + return category.contents.select(SearchVideo) +end - category.contents.each do |item| - target << cate_i if item.is_a?(SearchItem) +# :ditto: +def extract_category(category : Category, &) + category.contents.select(SearchVideo).each do |item| + yield item end - - return items end def extract_selected_tab(tabs) From 90914343ec1a4c89e8bb873fdefa0a8e8ac656df Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Wed, 3 May 2023 00:02:38 +0200 Subject: [PATCH 54/54] Trending: de-duplicate results --- src/invidious/trending.cr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/invidious/trending.cr b/src/invidious/trending.cr index fcaf60d1..2d9f8a83 100644 --- a/src/invidious/trending.cr +++ b/src/invidious/trending.cr @@ -35,5 +35,6 @@ def fetch_trending(trending_type, region, locale) end end - return extracted, plid + # Deduplicate items before returning results + return extracted.select(SearchVideo).uniq!(&.id), plid end