mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-03 22:21:55 +00:00 
			
		
		
		
	Merge pull request #44 from omarroth/add-livestreams
Add livestream support [EXPERIMENTAL]
This commit is contained in:
		@@ -371,6 +371,20 @@ get "/watch" do |env|
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
  captions ||= [] of JSON::Any
 | 
					  captions ||= [] of JSON::Any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if video.info["hlsvp"]?
 | 
				
			||||||
 | 
					    hlsvp = video.info["hlsvp"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if Kemal.config.ssl || CONFIG.https_only
 | 
				
			||||||
 | 
					      scheme = "https://"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      scheme = "http://"
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					    host = env.request.headers["Host"]
 | 
				
			||||||
 | 
					    url = "#{scheme}#{host}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    hlsvp = hlsvp.gsub("https://manifest.googlevideo.com", url)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  rvs = [] of Hash(String, String)
 | 
					  rvs = [] of Hash(String, String)
 | 
				
			||||||
  if video.info.has_key?("rvs")
 | 
					  if video.info.has_key?("rvs")
 | 
				
			||||||
    video.info["rvs"].split(",").each do |rv|
 | 
					    video.info["rvs"].split(",").each do |rv|
 | 
				
			||||||
@@ -2474,6 +2488,57 @@ options "/videoplayback*" do |env|
 | 
				
			|||||||
  env.response.headers["Access-Control-Allow-Headers"] = "Content-Type, range"
 | 
					  env.response.headers["Access-Control-Allow-Headers"] = "Content-Type, range"
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get "/api/manifest/hls_variant/*" do |env|
 | 
				
			||||||
 | 
					  client = make_client(YT_URL)
 | 
				
			||||||
 | 
					  manifest = client.get(env.request.path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if manifest.status_code != 200
 | 
				
			||||||
 | 
					    halt env, status_code: 403
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  manifest = manifest.body
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if Kemal.config.ssl || CONFIG.https_only
 | 
				
			||||||
 | 
					    scheme = "https://"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    scheme = "http://"
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  host = env.request.headers["Host"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  url = "#{scheme}#{host}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  env.response.content_type = "application/x-mpegURL"
 | 
				
			||||||
 | 
					  env.response.headers.add("Access-Control-Allow-Origin", "*")
 | 
				
			||||||
 | 
					  manifest.gsub("https://www.youtube.com", url)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get "/api/manifest/hls_playlist/*" do |env|
 | 
				
			||||||
 | 
					  client = make_client(YT_URL)
 | 
				
			||||||
 | 
					  manifest = client.get(env.request.path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if manifest.status_code != 200
 | 
				
			||||||
 | 
					    halt env, status_code: 403
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if Kemal.config.ssl || CONFIG.https_only
 | 
				
			||||||
 | 
					    scheme = "https://"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    scheme = "http://"
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  host = env.request.headers["Host"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  url = "#{scheme}#{host}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  manifest = manifest.body.gsub("https://www.youtube.com", url)
 | 
				
			||||||
 | 
					  manifest = manifest.gsub(/https:\/\/r\d---.{11}\.c\.youtube\.com/, url)
 | 
				
			||||||
 | 
					  fvip = manifest.match(/hls_chunk_host\/r(?<fvip>\d)---/).not_nil!["fvip"]
 | 
				
			||||||
 | 
					  manifest = manifest.gsub("seg.ts", "seg.ts/fvip/#{fvip}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  env.response.content_type = "application/x-mpegURL"
 | 
				
			||||||
 | 
					  env.response.headers.add("Access-Control-Allow-Origin", "*")
 | 
				
			||||||
 | 
					  manifest
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get "/videoplayback*" do |env|
 | 
					get "/videoplayback*" do |env|
 | 
				
			||||||
  path = env.request.path
 | 
					  path = env.request.path
 | 
				
			||||||
  if path != "/videoplayback"
 | 
					  if path != "/videoplayback"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,28 +29,36 @@
 | 
				
			|||||||
<title><%= video.title %> - Invidious</title>
 | 
					<title><%= video.title %> - Invidious</title>
 | 
				
			||||||
<% end %>
 | 
					<% end %>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<% if hlsvp %>
 | 
				
			||||||
 | 
					<script src="https://unpkg.com/videojs-contrib-hls@5.14.1/dist/videojs-contrib-hls.min.js"></script>
 | 
				
			||||||
 | 
					<% end %>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="h-box">
 | 
					<div class="h-box">
 | 
				
			||||||
    <video style="width:100%" playsinline poster="<%= thumbnail %>" title="<%= HTML.escape(video.title) %>" 
 | 
					    <video style="width:100%" playsinline poster="<%= thumbnail %>" title="<%= HTML.escape(video.title) %>" 
 | 
				
			||||||
        id="player" class="video-js vjs-16-9" data-setup="{}" 
 | 
					        id="player" class="video-js vjs-16-9" data-setup="{}" 
 | 
				
			||||||
        <% if autoplay %>autoplay<% end %>
 | 
					        <% if autoplay %>autoplay<% end %>
 | 
				
			||||||
        <% if video_loop %>loop<% end %>
 | 
					        <% if video_loop %>loop<% end %>
 | 
				
			||||||
        controls>
 | 
					        controls>
 | 
				
			||||||
        <% if listen %>
 | 
					        <% if hlsvp %>
 | 
				
			||||||
            <% audio_streams.each_with_index do |fmt, i| %>
 | 
					            <source src="<%= hlsvp %>" type="application/x-mpegURL">
 | 
				
			||||||
                <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>">
 | 
					 | 
				
			||||||
            <% end %>
 | 
					 | 
				
			||||||
        <% else %>
 | 
					        <% else %>
 | 
				
			||||||
            <% fmt_stream.each_with_index do |fmt, i| %>
 | 
					            <% if listen %>
 | 
				
			||||||
                <% if preferences %>
 | 
					                <% audio_streams.each_with_index do |fmt, i| %>
 | 
				
			||||||
                <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= preferences.quality == fmt["label"].split(" - ")[0] %>">
 | 
					                    <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>">
 | 
				
			||||||
                <% else %>
 | 
					                <% end %>
 | 
				
			||||||
                <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= i == 0 ? true : false %>">
 | 
					            <% else %>
 | 
				
			||||||
 | 
					                <% fmt_stream.each_with_index do |fmt, i| %>
 | 
				
			||||||
 | 
					                    <% if preferences %>
 | 
				
			||||||
 | 
					                    <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= preferences.quality == fmt["label"].split(" - ")[0] %>">
 | 
				
			||||||
 | 
					                    <% else %>
 | 
				
			||||||
 | 
					                    <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["label"] %>" selected="<%= i == 0 ? true : false %>">
 | 
				
			||||||
 | 
					                    <% end %>
 | 
				
			||||||
 | 
					                <% end %>
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                <% captions.each do |caption| %>
 | 
				
			||||||
 | 
					                <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>"
 | 
				
			||||||
 | 
					                    srclang="<%= caption["languageCode"] %>" label="<%= caption["name"]["simpleText"]%> ">
 | 
				
			||||||
                <% end %>
 | 
					                <% end %>
 | 
				
			||||||
            <% end %>
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            <% captions.each do |caption| %>
 | 
					 | 
				
			||||||
            <track kind="captions" src="/api/v1/captions/<%= video.id %>?label=<%= caption["name"]["simpleText"] %>"
 | 
					 | 
				
			||||||
                srclang="<%= caption["languageCode"] %>" label="<%= caption["name"]["simpleText"]%> ">
 | 
					 | 
				
			||||||
            <% end %>
 | 
					            <% end %>
 | 
				
			||||||
        <% end %>
 | 
					        <% end %>
 | 
				
			||||||
    </video>
 | 
					    </video>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user