Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 4 additions & 27 deletions src/invidious/channels/videos.cr
Original file line number Diff line number Diff line change
Expand Up @@ -129,38 +129,15 @@ module Invidious::Channel::Tabs
# Shorts
# -------------------

private def fetch_shorts_data(ucid : String, continuation : String? = nil)
def get_shorts(channel : AboutChannel, continuation : String? = nil)
if continuation.nil?
# EgZzaG9ydHPyBgUKA5oBAA%3D%3D is the protobuf object to load "shorts"
# TODO: try to extract the continuation tokens that allows other sorting options
return YoutubeAPI.browse(ucid, params: "EgZzaG9ydHPyBgUKA5oBAA%3D%3D")
initial_data = YoutubeAPI.browse(channel.ucid, params: "EgZzaG9ydHPyBgUKA5oBAA%3D%3D")
else
return YoutubeAPI.browse(continuation: continuation)
end
end

def get_shorts(channel : AboutChannel, continuation : String? = nil)
initial_data = self.fetch_shorts_data(channel.ucid, continuation)

begin
# Try to parse the initial data fetched above
return extract_items(initial_data, channel.author, channel.ucid)
rescue ex : RetryOnceException
# Sometimes, for a completely unknown reason, the "reelItemRenderer"
# object is missing some critical information (it happens once in about
# 20 subsequent requests). Refreshing the page is required to properly
# show the "shorts" tab.
#
# In order to make the experience smoother for the user, we simulate
# said page refresh by fetching again the JSON. If that still doesn't
# work, we raise a BrokenTubeException, as something is really broken.
begin
initial_data = self.fetch_shorts_data(channel.ucid, continuation)
return extract_items(initial_data, channel.author, channel.ucid)
rescue ex : RetryOnceException
raise BrokenTubeException.new "reelPlayerHeaderSupportedRenderers"
end
initial_data = YoutubeAPI.browse(continuation: continuation)
end
return extract_items(initial_data, channel.author, channel.ucid)
end

# -------------------
Expand Down
55 changes: 27 additions & 28 deletions src/invidious/yt_backend/extractors.cr
Original file line number Diff line number Diff line change
Expand Up @@ -448,44 +448,43 @@ private module Parsers
"overlay", "reelPlayerOverlayRenderer"
)

# Sometimes, the "reelPlayerOverlayRenderer" object is missing the
# important part of the response. We use this exception to tell
# the calling function to fetch the content again.
if !reel_player_overlay.as_h.has_key?("reelPlayerHeaderSupportedRenderers")
raise RetryOnceException.new
end

video_details_container = reel_player_overlay.dig(
"reelPlayerHeaderSupportedRenderers",
"reelPlayerHeaderRenderer"
)

# Author infos
if video_details_container = reel_player_overlay.dig?(
"reelPlayerHeaderSupportedRenderers",
"reelPlayerHeaderRenderer"
)
# Author infos

author = video_details_container
.dig?("channelTitleText", "runs", 0, "text")
.try &.as_s || author_fallback.name
author = video_details_container
.dig?("channelTitleText", "runs", 0, "text")
.try &.as_s || author_fallback.name

ucid = video_details_container
.dig?("channelNavigationEndpoint", "browseEndpoint", "browseId")
.try &.as_s || author_fallback.id
ucid = video_details_container
.dig?("channelNavigationEndpoint", "browseEndpoint", "browseId")
.try &.as_s || author_fallback.id

# Title & publication date
# Title & publication date

title = video_details_container.dig?("reelTitleText")
.try { |t| extract_text(t) } || ""
title = video_details_container.dig?("reelTitleText")
.try { |t| extract_text(t) } || ""

published = video_details_container
.dig?("timestampText", "simpleText")
.try { |t| decode_date(t.as_s) } || Time.utc
published = video_details_container
.dig?("timestampText", "simpleText")
.try { |t| decode_date(t.as_s) } || Time.utc

# View count
view_count_text = video_details_container.dig?("viewCountText", "simpleText")
else
author = author_fallback.name
ucid = author_fallback.id
published = Time.utc
title = item_contents.dig?("headline", "simpleText").try &.as_s || ""
end
# View count

# View count used to be in the reelWatchEndpoint, but that changed?
view_count_text = item_contents.dig?("viewCountText", "simpleText")
view_count_text ||= video_details_container.dig?("viewCountText", "simpleText")
view_count_text ||= item_contents.dig?("viewCountText", "simpleText")

view_count = view_count_text.try &.as_s.gsub(/\D+/, "").to_i64? || 0_i64
view_count = short_text_to_number(view_count_text.try &.as_s || "0")

# Duration

Expand Down