V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lxy42
V2EX  ›  分享创造

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

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

    最近在人人影视下载了一些美剧,手动下载字幕太麻烦,突然想到射手播放器可以在播放视频的时候自动匹配字幕,后来在射手网找到了匹配字幕的 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   ·   实用小工具   ·   2834 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:50 · PVG 15:50 · LAX 23:50 · JFK 02:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.