diff --git a/src/invidious/channels.cr b/src/invidious/channels.cr index b271b492..768e8198 100644 --- a/src/invidious/channels.cr +++ b/src/invidious/channels.cr @@ -380,8 +380,8 @@ def fetch_channel_playlists(ucid, author, continuation, sort_by) return items, continuation end -def fetch_channel_featured_channels(ucid, tab_data, view=nil, shelf_id=nil, continuation = nil, query_title = nil) - auxiliary_data = {} of String => String +def fetch_channel_featured_channels(ucid, tab_data, view = nil, shelf_id = nil, continuation = nil, query_title = nil) : {Array(Category), (String|Nil)} + auxiliary_data = {} of String => String if continuation.is_a?(String) initial_data = request_youtube_api_browse(continuation) @@ -392,10 +392,9 @@ def fetch_channel_featured_channels(ucid, tab_data, view=nil, shelf_id=nil, cont title: query_title.not_nil!, # If continuation contents is requested then the query_title has to be passed along. contents: items, browse_endpoint_data: nil, - continuation_token: continuation_token, badges: nil, auxiliary_data: auxiliary_data, - })] + })], continuation_token else if view && shelf_id auxiliary_data["view"] = view @@ -414,11 +413,11 @@ def fetch_channel_featured_channels(ucid, tab_data, view=nil, shelf_id=nil, cont # There's no submenu data if the channel doesn't feature any channels. if !submenu - return [] of Category + return {[] of Category, continuation_token} end submenu_data = submenu["channelSubMenuRenderer"]["contentTypeSubMenuItems"] - + items = extract_items(initial_data) fallback_title = submenu_data.as_a.select(&.["selected"].as_bool)[0]["title"].as_s @@ -436,8 +435,7 @@ def fetch_channel_featured_channels(ucid, tab_data, view=nil, shelf_id=nil, cont category_array << Category.new({ title: category.title.empty? ? fallback_title : category.title, contents: category.contents, - browse_endpoint_data: category.browse_endpoint_data, - continuation_token: continuation_token, + browse_endpoint_data: nil, badges: nil, auxiliary_data: category.auxiliary_data, }) @@ -445,25 +443,24 @@ def fetch_channel_featured_channels(ucid, tab_data, view=nil, shelf_id=nil, cont # If we don't have any categories we'll create one. if category_array.empty? - return [Category.new({ + category_array << Category.new({ title: fallback_title, contents: items, browse_endpoint_data: nil, - continuation_token: continuation_token, badges: nil, auxiliary_data: auxiliary_data, - })] + }) end - return category_array + return category_array, continuation_token end end def produce_featured_channel_browse_param(view : Int64, shelf_id : Int64) object = { - "2:string" => "channels", - "4:varint" => view, - "14:varint" => shelf_id + "2:string" => "channels", + "4:varint" => view, + "14:varint" => shelf_id, } browse_params = object.try { |i| Protodec::Any.cast_json(object) } diff --git a/src/invidious/helpers/extractors.cr b/src/invidious/helpers/extractors.cr index 196dcdd0..5d9844cc 100644 --- a/src/invidious/helpers/extractors.cr +++ b/src/invidious/helpers/extractors.cr @@ -219,7 +219,7 @@ private class CategoryParser < ItemParser title = "" end - auxiliary_data = {} of String => String + auxiliary_data = {} of String => String browse_endpoint = item_contents["endpoint"]?.try &.["browseEndpoint"] || nil browse_endpoint_data = "" category_type = 0 # 0: Video, 1: Channels, 2: Playlist/feed, 3: trending @@ -243,7 +243,7 @@ private class CategoryParser < ItemParser url = URI.parse(url.as_s) auxiliary_data["view"] = url.query_params["view"] auxiliary_data["shelf_id"] = url.query_params["shelf_id"] - + category_type = 1 else browse_endpoint_data = browse_endpoint["browseId"].as_s @@ -281,7 +281,6 @@ private class CategoryParser < ItemParser title: title, contents: contents, browse_endpoint_data: browse_endpoint_data, - continuation_token: nil, badges: badges, auxiliary_data: auxiliary_data, }) @@ -413,7 +412,7 @@ def extract_items(initial_data : Hash(String, JSON::Any), author_fallback : Stri items << parsed_result end end - return items + return items end end diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index 7d687567..020cc57b 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -266,8 +266,7 @@ end def fetch_continuation_token(items : Array(JSON::Any)) # Fetches the continuation token from an array of items return items.last["continuationItemRenderer"]? - .try &.["continuationEndpoint"]["continuationCommand"]["token"].as_s - + .try &.["continuationEndpoint"]["continuationCommand"]["token"].as_s end def fetch_continuation_token(initial_data : Hash(String, JSON::Any)) diff --git a/src/invidious/helpers/invidiousitems.cr b/src/invidious/helpers/invidiousitems.cr index 2b753911..65955083 100644 --- a/src/invidious/helpers/invidiousitems.cr +++ b/src/invidious/helpers/invidiousitems.cr @@ -234,7 +234,6 @@ class Category property title : String property contents : Array(SearchItem) | SearchItem property browse_endpoint_data : String? - property continuation_token : String? property badges : Array(Tuple(String, String))? # Data unique to only specific types of categories. diff --git a/src/invidious/routes/channels.cr b/src/invidious/routes/channels.cr index 6d298355..e6e40234 100644 --- a/src/invidious/routes/channels.cr +++ b/src/invidious/routes/channels.cr @@ -119,7 +119,7 @@ class Invidious::Routes::Channels < Invidious::Routes::BaseRoute # Previous continuation previous_continuation = env.params.query["previous"]? - featured_channel_categories = fetch_channel_featured_channels(ucid, channel.tabs["channels"], nil, nil, continuation, current_category_title).not_nil! + featured_channel_categories, continuation_token = fetch_channel_featured_channels(ucid, channel.tabs["channels"], nil, nil, continuation, current_category_title).not_nil! elsif view && shelf_id offset = env.params.query["offset"]? if offset @@ -128,12 +128,12 @@ class Invidious::Routes::Channels < Invidious::Routes::BaseRoute offset = 0 end - featured_channel_categories = fetch_channel_featured_channels(ucid, channel.tabs["channels"], view, shelf_id, continuation, current_category_title).not_nil! + featured_channel_categories, continuation_token = fetch_channel_featured_channels(ucid, channel.tabs["channels"], view, shelf_id, continuation, current_category_title).not_nil! else previous_continuation = nil offset = 0 - featured_channel_categories = fetch_channel_featured_channels(ucid, channel.tabs["channels"], nil, nil, current_category_title).not_nil! + featured_channel_categories, continuation_token = fetch_channel_featured_channels(ucid, channel.tabs["channels"], nil, nil, current_category_title).not_nil! end templated "channel/featured_channels", buffer_footer: true diff --git a/src/invidious/views/channel/featured_channels.ecr b/src/invidious/views/channel/featured_channels.ecr index a936a01a..2aafa14f 100644 --- a/src/invidious/views/channel/featured_channels.ecr +++ b/src/invidious/views/channel/featured_channels.ecr @@ -106,7 +106,7 @@
- <% if (next_cont_token = featured_channel_categories[0].continuation_token) %> + <% if (next_cont_token = continuation_token) %> <% previous = ""%> <% if continuation %> <% previous = "&previous=#{HTML.escape(continuation)}"%>