subwrap 是我写的一个小脚本,用来自动查找某视频对应的脚本,然后调用播放器播放。

因为我非常喜欢mplayer,所以目前只调用mplayer,因为我放啥都是用这个……

因为我用的FreeBSD,所以这个脚本我只在BSD下试过。别的系统下面,file的返回结果可能不一样,要做相应修改……

下载: 文件:Subwrap.pl

#!/usr/bin/perl

sub playfile {
	my($file, $sub, $encoding, $args) = @_;
	if ($encoding eq "")
	{
		system("mplayer \"$file\" -sub \"$sub\" -utf8 $args");
	} else {
#		system("iconv -f $encoding -c \"$sub\" | mplayer \"$file\" -sub - -utf8 $args");
		system("iconv -f $encoding -c \"$sub\" > /tmp/subtitle.sub");
		system("mplayer \"$file\" -ass -sub /tmp/subtitle.sub -utf8 $args");
		system("rm -f /tmp/subtitle.sub");
	}
}

@exts = ('srt','ssa','ass');

@langs = ('en','Eng','chs','Chs','cn','sc','SC','uni_gb','gb','GB','cht','tc','TC','uni_big5','neta');

if ($#ARGV == -1)
{
	print "Usage: subwrap <filename>\n";
	exit 1;
}

$fname = $ARGV[0];

$argstr = "";

for ($i = 1; $i <= $#ARGV; $i = $i + 1)
{
	$argstr = $argstr . $ARGV[$i] . " ";
}

if (!(-e $fname))
{
	print "Cannot find specified file.\n";
	exit 2;
}

if (!($fname =~ m/(.*)\.(.*)/))
{
	print "Cannot find . in filename.\n";
	exit 1;
}


for ($way = 0; $way < 2; $way++)
{
	if ($way == 0)
	{
		$fname =~ m/(.*)\.(.*)/;
		$basename = $1;
	} else {
		$fname =~ m/(.*)\[.*\]\.(.*)/;
		$basename = $1;
	}

	# First let's try only extensions
	foreach $i (@exts)
	{
		$subname = $basename . "." . $i;
		if (-e $subname)
		{
			goto FOUND;
		}
	}

	# Now let's try extensions with languages
	foreach $i (@langs)
	{
		foreach $j (@exts)
		{
			$subname = $basename . "." . $i . "." . $j;
			if (-e $subname)
			{
				goto FOUND;
			}
		}
	}
}
	
# We failed!
print "Cannot found subtitles in (@exts) or (@langs) . (@exts).\n";
exit 2;

FOUND:

$filetype = `file "$subname"`;
print "Found sub file: $subname\n";

if ($filetype =~ m/ISO-8859/ or $filetype =~ m/extended-ASCII/)
{
	# GBK file
	print "Converting from GBK encoding\n";
	playfile($fname, $subname, "gbk", $argstr);
} elsif ($filetype =~ m/UTF-16/) {
	# UTF-16 file
	if ($filetype =~ m/Little-endian/)
	{
		# UTF-16 Little Endian
		print "Converting from UTF-16LE encoding\n";
		playfile($fname, $subname, "utf-16le", $argstr);
	} else {
		# UTF-16 Big Endian
		print "Converting from UTF-16BE encoding\n";
		playfile($fname, $subname, "utf-16be", $argstr);
	}
} else {
	playfile($fname, $subname, "", $argstr);
}