ytdl_hook: add chapters by parsing video's description

This commit is contained in:
Maurycy Skier 2016-09-27 23:23:10 +02:00 committed by Ricardo Constantino
parent c3ae2ff107
commit e9c43258b8
1 changed files with 46 additions and 0 deletions

View File

@ -6,6 +6,8 @@ local ytdl = {
searched = false
}
local chapter_list = {}
local function exec(args)
local ret = utils.subprocess({args = args})
return ret.status, ret.stdout, ret
@ -57,6 +59,35 @@ local function edl_escape(url)
return "%" .. string.len(url) .. "%" .. url
end
local function time_to_secs(time_string)
local ret
local a, b, c = time_string:match("(%d+):(%d%d?):(%d%d)")
if a ~= nil then
ret = (a*3600 + b*60 + c)
else
a, b = time_string:match("(%d%d?):(%d%d)")
if a ~= nil then
ret = (a*60 + b)
end
end
return ret
end
local function extract_chapters(data, video_length)
local ret = {}
for line in data:gmatch("[^\r\n]+") do
local time = time_to_secs(line)
if time and (time < video_length) then
table.insert(ret, {time = time, title = line})
end
end
return ret
end
mp.add_hook("on_load", 10, function ()
local url = mp.get_property("stream-open-filename")
@ -284,6 +315,11 @@ mp.add_hook("on_load", 10, function ()
end
end
-- add chapters from description
if not (json.description == nil) and not (json.duration == nil) then
chapter_list = extract_chapters(json.description, json.duration)
end
-- set start time
if not (json.start_time == nil) then
msg.debug("Setting start to: " .. json.start_time .. " secs")
@ -314,3 +350,13 @@ mp.add_hook("on_load", 10, function ()
end
end
end)
mp.add_hook("on_preloaded", 10, function ()
if next(chapter_list) ~= nil then
msg.verbose("Setting chapters from video's description")
mp.set_property_native("chapter-list", chapter_list)
chapter_list = {}
end
end)