yt-dlp 下载 YouTube 视频 - 快捷的命令行工具

yt-dlp 是 youtube-dl 的分叉版本，GitHub： yt-dlp/yt-dlp: A youtube-dl fork with additional features and fixes (github.com) ，它支持很多网站视频的下载，除了油管，还有 Twitter、Twitch、Bilibili 等。

若无单独说明，按照文章代码块中命令的顺序，一条一条执行，即可实现目标。
适用系统：Debian 系发行版，包括 Ubuntu 和 Armbian，其他发行版按流程稍改命令一般也可。

走通预计时间：12 分钟

I might have made some mistakes, please let me know if I’ve gotten anything wrong!

而 youtube-dl 由于谷歌的限制，下载速度很慢，上次使用已经不能用于下载油管了。youtube-dl 的 GitHub： ytdl-org/youtube-dl: Command-line program to download videos from YouTube.com and other video sites (github.com)

下面是它结合网络记事本方便日常使用的演示。

通观全局（以 /home/vfly2 为家目录）

yt-dlp 是一个单文件程序，它还需要 yt-dlp.conf 保存配置文件，以及 FFmpeg 来合并音视频等。

本文还涉及到了一个脚本文件、视频链接文件和 nfo 转换文件。最终所有文件位置如下：

Copy
/usr/local/bin/
├── ffmpeg
├── ffprobe
├── nfo.sh
├── yt-dlp
└── yt-dlp.conf

/home/vfly2
├── yt-dlp.sh
└── ytdlplist

仅此 7 个文件，一目了然。

安装和设置

安装前置工具

Copy
sudo apt install -y wget curl

确保版本 Python 3.7+

Copy
python --version

安装 yt-dlp

一键复制运行即可安装

Copy
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp && sudo chmod a+rx /usr/local/bin/yt-dlp

更新

Copy
sudo yt-dlp -U

安装依赖 FFmpeg 和 ffprobe

由于原版 FFmpeg 用于 yt-dlp 有 Bug，因此 yt-dlp 制作了这个 GitHub： yt-dlp/FFmpeg-Builds: FFmpeg Builds for yt-dlp (github.com)

一键复制运行即可安装

Copy
wget https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz && \
tar -Jxv -f ffmpeg-master-latest-linux64-gpl.tar.xz && \
sudo mv ./ffmpeg-master-latest-linux64-gpl/bin/* /usr/local/bin/

# 清理
rm -r ffmpeg-master-latest-linux64-gpl
rm ffmpeg-master-latest-linux64-gpl.tar.xz

查看 ffmpeg 版本，确保安装成功

Copy
ffmpeg -version

这个也可以给 BBDown 使用

配置

更多配置查看项目主页： https://github.com/yt-dlp/yt-dlp#configuration

Copy
sudo vim /usr/local/bin/yt-dlp.conf

注意配置文件内不能有中文字符，否则会报错

Copy
# filename
-o '%(title)s.%(ext)s'

# thumbnail to jpg
--write-thumbnail
--convert-thumbnails jpg

# proxy
#--proxy 127.0.0.1:7890

# other
--write-description
--write-subs
--compat-options no-live-chat
#--remux-video mkv

# Execute a command
# %(filepath,_filename|)q is appended to the end of the command.
# --exec 'bash /usr/local/bin/nfo.sh'

这里先不设置下载目录，在脚本里设置

Copy
--paths /home/vfly2/youtube

转换 nfo 脚本

如果要配合 Emby 使用，可以了解下面这一段。否则跳过即可。

在配置文件中，有选项 --write-description ，它是将视频简介（description 文件）也保存，但由于是纯文本， Emby 并不能识别。下面就是在下载完之后借助选项 --exec ，执行一个脚本将 description 文件转换为 Emby 能识别的 nfo 文件。

首先，取消配置文件中对 --exec 'bash /usr/local/bin/nfo.sh' 的注释。 --exec 会将视频路径和名称传给脚本。

然后创建转换脚本

Copy
sudo touch /usr/local/bin/nfo.sh && sudo chmod a+x /usr/local/bin/nfo.sh

编辑

Copy
sudo vim /usr/local/bin/nfo.sh

Copy
#!/bin/bash

# 生成临时文件
tee nfo1.temp <<-'EOF'
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<movie>
<plot>
EOF

tee nfo2.temp <<-'EOF'

</plot>
</movie>
EOF

# 生成 emby 可识别的 nfo 文件并添加换行符号
file=$1
filename=${file%.*}
nfo=${filename}.nfo
description=${filename}.description

touch "${nfo}";
cat nfo1.temp > "${nfo}";
# 使用 `sed` 命令在读取的 `${description}` 文件中的每一行末尾添加 ` ` 换行标记，
sed 's#$#& #g' "${description}" >> "${nfo}";
cat nfo2.temp >> "${nfo}";

# 删除临时文件
rm nfo1.temp nfo2.temp

这样在下载完之后就会调用脚本，实现转换。

使用

对于 YouTube，默认下载的是 WebM 格式，Emby 可以识别。

Copy
yt-dlp https://www.youtube.com/watch?v=gIbfYsQfNWs

使用代理

Copy
yt-dlp --proxy http://127.0.0.1:10809 https://www.youtube.com/watch?v=gIbfYsQfNWs

yt-dlp --proxy socks5://127.0.0.1:10808/ https://www.youtube.com/watch?v=gIbfYsQfNWs

批量下载

前面的内容还不容易看出，命令行工具相比有用户界面工具的优势，也就是快捷简便自动化。下面通过一个小脚本来发挥出它的优势。

批量下载脚本

先创建一个脚本文件：

Copy
filename="yt-dlp.sh"
touch $filename && chmod +x $filename && vim $filename

编辑内容：

Copy
vim yt-dlp.sh

需要修改 URLLIST 变量的值，也就是待会保存视频网址的文件的绝对路径。

Copy
#!/bin/bash
# download multiple platforms (youtube, ) videos according to the file containing urls

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# 如果需要代理
# export http_proxy="http://127.0.0.1:1080"
# export https_proxy="http://127.0.0.1:1080"
# export no_proxy=127.0.0.1,localhost

# 存有 视频网址 的文件路径
URLLIST="/home/vfly2/ytdlplist"

# 取文件指定的第几行的内容，变量1是文件路径，变量2是第几行
function grepline(){
url=$(cat ${1} | head -n ${2} | tail -n 1)
echo ${url}
}

LINE=1
URL=$(grepline ${URLLIST} ${LINE}) # 先取第一行
ENDLINE=$(cat ${URLLIST} | tail -n 1)

# 每次取一行，直到行的内容是 EOF
until [ "${URL}" == "${ENDLINE}" ]
do

/usr/local/bin/yt-dlp ${URL}
# /usr/local/bin/yt-dlp ${URL} --paths /home/vfly2/youtube # 可在这指定下载目录
LINE=$((${LINE}+1)) # 加1
URL=$(grepline ${URLLIST} ${LINE}) # 取下一行，如果到最后一行，则退出循环

done

/usr/local/bin/yt-dlp ${ENDLINE} # 补上最后一行网址的下载

将视频链接保存在 ytdlplist 中：

Copy
vim /home/vfly2/ytdlplist

一行一个链接

Copy
https://www.youtube.com/watch?v=gIbfYsQfNWs
https://www.youtube.com/watch?v=laIvjmdM0Ww

执行脚本（默认下载在当前目录下）

Copy
bash -ex ./yt-dlp.sh

结合网络记事本

如果每次只下载一两个视频，还需要连接终端、编辑文件并执行脚本，有些繁琐。

本博客之前有一篇介绍网络记事本的文章：分享我使用两年的极简 网页记事本 - 承飞之咎 (vfly2.com)，它支持用 curl 抓取内容。

可以通过网络记事本随时保存链接，再用 curl 获取链接，每隔一段时间自动执行脚本下载视频，就可以省去操作。

实时性差些，AhFei 是将下载目录改为 Emby 的媒体库，通过 Emby 观看。这样高质量视频直接就保存了，看完后删去不需要的，不用担心视频被和谐，也不需要单独抽空下载收藏的视频。

类似上面的脚本流程：

Copy
filename="yt-dlp.sh"
touch $filename && chmod +x $filename && vim $filename

Copy
vim yt-dlp.sh

除了 URLLIST，还增加了一个变量 WEBLIST ，它的值是网络记事本的网址，这里使用 AhFei 搭建的演示： https://forward.vfly.app/ytdlplist ，将链接复制到这上面，一行一个。

各位读者可以直接使用这个公开实例，或者自行搭建：分享我使用两年的极简 网页记事本 - 承飞之咎 (vfly2.com)

Copy
#!/bin/bash
# download multiple platforms (youtube, ) videos

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# export http_proxy="http://127.0.0.1:1080"
# export https_proxy="http://127.0.0.1:1080"
# export no_proxy=127.0.0.1,localhost

# 存有 视频网址 的文件路径
URLLIST="/home/vfly2/ytdlplist"
WEBLIST="https://forward.vfly.app/ytdlplist"

# 下载网页上的视频链接
curl -k $WEBLIST > $URLLIST

# 取文件指定的第几行的内容，变量1是文件路径，变量2是第几行
function grepline(){
url=$(cat ${1} | head -n ${2} | tail -n 1)
echo ${url}
}

LINE=1
URL=$(grepline ${URLLIST} ${LINE}) # 先取第一行
ENDLINE=$(cat ${URLLIST} | tail -n 1)

# 每次取一行，直到行的内容是 EOF
until [ "${URL}" == "${ENDLINE}" ]
do

# echo ${URL}
/usr/local/bin/yt-dlp ${URL}
# /usr/local/bin/yt-dlp ${URL} --paths /home/vfly2/youtube # 可在这指定下载目录
LINE=$((${LINE}+1)) # 加1
URL=$(grepline ${URLLIST} ${LINE}) # 取下一行，如果到最后一行，则退出循环

done

/usr/local/bin/yt-dlp ${ENDLINE} # 补上最后一行网址的下载
# 向网页记事本传送已完成的标志
echo -e "\nabove have done, but may skip" >> $URLLIST
curl -k --data-urlencode "text@${URLLIST}" $WEBLIST

这样每次 SSH 只需要运行一遍下面命令即可，不需要编辑文件复制链接了

Copy
bash -ex ./yt-dlp.sh

原文链接： https://blog.vfly2.com/2023/10/download-youtube-videos-with-yt-dlp/

版权声明：本博客所有文章除特別声明外，均为 AhFei 原创，采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 承飞之咎 (blog.vfly2.com) 。

保持更新 ٩(・̤̀ᵕ・̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰可重复的实用技能，欢迎使用 RSS 订阅，也欢迎留言指正。

可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。