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 转换文件。最终所有文件位置如下:
/usr/local/bin/
├── ffmpeg
├── ffprobe
├── nfo.sh
├── yt-dlp
└── yt-dlp.conf
/home/vfly2
├── yt-dlp.sh
└── ytdlplist
仅此 7 个文件,一目了然。
安装和设置
安装前置工具
sudo apt install -y curl
确保版本 Python 3.7+
python3 --version
安装 yt-dlp
一键复制运行即可安装
curl -LO https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp
sudo mv yt-dlp /usr/local/bin/yt-dlp && sudo chmod a+rx /usr/local/bin/yt-dlp
更新
sudo yt-dlp -U --proxy socks5://127.0.0.1:10808/
安装依赖 FFmpeg 和 ffprobe
由于原版 FFmpeg 用于 yt-dlp 有 Bug,因此 yt-dlp 制作了这个 GitHub: yt-dlp/FFmpeg-Builds: FFmpeg Builds for yt-dlp (github.com)
一键复制运行即可安装
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 版本,确保安装成功
ffmpeg -version
这个也可以给 BBDown 使用
配置
更多配置查看项目主页: https://github.com/yt-dlp/yt-dlp#configuration
sudo vim /usr/local/bin/yt-dlp.conf
注意配置文件内不能有中文字符,否则会报错
# subdirectory + filename
-o '%(title)s/%(title)s.%(ext)s'
# thumbnail to jpg
--write-thumbnail
--convert-thumbnails jpg
# proxy
#--proxy 127.0.0.1:7890
# other
--write-description
--write-subs
--sub-langs "en, zh-Hans"
--compat-options no-live-chat
#--remux-video mkv
# Execute a command 如果你想要配合 emby,就取消 --exec 这行的注释
# %(filepath,_filename|)q is appended to the end of the command.
# --exec 'bash /usr/local/bin/nfo.sh'
这里先不设置下载目录,在脚本里设置
--paths /home/vfly2/youtube
查看这个视频有什么字幕可以下载(不会下载视频)
yt-dlp --list-subs https://www.youtube.com/watch?v=Z_1Q0XB4X0Y&list=WL
下载视频时,下载指定字幕
--write-subs --sub-langs "en, zh-Hans"
转换 nfo 脚本
如果要配合 Emby 使用,可以了解下面这一段。否则跳过即可。
在配置文件中,有选项 --write-description
,它是将视频简介(description 文件)也保存,但由于是纯文本, Emby 并不能识别。下面就是在下载完之后借助选项 --exec
,执行一个脚本将 description 文件转换为 Emby 能识别的 nfo 文件。
首先,取消配置文件中对 --exec 'bash /usr/local/bin/nfo.sh'
的注释。 --exec
会将视频路径和名称传给脚本。
然后创建转换脚本
sudo touch /usr/local/bin/nfo.sh && sudo chmod a+x /usr/local/bin/nfo.sh
编辑
sudo vim /usr/local/bin/nfo.sh
#!/bin/bash
# 生成临时文件
tee nfo1.temp <<-'EOF'
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<movie>
<plot><![CDATA[
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}` 文件中的每一行末尾添加 `<br/>` 换行标记,
sed 's#$#&<br/>#g' "${description}" >> "${nfo}";
cat nfo2.temp >> "${nfo}";
# 删除临时文件
rm nfo1.temp nfo2.temp
这样在下载完之后就会调用脚本,实现转换。
使用
对于 YouTube,默认下载的是 WebM 格式,Emby 可以识别。
yt-dlp https://www.youtube.com/watch?v=gIbfYsQfNWs
使用代理
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
批量下载
前面的内容还不容易看出,命令行工具相比有用户界面工具的优势,也就是快捷简便自动化。下面通过一个小脚本来发挥出它的优势。
批量下载脚本
先创建一个脚本文件:
filename="yt-dlp.sh"
touch $filename && chmod +x $filename && vim $filename
编辑内容:
vim yt-dlp.sh
需要修改 URLLIST 变量的值,也就是待会保存视频网址的文件的绝对路径。
#!/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 中:
vim /home/vfly2/ytdlplist
一行一个链接
https://www.youtube.com/watch?v=gIbfYsQfNWs
https://www.youtube.com/watch?v=laIvjmdM0Ww
执行脚本(默认下载在当前目录下)
bash -ex ./yt-dlp.sh
原文链接: https://yanh.tech/2023/10/download-youtube-videos-with-yt-dlp/
版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (yanh.tech) 。
保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。
可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。
经常用他下载youtube的视频,不用苦哈哈地用OBS录屏了。🤣😂