mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-10-31 04:32:02 +00:00 
			
		
		
		
	Add livestream support
This commit is contained in:
		| @@ -366,6 +366,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| | ||||||
| @@ -2360,6 +2374,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
	 Omar Roth
					Omar Roth