diff --git a/src/invidious/helpers/backend_info.cr b/src/invidious/helpers/backend_info.cr index 4bb4899f..35d700f4 100644 --- a/src/invidious/helpers/backend_info.cr +++ b/src/invidious/helpers/backend_info.cr @@ -1,18 +1,17 @@ module BackendInfo extend self - @@exvpp_url : Array(String) = Array.new(CONFIG.invidious_companion.size, "") - @@status : Array(Int32) = Array.new(CONFIG.invidious_companion.size, 0) + + enum Status + Dead = 0 + Working = 1 + end + + @@status : Array(Int32) = Array.new(CONFIG.invidious_companion.size, Status::Dead.to_i) @@csp : Array(String) = Array.new(CONFIG.invidious_companion.size, "") @@working_ends : Array(Int32) = Array(Int32).new(0) @@csp_mutex : Mutex = Mutex.new @@check_mutex : Mutex = Mutex.new - enum BackendStatus - Dead - Problems - Working - end - def check_backends check_companion() LOGGER.debug("Invidious companion: New working_ends \"#{@@working_ends}\"") @@ -25,6 +24,7 @@ module BackendInfo channels = Channel(Nil).new(comp_size) updated_ends = Array(Int32).new(0) updated_status = Array(Int32).new(CONFIG.invidious_companion.size, 0) + LOGGER.debug("Invidious companion: comp_size \"#{comp_size}\"") CONFIG.invidious_companion.each_with_index do |companion, index| spawn do @@ -33,19 +33,22 @@ module BackendInfo client.connect_timeout = 10.seconds response = client.get("/healthz") if response.status_code == 200 - check_videoplayback_proxy(companion, index, updated_status, updated_ends) - generate_csp([companion.public_url.to_s, companion.i2p_public_url.to_s], @@exvpp_url[index], index) + @@check_mutex.synchronize do + updated_status[index] = Status::Working.to_i + updated_ends.push(index) + end + generate_csp([companion.public_url.to_s, companion.i2p_public_url.to_s], index) else @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Dead.to_i + updated_status[index] = Status::Dead.to_i end end rescue @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Dead.to_i + updated_status[index] = Status::Dead.to_i end ensure - LOGGER.debug("Invidious companion: Done Index: \"#{index}\"") + LOGGER.trace("Invidious companion: Done Index: \"#{index}\"") channels.send(nil) end end @@ -53,59 +56,16 @@ module BackendInfo # Wait until we receive a signal from them all LOGGER.debug("Invidious companion: Updating working_ends") comp_size.times { channels.receive } - @@working_ends = updated_ends + @@working_ends = updated_ends.sort! @@status = updated_status end - private def check_videoplayback_proxy(companion : Config::CompanionConfig, index : Int32, updated_status : Array(Int32), updated_ends : Array(Int32)) - begin - info = HTTP::Client.get "#{companion.private_url}/info" - exvpp_url = JSON.parse(info.body)["external_videoplayback_proxy"]?.try &.to_s - rescue JSON::ParseException - @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Working.to_i - updated_ends.push(index) - end - return - end - - exvpp_url = "" if exvpp_url.nil? - @@exvpp_url[index] = exvpp_url - if exvpp_url.empty? - @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Working.to_i - updated_ends.push(index) - end - return - else - begin - exvpp_health = HTTP::Client.get "#{exvpp_url}/health" - if exvpp_health.status_code == 200 - @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Working.to_i - updated_ends.push(index) - end - return exvpp_url - else - @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Problems.to_i - end - end - rescue - @@check_mutex.synchronize do - updated_status[index] = BackendStatus::Problems.to_i - end - end - end - end - - private def generate_csp(companion_url : Array(String), exvpp_url : String? = nil, index : Int32? = nil) + private def generate_csp(companion_url : Array(String), index : Int32? = nil) @@csp_mutex.synchronize do @@csp[index] = "" companion_url.each do |url| @@csp[index] += " #{url}" end - @@csp[index] += " #{exvpp_url}" end end @@ -119,10 +79,6 @@ module BackendInfo return @@working_ends end - def get_exvpp - return @@exvpp_url - end - def get_csp(index : Int32) # A little mutex to prevent sending a partial CSP header # Not sure if this is necessary. But if the @@csp[index] is being assigned diff --git a/src/invidious/routes/before_all.cr b/src/invidious/routes/before_all.cr index 1cc7b04a..474917c7 100644 --- a/src/invidious/routes/before_all.cr +++ b/src/invidious/routes/before_all.cr @@ -32,50 +32,59 @@ module Invidious::Routes::BeforeAll extra_connect_csp = "" if CONFIG.invidious_companion.present? - current_companion_d = host.split(":")[0].split(".")[0] + if !{ + "/sb/", + "/vi/", + "/s_p/", + "/yts/", + "/ggpht/", + }.any? { |r| env.request.resource.starts_with? r } + current_companion_d = host.split(":")[0].split(".")[0] - if index = COMPANION_PREFIXES.index(current_companion_d) - env.set "using_domain", true - env.set "current_companion", index - env.set "companion_public_url", CONFIG.invidious_companion[index].public_url.to_s - else - if !env.request.cookies[CONFIG.server_id_cookie_name]? - env.response.cookies[CONFIG.server_id_cookie_name] = Invidious::User::Cookies.server_id(host) - end + if index = COMPANION_PREFIXES.index(current_companion_d) + env.set "using_domain", true + env.set "current_companion", index + env.set "companion_public_url", CONFIG.invidious_companion[index].public_url.to_s + else + if !env.request.cookies[CONFIG.server_id_cookie_name]? + env.response.cookies[CONFIG.server_id_cookie_name] = Invidious::User::Cookies.server_id(host) + end - begin - current_companion = env.request.cookies[CONFIG.server_id_cookie_name].value.try &.to_i - rescue - working_ends = BackendInfo.get_working_ends - current_companion = working_ends.sample - end + begin + current_companion = env.request.cookies[CONFIG.server_id_cookie_name].value.try &.to_i + rescue + working_ends = BackendInfo.get_working_ends + current_companion = working_ends.sample + end - if current_companion > CONFIG.invidious_companion.size - current_companion = current_companion % CONFIG.invidious_companion.size - env.response.cookies[CONFIG.server_id_cookie_name] = Invidious::User::Cookies.server_id(host, current_companion) - end - - companion_status = BackendInfo.get_status - - if companion_status[current_companion] != 2 - alive_companion = companion_status.index(2, offset: current_companion) - if alive_companion - env.set "companion_switched", true - current_companion = alive_companion + if current_companion > CONFIG.invidious_companion.size + current_companion = current_companion % CONFIG.invidious_companion.size env.response.cookies[CONFIG.server_id_cookie_name] = Invidious::User::Cookies.server_id(host, current_companion) end + + companion_status = BackendInfo.get_status + + if companion_status[current_companion] != BackendInfo::Status::Working.to_i + current_companion = 0 if current_companion == companion_status.size - 1 + alive_companion = companion_status.index(BackendInfo::Status::Working.to_i, offset: current_companion) + if alive_companion + env.set "companion_switched", true + current_companion = alive_companion + env.response.cookies[CONFIG.server_id_cookie_name] = Invidious::User::Cookies.server_id(host, current_companion) + end + end + + env.set "current_companion", current_companion + + if host.split(".").last == "i2p" + env.set "companion_public_url", CONFIG.invidious_companion[current_companion].i2p_public_url.to_s + else + env.set "companion_public_url", CONFIG.invidious_companion[current_companion].public_url.to_s + end end - env.set "current_companion", current_companion - - if host.split(".").last == "i2p" - env.set "companion_public_url", CONFIG.invidious_companion[current_companion].i2p_public_url.to_s - else - env.set "companion_public_url", CONFIG.invidious_companion[current_companion].public_url.to_s - end + extra_media_csp, extra_connect_csp = BackendInfo.get_csp(env.get("current_companion").as(Int32)) end - - extra_media_csp, extra_connect_csp = BackendInfo.get_csp(env.get("current_companion").as(Int32)) end # Only allow the pages at /embed/* to be embedded diff --git a/src/invidious/views/template.ecr b/src/invidious/views/template.ecr index e4c81238..6239902e 100644 --- a/src/invidious/views/template.ecr +++ b/src/invidious/views/template.ecr @@ -123,9 +123,8 @@ display: inline-block;"> <%= HTML.escape(CONFIG.backend_name_prefix + (index + 1).to_s) %> <%= HTML.escape(companion.note) %> <% if !(index == CONFIG.invidious_companion.size-1) %> @@ -138,9 +137,8 @@ display: inline-block;"> <%= HTML.escape(CONFIG.backend_name_prefix + (index + 1).to_s) %> <%= HTML.escape(companion.note) %> <% if !(index == CONFIG.invidious_companion.size-1) %>