diff --git a/src/invidious.cr b/src/invidious.cr index 7b76c886..6af80f87 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -97,6 +97,10 @@ YT_POOL = YoutubeConnectionPool.new(YT_URL, capacity: CONFIG.pool_size) GGPHT_POOL = YoutubeConnectionPool.new(URI.parse("https://yt3.ggpht.com"), capacity: CONFIG.pool_size) +COMPANION_POOL = CompanionConnectionPool.new( + capacity: CONFIG.pool_size +) + # CLI Kemal.config.extra_options do |parser| parser.banner = "Usage: invidious [arguments]" diff --git a/src/invidious/yt_backend/connection_pool.cr b/src/invidious/yt_backend/connection_pool.cr index 060e5e2b..c41cfd0a 100644 --- a/src/invidious/yt_backend/connection_pool.cr +++ b/src/invidious/yt_backend/connection_pool.cr @@ -46,6 +46,45 @@ struct YoutubeConnectionPool end end +struct CompanionConnectionPool + property pool : DB::Pool(HTTP::Client) + + def initialize(capacity = 5, timeout = 5.0) + options = DB::Pool::Options.new( + initial_pool_size: 0, + max_pool_size: capacity, + max_idle_pool_size: capacity, + checkout_timeout: timeout + ) + + @pool = DB::Pool(HTTP::Client).new(options) do + companion = CONFIG.invidious_companion.sample + next make_client(companion.private_url, force_resolve: true) + end + end + + def client(&) + conn = pool.checkout + # Proxy needs to be reinstated every time we get a client from the pool + conn.proxy = make_configured_http_proxy_client() if CONFIG.http_proxy + + begin + response = yield conn + rescue ex + conn.close + + companion = CONFIG.invidious_companion.sample + conn = make_client(companion.private_url, force_resolve: true) + + response = yield conn + ensure + pool.release(conn) + end + + response + end +end + 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" diff --git a/src/invidious/yt_backend/youtube_api.cr b/src/invidious/yt_backend/youtube_api.cr index 58e100d8..b40092a1 100644 --- a/src/invidious/yt_backend/youtube_api.cr +++ b/src/invidious/yt_backend/youtube_api.cr @@ -681,7 +681,7 @@ module YoutubeAPI # def _post_invidious_companion( endpoint : String, - data : Hash + data : Hash, ) : Hash(String, JSON::Any) headers = HTTP::Headers{ "Content-Type" => "application/json; charset=UTF-8", @@ -695,9 +695,7 @@ module YoutubeAPI # Send the POST request begin - invidious_companion = CONFIG.invidious_companion.sample - response = make_client(invidious_companion.private_url, use_http_proxy: false, - &.post(endpoint, headers: headers, body: data.to_json)) + response = COMPANION_POOL.client &.post(endpoint, headers: headers, body: data.to_json) body = response.body if (response.status_code != 200) raise Exception.new(