script_name = "Chapter Generator" script_description = "Makes XML chapters for matroska." script_author = "garret" script_version = "2.1.0" script_namespace = "garret.chapters" local haveDepCtrl, DependencyControl, depctrl = pcall(require, "l0.DependencyControl") local simpleconf, config_dir if haveDepCtrl then depctrl = DependencyControl { --feed="TODO", { {"garret.simpleconf", url="https://github.com/garret1317/aegisub-scripts",} --feed="TODO"}, } } simpleconf = depctrl:requireModules() config_dir = depctrl.configDir else simpleconf = require 'garret.simpleconf' config_dir = "?user/config" end local config = simpleconf.get_config(aegisub.decode_path(config_dir.."/"..script_namespace..".conf"), {language = "eng", language_ietf = "en"}) function ms_to_human(start) -- From Significance local timecode=math.floor(start/1000) local tc1=math.floor(timecode/60) local tc2=timecode%60 local tc3=start%1000 local tc4="00" if tc2==60 then tc2=0 tc1=tc1+1 end if tc1>119 then tc1=tc1-120 tc4="02" end if tc1>59 then tc1=tc1-60 tc4="01" end if tc1<10 then tc1="0"..tc1 end if tc2<10 then tc2="0"..tc2 end if tc3<100 then tc3="0"..tc3 end linetime=tc4..":"..tc1..":"..tc2.."."..tc3 if linetime=="00:00:00.00" then linetime="00:00:00.033" end return linetime end function get_sane_path() script_path = aegisub.decode_path("?script") audio_path = aegisub.decode_path("?audio") video_path = aegisub.decode_path("?video") if script_path ~= "?script" then return script_path elseif video_path ~= "?video" then return video_path elseif audio_path ~= "?audio" then return audio_path else return "" end end function get_user_path(default_dir) local path = aegisub.dialog.save("Save Chapter File", default_dir, "chapters.xml", "XML files|*.xml|All Files|*", false) return path end function main(sub) aegisub.log(config_dir) local times = {} local names = {} for i=1,#sub do local line = sub[i] if line.class == "dialogue" then local fx = line.effect if fx:match("[Cc]hapter") or fx:match("[Cc]hptr") or fx:match("[Cc]hap") then line.comment = true table.insert(times, line.start_time) table.insert(names, line.text) sub[i] = line end end end aegisub.set_undo_point(script_name) local chapters = "\n\n\n \n" for j, k in ipairs(times) do local humantime = ms_to_human(k) local name = names[j] chapters = chapters.." \n "..humantime.."\n \n "..name.."\n "..config.language_ietf.."\n "..config.language.."\n \n \n" end chapters = chapters.." \n" sane_path = get_sane_path() path = get_user_path(sane_path) if path ~= nil then local chapfile = io.open(path, "w") chapfile:write(chapters) chapfile:close() else aegisub.cancel() end end if haveDepCtrl then depctrl:registerMacro(main) else aegisub.register_macro(script_name, script_description, main) end