kopia lustrzana https://github.com/iv-org/invidious
				
				
				
			Videos: Fix missing host parameter on playback URLs when `local=true` (#4992)
						commit
						52daafe047
					
				| 
						 | 
				
			
			@ -27,28 +27,21 @@ module Invidious::Routes::API::Manifest
 | 
			
		|||
        haltf env, status_code: response.status_code
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      manifest = response.body
 | 
			
		||||
 | 
			
		||||
      manifest = manifest.gsub(/<BaseURL>[^<]+<\/BaseURL>/) do |baseurl|
 | 
			
		||||
        url = baseurl.lchop("<BaseURL>")
 | 
			
		||||
        url = url.rchop("</BaseURL>")
 | 
			
		||||
 | 
			
		||||
        if local
 | 
			
		||||
          uri = URI.parse(url)
 | 
			
		||||
          url = "#{HOST_URL}#{uri.request_target}host/#{uri.host}/"
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
      # Proxy URLs for video playback on invidious.
 | 
			
		||||
      # Other API clients can get the original URLs by omiting `local=true`.
 | 
			
		||||
      manifest = response.body.gsub(/<BaseURL>[^<]+<\/BaseURL>/) do |baseurl|
 | 
			
		||||
        url = baseurl.lchop("<BaseURL>").rchop("</BaseURL>")
 | 
			
		||||
        url = HttpServer::Utils.proxy_video_url(url, absolute: true) if local
 | 
			
		||||
        "<BaseURL>#{url}</BaseURL>"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      return manifest
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    adaptive_fmts = video.adaptive_fmts
 | 
			
		||||
 | 
			
		||||
    # Ditto, only proxify URLs if `local=true` is used
 | 
			
		||||
    if local
 | 
			
		||||
      adaptive_fmts.each do |fmt|
 | 
			
		||||
        fmt["url"] = JSON::Any.new("#{HOST_URL}#{URI.parse(fmt["url"].as_s).request_target}")
 | 
			
		||||
      video.adaptive_fmts.each do |fmt|
 | 
			
		||||
        fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s, absolute: true))
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -183,8 +176,9 @@ module Invidious::Routes::API::Manifest
 | 
			
		|||
    manifest = response.body
 | 
			
		||||
 | 
			
		||||
    if local
 | 
			
		||||
      manifest = manifest.gsub(/^https:\/\/\w+---.{11}\.c\.youtube\.com[^\n]*/m) do |match|
 | 
			
		||||
        path = URI.parse(match).path
 | 
			
		||||
      manifest = manifest.gsub(/https:\/\/[^\n"]*/m) do |match|
 | 
			
		||||
        uri = URI.parse(match)
 | 
			
		||||
        path = uri.path
 | 
			
		||||
 | 
			
		||||
        path = path.lchop("/videoplayback/")
 | 
			
		||||
        path = path.rchop("/")
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +207,7 @@ module Invidious::Routes::API::Manifest
 | 
			
		|||
          raw_params["fvip"] = fvip["fvip"]
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        raw_params["local"] = "true"
 | 
			
		||||
        raw_params["host"] = uri.host.not_nil!
 | 
			
		||||
 | 
			
		||||
        "#{HOST_URL}/videoplayback?#{raw_params}"
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,10 +157,12 @@ module Invidious::Routes::Embed
 | 
			
		|||
    adaptive_fmts = video.adaptive_fmts
 | 
			
		||||
 | 
			
		||||
    if params.local
 | 
			
		||||
      fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) }
 | 
			
		||||
      adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) }
 | 
			
		||||
      fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s)) }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Always proxy DASH streams, otherwise youtube CORS headers will prevent playback
 | 
			
		||||
    adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s)) }
 | 
			
		||||
 | 
			
		||||
    video_streams = video.video_streams
 | 
			
		||||
    audio_streams = video.audio_streams
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -164,10 +164,13 @@ 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}#{region ? "®ion=#{region}" : ""}"
 | 
			
		||||
                url = Invidious::HttpServer::Utils.proxy_video_url(location, region: region)
 | 
			
		||||
 | 
			
		||||
                env.redirect location
 | 
			
		||||
                if title = query_params["title"]?
 | 
			
		||||
                  url = "#{url}&title=#{URI.encode_www_form(title)}"
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                env.redirect url
 | 
			
		||||
                break
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -121,10 +121,12 @@ module Invidious::Routes::Watch
 | 
			
		|||
    adaptive_fmts = video.adaptive_fmts
 | 
			
		||||
 | 
			
		||||
    if params.local
 | 
			
		||||
      fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) }
 | 
			
		||||
      adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) }
 | 
			
		||||
      fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s)) }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Always proxy DASH streams, otherwise youtube CORS headers will prevent playback
 | 
			
		||||
    adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(HttpServer::Utils.proxy_video_url(fmt["url"].as_s)) }
 | 
			
		||||
 | 
			
		||||
    video_streams = video.video_streams
 | 
			
		||||
    audio_streams = video.audio_streams
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue