在Linux系统,解决很多问题都是靠shell脚本就能快速解决。
通常,直接下载视频的链接地址只能得到一小部分视频文件(M3U8列表文件的第一个片段),今天我们写个脚本解决某视频平台的下载M3U8文件类型的完整版视频文件问题。
提示:本文介绍的是如何通过脚本来下载M3U8视频文件,侧重原理和逻辑。
一条ffmpeg命令下载M3U8类型视频文件 这篇文章的方法更加简单实用(推荐使用哦)。
M3U8
是Unicode版本的M3U,用UTF-8编码。
那么,M3U
又是什么呢?
M3U
文件是一种纯文本文件,可以指定一个或多个多媒体文件的位置,其文件扩展名是“M3U”或者“m3u”。
M3U文件的作用通常是创建指向在线流媒体的播放列表,创建的文件可以轻松访问流媒体。M3U文件通常作为网站的下载资源。
今天以鹅厂里的一个视频为例介绍如何快速编写下载视频的脚本。
实验依赖环境:
you-get
命令行下载工具打开Chrome或者Chromium等浏览器,随便找一个鹅厂视频点开,然后按F12
打开开发者工具,之后在开发者工具里就找下图标记类型的链接,这个就是M3U8
文件下载地址,鼠标右键,复制URL链接地址备用。
在浏览器界面按快捷键Ctrl
+ D
添加收藏 ,点击更多, 然后将下面内容粘帖到网址这一输入框内,点击确定即可:
javascript:var a=prompt(PLAYER._DownloadMonitor.context.dataset.title,PLAYER._DownloadMonitor.context.dataset.ckc?PLAYER._DownloadMonitor.context.dataset.currentVideoUrl:PLAYER._DownloadMonitor.context.dataset.currentVideoUrl);
添加成功后,随便打开一个鹅厂视频地址,然后点击收藏夹里的这个标签,就会显示出视频的M3U8文件URL地址啦,接下来我们要用这个地址下载对应的视频文件了。
脚本工具文件名为m3u8_download.sh
: 执行命令如下:
$ m3u8_download.sh https://xxxxxxxxxxxxxxx/gzc_1000102_dldkfldjfkfla.f321004.ts.m3u8?ver=4 out.mp4
...
下载地址: https://xxxxxxx/0381_gzc_1000102_0b53tqaayaaaeeaivo6vmfq4bhgdbsiqacca.f321004.13.ts?index=381&start=4482560&end=4496426&brs=77478936&bre=82758539&ver=4&token=1a37516957376f20acf946bb1d94650b
Site: v.smtcdns.com
Title: 0381_gzc_1000102_0b53tqaayaaaeeaivo6vmfq4bhgdbsiqacca.f321004.13
Type: MPEG-2 transport stream (video/MP2T)
Size: 5.04 MiB (5279604 Bytes)
Downloading 0381_gzc_1000102_0b53tqaayaaaeeaivo6vmfq4bhgdbsiqacca.f321004.13.ts ...
100% ( 5.0/ 5.0MB) ├█████████████████████████████████████┤[1/1] 52 MB/s
real 13m4.497s
user 1m53.877s
sys 0m14.715s
这样,我们就用了13分钟时间完成下载视频任务了。成功得到了一个 out.mp4 视频文件。
这里演示了一个脚本下载M3U8类型的视频文件方法,例子是固定的,但方法是活的。
例如你可以使用you-get
,也可以使用wget
或youtube-dl
等工具。
你当然可以并发同时下载多个文件, 比如一次下载50个文件(没有哪个厂家会认为这是合理的行为),适当控制,有代理池的话,你并发执行100个也是可以的。
当然,你有更好、更简单的方法可以给我留言,好方法一定要学会分享。
最后的最后,上脚本m3u8_download.sh
文件的源码:
#!/usr/bin/env bash
# filename: m3u8_download.sh
# 功能: M3U8 下载视频脚本
# 依赖: curl + you-get
usage() {
cat <<END
Usage:
`basename $0` [cookies_file]
Desc:
m3u8-url : M3U8 链接地址
outfile : 输出的视频文件名
END
}
ua='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
download_m3u8_ts() {
# 下载ts文件
m3u8_url="$1"
outfile="$2"
cookies_file="$3"
if [ "$m3u8_url" = "" ] ; then
echo "参数错误: 设置M3U8文件的URL地址"
usage
return 1
fi
if [ "$outfile" = "" ] ; then
echo "参数错误: 设置输出文件名为空."
usage
return 2
fi
if [ -f "$outfile" ] ; then
echo "输出文件[$outfile] 已经存在了,请先删除或换个名字."
return 3
fi
if [ -f "$cookies_file" ] ; then
dn_cmd="you-get -c $cookies_file"
curl_cmd="curl -k -b $cookies_file"
else
dn_cmd="you-get"
curl_cmd="curl -k"
fi
m3u8_file="./temp_m3u.list"
$curl_cmd -A "${ua}" $m3u8_url | awk '!/^#/' > $m3u8_file
for m3u8_suffix in `cat $m3u8_file`
do
if [ "${m3u8_suffix:0:4}" = "http" ] ; then
# 路径为 http(s) 开头的不同URL源绝对路径
dn_url="$m3u8_suffix"
ts_file=`basename "$m3u8_suffix"| cut -d '?' -f1`
elif [ "${m3u8_suffix:0:1}" = "/" ] ; then
# 路径为/ 开头的同URL源绝对路径
home_url=`echo $m3u8_url | cut -d '/' -f1-3`
dn_url="$home_url/$m3u8_suffix"
ts_file=`basename "$m3u8_suffix"| cut -d '?' -f1`
else
# 路径为相对路径
m3u8_prefix=`dirname $m3u8_url`
dn_url="$m3u8_prefix/$m3u8_suffix"
ts_file=`echo "$m3u8_suffix"| cut -d '?' -f1`
fi
echo "下载文件: $ts_file"
$dn_cmd -O ${ts_file} ${dn_url}
if [ ! -f "$ts_file" ] ; then
# 下载失败,再尝试一次
sleep 1
echo "下载文件(失败了,重试一次): $ts_file"
$dn_cmd ${dn_url}
fi
# sleep 1
done
# 合并ts文件
for m3u8_suffix in `cat $m3u8_file`
do
ts_file=`echo "$m3u8_suffix"| cut -d '?' -f1`
cat $ts_file >> $outfile
done
rm -f $m3u8_file
}
time download_m3u8_ts $@
总结一下,下载视频总共分两步:
评论区里分享了一个链接,希望对你有帮助。
最后提醒:珍爱资源,请合理利用。