mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-10-31 12:42:09 +00:00 
			
		
		
		
	API: make /api/v1/videos respect the 'local' parameter
This commit is contained in:
		| @@ -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/*" | ||||
|   | ||||
							
								
								
									
										20
									
								
								src/invidious/http_server/utils.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/invidious/http_server/utils.cr
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
| @@ -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" | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -91,14 +91,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 += "®ion=#{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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Samantaz Fox
					Samantaz Fox