local utils = require("mp.utils") local function create_chapter() local time_pos = mp.get_property_number("time-pos") local time_pos_osd = mp.get_property_osd("time-pos/full") local curr_chapter = mp.get_property_number("chapter") local chapter_count = mp.get_property_number("chapter-list/count") local all_chapters = mp.get_property_native("chapter-list") mp.osd_message(time_pos_osd, 1) if chapter_count == 0 then all_chapters[1] = { title = "chapter_1", time = time_pos } -- We just set it to zero here so when we add 1 later it ends up as 1 -- otherwise it's probably "nil" curr_chapter = 0 -- note that mpv will treat the beginning of the file as all_chapters[0] when using pageup/pagedown -- so we don't actually have to worry if the file doesn't start with a chapter else -- to insert a chapter we have to increase the index on all subsequent chapters -- otherwise we'll end up with duplicate chapter IDs which will confuse mpv -- +2 looks weird, but remember mpv indexes at 0 and lua indexes at 1 -- adding two will turn "current chapter" from mpv notation into "next chapter" from lua's notation -- count down because these areas of memory overlap for i = chapter_count, curr_chapter + 2, -1 do all_chapters[i + 1] = all_chapters[i] end all_chapters[curr_chapter+2] = { title = "chapter_"..curr_chapter, time = time_pos } end mp.set_property_native("chapter-list", all_chapters) mp.set_property_number("chapter", curr_chapter+1) end local function format_time(seconds) local result = "" if seconds <= 0 then return "00:00:00.000"; else hours = string.format("%02.f", math.floor(seconds/3600)) mins = string.format("%02.f", math.floor(seconds/60 - (hours*60))) secs = string.format("%02.f", math.floor(seconds - hours*60*60 - mins*60)) msecs = string.format("%03.f", seconds*1000 - hours*60*60*1000 - mins*60*1000 - secs*1000) result = hours..":"..mins..":"..secs.."."..msecs end return result end local function write_chapter() local euid = mp.get_property_number("estimated-frame-count") local chapter_count = mp.get_property_number("chapter-list/count") local all_chapters = mp.get_property_native("chapter-list") local insert_chapters = "" local curr = nil for i = 1, chapter_count, 1 do curr = all_chapters[i] local time_pos = format_time(curr.time) if i == 1 and curr.time ~= 0 then local first_chapter=" \n "..math.random(1000, 9000).."\n 0\n 1\n \n Prologue\n eng\n \n 00:00:00.000\n \n" insert_chapters = insert_chapters..first_chapter end local next_chapter=" \n \n "..curr.title.."\n eng\n \n "..math.random(1000, 9000).."\n "..time_pos.."\n 0\n 1\n \n" insert_chapters = insert_chapters..next_chapter end local chapters="\n\n\n \n 0\n 0\n "..euid.."\n"..insert_chapters.." \n" local path = mp.get_property("path") dir, name_ext = utils.split_path(path) local name = string.sub(name_ext, 1, (string.len(name_ext)-4)) local out_path = utils.join_path(dir, name.."_chapter.xml") local file = io.open(out_path, "w") if file == nil then dir = utils.getcwd() out_path = utils.join_path(dir, "create_chapter.xml") file = io.open(out_path, "w") end if file == nil then mp.error("Could not open chapter file for writing.") return end file:write(chapters) file:close() mp.osd_message("Export file to: "..out_path, 3) end mp.add_key_binding("C", "create_chapter", create_chapter, {repeatable=true}) mp.add_key_binding("B", "write_chapter", write_chapter, {repeatable=false})