From ed64def5a684d713c758d89e79fe196791e9ca24 Mon Sep 17 00:00:00 2001 From: syeopite Date: Thu, 15 Apr 2021 23:20:44 -0700 Subject: [PATCH] Fetch external links favicon and add to about page (cherry picked from commit 9c3a9322175d9d8dad733c17ba4c2d88ee893f9f) --- src/invidious.cr | 1 + src/invidious/channels/about.cr | 10 ++++---- src/invidious/routes/images.cr | 33 +++++++++++++++++++++++++++ src/invidious/views/channel_about.ecr | 1 + 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/invidious.cr b/src/invidious.cr index 21a12ff2..b268492e 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -397,6 +397,7 @@ Invidious::Routing.get "/sb/:authority/:id/:storyboard/:index", Invidious::Route Invidious::Routing.get "/s_p/:id/:name", Invidious::Routes::Images, :s_p_image Invidious::Routing.get "/yts/img/:name", Invidious::Routes::Images, :yts_image Invidious::Routing.get "/vi/:id/:name", Invidious::Routes::Images, :thumbnails +Invidious::Routing.get "/fetch_link_favicon", Invidious::Routes::Images, :link_favicon # API routes (macro) define_v1_api_routes() diff --git a/src/invidious/channels/about.cr b/src/invidious/channels/about.cr index 839ab617..ac8c0bcb 100644 --- a/src/invidious/channels/about.cr +++ b/src/invidious/channels/about.cr @@ -17,7 +17,7 @@ struct AboutChannel property allowed_regions : Array(String) property related_channels : Array(AboutRelatedChannel) property tabs : Array(String) - property links : Array(Tuple(String, String)) + property links : Array(Tuple(String, String, String)) end struct AboutRelatedChannel @@ -125,7 +125,7 @@ def get_about_info(ucid, locale) total_views = 0_i64 joined = Time.unix(0) tabs = [] of String - links = [] of {String, String} + links = [] of {String, String, String} tabs_json = initdata["contents"]["twoColumnBrowseResultsRenderer"]["tabs"]?.try &.as_a? if !tabs_json.nil? @@ -146,6 +146,7 @@ def get_about_info(ucid, locale) channel_about_meta["primaryLinks"]?.try &.as_a.each do |link| link_title = link["title"]["simpleText"].as_s link_url = URI.parse(link["navigationEndpoint"]["urlEndpoint"]["url"].to_s) + link_icon_url = link["icon"]?.try &.["thumbnails"][0]["url"].to_s || "" if {"m.youtube.com", "www.youtube.com", "youtu.be"}.includes? link_url.host if link_url.path == "/redirect" @@ -157,12 +158,11 @@ def get_about_info(ucid, locale) link_url = link_url.to_s end - links << {link_title, link_url} + links << {link_title, link_url, link_icon_url} end country = channel_about_meta["country"]?.try &.["simpleText"].as_s || "" - # Normal Auto-generated channels # https://support.google.com/youtube/answer/2579942 # For auto-generated channels, channel_about_meta only has ["description"]["simpleText"] and ["primaryLinks"][0]["title"]["simpleText"] @@ -194,6 +194,6 @@ def get_about_info(ucid, locale) allowed_regions: allowed_regions, related_channels: related_channels, tabs: tabs, - links: links + links: links, }) end diff --git a/src/invidious/routes/images.cr b/src/invidious/routes/images.cr index bb924cdf..2c7cee77 100644 --- a/src/invidious/routes/images.cr +++ b/src/invidious/routes/images.cr @@ -188,4 +188,37 @@ module Invidious::Routes::Images rescue ex end end + + # Used in fetching the favicons of featured links on channel pages + def self.link_favicon(env) + url = env.params.query["url"] + url = URI.parse(url) + + if url.host.to_s.ends_with?("gstatic.com") + # headers = HTTP::Headers{"Content-Encoding" => "gzip"} + headers = HTTP::Headers{} of String => String + + REQUEST_HEADERS_WHITELIST.each do |header| + if env.request.headers[header]? + headers[header] = env.request.headers[header] + end + end + + begin + HTTP::Client.get(url.to_s, headers) do |favicon_response| + env.response.status_code = favicon_response.status_code + favicon_response.headers.each do |key, value| + if !RESPONSE_HEADERS_BLACKLIST.includes?(key.downcase) + env.response.headers[key] = value + break + end + end + + env.response.headers["Access-Control-Allow-Origin"] = "*" + proxy_file(favicon_response, env) + end + rescue ex + end + end + end end diff --git a/src/invidious/views/channel_about.ecr b/src/invidious/views/channel_about.ecr index 593872bf..4f05e1b3 100644 --- a/src/invidious/views/channel_about.ecr +++ b/src/invidious/views/channel_about.ecr @@ -27,6 +27,7 @@

<%= translate(locale, "channel_about_page_links_section_header") %>

<% channel.links.each do |link_tuple| %>

+ <%=link_tuple[0]%>

<% end %>