mirror of
https://github.com/iv-org/invidious.git
synced 2025-05-30 21:51:37 +00:00
Make base-Invidious video info extraction more resilient (#5312)
Try next fallback client if one raises Convert `dig` to `dig?` Optimize companionless stream retrieval
This commit is contained in:
parent
b859faebf0
commit
df8839d1f0
@ -82,7 +82,7 @@ def extract_video_info(video_id : String)
|
|||||||
"reason" => JSON::Any.new(reason),
|
"reason" => JSON::Any.new(reason),
|
||||||
}
|
}
|
||||||
end
|
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.
|
# YouTube may return a different video player response than expected.
|
||||||
# See: https://github.com/TeamNewPipe/NewPipe/issues/8713
|
# See: https://github.com/TeamNewPipe/NewPipe/issues/8713
|
||||||
# Line to be reverted if one day we solve the video not available issue.
|
# 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
|
params["reason"] = JSON::Any.new(reason) if reason
|
||||||
|
|
||||||
if !CONFIG.invidious_companion.present?
|
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.")
|
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|
|
players_fallback.each do |player_fallback|
|
||||||
client_config.client_type = 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"]? &&
|
next if !(player_fallback_response = try_fetch_streaming_data(video_id, client_config))
|
||||||
player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url")
|
|
||||||
|
if player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url")
|
||||||
streaming_data = player_response["streamingData"].as_h
|
streaming_data = player_response["streamingData"].as_h
|
||||||
streaming_data["adaptiveFormats"] = player_fallback_response["streamingData"]["adaptiveFormats"]
|
streaming_data["adaptiveFormats"] = player_fallback_response["streamingData"]["adaptiveFormats"]
|
||||||
player_response["streamingData"] = JSON::Any.new(streaming_data)
|
player_response["streamingData"] = JSON::Any.new(streaming_data)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
rescue InfoException
|
||||||
|
next LOGGER.warn("Failed to fetch streams with #{player_fallback}")
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
||||||
{"captions", "playabilityStatus", "playerConfig", "storyboards"}.each do |f|
|
{"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"]
|
playability_status = response["playabilityStatus"]["status"]
|
||||||
LOGGER.debug("try_fetch_streaming_data: [#{id}] Got playabilityStatus == #{playability_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.
|
# YouTube may return a different video player response than expected.
|
||||||
# See: https://github.com/TeamNewPipe/NewPipe/issues/8713
|
# See: https://github.com/TeamNewPipe/NewPipe/issues/8713
|
||||||
raise InfoException.new(
|
raise InfoException.new(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user