From ddf1e84f7c088051a20461f5c0b7fef069089c74 Mon Sep 17 00:00:00 2001 From: matthewmcgarvey Date: Thu, 10 Feb 2022 23:43:14 -0600 Subject: [PATCH] Raise exception if playability not ok, also handle missing related videos --- src/invidious/videos.cr | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 335f6b60..81fce5b8 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -881,11 +881,13 @@ def extract_video_info(video_id : String, proxy_region : String? = nil, context_ player_response = YoutubeAPI.player(video_id: video_id, params: "", client_config: client_config) - if player_response["playabilityStatus"]?.try &.["status"]?.try &.as_s != "OK" - reason = player_response["playabilityStatus"]["errorScreen"]?.try &.["playerErrorMessageRenderer"]?.try &.["subreason"]?.try { |s| - s["simpleText"]?.try &.as_s || s["runs"].as_a.map { |r| r["text"] }.join("") - } || player_response["playabilityStatus"]["reason"].as_s + if player_response.dig?("playabilityStatus", "status").try &.as_s != "OK" + subreason = player_response.dig?("playabilityStatus", "errorScreen", "playerErrorMessageRenderer", "subreason") + reason = subreason.try &.[]?("simpleText").try &.as_s + reason ||= subreason.try &.[]("runs").as_a.map(&.[]("text")).join("") + reason ||= player_response.dig("playabilityStatus", "reason").as_s params["reason"] = JSON::Any.new(reason) + return params end params["shortDescription"] = player_response.dig?("videoDetails", "shortDescription") || JSON::Any.new(nil) @@ -928,11 +930,8 @@ def extract_video_info(video_id : String, proxy_region : String? = nil, context_ raise BrokenTubeException.new("twoColumnWatchNextResults") if !main_results primary_results = main_results.dig?("results", "results", "contents") - secondary_results = main_results - .dig?("secondaryResults", "secondaryResults", "results") raise BrokenTubeException.new("results") if !primary_results - raise BrokenTubeException.new("secondaryResults") if !secondary_results video_primary_renderer = primary_results .as_a.find(&.["videoPrimaryInfoRenderer"]?) @@ -952,7 +951,9 @@ def extract_video_info(video_id : String, proxy_region : String? = nil, context_ related = [] of JSON::Any # Parse "compactVideoRenderer" items (under secondary results) - secondary_results.as_a.each do |element| + secondary_results = main_results + .dig?("secondaryResults", "secondaryResults", "results") + secondary_results.try &.as_a.each do |element| if item = element["compactVideoRenderer"]? related_video = parse_related_video(item) related << JSON::Any.new(related_video) if related_video @@ -1119,7 +1120,9 @@ def fetch_video(id, region) info = embed_info if !embed_info["reason"]? end - raise InfoException.new(info["reason"]?.try &.as_s || "") if !info["videoDetails"]? + if reason = info["reason"]? + raise InfoException.new(reason.as_s || "") + end video = Video.new({ id: id,