From e0dd56f4ff72d18e67cf082b9ddc719b92d30ac2 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Wed, 6 Jun 2018 17:55:51 -0500 Subject: [PATCH] Fix dash endpoint --- src/invidious.cr | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/invidious.cr b/src/invidious.cr index 679fd7488..d3e8a4ac9 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -594,7 +594,8 @@ get "/redirect" do |env| end end -# Return dash manifest for the given video ID +# Return dash manifest for the given video ID, note this will not work on +# videos that already have a dashmpd in video info. get "/api/manifest/dash/id/:id" do |env| env.response.headers.add("Access-Control-Allow-Origin", "*") env.response.content_type = "application/dash+xml" @@ -644,9 +645,10 @@ get "/api/manifest/dash/id/:id" do |env| end manifest = XML.build(indent: " ", encoding: "UTF-8") do |xml| - xml.element("MPD", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation": "urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd", - xmlns: "urn:mpeg:dash:schema:mpd:2011", profiles: "urn:mpeg:dash:profile:isoff-main:2011", - mediaPresentationDuration: "PT#{video.info["length_seconds"]}S", minBufferTime: "PT2S", type: "static") do + xml.element("MPD", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns": "urn:mpeg:DASH:schema:MPD:2011", + "xmlns:yt": "http://youtube.com/yt/2012/10/10", "xsi:schemaLocation": "urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd", + minBufferTime: "PT1.5S", profiles: "urn:mpeg:dash:profile:isoff-main:2011", type: "static", + mediaPresentationDuration: "PT#{video.info["length_seconds"]}S") do xml.element("Period") do xml.element("AdaptationSet", id: 0, mimeType: "audio/mp4", subsegmentAlignment: true) do xml.element("Role", schemeIdUri: "urn:mpeg:DASH:role:2011", value: "main") @@ -657,8 +659,12 @@ get "/api/manifest/dash/id/:id" do |env| bandwidth = fmt["bitrate"] itag = fmt["itag"] url = fmt["url"] + url = url.gsub("?", "/") + url = url.gsub("&", "/") + url = url.gsub("=", "/") xml.element("Representation", id: fmt["itag"], codecs: codecs, bandwidth: bandwidth) do + xml.element("AudioChannelConfiguration", schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", value: "2") xml.element("BaseURL") { xml.text url } xml.element("SegmentBase", indexRange: fmt["init"]) do xml.element("Initialization", range: fmt["index"]) @@ -672,13 +678,16 @@ get "/api/manifest/dash/id/:id" do |env| video_streams.each do |fmt| mimetype, codecs = fmt["type"].split(";") codecs = codecs[9..-2] - fmt_type = mimetype.split("/")[0] bandwidth = fmt["bitrate"] itag = fmt["itag"] url = fmt["url"] + url = url.gsub("?", "/") + url = url.gsub("&", "/") + url = url.gsub("=", "/") height, width = fmt["size"].split("x") - xml.element("Representation", id: itag, codecs: codecs, width: width, height: height, bandwidth: bandwidth, frameRate: fmt["fps"]) do + xml.element("Representation", id: itag, codecs: codecs, width: width, startWithSAP: "1", maxPlayoutRate: "1", + height: height, bandwidth: bandwidth, frameRate: fmt["fps"]) do xml.element("BaseURL") { xml.text url } xml.element("SegmentBase", indexRange: fmt["init"]) do xml.element("Initialization", range: fmt["index"]) @@ -862,8 +871,29 @@ get "/modify_theme" do |env| env.redirect referer end -get "/videoplayback" do |env| - query_params = env.params.query +get "/videoplayback*" do |env| + path = env.request.path + if path != "/videoplayback" + path = path.lchop("/videoplayback/") + path = path.split("/") + # puts path + + raw_params = {} of String => Array(String) + path.each_slice(2) do |pair| + key, value = pair + value = URI.unescape(value) + + if raw_params[key]? + raw_params[key] << value + else + raw_params[key] = [value] + end + end + + query_params = HTTP::Params.new(raw_params) + else + query_params = env.params.query + end fvip = query_params["fvip"] mn = query_params["mn"].split(",")[0]