介绍:Aegisub的API接口来源于【Automation 4 Lua】脚本,而这个脚本是基于【Lua】语言写的。
一、需要输入的内容有:
● script_name
(脚本名,字符串) - 脚本的名称,应尽量简洁
● script_description
(脚本描述,字符串) - 描述该脚本可以达成什么目的,也不建议太长。
● script_version
(脚本版本号,字符串或数字) - 脚本的版本号
● script_author
(脚本作者,字符串) - 脚本作者信息
二、需要处理的内容有:
API是一个输入再输出的过程,但这个这两个过程都需要Aegisub来完成。aegisub会给一个关于subtitles
的userdata
,其本质上为一个table
。我们需要对这个table
中的元素进行处理,再返回给aegisub。输出的内容subtitles[i]则会呈现在aegisub对应的文本框中。
固定格式:aegisub.register_macro(name, description, processing_function, validation_function, is_active_function)
每个脚本的最后都需要通过这个对象函数将处理好的数据再传回给aegisub,其中validation_function
, is_active_function
可以不传入。
难点1:了解
subtitles
对象的结构
subtitles
对象的类型为userdata
,可以当做一个table
来使用,结构类似于:
table_userdata = {subtitles[1],subtitles[2],...,subtitles[#subtitles]}
,而table_userdata
中每一个元素的类型还是table
,需要将table
的内容打印出来,方便理解和操作。
----获取table里的内容
script_name = "删除空字幕"
script_description = "删除空字幕"
function clean_empty_subs(subtitles)
local i = 1
local line
while(i <= #subtitles)
do
local result = {}
local a = 1
----对输入的table进行处理
for k,v in pairs(subtitles[i]) do
k = string.format("%q", k)
v = string.format("%q", v)
result[a] = string.format("%s[%s] = %s", '', k, v)
a = a + 1
end
----判断字幕行,并对符合条件的进行替换
if subtitles[i].text == ""
then
line = subtitles[i]
line.text = table.concat(result, "\n")
subtitles[i] = line
end
i=i+1
end
end
aegisub.register_macro(script_name, script_description, clean_empty_subs)
过滤之后,空白字幕行得到的结果:
[“layer”] = “0”
[“margin_b”] = “0”
[“class”] = “dialogue”
[“extra”] = “table: 0x1538c020”
[“margin_t”] = “0”
[“margin_l”] = “0”
[“style”] = “Default”
[“actor”] = “”
[“start_time”] = “0”
[“raw”] = “Dialogue: 0,0:00:00.00,0:00:05.00,Default,0,0,0,”
[“section”] = “[Events]”
[“text”] = “”
[“margin_r”] = “0”
[“comment”] = “false”
[“effect”] = “”
[“end_time”] = “5000”
难点2:了解ASS字幕的结构
ASS字幕结构参考链接:https://www.douban.com/note/658520175/
打开由aegisub保存的ass文件可知,字幕文件共分为以下四个部分:
[Script Info]
、[Aegisub Project Garbage]
、[V4+ Styles]
、[Events]
但字幕文件中不是每一行都会被返回到subtitles对象
,并且也会在其基础上加上一些其他的参数。经过测试,[Aegisub Project Garbage]
中的都不会被反馈,[Script Info]、[V4+ Styles]、[Events]
中只有以下标记的会被处理反馈。
以上述字幕文件最后一行,反馈出来的有:
需要注意几个参数:
1、class
分为info
、style
、dialogue
以及unknown
,分别对应[Script Info]、[V4+ Styles]、[Events]
,从[‘section’]可以看出来;
2、raw
ass文件中原始的行
3、text
最基础的处理参数,直接反馈到aegisub里