mirror of
https://github.com/iv-org/invidious.git
synced 2024-10-01 01:25:56 -04:00
Merge pull request #44 from omarroth/add-livestreams
Add livestream support [EXPERIMENTAL]
This commit is contained in:
commit
01e5bec246
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user