summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamantaz Fox <coding@samantaz.fr>2022-08-21 17:28:27 +0200
committerSamantaz Fox <coding@samantaz.fr>2022-10-31 20:09:04 +0100
commite23ceb6ae92b685152a284f840fa9aee0f1853ab (patch)
tree384b091aeea628bab9a1535026ed595aead04344
parent33150f5de388e34cc776a517db099dea39aab392 (diff)
downloadinvidious-e23ceb6ae92b685152a284f840fa9aee0f1853ab.tar.gz
invidious-e23ceb6ae92b685152a284f840fa9aee0f1853ab.tar.bz2
invidious-e23ceb6ae92b685152a284f840fa9aee0f1853ab.zip
videos: Fix extraction code according to tests
-rw-r--r--src/invidious/videos.cr35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr
index b76da8f9..a01a18b7 100644
--- a/src/invidious/videos.cr
+++ b/src/invidious/videos.cr
@@ -666,20 +666,20 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any
raise BrokenTubeException.new("twoColumnWatchNextResults") if !main_results
- primary_results = main_results.dig?("results", "results", "contents")
+ # Primary results are not available on Music videos
+ # See: https://github.com/iv-org/invidious/pull/3238#issuecomment-1207193725
+ if primary_results = main_results.dig?("results", "results", "contents")
+ video_primary_renderer = primary_results
+ .as_a.find(&.["videoPrimaryInfoRenderer"]?)
+ .try &.["videoPrimaryInfoRenderer"]
- raise BrokenTubeException.new("results") if !primary_results
+ video_secondary_renderer = primary_results
+ .as_a.find(&.["videoSecondaryInfoRenderer"]?)
+ .try &.["videoSecondaryInfoRenderer"]
- video_primary_renderer = primary_results
- .as_a.find(&.["videoPrimaryInfoRenderer"]?)
- .try &.["videoPrimaryInfoRenderer"]
-
- video_secondary_renderer = primary_results
- .as_a.find(&.["videoSecondaryInfoRenderer"]?)
- .try &.["videoSecondaryInfoRenderer"]
-
- raise BrokenTubeException.new("videoPrimaryInfoRenderer") if !video_primary_renderer
- raise BrokenTubeException.new("videoSecondaryInfoRenderer") if !video_secondary_renderer
+ raise BrokenTubeException.new("videoPrimaryInfoRenderer") if !video_primary_renderer
+ raise BrokenTubeException.new("videoSecondaryInfoRenderer") if !video_secondary_renderer
+ end
video_details = player_response.dig?("videoDetails")
microformat = player_response.dig?("microformat", "playerMicroformatRenderer")
@@ -691,9 +691,12 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any
title = video_details["title"]?.try &.as_s
+ # We have to try to extract viewCount from videoPrimaryInfoRenderer first,
+ # then from videoDetails, as the latter is "0" for livestreams (we want
+ # to get the amount of viewers watching).
views = video_primary_renderer
- .dig?("viewCount", "videoViewCountRenderer", "viewCount", "runs", 0, "text")
- .try &.as_s.to_i64
+ .try &.dig?("viewCount", "videoViewCountRenderer", "viewCount", "runs", 0, "text")
+ .try &.as_s.to_i64
views ||= video_details["viewCount"]?.try &.as_s.to_i64
length_txt = (microformat["lengthSeconds"]? || video_details["lengthSeconds"])
@@ -825,7 +828,7 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any
if live_now
video_type = VideoType::Livestream
- elsif premiere_timestamp.not_nil!
+ elsif !premiere_timestamp.nil?
video_type = VideoType::Scheduled
published = premiere_timestamp || Time.utc
else
@@ -861,7 +864,7 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any
"author" => JSON::Any.new(author || ""),
"ucid" => JSON::Any.new(ucid || ""),
"authorThumbnail" => JSON::Any.new(author_thumbnail.try &.as_s || ""),
- "authorVerified" => JSON::Any.new(author_verified),
+ "authorVerified" => JSON::Any.new(author_verified || false),
"subCountText" => JSON::Any.new(subs_text || "-"),
}