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+
python --version
安裝 yt-dlp#
一鍵複製運行即可安裝
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
更新
sudo yt-dlp -U
安裝依賴 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
注意配置文件內不能有中文字符,否則會報錯
# 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'
這裡先不設置下載目錄,在腳本裡設置
--paths /home/vfly2/youtube
轉換 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
結合網絡記事本#
如果每次只下載一兩個視頻,還需要連接終端、編輯文件並執行腳本,有些繁瑣。
本博客之前有一篇介紹網絡記事本的文章:分享我使用兩年的極簡 網頁記事本 - 承飛之咎 (vfly2.com),它支持用 curl 抓取內容。
可以通過網絡記事本隨時保存鏈接,再用 curl 獲取鏈接,每隔一段時間自動執行腳本下載視頻,就可以省去操作。
實時性差些,AhFei 是將下載目錄改為 Emby 的媒體庫,通過 Emby 觀看。這樣高質量視頻直接就保存了,看完後刪去不需要的,不用擔心視頻被和諧,也不需要單獨抽空下載收藏的視頻。
類似上面的腳本流程:
filename="yt-dlp.sh"
touch $filename && chmod +x $filename && vim $filename
vim yt-dlp.sh
除了 URLLIST,還增加了一個變量 WEBLIST ,它的值是網絡記事本的網址,這裡使用 AhFei 搭建的演示: https://forward.vfly.app/ytdlplist ,將鏈接複製到這上面,一行一個。
各位讀者可以直接使用這個公開實例,或者自行搭建:分享我使用兩年的極簡 網頁記事本 - 承飛之咎 (vfly2.com)
#!/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 只需要運行一遍下面命令即可,不需要編輯文件複製鏈接了
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 交流依文章步驟遇到的問題。