diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9ca09368..9f17bb40 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1,3 @@ -# Default and lowest precedence. If none of the below matches, @iv-org/developers would be requested for review. -* @iv-org/developers - docker-compose.yml @unixfox docker/ @unixfox kubernetes/ @unixfox diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index de82e1fb..1e0a4085 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -195,7 +195,7 @@ module Invidious::Routes::Feeds xml.element("link", rel: "self", href: "#{HOST_URL}#{env.request.resource}") xml.element("id") { xml.text "yt:channel:#{ucid}" } xml.element("yt:channelId") { xml.text ucid } - xml.element("title") { author } + xml.element("title") { xml.text author } xml.element("link", rel: "alternate", href: "#{HOST_URL}/channel/#{ucid}") xml.element("author") do diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 15bd00b6..feb58440 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -82,7 +82,7 @@ def extract_video_info(video_id : String) "reason" => JSON::Any.new(reason), } end - elsif video_id != player_response.dig("videoDetails", "videoId") + elsif video_id != player_response.dig?("videoDetails", "videoId") # YouTube may return a different video player response than expected. # See: https://github.com/TeamNewPipe/NewPipe/issues/8713 # Line to be reverted if one day we solve the video not available issue. @@ -109,21 +109,33 @@ def extract_video_info(video_id : String) params["reason"] = JSON::Any.new(reason) if reason if !CONFIG.invidious_companion.present? - if player_response["streamingData"]? && player_response.dig?("streamingData", "adaptiveFormats", 0, "url").nil? + if player_response.dig?("streamingData", "adaptiveFormats", 0, "url").nil? LOGGER.warn("Missing URLs for adaptive formats, falling back to other YT clients.") - players_fallback = [YoutubeAPI::ClientType::TvHtml5, YoutubeAPI::ClientType::WebMobile] + players_fallback = {YoutubeAPI::ClientType::TvHtml5, YoutubeAPI::ClientType::WebMobile} + players_fallback.each do |player_fallback| client_config.client_type = player_fallback - player_fallback_response = try_fetch_streaming_data(video_id, client_config) - if player_fallback_response && player_fallback_response["streamingData"]? && - player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url") + + next if !(player_fallback_response = try_fetch_streaming_data(video_id, client_config)) + + if player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url") streaming_data = player_response["streamingData"].as_h streaming_data["adaptiveFormats"] = player_fallback_response["streamingData"]["adaptiveFormats"] player_response["streamingData"] = JSON::Any.new(streaming_data) break end + rescue InfoException + next LOGGER.warn("Failed to fetch streams with #{player_fallback}") end end + + # Seems like video page can still render even without playable streams. + # its better than nothing. + # + # # Were we able to find playable video streams? + # if player_response.dig?("streamingData", "adaptiveFormats", 0, "url").nil? + # # No :( + # end end {"captions", "playabilityStatus", "playerConfig", "storyboards"}.each do |f| @@ -154,7 +166,7 @@ def try_fetch_streaming_data(id : String, client_config : YoutubeAPI::ClientConf playability_status = response["playabilityStatus"]["status"] LOGGER.debug("try_fetch_streaming_data: [#{id}] Got playabilityStatus == #{playability_status}.") - if id != response.dig("videoDetails", "videoId") + if id != response.dig?("videoDetails", "videoId") # YouTube may return a different video player response than expected. # See: https://github.com/TeamNewPipe/NewPipe/issues/8713 raise InfoException.new(