Posted by novicepq on

youtube-dl,用于视频批量的下载超级小软件

youtube-dl是网上开发的专门用于下载Youtube视频的软件,但它真正牛逼的地方在于还支持其它视频网站的下载,包括爱情动作片们,其中pornhub,xvideo等赫然在列。

安装

使用的系统是debian,若因为时间间隔太久,该方法失效,则可以直接参考软件作者写的最新方法(https://rg3.github.io/youtube-dl/download.html)。

我没装curl,所以用的是wget。若wget没装,可以先装wget:
apt-get update
apt-get install wget -y

接下来是安装youtube-dl两行代码:
wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
chmod a+rx /usr/local/bin/youtube-dl

安装完后就可以开始直接使用了。

首先因为youtube-dl会下载到当前的目录,所以需要确保当前的目录是哪边,一般如果是root登录的话,目录就是/root,如果不想下载到root目录下,可以用mkdir新建一个目录,比如如下代码会新建一个叫Test的目录:
mkdir Test

然后使用cd命令进入到该目录下:
cd ./Test
这就进入到root下面新建的Test目录里。可以使用点号.来代替当前所在的目录地址,这样目录地址就不用打全了。下面这段代码的结果和上面是一样的,点号.取代了/root目录:
cd /root/Test

若要回到上层目录可以使用如下代码:
cd ..

进入到Test目录里后就可以使用youtube-dl下载视频了
语法: youtube-dl 视频网址
代码: youtube-dl http://...

youtube-dl会自动下载最佳的视频格式。

若不想下载最佳格式,也可以用以下代码查看可供下载的格式:
youtube-dl -F https://www.youtube.com/watch?v=lW9Uudkx42g
然后选中想下载的格式,比如想下载138:
youtube-dl -f 138 https://www.youtube.com/watch?v=lW9Uudkx42g
以上就是youtube-dl的简单操作,该操作的局限在于不能离线,也就是说如果SSH终端不小心被关掉,或者甚至网络连接不稳定导致SSH链接断掉,则下载自动终止。

批量下载

这里面会用到screen、文档编辑等操作。

准备工作:安装screen(如果第一次使用)
使用下面代码安装screen,Debian下使用apt-get,Centos下使用yum:
apt-get install screen -y

方法一:直接贴网址

使用screen命令开一个session,命名该session,比如就叫video:
screen -S video
注意S要大写,这时SSH终端会把你带到一个空窗口。

然后使用语法youtube-dl 链接1 链接2 链接3 … … 就能进行批量下载了,代码:
youtube-dl https://www.pornhub.com/view_video.php?viewkey=1763364088 https://www.pornhub.com/view_video.php?viewkey=1164813484 https://www.pornhub.com/view_video.php?viewkey=ph565707fb861b7
有多少链接就贴多少链接。

方法二:将链接全部保存到一个txt文件里,一行一个

这种方法的好处是,SSH不是随时都能用,碰到好的视频可以先把它保存下来,然后回到家里利用FTP上传到需要下载的目录。不过下面讲的是现场在SSH里制作txt文件。

首先使用cd命令去到你打算使用的下载文件夹。本例中使用的文件夹名为Downloads。

使用vim,或者nano命令新建一个txt或bat文件,这里取名download.txt/download.bat,后者是一个批处理文件格式,将你打算下载的爱情动作片网页链接保存在该txt文件里,一行一个网址,文件保存在Downloads文件夹下面。

使用以下命令去到该文件夹里面:
cd ./Downloads

使用screen命令开一个session,然后贴下面的代码:
youtube-dl -ci --batch-file=download.txt
-ci 可有可无,= 可有可无

这时vps就开始下载了,贴张图,是我正在下载的视频:

接下来我们可以退出这个session,让它安静的在后台跑着,我们可以去做其他事了,或者就可以直接关掉SSH。

退出session使用快捷键ctr+a, d或者ctr+a,ctr+d,~~注意快捷键需要在英文输入环境下,不能在中文输入法下,即便现在的中文输入法在shift操作下会转换为英文输入也不可以。~~退出session叫detach session。从下面的截图我们甚至可以看出,虽然我们给这个session取名video,但screen会分配一串数字给这个session,然后在screen里它的全名就是62718.video

使用以下命令可以再进去该session,查看下载进程,速度不是很快,所以很适合离线下载:
screen -r video

下载完后,我们可以使用如下代码将该session给删掉,如果不删的话,这个session会一直保存在vps里,如果下次再开一个screen,使用同样一个名字,等我们再打算进去的时候,screen就不知道你打算进哪个video session了,它会把所有取名video的session都给列出来,所以为了方便起见,最好下载好后还是把进程给杀掉。这里我把这个取名叫video的session给删掉:
screen -S video -X kill
或者
screen -S video -X quit
或者进入某个session后,按ctr+a,再按:quit
至于quit和kill两者有何区别,暂时还在研究中。。。

如果我们不慎没有把session删掉,然后开了好几个session,可以使用下面代码来列出目前的session清单:
screen -ls

然后就可以使用上面讲到的操作把某个session给删掉了。或者删掉全部的session:
pkill screen or
killall screen

如果session都已死的话,可以使用:
screen -wipe

下载完后,我们可以用FTP软件把下载的视频全部保存到本地硬盘里。

最后养成良好的打扫卫生习惯,将保存好的视频全部删掉,节省vps硬盘空间。我们可以在FTP里删除,但如果文件太多的话,速度会非常慢。这时可以使用如下代码来进行文件删除:
首先用cd命令进入Downloads文件夹,然后:
rm *.mp4 -rf

以上通配符将任何媒体格式是MP4的文件删掉,当然我们可以使用字母和结合的方式来删除特定的文件。

以下代码会将Downloads文件夹下的所有文件全部删掉:
rm *.*

youtube-dl结合aria2提高下载速度

若youtube-dl下载速度很慢,这时候我们可以通过让它调用linux下的多线程下载工具aria2实现多线程加速下载。所谓多线程就是下载速度像迅雷那样快。

首先需要安装aria2:
Centos:
yum install aria2 -y

Debian:
apt-get install aria2 -y

测试是否安装成功:
aria2c 文件下载地址


若出现如图所示的结果则说明aria2已安装成功。

然后就可让youtube-dl调用aria2进行下载了:
youtube-dl 视频网址 --external-downloader aria2c --external-downloader-args "-x 16 -k 1M"
–external-downloader aria2c #调用外部下载工具aria2c
–external-downloader-args #外部下载工具指定参数
-x 16 #表示进程数,aria2最高只能16进程
-k 1M #指定块的大小


当看到如图结果则说明aria2调用成功,截图时网速8.6MB/秒

Youtube视频不能指定块的大小,故需要把-K参数拿掉,其它照旧:
youtube-dl 视频网址 --external-downloader aria2c --external-downloader-args "-x 16"

我们再试试调用aria2c进行批量下载:
先去指定下载文件夹,用vi新建一个txt文件,将所需下载的视频网址一行一个黏贴到test.txt文件中,保存关闭。
使用代码:
youtube-dl -ci --batch-file=test.txt --external-downloader aria2c --external-downloader-args "-x 16 -k 1M"
视频列表现在成功。

目前实测的时候发现,只要调用了一次aria2c参数,接下来都不需要再调用,youtube-dl会自动默认走aria2.

本文参考自Youtube-dl调用外部Aria2多线程下载工具加速下载

安装FFmeg视频解码软件

在使用youtube-dl调用aria2下载视频的时候,发现视频下载完后,vps会报错:下载的视频格式有问题,推荐安装FFmpeg进行修复。奇怪的是我把视频保存到本地电脑仍能正常播放,没有一点问题。但既然说有报错,那就也把FFmpeg装上吧。

Centos7安装方法

vultr上有很详细的英文手册,按照上面的步骤一步步做就没问题了。
首先安装EPEL Release
yum install epel-release -y
yum repolist

导入code和nux源
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

然后安装FFmpeg
yum install ffmpeg ffmpeg-devel -y

Debian安装方法

分Debian8 Jessie和Debian9 Stretch,参考自Vultr

Debian8

  1. nano更新文件:
    nano /etc/apt/sources.list
  2. 将下列代码加入文件的最后:
    # deb-multimedia
    deb http://www.deb-multimedia.org jessie main non-free
    deb-src http://www.deb-multimedia.org jessie main non-free
    # jessie-backports
    deb http://httpredir.debian.org/debian/ jessie-backports main

按ctr+0,及ctr+x保存退出sources.list

  1. 使用下列代码,一行一个:
    apt-get update
    apt-get install deb-multimedia-keyring
    apt-get update
  2. 安装ffmpeg:
    apt-get install ffmpeg

最后查看是否安装成功
ffmpeg -version

如果安装成功系统会给出FFmpeg的最新版本号

Debian9

直接更新package list:
apt-get update

然后安装ffmpeg:
apt-get install ffmpeg

安装后再用youtube-dl试了一下,果然就没格式报错问题。

修改名字,自动保存到指定文件夹

每次用youtube-dl下载视频都需要先去指定的下载文件夹比较麻烦。下面的操作可以自动将下载完成的视频移动到指定的文件夹。

代码
youtube-dl -v --exec "mv {} ./Downloads/{}" 视频地址
参数:
mv :linux移动文件的命令
{} :这个是获取文件名参数
./Downloads/:此文件夹是当前root目录下面的Downloads文件夹,当然也可以移动到根目录下的非root文件夹下
视频地址接受批量下载

更方便的操作是让vps将指定的文件夹路径“记住”,每次下载的时候都调用该路径。比如我同时还安装了transmission方便BT离线下载,我可以把下载好的视频移动到该transmission的下载文件夹,方便我随时将视频做种。

方法:
root目录下有一个.config文件夹,可以在该文件夹下创建一个配置目录:
mkdir ./.config/youtube-dl/

编辑config文件,加入需要的参数:
vi ./.config/youtube-dl/config

以下是我自己的参数内容:
-o /root/Downloads/%(title)s.%(ext)s
--external-downloader aria2c
--external-downloader-args "-x 16 -k 1M"
--exec "mv {} /var/lib/transmission/Downloads/"

第一行是下载的地址及命名规则:root目录下的Downloads文件夹
第二行调用aria2c外部命令
第三行设置下载进程数和块
第四行是目标保存地址:我安装的transmission设置的Downloads文件夹

保存完config文件后,就可以试运行下载一个视频看是否保存到了/var/lib/transmission/Downloads:youtube-dl 视频地址
验证成功!

参考文章:
youtube-dl下载完成后文件自动转移到指定位置
youtube-dl配置文件config的使用

批量下载,跳过已下载的视频

youtube-dl有一个写入历史下载链接的方法,此方法确保将所有已下载的视频链接地址写入一个archive文件,这样在以后下载,特别是批量下载的时候,已经下载过的视频youtube-dl会自动跳过。语法是–download-archive /…archive文件的保存路径…/archive.txt,比如root里Downloads文件夹下有一个批量视频链接文件list.txt,里面写了所有打算下载的视频链接地址,使用代码:
youtube-dl –batch-file /root/Downloads/list.txt –download-archive /root/Downloads/archive.txt
该代码就会将所有下载后的链接写入archive.txt文件,如果archive.txt文件里有相同的链接,youtube-dl就会跳过下载该链接的视频,同时再结合其它诸如将下载视频自动移动命令等工具,最大化利用youtube-dl的强大功能。