前言
本文希望建置起能永久自動運作的 Youtube 直播備份機
本專案包含三個部份:
- youtube-dl-server: 這是一個網頁 UI 界面,可以手動執行下載
- live-dl: 直播中錄播,用來對應版權砲、下播即砍,等等的狀況
- backup-dl: 定期封存所有影片,下載 Youtube 算完影片後較高品質的檔案
此專案目標為 「自動化影片備份」,盡量保存最好的影片,若砍檔我還有一份錄播的
記錄下我推的每分每秒
概觀
本專案核心目標
- 以 docker-compose 技術,將建置 server 的難度維持在... 還可以?
- 監控指定的頻道,直播時自動錄製功能
- 磁碟滿時自動刪除錄播檔
- 能手動下載指定影片
- 定期備份 Youtube 已算完的影片,並上傳封存
本文適合對象
- 初級以上的 linux 操作基礎
- 有自己的主機或 NAS,沒有可以現在租 (不然你東西想放哪裡?)
功能說明
- 手動下載會儲存在主機的
../YoutubeRecordings/
之下,可以在 docker-compose.yml 修改 - 可以在錄影完成後執行 callback bash script
- Jobber 會在每日的 01:00 UTC 檢查磁碟使用率,並由舊檔案刪起,直到磁碟使用率降到設定值 (或直到沒有檔案)
- Jobber 會每日喚醒 backup-dl 執行備份封存
流程簡述
- Linux 主機之 Docker 安裝和 ReverseProxy 建置
- git clone 下來 docker-compose 建置檔案和 config 檔案
- 設定要自動錄影的直播頻道
- docker-compose up -d
架構
WWW
│
nginx Server (Reverse Proxy) (SSL 證書申請、Renew)
├ Jobber (Cron) (定時檢查磁碟使用率,在高於設定之百分比時,自動由舊起刪除錄影)
├┴ backup-dl (影片備份上傳機)
├ live-dl (直播監控錄影機)
└ youtube-dl-server (WebUI 下載器)
建置
Linux 主機和 Docker 安裝
請完成此文的建置章節
另外,本專案完全可以部屬在 Windows10 機器上,以圖為證
請自行轉換所有步驟在 Windows 執行
live-dl、youtube-dl-server 建置
cd 到欲儲存影片的位置,例如我想放在
/YoutubeDL
mkdir /YoutubeDL && cd /YoutubeDL
git clone 專案
git clone https://github.com/jim60105/docker-youtube-dl.git
本專案有 submodule
如果想要 build docker image,請用git pull --recurse-submodules
進入 docker-youtube-dl 資料夾
cd docker-youtube-dl
填入.env 檔案
cp .env_sample .env && vim .env
LETSENCRYPT_TEST
: 此為設定申請測試 SSL 證書,現在給 true,最後上線前才改 falseLETSENCRYPT_EMAIL
: Let's Encrypt 在證書到期時通知你用的 email,不會透過這個做驗證。建議正確填入。HOST
: WebUI 網址DelPercentage
: 超過時要執行刪除功能的磁碟使用百分比
(此處請按照你的磁碟大小估算。例如,我的磁碟大小是 25G,我希望留下的空間至少為 3G,3G / 25G = 12%,設定為 88)
編輯
config_live-dl.yml
在 map 下建立名稱對應表,此表用於自動錄播時的資料夾建立vim config_live-dl.yml
參考
Monitor/tama.sh
建立要做自動錄影的頻道,所有 Monitor 資料夾下的檔案都會被執行
(資料夾內可以建立多個.sh 檔)
請自行為不同頻道替換 Youtube URL 和 Channel Name 的內容
目前內建的直播錄影設定的是久遠たま的頻道cp Monitor/tama.sh Monitor/{{Channel Name}}.sh vim Monitor/{{Channel Name}}.sh
內容
nohup /bin/bash live-dl {{Youtube URL}} &>/youtube-dl/logs/live-dl-{{Channel Name}}.$(date +%d%b%y-%H%M%S).log &
給所有
*.sh
執行權限find ./ -type f -iname "*.sh" -exec chmod +x {} \;
起機囉~~
docker-compose up -d
檢查 Container 是否都有起來
docker ps -a
檢查 SSL 是否成功
docker logs proxy_le -f
注意紅框處,這樣就是成功
將 SSL 申請改為正式申請
附註
因為 Let's Encrypt 針對網域正式申請有次數限制
不論成功與否,做太多次就會鎖住
發布前一定要測試成功再轉正或者,若你不需要 SSL 就把
proxy_le
container 停掉vim .env
第一行
LETSENCRYPT_TEST
改為false
重新啟動 composedocker-compose down && docker compose up -d
檢查自動錄影是否正常
查看在../YoutubeRecordings/logs
下是否有 log 輸出,並查看檔案內容ls ../YoutubeRecordings/logs
檢查 WebUI 是否正常
開啟你設定的 HOST 網址,看看是否能正常訪問網址
backup-dl 建置
提示
Backup 的封存位置是 Azure Blob Storage,不是每個人都適用
相關設定全都是註解狀態,你要用再打開
在 Azure 開一個 Blob Storage,直到取得 ConnectionString
這有點複雜,且本文的重點不在這裡,請參照官方文件編輯 docker-compose.yml,把 backup-dl,和 jobber 下半部份取消註解
vim docker-compose.yml
編輯.env 檔案,填入要下載的頻道和連接字串
vim .env
CHANNELS_IN_ARRAY
: Azure Blob Storage 的連接字串AZURE_STORAGE_CONNECTION_STRING_VTUBER
: 欲下載的頻道網址,以陣列傳入HOST
: WebUI 網址MAX_DOWNLOAD
: (可選) 每次執行的最大下載數量,預設為 10FORMAT
: (可選) 自訂欲下載的格式,預設為 bestvideo+bestaudio/best,請參考 yt-dlp 說明文件
重新啟動 docker-compose
docker-compose down && docker-compose up -d
檢查 log 看是否成功啟動,有沒有進入下載
docker-compose logs -f
附註: 下載會員限定影片
此專案支援以 youtube-dl 的 cookies file 方式登入,可以下載會限影片
(youtube-dl 的帳密登入從 2019 bug 到現在都沒有修好)
- 安裝瀏覧器擴充功能,以匯出 Netscape HTTP Cookie File
- Chrome: Get cookies.txt LOCALLY
- Firefox: cookies.txt
- 瀏覧至 Youtube 網頁,登入你的帳號
- 以擴充功能匯出
youtube.com
網域的所有 cookie - 將匯出之 cookie 檔案重命名為
cookies.txt
- 取代專案目錄下的 cookies.txt 檔或用於後述的 volume bind
注意
此 cookies file 包含了你的 Youtube 登入授權
任何人只要取得這個檔案,即可由你的身份登入 Youtube
請務必妥善保管,把它當成你的帳號密碼看待
附註: 不部屬之單次執行 live-dl
若要單次執行而不部屬,可直接 docker run
我有 build 了 image 在此: https://github.com/users/jim60105/packages/container/package/live-dl
例如
docker run --rm
-v D:\YoutubeDownload:/youtube-dl
-v D:\YoutubeDownload\cookies.txt:/usr/src/app/cookies.txt
ghcr.io/jim60105/live-dl https://www.youtube.com/watch?v=GDOQTShjTQs
此格式如下
將 {{}} 填入你的內容,若不需要登入就不用傳入 cookies file
cookies file 之相關說明請見上一節
docker run --rm
-v {{影片儲存資料夾}}:/youtube-dl
-v {{cookies file,用於登入驗證}}:/usr/src/app/cookies.txt
ghcr.io/jim60105/live-dl {{Youtube網址}}
附註: 錄影完成 Callback
附註
本專案提供的 download_again.sh ,能在下載完成後等待一分鐘,再下載第二次
由於串流中錄影容易有漏秒,所以我會在「直播結束後至 Youtube 版權砲前」再下載一次
callback.sh 傳入之參數
__info "Calling callback function..."
local cmd=( "$CALLBACK_EXEC" "${OUTPUT_PATH}.mp4" "$BASE_DIR/" "$VIDEO_ID" "$FULLTITLE" "$UPLOADER" "$UPLOAD_DATE" )
nohup "${cmd[@]}" &>> "$OUTPUT_PATH.log" &
bash 參數
- 產出檔案的完整路徑
- 產出檔案之所在資料夾
- 影片 id
- 影片標題
- 影片上傳者
- 上傳日期
附註: Logging 相關設定
本專案 logging 經過調整,可搭配 Seq Log Server 使用 (或是任何支援 GELF http post 的 log server)
- 參考這個 repo 部屬 Seq: https://github.com/jim60105/docker-Seq
- .env 正確設置 LOGSERVER 路徑,格式為
IP:埠號
- Monitor/*.sh 註解掉 File logging,改用「STDOUT logging (with log tag)」方式呼叫
- download_again.sh 註解掉 File logging,改用「Docker logs logging (with log tag)」方式呼叫
- 啟動指令改用
docker-compose -f docker-compose.yml -f docker-compose.log-server.yml up -d
或是將docker-compose.log-server.yml
重命名為docker-compose.override.yml
,使docker-compose up -d
可以自動應用 override 檔