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

2015-12-17 21:28:00 +08:00
 lxy42

最近在人人影视下载了一些美剧,手动下载字幕太麻烦,突然想到射手播放器可以在播放视频的时候自动匹配字幕,后来在射手网找到了匹配字幕的 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

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

实现得比你简单些(你用那么多线程锁是在干嘛...)
lxy42
2015-12-18 09:51:08 +08:00
@xiaket 看了一下,他的脚本是匹配单个视频并下载字幕的。我写的因为要匹配整个目录下的所有视频然后下载中英文字幕,所以用了多线程,有几个全局变量用来记录发现的字幕数量,成功下载的数量,失败的数量,没有找到字幕的视频文件名,所以用到锁来保证数据一致性。
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
2015-12-18 10:07:32 +08:00
@lxy42 电脑上使用场景不多 ,有射手播放器就够了;
多的是各种安卓手机 /平板 /安卓盒子+移动硬盘 /nas 等;
然而 安卓手机 /平板上的各种播放器有几个虽然有在线匹配功能,但弱的要死,所以建议楼主修改下适合手机的版本,手机上的 python 环境 有 http://www.qpython.com/ 类似这个;

然后手机 /平板看本地 /局域网片子就爽了
faketemp
2015-12-18 10:09:27 +08:00
@lxy42 可以考虑用 os.walk 递归查找所有层级目录中视频文件,并用列表或字典来保存所有视频文件对应的完整路径,然后逐个算出 hash 等查找并下载字幕,如果成功下载则对应重命名字幕文件即可
lxy42
2015-12-18 10:13:19 +08:00
@faketemp 我也是这样想的,但是就不好打包所有字幕了,我目前想到的是下载的字幕保存在与视频同级目录中。
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
2015-12-18 10:53:12 +08:00
@faketemp 嗯,有时间再调整一下
xiaket
2015-12-18 11:21:26 +08:00
@lxy42 我的想法是, 递归下载这样的需求, 不要在 python 这一层做了... bash 写循环很容易的.
lxy42
2015-12-18 11:41:14 +08:00
@xiaket 我考虑到了下载一个视频的字幕的需求,传入视频文件名参数就好。
yoa1q7y
2015-12-18 12:39:53 +08:00
lxy42
2015-12-18 16:07:41 +08:00
@yoa1q7y 没有吧, seek_positions 的意思是将文件指针移动到文件中相对于文件开头的位置,, FileObj.seek(offset, 0)。
lxy42
2015-12-18 16:09:13 +08:00
修改了一下脚本,现在可以递归匹配视频并下载字幕了,还可以打包字幕(保持目录结构不变)。
lxy42
2015-12-18 16:15:07 +08:00
@faketemp 现在可以递归了
yoa1q7y
2015-12-18 18:29:41 +08:00
额。。我原来指的是 `getVedioFileFromDir `这个名字的拼写
lxy42
2015-12-18 18:54:35 +08:00
@yoa1q7y 已修正。
kknd22
2015-12-19 12:43:34 +08:00
能否搞一个自动匹配番号下载字幕的脚本?比如 ABP-356 、 SDDE-412 、 IBW-518Z 这样子的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/244315

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX