aboutsummaryrefslogtreecommitdiffstats
path: root/macros/garret.chapters.lua
blob: 826ca9319972fb7f4613ea3154824d923eb5ff30 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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