[ruby|ubuntu]字幕转码脚本

Photobucket

随着把工作平台转向ubuntu,现在也要逐渐把娱乐平台转移过来。虽然转移游戏平台还是比较难,但转移影音平台倒是一点都不难。

在ubuntu上的视频播放器,一开始也是用自带的Totem Movie Player,很快就觉得不给力,于是就换成了 SMPlayer,各种配置的选项感觉和 kmp 也差不太多了,快件键也很全,再开启硬解,高清也啃得轻轻松松。

SMPlayer还自带从OpenSubtitles.org搜索字幕的功能,感觉还是很贴心,不过,OpenSubtitles上的字幕语言版本有很多(对于学习非英语专业的朋友想必也很有帮助),但要搜正宗英文的字幕,似乎还没有射手网给力。

但从射手网下载字幕,又出了问题,没错,又是转移到linux平台下不得不说的文字编码问题,虽然 Movie Player 和 SMPlayer 都有选择字幕编码格式的地方。

Photobucket

Photobucket

但是用文本编辑器打开就没那么轻松了。既然这一阵学习了一点编码的知识,那么为什么不把下载的字幕文件全部转码成 UTF-8 编码的呢?其实在命令行里面执行转码还是很轻松的

iconv -f GBK -t UTF-8 source.srt -o destination.srt

但是下载人人影视的字幕,一下过来5种字幕(srt字幕,只包含时间轴和字幕,而ass字幕在此基础上又添加了格式花样,直接忽视),还是会让人比较晕(见题图)。

其实稍加分析就会发现,这里面英文字幕是不需要转码的,因为无论是何种编码,对于半角ASCII字符是没有什么影响。不管用什么编码正确显示,同理,双语字幕中的英文部分,都是可以正确显示,中文的部分倒是经常乱码。所以转码,就是要把其余这些字幕中的中文部分进行处理。

而有意思的是,这两种简体和繁体使用的是不同的字符集,分别是GBK(GB2312,GB18030系列)和BIG5(“大五码”)。要正确实现转码,iconv命令中的-f参数是不同的。要逐一转码,手工一条条输入代码是没什么问题,但是太麻烦,您也看得到字幕文件文件名一般都很长,而且还是双语混杂。像高手一样整个批处理脚本吧~

#!/usr/bin/env ruby
# encoding: utf-8

puts Dir.getwd
srts = Dir.glob("*.srt")

srts.each do |srt|
	puts srt	
	srt_utf8 = srt.encode("UTF-8").sub(".srt", ".utf-8.srt")
	if srt.index('简体') or srt.index('chs') or srt.index('cht')
		`iconv #{srt} -f GBK -t UTF-8 -c -o #{srt_utf8}`
	elsif srt.index('繁体')
		`iconv #{srt} -f BIG5 -t UTF-8 -c -o #{srt_utf8}`
	end
end

程序其实很简单,把脚本命名为 utf8srt.rb 复制到字幕所在的文件夹,遍历文件夹内的.srt文件,若包含“简体”字样,则按照GBK方式进行转码,若包含“繁体”字样,则按照BIG5方式转码。转码后的文件,以*.utf-8.srt为文件名保存在原目录。这样,不需要修改视频播放器的默认字幕编码“UTF-8”,直接将转码后的字幕文件拖入视频窗口就能实现正确的显示播放。

有几处“玄机”:

  • 第一行,#!/usr/bin/env ruby,称为shebang,可以让脚本找到执行它的程序位置,设置成这样,更适用于用 rvm 安装的ruby。
  • 第二行,# encoding: utf-8,告诉脚本按照 UTF-8 编码解释,若无此行,脚本中出现的中文字符会报错: invalid multibyte char (US-ASCII)
  • 记得给 utf8srt.rb 通过 chmod +x 命令增加可执行属性。配合shebang,可以实现脚本的直接运行($ ./utf8srt.rb)。
  • 字幕组的字幕文件名其实蛮不规范,里面竟然含有“&”,这样的文件名,在linux的终端中,基本就等于废掉了。我手动将其改成“-”,另外文件名中的空格,也需要完全去除。这个似乎没什么招儿。有些字幕解压以后,会出现文件名乱码的情况,这个可以使用 convmv 命令进行转码(仅针对文件名)。

学习ruby,突然发现ruby可以如果容易的调用外部命令,只需要把命令用 “ ` ” 符号框起来即可,原来 ruby 也是很“胶水”的嘛~。继续向高手学习,宁愿花一天设计一个简单的bash/shell脚本(当然,写这个脚本没花多少时间),而不是看似快速地一次次重复输入命令。

友情提示:这个脚本肯定还不成熟,随着我转码字幕越来越多,相信会不断改进,竟然发现人人影视的繁体字体使用的BIG5编码,而圣城家园的繁体字幕依然是GBK编码,似乎只是换成了繁体的字体而已,晕……

关于aGuegu

向着更高的逼格
此条目发表在Ruby, Ubuntu | Linux分类目录,贴了, , , , , , , , , , 标签。将固定链接加入收藏夹。
  • 不错不错,我也是刚刚开始用Ubuntu,转载到我的博客去收藏备用