100行python代码,打造自己的视频下载器

​编者的话:

    hello,小伙伴们。我是"风尘",今天又来给大家分享知识啦。为了提起大家对编程的兴趣,今天给大家带来一个用python语言编写的视频下载器。让互联网上的视频"能看就能下载"

100行python代码,打造自己的视频下载器


需求分析

    继上次给大家做了一个免费看视频的网站后,我又"狂躁了"。又让我想起了某些小网站上真的有很多好的视频资源,但是唯独没有下载按钮。如果我想下载下来放到硬盘里收藏起来。肿么办?

    那么我的需求就是"把可以播放的视频,下载到本地电脑"。


设计思路

    视频播放的原理是:浏览器访问视频的URL(可以简单理解成网址),将资源请求回本地,然后调用浏览器的视频播放组件。将视频呈现在观众的眼中。那么,我们的思路就是:

    1、先获取URL地址

    2、发起请求下载视频资源到本地

    3、合并视频资源(可选)

    如果视频资源只有一个URL地址,这种比较简单,直接下载就好了。所以我们考虑做最复杂的场景。下载那些视频资源经过拆分和加密的场景。

    我们来下载HLS协议的流媒体文件。简单描述一下这个协议:

    HLS 是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 playlist)内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。


开发代码

    我们用python语言开发实现这个功能,代码主要分四部分:解析资源地址、下载资源文件、合并资源文件、工具交互设计。

    解析资源地址:使用python的urllib3内置库将m3u8文件请求到,结合re正则表达式内置库,解析出其中的加解密key、ts文件地址、视频顺序。并把信息推入队列queue供线程消费。

100行python代码,打造自己的视频下载器

    下载资源文件:消费queue队列提取出其中资源地址,调用urllib3请求下载,并判断是否有加解密key,如果有的话,证明视频经过了加密。于是,调用Crypto.Cipher的AES算法解密功能解密。最后将视频按照顺序编号命名保存在临时目录temp中。并且考虑到网络可能中断,最后的代码中加入了重试,如果出现异常则进行重试下载,直到下载成功。

100行python代码,打造自己的视频下载器

    合并资源文件:这部分代码前半段是设置全局的队列和线程数。初始化临时目录,并触发线程启动。后半段是提供下载进度显示,使用已下载数量除以总数得到的百分比代表视频下载进度。最后,当全部下载完成后,将视频文件按照序号顺序合并成一个文件。

100行python代码,打造自己的视频下载器

    工具交互设计:前面讲了很多,还剩一个问题,我该如何告诉程序要下载哪个视频呢?这里就是工具的交互设计。我们把它设计成命令行工具,通过传参数的方式告诉工具这些信息。'-u':m3u8的网址、'-n':保存的视频文件名(默认是video)、'-b':并发下载数量,默认是20个并发。

100行python代码,打造自己的视频下载器

测试使用

    1、首先我们先获取m3u8的地址,打开浏览器开发者工具,刷新一下网页,在过滤框处输入m3u8,复制以.m3u8结尾的链接。

    2、到download_video.exe所在目录。按住shift和鼠标右键,打开命令行窗口。输入:download_video.exe -u <m3u8地址> -n <给下载视频的取名>。然后按回车就好了。尽情观看吧

 

100行python代码,打造自己的视频下载器

 

福利

     最后给出源代码地址,可执行的版本也在这里哈。欢迎下载~

    项目地址:https://gitee.com/dust-on-the-sun/python-project

100行python代码,打造自己的视频下载器

    那么,今天就分享到这里,喜欢的朋友别忘了关注下面的公众号哦~

    我是你们的好朋友“太阳上的风尘”,我们下期再见~拜拜~

100行python代码,打造自己的视频下载器