From 1668e4187ee1c1432e9af7b71bb266be60ca72e1 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Mon, 7 Feb 2022 00:37:47 +0100 Subject: [PATCH 1/2] Related channel may contain a continuation entry --- src/invidious/channels/about.cr | 27 ++++++++++++++++++------- src/invidious/routes/api/v1/channels.cr | 8 ++++++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/invidious/channels/about.cr b/src/invidious/channels/about.cr index 0f3928f5d..4f82a0f1f 100644 --- a/src/invidious/channels/about.cr +++ b/src/invidious/channels/about.cr @@ -140,19 +140,32 @@ def fetch_related_channels(about_channel : AboutChannel) : Array(AboutRelatedCha return [] of AboutRelatedChannel if tab.nil? - items = tab.dig?("tabRenderer", "content", "sectionListRenderer", "contents", 0, "itemSectionRenderer", "contents", 0, "gridRenderer", "items").try(&.as_a?) || [] of JSON::Any + items = tab.dig?( + "tabRenderer", "content", + "sectionListRenderer", "contents", 0, + "itemSectionRenderer", "contents", 0, + "gridRenderer", "items" + ).try &.as_a? - items.map do |item| - related_id = item.dig("gridChannelRenderer", "channelId").as_s - related_title = item.dig("gridChannelRenderer", "title", "simpleText").as_s - related_author_url = item.dig("gridChannelRenderer", "navigationEndpoint", "browseEndpoint", "canonicalBaseUrl").as_s - related_author_thumbnail = item.dig("gridChannelRenderer", "thumbnail", "thumbnails", -1, "url").as_s + related = [] of AboutRelatedChannel + return related if (items.nil? || items.empty?) - AboutRelatedChannel.new( + items.each do |item| + renderer = item["gridChannelRenderer"]? + next if !renderer + + related_id = renderer.dig("channelId").as_s + related_title = renderer.dig("title", "simpleText").as_s + related_author_url = renderer.dig("navigationEndpoint", "browseEndpoint", "canonicalBaseUrl").as_s + related_author_thumbnail = HelperExtractors.get_thumbnails(renderer) + + related << AboutRelatedChannel.new( ucid: related_id, author: related_title, author_url: related_author_url, author_thumbnail: related_author_thumbnail, ) end + + return related end diff --git a/src/invidious/routes/api/v1/channels.cr b/src/invidious/routes/api/v1/channels.cr index 3e55b4120..83c6db043 100644 --- a/src/invidious/routes/api/v1/channels.cr +++ b/src/invidious/routes/api/v1/channels.cr @@ -96,7 +96,10 @@ module Invidious::Routes::API::V1::Channels json.field "relatedChannels" do json.array do - fetch_related_channels(channel).each do |related_channel| + # Fetch related channels + related_channels = fetch_related_channels(channel) + + related_channels.each do |related_channel| json.object do json.field "author", related_channel.author json.field "authorId", related_channel.ucid @@ -118,7 +121,8 @@ module Invidious::Routes::API::V1::Channels end end end - end + end # relatedChannels + end end end From 698a6f38863c399b50cda27b5b509be2980e8a21 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Mon, 7 Feb 2022 00:52:18 +0100 Subject: [PATCH 2/2] API: handle related channels parsing exceptions --- src/invidious/routes/api/v1/channels.cr | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/invidious/routes/api/v1/channels.cr b/src/invidious/routes/api/v1/channels.cr index 83c6db043..c4d6643ae 100644 --- a/src/invidious/routes/api/v1/channels.cr +++ b/src/invidious/routes/api/v1/channels.cr @@ -97,7 +97,11 @@ module Invidious::Routes::API::V1::Channels json.field "relatedChannels" do json.array do # Fetch related channels - related_channels = fetch_related_channels(channel) + begin + related_channels = fetch_related_channels(channel) + rescue ex + related_channels = [] of AboutRelatedChannel + end related_channels.each do |related_channel| json.object do