From c026a7b1f6a3513d604d441e37d2c01e5675f00f Mon Sep 17 00:00:00 2001 From: syeopite Date: Mon, 11 Nov 2024 16:04:30 -0800 Subject: [PATCH] Move ytimg pool logic to Invidious::ConnectionPool --- src/invidious/connection/client.cr | 23 ----------------------- src/invidious/connection/pool.cr | 23 +++++++++++++++++++++++ src/invidious/routes/images.cr | 8 ++++---- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/invidious/connection/client.cr b/src/invidious/connection/client.cr index 1066cade..aee1fabc 100644 --- a/src/invidious/connection/client.cr +++ b/src/invidious/connection/client.cr @@ -1,7 +1,3 @@ -# Mapping of subdomain => Invidious::ConnectionPool::Pool -# This is needed as we may need to access arbitrary subdomains of ytimg -private YTIMG_POOLS = {} of String => Invidious::ConnectionPool::Pool - def add_yt_headers(request) request.headers.delete("User-Agent") if request.headers["User-Agent"] == "Crystal" request.headers["User-Agent"] ||= "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" @@ -55,22 +51,3 @@ def make_configured_http_proxy_client password: config_proxy.password, ) end - -# Fetches a HTTP pool for the specified subdomain of ytimg.com -# -# Creates a new one when the specified pool for the subdomain does not exist -def get_ytimg_pool(subdomain) - if pool = YTIMG_POOLS[subdomain]? - return pool - else - LOGGER.info("ytimg_pool: Creating a new HTTP pool for \"https://#{subdomain}.ytimg.com\"") - pool = Invidious::ConnectionPool::Pool.new( - URI.parse("https://#{subdomain}.ytimg.com"), - max_capacity: CONFIG.pool_size, - idle_capacity: CONFIG.idle_pool_size - ) - YTIMG_POOLS[subdomain] = pool - - return pool - end -end diff --git a/src/invidious/connection/pool.cr b/src/invidious/connection/pool.cr index a6b09f02..a3a5935f 100644 --- a/src/invidious/connection/pool.cr +++ b/src/invidious/connection/pool.cr @@ -63,4 +63,27 @@ module Invidious::ConnectionPool class Error < Exception end + + # Mapping of subdomain => Invidious::ConnectionPool::Pool + # This is needed as we may need to access arbitrary subdomains of ytimg + private YTIMG_POOLS = {} of String => Invidious::ConnectionPool::Pool + + # Fetches a HTTP pool for the specified subdomain of ytimg.com + # + # Creates a new one when the specified pool for the subdomain does not exist + def self.get_ytimg_pool(subdomain) + if pool = YTIMG_POOLS[subdomain]? + return pool + else + LOGGER.info("ytimg_pool: Creating a new HTTP pool for \"https://#{subdomain}.ytimg.com\"") + pool = Invidious::ConnectionPool::Pool.new( + URI.parse("https://#{subdomain}.ytimg.com"), + max_capacity: CONFIG.pool_size, + idle_capacity: CONFIG.idle_pool_size + ) + YTIMG_POOLS[subdomain] = pool + + return pool + end + end end diff --git a/src/invidious/routes/images.cr b/src/invidious/routes/images.cr index 639697db..63c1b94e 100644 --- a/src/invidious/routes/images.cr +++ b/src/invidious/routes/images.cr @@ -42,7 +42,7 @@ module Invidious::Routes::Images end begin - get_ytimg_pool(authority).client &.get(url, headers) do |resp| + Invidious::ConnectionPool.get_ytimg_pool(authority).client &.get(url, headers) do |resp| env.response.headers["Connection"] = "close" return self.proxy_image(env, resp) end @@ -65,7 +65,7 @@ module Invidious::Routes::Images end begin - get_ytimg_pool("i9").client &.get(url, headers) do |resp| + Invidious::ConnectionPool.get_ytimg_pool("i9").client &.get(url, headers) do |resp| return self.proxy_image(env, resp) end rescue ex @@ -111,7 +111,7 @@ module Invidious::Routes::Images if name == "maxres.jpg" build_thumbnails(id).each do |thumb| thumbnail_resource_path = "/vi/#{id}/#{thumb[:url]}.jpg" - if get_ytimg_pool("i9").client &.head(thumbnail_resource_path, headers).status_code == 200 + if Invidious::ConnectionPool.get_ytimg_pool("i9").client &.head(thumbnail_resource_path, headers).status_code == 200 name = thumb[:url] + ".jpg" break end @@ -127,7 +127,7 @@ module Invidious::Routes::Images end begin - get_ytimg_pool("i").client &.get(url, headers) do |resp| + Invidious::ConnectionPool.get_ytimg_pool("i").client &.get(url, headers) do |resp| return self.proxy_image(env, resp) end rescue ex