diff options
Diffstat (limited to 'macros/garret.chapters.lua')
-rw-r--r-- | macros/garret.chapters.lua | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/macros/garret.chapters.lua b/macros/garret.chapters.lua new file mode 100644 index 0000000..826ca93 --- /dev/null +++ b/macros/garret.chapters.lua @@ -0,0 +1,103 @@ +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 = "<?xml version=\"1.0\"?>\n<!-- <!DOCTYPE Chapters SYSTEM \"matroskachapters.dtd\"> -->\n<Chapters>\n <EditionEntry>\n" + for j, k in ipairs(times) do + local humantime = ms_to_human(k) + local name = names[j] + chapters = chapters.." <ChapterAtom>\n <ChapterTimeStart>"..humantime.."</ChapterTimeStart>\n <ChapterDisplay>\n <ChapterString>"..name.."</ChapterString>\n <ChapLanguageIETF>"..config.language_ietf.."</ChapLanguageIETF>\n <ChapterLanguage>"..config.language.."</ChapterLanguage>\n </ChapterDisplay>\n </ChapterAtom>\n" + end + chapters = chapters.." </EditionEntry>\n</Chapters>" + 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 |