当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 13 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-01 22:31 
头像

注册: 2007-12-01 14:56
帖子: 249
送出感谢: 0 次
接收感谢: 0 次
这几天电驴上拉了一个多月的几部动画终于下完了。看的时候才觉得手动配置字幕太麻烦(编码太乱了,UCS2,utf-8,gbk,big-5通通都有)。

熬了几天,终于撑不住了,一咬牙写了个脚本来自动检测字幕。

这个脚本会自动在视频所在目录和~/.sub目录下,按从视频文件名中提取的关键字符串搜索字幕,在其中找到吻合度最高的字幕文件,然后用enca检测文件编码,生成mplayer的字幕参数,然后调用mplayer播放视频(我另外加了从xterm里启动mplayer,个人习惯。)。

效果还不错。我目前所有的视频都能正常找到字幕并加载。放出来和大家分享下。

有问题的话可以联系我,我顺便完善下。

代码:
#!/usr/bin/python

import os
import sys
import re

def find_subfile( string_list, path, subfile_dict ):
    if path == "":
        path = "./"
    filelist = os.listdir( path )
    for file in filelist:
        if file[-4:] == ".ass" or file[-4:] == ".ssa" or file[-4:] == ".srt" :
            #print "sub " + file
            for string in string_list:
                if file.find( string ) != -1:
                    if subfile_dict.has_key( path + "/" + file ):
                        subfile_dict[ path + "/" + file] = subfile_dict[ path + "/" + file] + 1
                    else:
                        subfile_dict[ path + "/" + file] = 1

    return subfile_dict


def select_sub( subfile_dict ):
    max_value = 0
    subfile_list = []
    for key in subfile_dict.keys():
        if subfile_dict[key] > max_value:
            max_value = subfile_dict[key]
    for key in subfile_dict.keys():
        if subfile_dict[key] == max_value:
            subfile_list.append(key)
    return subfile_list

def get_enca( subfile ):
    pipe = os.popen( 'enca -L zh_CN "' +subfile + '"' )
    enca_rex = pipe.read()
    enca = enca_rex.split("\n")[0].split(";")[1]
    #print enca
    if enca.find("GB2312") != -1:
        enca = "GB18030"
    return enca

def gen_subarg( subfile_list, enca ):
    arg = ''
    if len( subfile_list ) != 0:
        arg = ' -subcp ' + enca + ' -sub '
        for sub in subfile_list:
            arg = arg + '"' + sub + '"' + ","
        arg = arg[:-1]
    return arg


def check_string( string ):
    string_list_1 = string.split(".")
    string_list_2 = []
    for s1 in string_list_1:
        string_list_3 = s1.split("\ ")
        for s2 in string_list_3:
            string_list_2.append( s2 )
    for s1 in string_list_2:
        print s1
        #pass


def get_subfile( filepath ):
    enca = ""
    subarg = ""
    filename = os.path.basename( filepath )
    filepath = os.path.dirname( filepath )

    #for string in os.listdir( os.path.expanduser( "~/.sub") ):


    #check_string( string[1:-1] )

    rex = re.compile("\[.*?\]")
    string_list_orig = rex.findall( filename )
    string_list = []
    for string in string_list_orig:
        if len( string[1:-1] ) != 0:
            string_list.append( string[1:-1] )

    rex = re.compile("\(.*?\)")
    string_list_orig = rex.findall( filename )
    for string in string_list_orig:
        if len( string[1:-1] ) != 0:
            string_list.append( string[1:-1] )

    #rex = re.compile("[\x80-\xff]{3}\+")
    #string_list_orig = rex.findall( filename )
    #for string in string_list_orig:
        #print string
        #string_list.append( string[1:-1] )

    rex = re.compile("[a-zA-Z]+")
    string_list_orig = rex.findall( filename )
    for string in string_list_orig:
        #print string
        string_list.append( string )

    rex = re.compile("\d+")
    string_list_orig = rex.findall( filename )
    for string in string_list_orig:
        string_list.append( string )

    string_list_orig = filename.split(".")
    for string in string_list_orig:
        if len( string ) != 0:
            string_list.append( string )
    #print string_list
    #for string in string_list:
        #print string

    subfile_dict = {}
    subfile_dict = find_subfile( string_list, filepath, subfile_dict )
    subfile_dict = find_subfile( string_list, os.path.expanduser( "~/.sub" ), subfile_dict )

    if len( subfile_dict ) == 0:
        return ""

    subfile_list = select_sub( subfile_dict )
    #for sub in subfile_list:
        #print sub

    if len( subfile_list  ) < 6:
        enca = get_enca( subfile_list[0] )
        subarg = gen_subarg( subfile_list, enca )
    else:
        subarg = ""
   
    #print subarg
    return subarg



if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "useage: xmplayer filename"
    else:
        subarg = get_subfile( sys.argv[1] )
        os.system( 'xterm -e mplayer "' + sys.argv[1] + '"' + subarg )


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-01 22:37 

注册: 2008-01-09 22:41
帖子: 18311
送出感谢: 0 次
接收感谢: 6
:em11


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-01 22:37 
头像

注册: 2009-04-11 12:17
帖子: 3049
送出感谢: 0 次
接收感谢: 0 次
哀,我又不得不鄙视下自己...顶起!虽然我很少看电影..视频


_________________
wowoto>ubuntu8.04>ubuntu9.04>Archlinux>FreeBSD8.0>Archlinux & end here.


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 7:55 

注册: 2006-12-08 23:11
帖子: 91
送出感谢: 0 次
接收感谢: 0 次
试用了一下,不错哦。


_________________
无论多么艰难的现在,终是记忆和过去


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 8:34 
头像

注册: 2007-10-19 14:51
帖子: 4953
地址: 深圳
送出感谢: 0 次
接收感谢: 2
好东西呀,收藏。


_________________
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 15:57 

注册: 2009-02-13 0:42
帖子: 24
送出感谢: 0 次
接收感谢: 0 次
mark,收藏。谢谢


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 15:59 
头像

注册: 2009-05-16 8:47
帖子: 2753
送出感谢: 0 次
接收感谢: 2
:em11


_________________
“飞达”——武汉理工大学开源技术协会http://vedaclub.org/


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 20:19 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
发现了gb2312


_________________
● 鸣学


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 22:01 
头像

注册: 2008-09-09 16:39
帖子: 206
送出感谢: 0 次
接收感谢: 0 次
先收藏,Python可以学习~~


_________________
Am I in Matrix?
System: ArchLinux
DM: Awesome 3.4.4
乱乱的小窝


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-03 22:03 
头像

注册: 2008-11-21 20:26
帖子: 36913
送出感谢: 1
接收感谢: 36
膜拜一下


_________________
讨厌我的人可以试着点一下
浏览全部ubuntu技巧


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-04 21:46 
头像

注册: 2008-09-09 16:39
帖子: 206
送出感谢: 0 次
接收感谢: 0 次
测试后没效果,我看要重新看一下代码了我


_________________
Am I in Matrix?
System: ArchLinux
DM: Awesome 3.4.4
乱乱的小窝


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-04 21:50 
头像

注册: 2008-09-09 16:39
帖子: 206
送出感谢: 0 次
接收感谢: 0 次
刚才没有注意,原来没有自动下载字幕功能,只是自己选择字幕


_________________
Am I in Matrix?
System: ArchLinux
DM: Awesome 3.4.4
乱乱的小窝


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 自动搜索字幕,检测编码,并使用mplayer播放的python脚本
帖子发表于 : 2010-05-04 22:00 
头像

注册: 2007-05-06 2:46
帖子: 15634
送出感谢: 0 次
接收感谢: 2
:em04

这个折腾,不如先登月后看片

我只是gconf-editor添加GBK

vlc自动,或指定都可以


附件:
vlc.png
vlc.png [ 88.68 KiB | 被浏览 1078 次 ]

页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 13 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译