summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ext/kemal_content_for.cr16
-rw-r--r--src/ext/kemal_static_file_handler.cr2
-rw-r--r--src/invidious.cr11
-rw-r--r--src/invidious/config.cr6
-rw-r--r--src/invidious/frontend/watch_page.cr8
-rw-r--r--src/invidious/helpers/macros.cr5
-rw-r--r--src/invidious/routes/video_playback.cr5
-rw-r--r--src/invidious/routes/watch.cr11
-rw-r--r--src/invidious/videos/parser.cr35
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