Skip to content

Commit 17a83f9

Browse files
committed
Videos: Fix missing host parameter on playback URLs when local=true
1 parent a88a723 commit 17a83f9

File tree

2 files changed

+15
-19
lines changed

2 files changed

+15
-19
lines changed

src/invidious/routes/api/manifest.cr

+11-17
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,21 @@ module Invidious::Routes::API::Manifest
2727
haltf env, status_code: response.status_code
2828
end
2929

30-
manifest = response.body
31-
32-
manifest = manifest.gsub(/<BaseURL>[^<]+<\/BaseURL>/) do |baseurl|
33-
url = baseurl.lchop("<BaseURL>")
34-
url = url.rchop("</BaseURL>")
35-
36-
if local
37-
uri = URI.parse(url)
38-
url = "#{HOST_URL}#{uri.request_target}host/#{uri.host}/"
39-
end
40-
30+
# Proxy URLs for video playback on invidious.
31+
# Other API clients can get the original URLs by omiting `local=true`.
32+
manifest = response.body.gsub(/<BaseURL>[^<]+<\/BaseURL>/) do |baseurl|
33+
url = baseurl.lchop("<BaseURL>").rchop("</BaseURL>")
34+
url = HttpServer::Utils.proxy_video_url(url, absolute: true) if local
4135
"<BaseURL>#{url}</BaseURL>"
4236
end
4337

4438
return manifest
4539
end
4640

47-
adaptive_fmts = video.adaptive_fmts
48-
41+
# Ditto, only proxify URLs if `local=true` is used
4942
if local
50-
adaptive_fmts.each do |fmt|
51-
fmt["url"] = JSON::Any.new("#{HOST_URL}#{URI.parse(fmt["url"].as_s).request_target}")
43+
video.adaptive_fmts.each do |fmt|
44+
fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s, absolute: true))
5245
end
5346
end
5447

@@ -178,7 +171,8 @@ module Invidious::Routes::API::Manifest
178171

179172
if local
180173
manifest = manifest.gsub(/^https:\/\/\w+---.{11}\.c\.youtube\.com[^\n]*/m) do |match|
181-
path = URI.parse(match).path
174+
uri = URI.parse(match)
175+
path = uri.path
182176

183177
path = path.lchop("/videoplayback/")
184178
path = path.rchop("/")
@@ -207,7 +201,7 @@ module Invidious::Routes::API::Manifest
207201
raw_params["fvip"] = fvip["fvip"]
208202
end
209203

210-
raw_params["local"] = "true"
204+
raw_params["host"] = uri.host.not_nil!
211205

212206
"#{HOST_URL}/videoplayback?#{raw_params}"
213207
end

src/invidious/routes/watch.cr

+4-2
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,12 @@ module Invidious::Routes::Watch
121121
adaptive_fmts = video.adaptive_fmts
122122

123123
if params.local
124-
fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) }
125-
adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) }
124+
fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s)) }
126125
end
127126

127+
# Always proxy DASH streams, otherwise youtube CORS headers will prevent playback
128+
adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s)) }
129+
128130
video_streams = video.video_streams
129131
audio_streams = video.audio_streams
130132

0 commit comments

Comments
 (0)