From f34cd38d5c0d6b1e126276f6bc97c2df6872afa4 Mon Sep 17 00:00:00 2001 From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Tue, 18 Mar 2025 08:50:58 -0400 Subject: [PATCH 1/3] Playlists: fix parsing error when some videos are paid for in a course --- src/invidious/playlists.cr | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr index 7c584d15..2d815ca8 100644 --- a/src/invidious/playlists.cr +++ b/src/invidious/playlists.cr @@ -377,7 +377,7 @@ def fetch_playlist(plid : String) video_count = text.gsub(/\D/, "").to_i? || 0 elsif text.includes? "view" views = text.gsub(/\D/, "").to_i64? || 0_i64 - else + elsif !text.includes? "Pay to watch" updated = decode_date(text.lchop("Last updated on ").lchop("Updated ")) end end @@ -438,7 +438,7 @@ def get_playlist_videos(playlist : InvidiousPlaylist | Playlist, offset : Int32, # 100 videos per request ctoken = produce_playlist_continuation(playlist.id, offset) initial_data = YoutubeAPI.browse(ctoken) - videos += extract_playlist_videos(initial_data) + videos += extract_playlist_videos(playlist.id, initial_data) offset += 100 end @@ -473,9 +473,9 @@ def extract_playlist_videos(initial_data : Hash(String, JSON::Any)) contents.try &.each do |item| if i = item["playlistVideoRenderer"]? - video_id = i["navigationEndpoint"]["watchEndpoint"]["videoId"].as_s - plid = i["navigationEndpoint"]["watchEndpoint"]["playlistId"].as_s - index = i["navigationEndpoint"]["watchEndpoint"]["index"].as_i64 + video_id = i.dig?("navigationEndpoint", "watchEndpoint", "videoId").try &.as_s || i.dig("videoId").as_s + plid = i.dig?("navigationEndpoint", "watchEndpoint", "playlistId").try &.as_s || playlist_id + index = i.dig?("navigationEndpoint", "watchEndpoint", "index").try &.as_i64 || i.dig("index", "simpleText").as_s.to_i64 title = i["title"].try { |t| t["simpleText"]? || t["runs"]?.try &.[0]["text"]? }.try &.as_s || "" author = i["shortBylineText"]?.try &.["runs"][0]["text"].as_s || "" From 5ffb1bc172eba989c0c966111055147263ca4720 Mon Sep 17 00:00:00 2001 From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Thu, 26 Jun 2025 04:59:21 +0000 Subject: [PATCH 2/3] Remove redundant casting to string fix rebase error Co-Authored-By: syeopite <70992037+syeopite@users.noreply.github.com> --- src/invidious/playlists.cr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr index 2d815ca8..a81a2ee7 100644 --- a/src/invidious/playlists.cr +++ b/src/invidious/playlists.cr @@ -438,7 +438,7 @@ def get_playlist_videos(playlist : InvidiousPlaylist | Playlist, offset : Int32, # 100 videos per request ctoken = produce_playlist_continuation(playlist.id, offset) initial_data = YoutubeAPI.browse(ctoken) - videos += extract_playlist_videos(playlist.id, initial_data) + videos += extract_playlist_videos(initial_data) offset += 100 end @@ -475,7 +475,7 @@ def extract_playlist_videos(initial_data : Hash(String, JSON::Any)) if i = item["playlistVideoRenderer"]? video_id = i.dig?("navigationEndpoint", "watchEndpoint", "videoId").try &.as_s || i.dig("videoId").as_s plid = i.dig?("navigationEndpoint", "watchEndpoint", "playlistId").try &.as_s || playlist_id - index = i.dig?("navigationEndpoint", "watchEndpoint", "index").try &.as_i64 || i.dig("index", "simpleText").as_s.to_i64 + index = i.dig?("navigationEndpoint", "watchEndpoint", "index").try &.as_i64 || i.dig("index", "simpleText").as_i64 title = i["title"].try { |t| t["simpleText"]? || t["runs"]?.try &.[0]["text"]? }.try &.as_s || "" author = i["shortBylineText"]?.try &.["runs"][0]["text"].as_s || "" From ba2151b1c0a542e9324bdc8d3180be58cf7d44ae Mon Sep 17 00:00:00 2001 From: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:22:03 -0400 Subject: [PATCH 3/3] Fix rebase issues --- src/invidious/playlists.cr | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr index a81a2ee7..dfbfa819 100644 --- a/src/invidious/playlists.cr +++ b/src/invidious/playlists.cr @@ -438,7 +438,7 @@ def get_playlist_videos(playlist : InvidiousPlaylist | Playlist, offset : Int32, # 100 videos per request ctoken = produce_playlist_continuation(playlist.id, offset) initial_data = YoutubeAPI.browse(ctoken) - videos += extract_playlist_videos(initial_data) + videos += extract_playlist_videos(playlist.id, initial_data) offset += 100 end @@ -447,7 +447,7 @@ def get_playlist_videos(playlist : InvidiousPlaylist | Playlist, offset : Int32, end end -def extract_playlist_videos(initial_data : Hash(String, JSON::Any)) +def extract_playlist_videos(playlist_id : String, initial_data : Hash(String, JSON::Any)) videos = [] of PlaylistVideo | ProblematicTimelineItem if initial_data["contents"]? @@ -475,7 +475,7 @@ def extract_playlist_videos(initial_data : Hash(String, JSON::Any)) if i = item["playlistVideoRenderer"]? video_id = i.dig?("navigationEndpoint", "watchEndpoint", "videoId").try &.as_s || i.dig("videoId").as_s plid = i.dig?("navigationEndpoint", "watchEndpoint", "playlistId").try &.as_s || playlist_id - index = i.dig?("navigationEndpoint", "watchEndpoint", "index").try &.as_i64 || i.dig("index", "simpleText").as_i64 + index = i.dig?("navigationEndpoint", "watchEndpoint", "index").try &.as_i64 || i.dig("index", "simpleText").as_s.to_i64 title = i["title"].try { |t| t["simpleText"]? || t["runs"]?.try &.[0]["text"]? }.try &.as_s || "" author = i["shortBylineText"]?.try &.["runs"][0]["text"].as_s || ""