写了个 python 脚本,自动匹配并下载字幕 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lxy42
V2EX    分享创造

写了个 python 脚本,自动匹配并下载字幕

  •  3
     
  •   lxy42 2015-12-17 21:28:00 +08:00 13375 次点击
    这是一个创建于 3595 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在人人影视下载了一些美剧,手动下载字幕太麻烦,突然想到射手播放器可以在播放视频的时候自动匹配字幕,后来在射手网找到了匹配字幕的 API 地址, https://www.shooter.cn/api/subapi.php
    该 API 可以根据给定的视频信息返回匹配的字幕信息,包括下载地址。
    API 使用说明: https://docs.google.com/document/d/1ufdzy6jbornkXxsD-OGl3kgWa4P9WO5NZb6_QYZiGI0/preview

    github 地址: https://github.com/L-xm/python-shooter.org

    28 条回复    2015-12-21 12:22:27 +08:00
    faketemp
        1
    faketemp  
       2015-12-17 22:14:35 +08:00
    NAS 中 BT 下载高清电影多无字幕,每次都得去搜索下载然后改名视频一多就烦, LZ 这个很方便!
    提两个小建议:
    1.能否修改一下 py 文件编码?使用 UTF-8 应该更利于 Linux 或 MAC 用户使用
    2.考虑添加选项支持递归查询子目录文件( BT 下载视频大多都是独立目录,无法递归实在不便)
    lxy42
        2
    lxy42  
    OP
       2015-12-17 22:51:37 +08:00
    @faketemp 好的,编码的问题到不大,自己改改也行。关于第二点,你指的是一个目录包含若干子目录,每个子目录只包含一个视频吗?
    GPU
        3
    GPU  
       2015-12-18 08:23:08 +08:00
    @lxy42
    1 楼的意思是 , PT 、 BT 下载回来的电影都是哪些标准的目录的, 类似于 `The.Walk.2015.1080p.BluRay.x264-SPARKS` 这样子 , 而且都是以文件夹形式,一个电影或电视剧下载下来的。
    如果楼主的脚本只能去匹配影视文件本身 哪么就不能识别文件夹里面的影视文件了,然而在国外 BT 站与国内 PT 站都是以这种文件夹的形式 BT 下载的 , 如果是单独一个影视文件的 一般是国内的会这样子。
    xiaket
        4
    xiaket  
       2015-12-18 09:32:47 +08:00
    https://github.com/xiaket/shooter_client

    实现得比你简单些(你用那么多线程锁是在干嘛...)
    lxy42
        5
    lxy42  
    OP
       2015-12-18 09:51:08 +08:00
    @xiaket 看了一下,他的脚本是匹配单个视频并下载字幕的。我写的因为要匹配整个目录下的所有视频然后下载中英文字幕,所以用了多线程,有几个全局变量用来记录发现的字幕数量,成功下载的数量,失败的数量,没有找到字幕的视频文件名,所以用到锁来保证数据一致性。
    faketemp
        6
    faketemp  
       2015-12-18 10:03:57 +08:00
    @lxy42 BT 下载大概目录结构如下:
    ./西游记之大圣归来.mp4
    ./Hotel.Transylvania.2.2015.720p.WEBRip.x264.AAC2.0-FGT/English.srt
    ./Hotel.Transylvania.2.2015.720p.WEBRip.x264.AAC2.0-FGT/Hotel.Transylvania.2.2015.720p.WEBRip.x264.AAC2.0-FGT.mp4 ./Shaun.the.Sheep.Movie.2015.1080p.BluRay.H264.AAC-RARBG/Shaun.the.Sheep.Movie.2015.1080p.BluRay.H264.AAC-RARBG.mp4
    ./The.Little.Prince.2015.BluRay.720p.DTS.x264-MTeam/The.Little.Prince.2015.BluRay.720p.DTS.x264-MTeam.mkv
    ./玩具总动员:迷失时空.原盘中英字幕.Toy.Story.That.Time.Forgot.2014.BD1080P.X264.AAC.English&Mandarin&Cantonese.CHS-ENG.Mp4Ba/玩具总动员:迷失时空.原盘中英字幕.Toy.Story.That.Time.Forgot.2014.BD1080P.X264.AAC.English&Mandarin&Cantonese.CHS-ENG.Mp4Ba.mp4
    ......

    @GPU 解释的对
    ketle
        7
    ketle  
       2015-12-18 10:07:32 +08:00
    @lxy42 电脑上使用场景不多 ,有射手播放器就够了;
    多的是各种安卓手机 /平板 /安卓盒子+移动硬盘 /nas 等;
    然而 安卓手机 /平板上的各种播放器有几个虽然有在线匹配功能,但弱的要死,所以建议楼主修改下适合手机的版本,手机上的 python 环境 有 http://www.qpython.com/ 类似这个;

    然后手机 /平板看本地 /局域网片子就爽了
    faketemp
        8
    faketemp  
       2015-12-18 10:09:27 +08:00
    @lxy42 可以考虑用 os.walk 递归查找所有层级目录中视频文件,并用列表或字典来保存所有视频文件对应的完整路径,然后逐个算出 hash 等查找并下载字幕,如果成功下载则对应重命名字幕文件即可
    lxy42
        9
    lxy42  
    OP
       2015-12-18 10:13:19 +08:00
    @faketemp 我也是这样想的,但是就不好打包所有字幕了,我目前想到的是下载的字幕保存在与视频同级目录中。
    faketemp
        10
    faketemp  
       2015-12-18 10:21:50 +08:00
    @lxy42
    In [1]: filepath = '/Users/test/test.mp4'

    In [2]: import os

    In [3]: os.path.split(filepath)
    Out[3]: ('/Users/test', 'test.mp4')

    In [4]: os.path.split(filepath)[0]
    Out[4]: '/Users/test'

    比如某视频路径 filepath = '/Users/test/test.mp4',则算出 hash 下载对应字幕并改名为“ test.srt ”保存到 os.path.split(filepath)[0]即可
    这样就保证了每个字幕都恰好与对应视频文件存放在同一目录
    lxy42
        11
    lxy42  
    OP
       2015-12-18 10:53:12 +08:00
    @faketemp 嗯,有时间再调整一下
    xiaket
        12
    xiaket  
       2015-12-18 11:21:26 +08:00
    @lxy42 我的想法是, 递归下载这样的需求, 不要在 python 这一层做了... bash 写循环很容易的.
    lxy42
        13
    lxy42  
    OP
       2015-12-18 11:41:14 +08:00
    @xiaket 我考虑到了下载一个视频的字幕的需求,传入视频文件名参数就好。
    yoa1q7y
        14
    yoa1q7y  
       2015-12-18 12:39:53 +08:00
    lxy42
        15
    lxy42  
    OP
       2015-12-18 16:07:41 +08:00
    @yoa1q7y 没有吧, seek_positions 的意思是将文件指针移动到文件中相对于文件开头的位置,, FileObj.seek(offset, 0)。
    lxy42
        16
    lxy42  
    OP
       2015-12-18 16:09:13 +08:00
    修改了一下脚本,现在可以递归匹配视频并下载字幕了,还可以打包字幕(保持目录结构不变)。
    lxy42
        17
    lxy42  
    OP
       2015-12-18 16:15:07 +08:00
    @faketemp 现在可以递归了
    yoa1q7y
        18
    yoa1q7y  
       2015-12-18 18:29:41 +08:00
    额。。我原来指的是 `getVedioFileFromDir `这个名字的拼写
    lxy42
        19
    lxy42  
    OP
       2015-12-18 18:54:35 +08:00
    @yoa1q7y 已修正。
    kknd22
        20
    kknd22  
       2015-12-19 12:43:34 +08:00
    能否搞一个自动匹配番号下载字幕的脚本?比如 ABP-356 、 SDDE-412 、 IBW-518Z 这样子的?
    lxy42
        21
    lxy42  
    OP
       2015-12-19 15:12:33 +08:00
    @kknd22 看的的不是情节吗?字幕脑补就好
    cruisehu
        22
    cruisehu  
       2015-12-19 23:43:34 +08:00
    L219 Video 拼错了
    atnoot
        23
    atnoot  
       2015-12-20 04:03:53 +08:00
    学以致用 才是我们学习的目标, mark 一下 买了网件的路由器 配上 1t 的 nas 加楼主的脚本 以后看片爽歪歪
    lxy42
        24
    lxy42  
    OP
       2015-12-20 11:39:24 +08:00
    @atnoot 真是爽
    cutoutsy
        25
    cutoutsy  
       2015-12-20 23:49:56 +08:00
    最新的视频都找不到字幕,,
    lxy42
        26
    lxy42  
    OP
       2015-12-21 00:01:59 +08:00
    @cutoutsy 可能射手网还没收集到字幕
    evilic
        27
    evilic  
       2015-12-21 08:58:52 +08:00
    射手网不是关闭了么?为什么会有最新的字幕?
    lxy42
        28
    lxy42  
    OP
       2015-12-21 12:22:27 +08:00
    @evilic 只是把前台网站关了而已,又没有把整个服务器都查封, API 还可以用,[API 使用说明]( https://docs.google.com/document/d/1ufdzy6jbornkXxsD-OGl3kgWa4P9WO5NZb6_QYZiGI0/preview)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5327 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 07:19 PVG 15:19 LAX 00:19 JFK 03:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86