mirror of
https://github.com/odrling/Aegisub
synced 2025-04-11 22:56:02 +02:00
173 lines
5.1 KiB
Lua
173 lines
5.1 KiB
Lua
local tr = aegisub.gettext
|
|
|
|
script_name = tr"Karaoke 1sec adjust lead-in"
|
|
script_description = tr"Adjust karaoke leadin to 1sec"
|
|
script_author = "Flore"
|
|
script_version = "1.00"
|
|
|
|
include("cleantags.lua")
|
|
|
|
leadinmsec = 1000 --lead in time can be changed here
|
|
|
|
ktag = "\\[kK][fo]?%d+" --pattern used to detect karaoke tags
|
|
|
|
-- KM template line definition
|
|
km_template_effect = "template pre-line all keeptags"
|
|
km_templayte_text = '!retime("line",$start < 900 and -$start or -900,200)!{!$start < 900 and "\\\\k" .. ($start/10) or "\\\\k90"!\\fad(!$start < 900 and $start or 300!,200)}'
|
|
|
|
function hasleadin(line)--check if there is an existing lead in (2 consecutive bracket with karaoke tags at the start of the line)
|
|
return line.text:find("^{[^{}]-" .. ktag .. "[^{}]-}%s*{[^{}]-" .. ktag .. "[^{}]-}")
|
|
end
|
|
|
|
|
|
function removeleadin(line)
|
|
if not hasleadin(line) then
|
|
return line
|
|
end
|
|
|
|
leadin = tonumber( line.text:match("^{[^{}]-\\[kK][fo]?(%d+)[^{}]-}%s*{[^{}]-" .. ktag .. "[^{}]-}") ) --read lead-in value
|
|
line.text = line.text:gsub("^({[^{}]-)\\[kK][fo]?%d+(.-}%s*{[^{}]-" .. ktag .. ".-})","%1%2") --remove lead in
|
|
|
|
line.text = cleantags(line.text) --clean tags
|
|
|
|
line.start_time = line.start_time + leadin*10 --adjust start time
|
|
|
|
--aegisub.log(line.text)
|
|
|
|
return line
|
|
end
|
|
|
|
|
|
function adjust_1sec(subs, sel)
|
|
|
|
for _, i in ipairs(sel) do
|
|
local line = subs[i]
|
|
|
|
line.text = cleantags(line.text)
|
|
|
|
if( line.text:find(ktag)) then--don't do anything if there is no ktags in this line
|
|
|
|
--start by removing existing lead-in
|
|
while hasleadin(line) do
|
|
if aegisub.progress.is_cancelled() then return end
|
|
line = removeleadin(line)
|
|
end
|
|
|
|
--then add our lead in
|
|
|
|
if line.start_time >= leadinmsec then
|
|
line.text = string.format("{\\k%d}%s",leadinmsec/10, line.text)
|
|
line.start_time = line.start_time - leadinmsec
|
|
|
|
else --if line starts too early to put the needed lead in, make the line start at time 0 and fill with appropriate lead in
|
|
line.text = string.format("{\\k%d}%s",line.start_time/10, line.text)
|
|
line.start_time = 0
|
|
end
|
|
|
|
subs[i] = line
|
|
end
|
|
end
|
|
|
|
aegisub.set_undo_point(tr"1sec adjust lead-in")
|
|
end
|
|
|
|
|
|
function remove_tag(line, tag)
|
|
local expr = "^(.-{[^}]*)\\" .. tag .. "[^\\}]*(.*)"
|
|
while true do
|
|
before, after = line.text:match(expr)
|
|
if before == nil then
|
|
return line
|
|
else
|
|
line.text = cleantags(before .. after)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function is_template_line(line)
|
|
return (line.class == "dialogue"
|
|
and line.effect == km_template_effect
|
|
and line.text == km_templayte_text)
|
|
end
|
|
|
|
|
|
function mugenizer(subs)
|
|
local first = nil
|
|
local styles_different = false
|
|
local styles = 0
|
|
local i_styles = {}
|
|
local template_present = false
|
|
|
|
for i, line in ipairs(subs) do
|
|
if line.class == "info" then
|
|
if line.key == "PlayResX" or line.key == "PlayResY" then
|
|
line.value = "0"
|
|
end
|
|
end
|
|
|
|
if line.class == "style" then
|
|
line.fontname = "Arial"
|
|
line.fontsize = "24"
|
|
line.outline = "1.5"
|
|
line.margin_l = "15"
|
|
line.margin_r = "15"
|
|
line.margin_t = "20"
|
|
line.margin_b = "20"
|
|
|
|
i_styles[styles] = i
|
|
if styles > 0 then
|
|
styles_different = styles_different or line.color1 ~= subs[i_styles[styles-1]].color1 or line.color2 ~= subs[i_styles[styles-1]].color2 or line.color3 ~= subs[i_styles[styles-1]].color3 or line.color4 ~= subs[i_styles[styles-1]].color4
|
|
end
|
|
styles = styles + 1
|
|
end
|
|
|
|
if is_template_line(line) then
|
|
line.comment = true
|
|
template_present = true
|
|
end
|
|
|
|
if line.class == "dialogue" and not line.comment and line.effect ~= "fx" then
|
|
if first == nil then
|
|
first = i
|
|
end
|
|
|
|
line.text = cleantags(line.text)
|
|
|
|
while hasleadin(line) do
|
|
if aegisub.progress.is_cancelled() then return end
|
|
line = removeleadin(line)
|
|
end
|
|
|
|
line = remove_tag(line, "fad")
|
|
end
|
|
|
|
subs[i] = line
|
|
end
|
|
|
|
if not styles_different then
|
|
for i = 0, styles-1, 1 do
|
|
line = subs[i_styles[i]]
|
|
line.color1 = "&H008AFF"
|
|
line.color2 = "&HFFFFFF"
|
|
line.color3 = "&H000000"
|
|
line.color4 = "&H000000"
|
|
subs[i_styles[i]] = line
|
|
end
|
|
end
|
|
|
|
if not template_present then
|
|
-- add mugen's magic line
|
|
line = subs[first]
|
|
line.comment = true
|
|
line.start_time = 0
|
|
line.end_time = 0
|
|
line.effect = km_template_effect
|
|
line.text = km_templayte_text
|
|
subs.insert(first, line)
|
|
end
|
|
end
|
|
|
|
aegisub.register_macro(script_name, script_description, adjust_1sec)
|
|
aegisub.register_macro(tr"Mugenizer", tr"Mugenize your subs", mugenizer)
|