mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-03 22:21:55 +00:00 
			
		
		
		
	API: make /api/v1/videos respect the 'local' parameter (#3567)
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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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 += "®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