diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ext/kemal_content_for.cr | 16 | ||||
| -rw-r--r-- | src/ext/kemal_static_file_handler.cr | 2 | ||||
| -rw-r--r-- | src/invidious.cr | 11 | ||||
| -rw-r--r-- | src/invidious/config.cr | 6 | ||||
| -rw-r--r-- | src/invidious/frontend/watch_page.cr | 8 | ||||
| -rw-r--r-- | src/invidious/helpers/macros.cr | 5 | ||||
| -rw-r--r-- | src/invidious/routes/video_playback.cr | 5 | ||||
| -rw-r--r-- | src/invidious/routes/watch.cr | 11 | ||||
| -rw-r--r-- | src/invidious/videos/parser.cr | 35 |
9 files changed, 39 insertions, 60 deletions
diff --git a/src/ext/kemal_content_for.cr b/src/ext/kemal_content_for.cr deleted file mode 100644 index a4f3fd96..00000000 --- a/src/ext/kemal_content_for.cr +++ /dev/null @@ -1,16 +0,0 @@ -# Overrides for Kemal's `content_for` macro in order to keep using -# kilt as it was before Kemal v1.1.1 (Kemal PR #618). - -require "kemal" -require "kilt" - -macro content_for(key, file = __FILE__) - %proc = ->() { - __kilt_io__ = IO::Memory.new - {{ yield }} - __kilt_io__.to_s - } - - CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, %proc - nil -end diff --git a/src/ext/kemal_static_file_handler.cr b/src/ext/kemal_static_file_handler.cr index eb068aeb..a5f42261 100644 --- a/src/ext/kemal_static_file_handler.cr +++ b/src/ext/kemal_static_file_handler.cr @@ -71,7 +71,7 @@ def send_file(env : HTTP::Server::Context, file_path : String, data : Slice(UInt filesize = data.bytesize attachment(env, filename, disposition) - Kemal.config.static_headers.try(&.call(env.response, file_path, filestat)) + Kemal.config.static_headers.try(&.call(env, file_path, filestat)) file = IO::Memory.new(data) if env.request.method == "GET" && env.request.headers.has_key?("Range") diff --git a/src/invidious.cr b/src/invidious.cr index d3300ece..69f8a26c 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -17,10 +17,8 @@ require "digest/md5" require "file_utils" -# Require kemal, kilt, then our own overrides +# Require kemal, then our own overrides require "kemal" -require "kilt" -require "./ext/kemal_content_for.cr" require "./ext/kemal_static_file_handler.cr" require "http_proxy" @@ -49,7 +47,8 @@ require "./invidious/channels/*" require "./invidious/user/*" require "./invidious/search/*" require "./invidious/routes/**" -require "./invidious/jobs/**" +require "./invidious/jobs/base_job" +require "./invidious/jobs/*" # Declare the base namespace for invidious module Invidious @@ -226,8 +225,8 @@ error 500 do |env, ex| error_template(500, ex) end -static_headers do |response| - response.headers.add("Cache-Control", "max-age=2629800") +static_headers do |env| + env.response.headers.add("Cache-Control", "max-age=2629800") end # Init Kemal diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 140b0daf..4d69854c 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -35,7 +35,7 @@ struct ConfigPreferences property max_results : Int32 = 40 property notifications_only : Bool = false property player_style : String = "invidious" - property quality : String = "hd720" + property quality : String = "dash" property quality_dash : String = "auto" property default_home : String? = "Popular" property feed_menu : Array(String) = ["Popular", "Trending", "Subscriptions", "Playlists"] @@ -267,8 +267,8 @@ class Config elsif config.invidious_companion_key == "CHANGE_ME!!" puts "Config: The value of 'invidious_companion_key' needs to be changed!!" exit(1) - elsif config.invidious_companion_key.size < 16 - puts "Config: The value of 'invidious_companion_key' needs to be a size of 16 or more." + elsif config.invidious_companion_key.size != 16 + puts "Config: The value of 'invidious_companion_key' needs to be a size of 16 characters." exit(1) end elsif config.signature_server diff --git a/src/invidious/frontend/watch_page.cr b/src/invidious/frontend/watch_page.cr index 2e2f6ad0..15d925e3 100644 --- a/src/invidious/frontend/watch_page.cr +++ b/src/invidious/frontend/watch_page.cr @@ -23,10 +23,16 @@ module Invidious::Frontend::WatchPage return "<p id=\"download\">#{translate(locale, "Download is disabled")}</p>" end + url = "/download" + if (CONFIG.invidious_companion.present?) + invidious_companion = CONFIG.invidious_companion.sample + url = "#{invidious_companion.public_url}/download?check=#{invidious_companion_encrypt(video.id)}" + end + return String.build(4000) do |str| str << "<form" str << " class=\"pure-form pure-form-stacked\"" - str << " action='/download'" + str << " action='#{url}'" str << " method='post'" str << " rel='noopener'" str << " target='_blank'>" diff --git a/src/invidious/helpers/macros.cr b/src/invidious/helpers/macros.cr index 43e7171b..84847321 100644 --- a/src/invidious/helpers/macros.cr +++ b/src/invidious/helpers/macros.cr @@ -55,12 +55,11 @@ macro templated(_filename, template = "template", navbar_search = true) {{ layout = "src/invidious/views/" + template + ".ecr" }} __content_filename__ = {{filename}} - content = Kilt.render({{filename}}) - Kilt.render({{layout}}) + render {{filename}}, {{layout}} end macro rendered(filename) - Kilt.render("src/invidious/views/#{{{filename}}}.ecr") + render("src/invidious/views/#{{{filename}}}.ecr") end # Similar to Kemals halt method but works in a diff --git a/src/invidious/routes/video_playback.cr b/src/invidious/routes/video_playback.cr index b1c788c2..083087a9 100644 --- a/src/invidious/routes/video_playback.cr +++ b/src/invidious/routes/video_playback.cr @@ -21,7 +21,7 @@ module Invidious::Routes::VideoPlayback end # Sanity check, to avoid being used as an open proxy - if !host.matches?(/[\w-]+.googlevideo.com/) + if !host.matches?(/[\w-]+\.(?:googlevideo|c\.youtube)\.com/) return error_template(400, "Invalid \"host\" parameter.") end @@ -37,7 +37,8 @@ module Invidious::Routes::VideoPlayback # See: https://github.com/iv-org/invidious/issues/3302 range_header = env.request.headers["Range"]? - if range_header.nil? + sq = query_params["sq"]? + if range_header.nil? && sq.nil? range_for_head = query_params["range"]? || "0-640" headers["Range"] = "bytes=#{range_for_head}" end diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index ab588ad6..e777b3f1 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -293,6 +293,9 @@ module Invidious::Routes::Watch if CONFIG.disabled?("downloads") return error_template(403, "Administrator has disabled this endpoint.") end + if CONFIG.invidious_companion.present? + return error_template(403, "Downloads should be routed through Companion when present") + end title = env.params.body["title"]? || "" video_id = env.params.body["id"]? || "" @@ -328,13 +331,7 @@ module Invidious::Routes::Watch env.params.query["title"] = filename env.params.query["local"] = "true" - if (CONFIG.invidious_companion.present?) - video = get_video(video_id) - invidious_companion = CONFIG.invidious_companion.sample - return env.redirect "#{invidious_companion.public_url}/latest_version?#{env.params.query}" - else - return Invidious::Routes::VideoPlayback.latest_version(env) - end + return Invidious::Routes::VideoPlayback.latest_version(env) else return error_template(400, "Invalid label or itag") end diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 26d74f37..15bd00b6 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -109,27 +109,20 @@ def extract_video_info(video_id : String) params["reason"] = JSON::Any.new(reason) if reason if !CONFIG.invidious_companion.present? - new_player_response = nil - - # Don't use Android test suite client if po_token is passed because po_token doesn't - # work for Android test suite client. - if reason.nil? && CONFIG.po_token.nil? - # Fetch the video streams using an Android client in order to get the - # decrypted URLs and maybe fix throttling issues (#2194). See the - # following issue for an explanation about decrypted URLs: - # https://github.com/TeamNewPipe/NewPipeExtractor/issues/562 - client_config.client_type = YoutubeAPI::ClientType::AndroidTestSuite - new_player_response = try_fetch_streaming_data(video_id, client_config) - end - - # Replace player response and reset reason - if !new_player_response.nil? - # Preserve captions & storyboard data before replacement - new_player_response["storyboards"] = player_response["storyboards"] if player_response["storyboards"]? - new_player_response["captions"] = player_response["captions"] if player_response["captions"]? - - player_response = new_player_response - params.delete("reason") + if player_response["streamingData"]? && 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.each do |player_fallback| + client_config.client_type = player_fallback + player_fallback_response = try_fetch_streaming_data(video_id, client_config) + if player_fallback_response && player_fallback_response["streamingData"]? && + player_fallback_response.dig?("streamingData", "adaptiveFormats", 0, "url") + streaming_data = player_response["streamingData"].as_h + streaming_data["adaptiveFormats"] = player_fallback_response["streamingData"]["adaptiveFormats"] + player_response["streamingData"] = JSON::Any.new(streaming_data) + break + end + end end end |
