summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorRicardo Constantino <wiiaboo@gmail.com>2017-09-03 12:11:49 +0100
committerRicardo Constantino <wiiaboo@gmail.com>2017-09-03 13:42:51 +0100
commitd280b3db930eadb49646eac2b523adee5ced58a3 (patch)
tree98a7cb9a1a7fda37e264b85338b6c4affd391b2b /player
parent181b0714312eec2b44ba974eb3de6f378da92b14 (diff)
downloadmpv-d280b3db930eadb49646eac2b523adee5ced58a3.tar.bz2
mpv-d280b3db930eadb49646eac2b523adee5ced58a3.tar.xz
ytdl_hook: resolve relative paths when joining segment urls
FFmpeg/mpv don't do it automatically. See #4827
Diffstat (limited to 'player')
-rw-r--r--player/lua/ytdl_hook.lua22
1 files changed, 21 insertions, 1 deletions
diff --git a/player/lua/ytdl_hook.lua b/player/lua/ytdl_hook.lua
index 9a95657d5b..82679a2aa8 100644
--- a/player/lua/ytdl_hook.lua
+++ b/player/lua/ytdl_hook.lua
@@ -122,10 +122,30 @@ local function is_blacklisted(url)
return false
end
+local function make_absolute_url(base_url, url)
+ if url:find("https?://") == 1 then return url end
+
+ local proto, domain, rest =
+ base_url:match("(https?://)([^/]+/)(.*)/?")
+ local segs = {}
+ rest:gsub("([^/]+)", function(c) table.insert(segs, c) end)
+ url:gsub("([^/]+)", function(c) table.insert(segs, c) end)
+ local resolved_url = {}
+ for i, v in ipairs(segs) do
+ if v == ".." then
+ table.remove(resolved_url)
+ elseif v ~= "." then
+ table.insert(resolved_url, v)
+ end
+ end
+ return proto .. domain ..
+ table.concat(resolved_url, "/")
+end
+
local function join_url(base_url, fragment)
local res = ""
if base_url and fragment.path then
- res = base_url .. fragment.path
+ res = make_absolute_url(base_url, fragment.path)
elseif fragment.url then
res = fragment.url
end