From 37be513e142061067604d7ec1981fe7a309f8713 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Thu, 12 Jun 2025 01:25:59 -0400 Subject: [PATCH 1/6] Add fallback to TvSimply client --- src/invidious/videos/parser.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index feb58440..5be59352 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -111,7 +111,7 @@ def extract_video_info(video_id : String) if !CONFIG.invidious_companion.present? if player_response.dig?("streamingData", "adaptiveFormats", 0, "url").nil? LOGGER.warn("Missing URLs for adaptive formats, falling back to other YT clients.") - players_fallback = {YoutubeAPI::ClientType::TvHtml5, YoutubeAPI::ClientType::WebMobile} + players_fallback = {YoutubeAPI::ClientType::TvHtml5, YoutubeAPI::ClientType::TvSimply, YoutubeAPI::ClientType::WebMobile} players_fallback.each do |player_fallback| client_config.client_type = player_fallback From 0c96e0977fd805731d8fdbe97afac1ee22b6626a Mon Sep 17 00:00:00 2001 From: Fijxu Date: Thu, 12 Jun 2025 16:06:04 -0400 Subject: [PATCH 2/6] check for signatureCipher too --- src/invidious/videos/parser.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 5be59352..212b3b35 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -118,7 +118,7 @@ def extract_video_info(video_id : String) next if !(player_fallback_response = try_fetch_streaming_data(video_id, client_config)) - if player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url") + if player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url") || player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "signatureCipher") streaming_data = player_response["streamingData"].as_h streaming_data["adaptiveFormats"] = player_fallback_response["streamingData"]["adaptiveFormats"] player_response["streamingData"] = JSON::Any.new(streaming_data) From b1e7e0c45e8cfe0ca262dc5774c8ccca3fc6db66 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Thu, 12 Jun 2025 16:18:01 -0400 Subject: [PATCH 3/6] replace url by signatureCipher if url is not present --- src/invidious/videos/parser.cr | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 212b3b35..e58c0e8f 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -146,6 +146,9 @@ def extract_video_info(video_id : String) if streaming_data = player_response["streamingData"]? %w[formats adaptiveFormats].each do |key| streaming_data.as_h[key]?.try &.as_a.each do |format| + if format.as_h["url"].nil? + format.as_h["url"] = format.as_h["signatureCipher"] + end format.as_h["url"] = JSON::Any.new(convert_url(format)) end end From 01cdb384e0629ade15a83f8a2bcb50722d03340c Mon Sep 17 00:00:00 2001 From: Fijxu Date: Thu, 12 Jun 2025 17:25:19 -0400 Subject: [PATCH 4/6] add suggestions from syeopite --- src/invidious/videos/parser.cr | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index e58c0e8f..6892b37c 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -146,10 +146,11 @@ def extract_video_info(video_id : String) if streaming_data = player_response["streamingData"]? %w[formats adaptiveFormats].each do |key| streaming_data.as_h[key]?.try &.as_a.each do |format| - if format.as_h["url"].nil? - format.as_h["url"] = format.as_h["signatureCipher"] + format = format.as_h + if format["url"]?.nil? + format["url"] = format["signatureCipher"] end - format.as_h["url"] = JSON::Any.new(convert_url(format)) + format["url"] = JSON::Any.new(convert_url(format)) end end From cf0a68bd77251528713404822a19c411a1c0aaca Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 15 Jun 2025 16:51:04 -0400 Subject: [PATCH 5/6] store adaptiveFormats data into a variable --- src/invidious/videos/parser.cr | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 6892b37c..178b905b 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -118,9 +118,10 @@ def extract_video_info(video_id : String) next if !(player_fallback_response = try_fetch_streaming_data(video_id, client_config)) - if player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url") || player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "signatureCipher") + adaptive_formats = player_fallback_response.dig?("streamingData", "adaptiveFormats") + if adaptive_formats && (adaptive_formats.dig?(0, "url") || adaptive_formats.dig?(0, "signatureCipher")) streaming_data = player_response["streamingData"].as_h - streaming_data["adaptiveFormats"] = player_fallback_response["streamingData"]["adaptiveFormats"] + streaming_data["adaptiveFormats"] = adaptive_formats player_response["streamingData"] = JSON::Any.new(streaming_data) break end From d51e1cb0514fe2be4b94f7233e36a8aada542496 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 15 Jun 2025 17:45:53 -0400 Subject: [PATCH 6/6] remove fallback to TV client --- src/invidious/videos/parser.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 178b905b..5335aa79 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -111,7 +111,7 @@ def extract_video_info(video_id : String) if !CONFIG.invidious_companion.present? if player_response.dig?("streamingData", "adaptiveFormats", 0, "url").nil? LOGGER.warn("Missing URLs for adaptive formats, falling back to other YT clients.") - players_fallback = {YoutubeAPI::ClientType::TvHtml5, YoutubeAPI::ClientType::TvSimply, YoutubeAPI::ClientType::WebMobile} + players_fallback = {YoutubeAPI::ClientType::TvSimply, YoutubeAPI::ClientType::WebMobile} players_fallback.each do |player_fallback| client_config.client_type = player_fallback