summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamantaz Fox <coding@samantaz.fr>2023-01-17 22:31:09 +0100
committerSamantaz Fox <coding@samantaz.fr>2023-01-17 22:31:09 +0100
commita7b2df31f0cb34d6cf82cbd3589304f8f651f1df (patch)
tree18ced2831dc4999f50aa6bd899be01060182f005
parentce07f2cd4a45d2eecdbb68afcc457980058d316d (diff)
parent1af846e58c3df98a589fe8fdda3e45f2745e69bc (diff)
downloadinvidious-a7b2df31f0cb34d6cf82cbd3589304f8f651f1df.tar.gz
invidious-a7b2df31f0cb34d6cf82cbd3589304f8f651f1df.tar.bz2
invidious-a7b2df31f0cb34d6cf82cbd3589304f8f651f1df.zip
API: make /api/v1/videos respect the 'local' parameter (#3567)
-rw-r--r--src/invidious.cr1
-rw-r--r--src/invidious/http_server/utils.cr20
-rw-r--r--src/invidious/jsonify/api_v1/video_json.cr11
-rw-r--r--src/invidious/routes/api/v1/videos.cr5
-rw-r--r--src/invidious/routes/video_playback.cr10
5 files changed, 36 insertions, 11 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 5064f0b8..d4f8e0fb 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -34,6 +34,7 @@ require "protodec/utils"
require "./invidious/database/*"
require "./invidious/database/migrations/*"
+require "./invidious/http_server/*"
require "./invidious/helpers/*"
require "./invidious/yt_backend/*"
require "./invidious/frontend/*"
diff --git a/src/invidious/http_server/utils.cr b/src/invidious/http_server/utils.cr
new file mode 100644
index 00000000..e3f1fa0f
--- /dev/null
+++ b/src/invidious/http_server/utils.cr
@@ -0,0 +1,20 @@
+module Invidious::HttpServer
+ module Utils
+ extend self
+
+ def proxy_video_url(raw_url : String, *, region : String? = nil, absolute : Bool = false)
+ url = URI.parse(raw_url)
+
+ # Add some URL parameters
+ params = url.query_params
+ params["host"] = url.host.not_nil! # Should never be nil, in theory
+ params["region"] = region if !region.nil?
+
+ if absolute
+ return "#{HOST_URL}#{url.request_target}?#{params}"
+ else
+ return "#{url.request_target}?#{params}"
+ end
+ end
+ end
+end
diff --git a/src/invidious/jsonify/api_v1/video_json.cr b/src/invidious/jsonify/api_v1/video_json.cr
index 642789aa..a2b1a35c 100644
--- a/src/invidious/jsonify/api_v1/video_json.cr
+++ b/src/invidious/jsonify/api_v1/video_json.cr
@@ -3,7 +3,7 @@ require "json"
module Invidious::JSONify::APIv1
extend self
- def video(video : Video, json : JSON::Builder, *, locale : String?)
+ def video(video : Video, json : JSON::Builder, *, locale : String?, proxy : Bool = false)
json.object do
json.field "type", video.video_type
@@ -89,7 +89,14 @@ module Invidious::JSONify::APIv1
# Not available on MPEG-4 Timed Text (`text/mp4`) streams (livestreams only)
json.field "bitrate", fmt["bitrate"].as_i.to_s if fmt["bitrate"]?
- json.field "url", fmt["url"]
+ if proxy
+ json.field "url", Invidious::HttpServer::Utils.proxy_video_url(
+ fmt["url"].to_s, absolute: true
+ )
+ else
+ json.field "url", fmt["url"]
+ end
+
json.field "itag", fmt["itag"].as_i.to_s
json.field "type", fmt["mimeType"]
json.field "clen", fmt["contentLength"]? || "-1"
diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr
index a6b2eb4e..79f7bd3f 100644
--- a/src/invidious/routes/api/v1/videos.cr
+++ b/src/invidious/routes/api/v1/videos.cr
@@ -6,6 +6,7 @@ module Invidious::Routes::API::V1::Videos
id = env.params.url["id"]
region = env.params.query["region"]?
+ proxy = {"1", "true"}.any? &.== env.params.query["local"]?
begin
video = get_video(id, region: region)
@@ -15,7 +16,9 @@ module Invidious::Routes::API::V1::Videos
return error_json(500, ex)
end
- video.to_json(locale, nil)
+ return JSON.build do |json|
+ Invidious::JSONify::APIv1.video(video, json, locale: locale, proxy: proxy)
+ end
end
def self.captions(env)
diff --git a/src/invidious/routes/video_playback.cr b/src/invidious/routes/video_playback.cr
index a0216cce..1e932d11 100644
--- a/src/invidious/routes/video_playback.cr
+++ b/src/invidious/routes/video_playback.cr
@@ -101,14 +101,8 @@ module Invidious::Routes::VideoPlayback
env.response.headers["Access-Control-Allow-Origin"] = "*"
if location = resp.headers["Location"]?
- location = URI.parse(location)
- location = "#{location.request_target}&host=#{location.host}"
-
- if region
- location += "&region=#{region}"
- end
-
- return env.redirect location
+ url = Invidious::HttpServer::Utils.proxy_video_url(location, region: region)
+ return env.redirect url
end
IO.copy(resp.body_io, env.response)