搭建私有播放服务
背景
由于很多时候,视频资源下载很慢,需要用自己的电脑挂机;又或是国外的资源被墙,无法观看;所以需要一个可以挂机下载的服务器。
离线下载这步做到之后,又由于download到自己电脑上还需要一段时间,而且有些资源可能是不需要的, 所以又有了在线观看的需求。
使用到的软件/框架
- Scrapy
- MySQL
- Aria2
- Ffmpeg
- Nginx
- Laravel
- Videojs
流程图
下载流程
展示流程
痛点
其实正常的开发流程一般遵照网上的教程或者官方文档就可以很容易的解决;这边讲讲一些需要费一些精力才能解决的问题
被js加密过的下载地址
一般都是使用eval
来执行加密过的字符串,只要先将eval里面的参数给解密出来,然后使用正则匹配解密之后的字符串里面的下载地址就可以了
p = re.compile(ur'eval\((.*)')
m = p.search(response.body)
if not m:
print('---- not match ----')
return
jsctx = PyV8.JSContext(PyV8.JSClass())
jsctx.enter()
jsctx.eval(r"var a = new String(" + m.group(1))
print(jsctx.locals.a)
content = jsctx.locals.a
p1 = re.compile('(http://[^"]+)')
m1 = p1.search(content)
if not m1:
print('---- cannot find url in js content ----')
return
videoUrl = m1.group(1)
python和aria2的交互
# encoding: utf-8
import xmlrpclib
class Pipeline(object):
def __init__(self):
self.s = xmlrpclib.ServerProxy('http://localhost:6800/rpc')
def init_hook(self):
self.s.aria2.onDownloadStart(self.onDownloadStart)
self.s.aria2.onDownloadError(self.onDownloadError)
self.s.aria2.onDownloadComplete(self.onDownloadComplete)
def onDownloadStart(self, event):
pass
def onDownloadError(self, event):
pass
def onDownloadComplete(self, event):
pass
def process_item(self, item, spider):
# ...
gid = self.s.aria2.addUri([item['video_url']], {"out": path})
# ...
ffmpeg将mp4拆分为HLS
命令如下,注意替换<>之间的内容
ffmpeg -i <ccc.mp4> -vf scale=-2:360 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls <ccc.m3u8>
ffmpeg截取部分视频为gif
注意替换命令中的两个变量
ffmpeg -ss 00:00:10 -t 5 -i "$filename" -vf scale=360:-1 -b 2048k "$dirname".gif
videojs播放HLS
默认情况之下videojs是不支持播放HLS的,需要引入 videojs-contrib-hls.min.js
videojs.options.flash.swf = "/js/video-js/video-js.swf";
videojs('main_video').ready(function() {
this.hotkeys({
volumeStep: 0.1,
seekStep: 5,
enableMute: true,
enableFullscreen: true,
enableNumbers: true
});
});
您好,大虾!
我想请教关于aria2c和python交互的问题。
您能发一个简单的Demo给我吗?看您的片段代码我还是搞不定!
谢谢! korykim@vip.qq.com