mirror of
				https://gitea.invidious.io/iv-org/invidious
				synced 2025-06-05 23:29:12 +02:00 
			
		
		
		
	Manually extract category refactor from 1b569bbc99
				
					
				
			Also fixes some errors caused by cherry-picking
This commit is contained in:
		| @@ -6,6 +6,7 @@ require "spec" | |||||||
| require "yaml" | require "yaml" | ||||||
| require "../src/invidious/helpers/*" | require "../src/invidious/helpers/*" | ||||||
| require "../src/invidious/channels/*" | require "../src/invidious/channels/*" | ||||||
|  | require "../src/invidious/videos" | ||||||
| require "../src/invidious/comments" | require "../src/invidious/comments" | ||||||
| require "../src/invidious/playlists" | require "../src/invidious/playlists" | ||||||
| require "../src/invidious/search" | require "../src/invidious/search" | ||||||
|   | |||||||
| @@ -205,7 +205,6 @@ private class CategoryParser < ItemParser | |||||||
|   def parse(item_contents, author_fallback) |   def parse(item_contents, author_fallback) | ||||||
|     # Title extraction is a bit complicated. There are two possible routes for it |     # Title extraction is a bit complicated. There are two possible routes for it | ||||||
|     # as well as times when the title attribute just isn't sent by YT. |     # as well as times when the title attribute just isn't sent by YT. | ||||||
|  |  | ||||||
|     title_container = item_contents["title"]? || "" |     title_container = item_contents["title"]? || "" | ||||||
|     if !title_container.is_a? String |     if !title_container.is_a? String | ||||||
|       if title = title_container["simpleText"]? |       if title = title_container["simpleText"]? | ||||||
| @@ -217,37 +216,7 @@ private class CategoryParser < ItemParser | |||||||
|       title = "" |       title = "" | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     auxiliary_data = {} of String => String |     url = item_contents["endpoint"]?.try &.["commandMetadata"]["webCommandMetadata"]["url"].as_s | ||||||
|     browse_endpoint = item_contents["endpoint"]?.try &.["browseEndpoint"] || nil |  | ||||||
|     browse_endpoint_data = "" |  | ||||||
|     category_type = 0 # 0: Video, 1: Channels, 2: Playlist/feed, 3: trending |  | ||||||
|  |  | ||||||
|     # There's no endpoint data for video and trending category |  | ||||||
|     if !item_contents["endpoint"]? |  | ||||||
|       if !item_contents["videoId"]? |  | ||||||
|         category_type = 3 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     if !browse_endpoint.nil? |  | ||||||
|       # Playlist/feed categories doesn't need the params value (nor is it even included in yt response) |  | ||||||
|       # instead it uses the browseId parameter. So if there isn't a params value we can assume the |  | ||||||
|       # category is a playlist/feed |  | ||||||
|       if browse_endpoint["params"]? |  | ||||||
|         # However, even though the channel category type returns the browse endpoint param |  | ||||||
|         # we're not going to be using it in order to preserve compatablity with Youtube. |  | ||||||
|         # and for an URL that looks cleaner |  | ||||||
|         url = item_contents["endpoint"]["commandMetadata"]["webCommandMetadata"]["url"] |  | ||||||
|         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 |  | ||||||
|         category_type = 2 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     # Sometimes a category can have badges. |     # Sometimes a category can have badges. | ||||||
|     badges = [] of Tuple(String, String) # (Badge style, label) |     badges = [] of Tuple(String, String) # (Badge style, label) | ||||||
| @@ -279,11 +248,11 @@ private class CategoryParser < ItemParser | |||||||
|     end |     end | ||||||
|  |  | ||||||
|     Category.new({ |     Category.new({ | ||||||
|       title:                title, |       title:            title, | ||||||
|       contents:             contents, |       contents:         contents, | ||||||
|       description_html:     description_html, |       description_html: description_html, | ||||||
|       browse_endpoint_data: browse_endpoint_data, |       url:              url, | ||||||
|       badges:               badges, |       badges:           badges, | ||||||
|     }) |     }) | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -230,8 +230,8 @@ class Category | |||||||
|   include DB::Serializable |   include DB::Serializable | ||||||
|  |  | ||||||
|   property title : String |   property title : String | ||||||
|   property contents : Array(SearchItem) |   property contents : Array(SearchItem) | Array(Video) | ||||||
|   property browse_endpoint_data : String? |   property url : String? | ||||||
|   property description_html : String |   property description_html : String | ||||||
|   property badges : Array(Tuple(String, String))? |   property badges : Array(Tuple(String, String))? | ||||||
|  |  | ||||||
|   | |||||||
| @@ -247,5 +247,5 @@ def process_search_query(query, page, user, region) | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   {search_query, items_without_category.size, items_without_category, url_params} |   {search_query, items_without_category.size, items_without_category, operators} | ||||||
| end | end | ||||||
|   | |||||||
| @@ -275,7 +275,7 @@ struct Video | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def to_json(locale, json : JSON::Builder) |   def to_json(locale : Hash(String, JSON::Any), json : JSON::Builder) | ||||||
|     json.object do |     json.object do | ||||||
|       json.field "type", "video" |       json.field "type", "video" | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user