aboutsummaryrefslogtreecommitdiffstats
path: root/karaoke2alpha.lua
blob: 3e89139fd9a0a95398214405da89a33221d8fd11 (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
script_name="K-Timing -> Alpha Timing"
script_description="does what it says on the tin."
script_author = "garret"
script_version = "1.0.1"
include("utils.lua")

-- logging stuff, for testing
--[[inspect = require 'inspect' -- luarocks install inspect
function log(level, msg)
    if type(level) ~= "number" then -- if no actual level provided
        msg = level -- set the non-level as the message
        level = 4 -- set log level - i'm using this for debugging, so 4 is relatively sane imo
    end
    if type(msg) == "table" then
        msg = inspect(msg) -- actually see what's in the table
    end
    aegisub.log(level, tostring(msg) .. "\n")
end]]
-- i should really put this stuff in a separate file or something but cba

function get_visible(parsed_line, index)
    local res = ""
    for i=1,index do -- for every syl up to the current one
        res = res..parsed_line[i].text -- add to the result
    end
    return res
end

function get_invisible(parsed_line, index)
    local res = ""
    for i=index+1,#parsed_line do -- for every syl from the next one to the end
        res = res..parsed_line[i].text -- add to result
    end
    return res
end

function main(sub, sel)
    for x=#sel,1,-1 do
        local line=sub[sel[x]]
        local parsed = aegisub.parse_karaoke_data(line) -- magic function that gets all the stuff about the karaoke
        for i=1,#parsed do -- for every syl in the karaoke
            visible = get_visible(parsed, i)
            invisible = get_invisible(parsed, i)
            if invisible ~= "" then -- if there's still invisible stuff left
                text = visible.."{\\alpha&HFF&}"..invisible -- add an alpha tag and slap the invisible stuff on the end
            else -- if it's all visible
                text = visible -- don't need the alpha any more
            end
            local syl = parsed[i]
            local new = util.copy(line)
            new.text = text -- make a new line for this syl
            -- set line start time
            new.start_time = syl.start_time + line.start_time -- just the syl on its own returns the offset from the line
            -- set line end time
            if i ~= #parsed then -- if there's still invisible stuff left
                new.end_time = syl.end_time + line.start_time -- end time is the syl's
            else
                new.end_time = line.end_time -- end time is the whole line's (i don't think this actually makes a difference but may as well)
            end
            sub.insert(sel[x] + i,new) -- add new lines (+1 line for first syl, +2 for 2nd syl, etc)
        end
        line.comment = true -- don't want to see the karaoke any more
        sub[sel[x]]=line
    end
    aegisub.set_undo_point(script_name)
end

aegisub.register_macro(script_name, script_description, main)