summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsyeopite <syeopite@syeopite.dev>2025-03-19 23:32:46 -0700
committersyeopite <syeopite@syeopite.dev>2025-03-19 23:32:46 -0700
commitf7810ba007d088175c693648d4e040a9fe1101a4 (patch)
tree847a380a7fb5a3e028107844b56738013d71403f /src
parentc288005bfd512652f82d3bfa8b2ff939dbd694de (diff)
downloadinvidious-f7810ba007d088175c693648d4e040a9fe1101a4.tar.gz
invidious-f7810ba007d088175c693648d4e040a9fe1101a4.tar.bz2
invidious-f7810ba007d088175c693648d4e040a9fe1101a4.zip
Use ProblematicTimelineItem as needed in playlists
Diffstat (limited to 'src')
-rw-r--r--src/invidious/helpers/serialized_yt_data.cr26
-rw-r--r--src/invidious/playlists.cr8
-rw-r--r--src/invidious/routes/embed.cr8
-rw-r--r--src/invidious/routes/feeds.cr8
4 files changed, 45 insertions, 5 deletions
diff --git a/src/invidious/helpers/serialized_yt_data.cr b/src/invidious/helpers/serialized_yt_data.cr
index 5eef2359..56b64dbf 100644
--- a/src/invidious/helpers/serialized_yt_data.cr
+++ b/src/invidious/helpers/serialized_yt_data.cr
@@ -309,6 +309,32 @@ struct ProblematicTimelineItem
json.field "errorBacktrace", @parse_exception.inspect_with_backtrace
end
end
+
+ # Provides compatibility with PlaylistVideo
+ def to_json(json : JSON::Builder, *args, **kwargs)
+ return to_json("", json)
+ end
+
+ def to_xml(env, locale, xml : XML::Builder)
+ xml.element("entry") do
+ xml.element("id") { xml.text "iv-err-#{Random.new.base64(8)}" }
+ xml.element("title") { xml.text "Parse Error: This item has failed to parse" }
+ xml.element("updated") { xml.text Time.utc.to_rfc3339 }
+
+ xml.element("content", type: "xhtml") do
+ xml.element("div", xmlns: "http://www.w3.org/1999/xhtml") do
+ xml.element("div") do
+ xml.element("h4") { translate(locale, "timeline_parse_error_placeholder_heading") }
+ xml.element("p") { translate(locale, "timeline_parse_error_placeholder_message") }
+ end
+
+ xml.element("pre") do
+ get_issue_template(env, @parse_exception)
+ end
+ end
+ end
+ end
+ end
end
class Category
diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr
index b670c009..c762b64b 100644
--- a/src/invidious/playlists.cr
+++ b/src/invidious/playlists.cr
@@ -432,7 +432,7 @@ def get_playlist_videos(playlist : InvidiousPlaylist | Playlist, offset : Int32,
offset = initial_data.dig?("contents", "twoColumnWatchNextResults", "playlist", "playlist", "currentIndex").try &.as_i || offset
end
- videos = [] of PlaylistVideo
+ videos = [] of PlaylistVideo | ProblematicTimelineItem
until videos.size >= 200 || videos.size == playlist.video_count || offset >= playlist.video_count
# 100 videos per request
@@ -448,7 +448,7 @@ def get_playlist_videos(playlist : InvidiousPlaylist | Playlist, offset : Int32,
end
def extract_playlist_videos(initial_data : Hash(String, JSON::Any))
- videos = [] of PlaylistVideo
+ videos = [] of PlaylistVideo | ProblematicTimelineItem
if initial_data["contents"]?
tabs = initial_data["contents"]["twoColumnBrowseResultsRenderer"]["tabs"]
@@ -500,6 +500,10 @@ def extract_playlist_videos(initial_data : Hash(String, JSON::Any))
index: index,
})
end
+ rescue ex
+ videos << ProblematicTimelineItem.new(
+ parse_exception: ex
+ )
end
return videos
diff --git a/src/invidious/routes/embed.cr b/src/invidious/routes/embed.cr
index bdbb2d89..b7ae4e0e 100644
--- a/src/invidious/routes/embed.cr
+++ b/src/invidious/routes/embed.cr
@@ -12,13 +12,15 @@ module Invidious::Routes::Embed
url = "/playlist?list=#{plid}"
raise NotFoundException.new(translate(locale, "error_video_not_in_playlist", url))
end
+
+ get_first_video = videos[0].as(PlaylistVideo)
rescue ex : NotFoundException
return error_template(404, ex)
rescue ex
return error_template(500, ex)
end
- url = "/embed/#{videos[0].id}?#{env.params.query}"
+ url = "/embed/#{get_first_video}?#{env.params.query}"
if env.params.query.size > 0
url += "?#{env.params.query}"
@@ -72,13 +74,15 @@ module Invidious::Routes::Embed
url = "/playlist?list=#{plid}"
raise NotFoundException.new(translate(locale, "error_video_not_in_playlist", url))
end
+
+ get_first_video = videos[0].as(PlaylistVideo)
rescue ex : NotFoundException
return error_template(404, ex)
rescue ex
return error_template(500, ex)
end
- url = "/embed/#{videos[0].id}"
+ url = "/embed/#{get_first_video.id}"
elsif video_series
url = "/embed/#{video_series.shift}"
env.params.query["playlist"] = video_series.join(",")
diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr
index 7f9a0edb..abfea9ee 100644
--- a/src/invidious/routes/feeds.cr
+++ b/src/invidious/routes/feeds.cr
@@ -296,7 +296,13 @@ module Invidious::Routes::Feeds
xml.element("name") { xml.text playlist.author }
end
- videos.each &.to_xml(xml)
+ videos.each do |video|
+ if video.is_a? PlaylistVideo
+ video.to_xml(xml)
+ else
+ video.to_xml(env, locale, xml)
+ end
+ end
end
end
else