mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-10-30 20:22:00 +00:00 
			
		
		
		
	Add livestream support
This commit is contained in:
		| @@ -366,6 +366,20 @@ get "/watch" do |env| | ||||
|   end | ||||
|   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) | ||||
|   if video.info.has_key?("rvs") | ||||
|     video.info["rvs"].split(",").each do |rv| | ||||
| @@ -2360,6 +2374,57 @@ options "/videoplayback*" do |env| | ||||
|   env.response.headers["Access-Control-Allow-Headers"] = "Content-Type, range" | ||||
| 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| | ||||
|   path = env.request.path | ||||
|   if path != "/videoplayback" | ||||
|   | ||||
| @@ -29,28 +29,36 @@ | ||||
| <title><%= video.title %> - Invidious</title> | ||||
| <% 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"> | ||||
|     <video style="width:100%" playsinline poster="<%= thumbnail %>" title="<%= HTML.escape(video.title) %>"  | ||||
|         id="player" class="video-js vjs-16-9" data-setup="{}"  | ||||
|         <% if autoplay %>autoplay<% end %> | ||||
|         <% if video_loop %>loop<% end %> | ||||
|         controls> | ||||
|         <% if listen %> | ||||
|             <% audio_streams.each_with_index do |fmt, i| %> | ||||
|                 <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>"> | ||||
|             <% end %> | ||||
|         <% if hlsvp %> | ||||
|             <source src="<%= hlsvp %>" type="application/x-mpegURL"> | ||||
|         <% 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 %>"> | ||||
|             <% if listen %> | ||||
|                 <% audio_streams.each_with_index do |fmt, i| %> | ||||
|                     <source src="<%= fmt["url"] %>" type='<%= fmt["type"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>"> | ||||
|                 <% end %> | ||||
|             <% 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 %> | ||||
|              | ||||
|             <% 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 %> | ||||
|     </video> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Omar Roth
					Omar Roth