下面文章已经过时,新版在「技焉洲」更新: yt-dlp 下载 YouTube 视频 – 快捷的命令行工具 – 技焉洲 (yanh.tech)
放在新站点「技焉洲」的原因: 承飞之咎与技焉洲 – 承飞之咎 (vfly2.com)
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 wget curl |
确保版本 Python 3.7+
一键复制运行即可安装
| 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 |
更新
由于原版 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 版本,确保安装成功
这个也可以给 BBDown 使用
更多配置查看项目主页: https://github.com/yt-dlp/yt-dlp#configuration
| sudo vim /usr/local/bin/yt-dlp.conf |
注意配置文件内不能有中文字符,否则会报错
| |
| -o '%(title)s.%(ext)s' |
| |
| |
| --write-thumbnail |
| --convert-thumbnails jpg |
| |
| |
| |
| |
| |
| --write-description |
| --write-subs |
| --compat-options no-live-chat |
| |
| |
| |
| |
| |
这里先不设置下载目录,在脚本里设置
| --paths /home/vfly2/youtube |
如果要配合 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 |
| |
| |
| file=$1 |
| filename=${file%.*} |
| nfo=${filename}.nfo |
| description=${filename}.description |
| |
| touch "${nfo}"; |
| cat nfo1.temp > "${nfo}"; |
| |
| 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 |
编辑内容:
需要修改 URLLIST 变量的值,也就是待会保存视频网址的文件的绝对路径。
| #!/bin/bash |
| |
| |
| PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
| export PATH |
| |
| |
| |
| |
| |
| |
| |
| URLLIST="/home/vfly2/ytdlplist" |
| |
| |
| 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) |
| |
| |
| until [ "${URL}" == "${ENDLINE}" ] |
| do |
| |
| /usr/local/bin/yt-dlp ${URL} |
| |
| LINE=$((${LINE}+1)) |
| URL=$(grepline ${URLLIST} ${LINE}) |
| |
| done |
| |
| /usr/local/bin/yt-dlp ${ENDLINE} |
将视频链接保存在 ytdlplist 中:
| vim /home/vfly2/ytdlplist |
一行一个链接
执行脚本(默认下载在当前目录下)
如果每次只下载一两个视频,还需要连接终端、编辑文件并执行脚本,有些繁琐。
本博客之前有一篇介绍网络记事本的文章:分享我使用两年的极简 网页记事本 – 承飞之咎 (vfly2.com),它支持用 curl 抓取内容。
可以通过网络记事本随时保存链接,再用 curl 获取链接,每隔一段时间自动执行脚本下载视频,就可以省去操作。
实时性差些,AhFei 是将下载目录改为 Emby 的媒体库,通过 Emby 观看。这样高质量视频直接就保存了,看完后删去不需要的,不用担心视频被和谐,也不需要单独抽空下载收藏的视频。
类似上面的脚本流程:
| filename="yt-dlp.sh" |
| touch $filename && chmod +x $filename && vim $filename |
除了 URLLIST,还增加了一个变量 WEBLIST ,它的值是网络记事本的网址,这里使用 AhFei 搭建的演示: https://forward.vfly.app/ytdlplist ,将链接复制到这上面,一行一个。
各位读者可以直接使用这个公开实例,或者自行搭建:分享我使用两年的极简 网页记事本 – 承飞之咎 (vfly2.com)
| #!/bin/bash |
| |
| |
| PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
| export PATH |
| |
| |
| |
| |
| |
| |
| URLLIST="/home/vfly2/ytdlplist" |
| WEBLIST="https://forward.vfly.app/ytdlplist" |
| |
| |
| curl -k $WEBLIST > $URLLIST |
| |
| |
| 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) |
| |
| |
| until [ "${URL}" == "${ENDLINE}" ] |
| do |
| |
| |
| /usr/local/bin/yt-dlp ${URL} |
| |
| LINE=$((${LINE}+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 只需要运行一遍下面命令即可,不需要编辑文件复制链接了
原文链接: 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 交流依文章步骤遇到的问题。
没有 RSS 订阅器的话,也可以关注公众号:承飞之咎 了解最新内容。