AhFei

AhFei

简洁的写作需要勇气

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)

下面是它結合網絡記事本方便日常使用的演示。

image


通觀全局(以 /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 交流依文章步驟遇到的問題。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。