From 10d82d2d95ff961da6c73fc2773d366024d7f285 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Fri, 27 Jul 2018 18:25:58 -0500 Subject: [PATCH] Add livestream support --- src/invidious.cr | 65 +++++++++++++++++++++++++++++++++++ src/invidious/views/watch.ecr | 36 +++++++++++-------- 2 files changed, 87 insertions(+), 14 deletions(-) diff --git a/src/invidious.cr b/src/invidious.cr index deebd44e..89b2702e 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -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(?\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" diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index 810a43e7..31008a8d 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -29,28 +29,36 @@ <%= video.title %> - Invidious <% end %> +<% if hlsvp %> + +<% end %> +