[Docker] Youtube直播錄影伺服器建置

前言


本文希望建置起能永久自動運作的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執行備份封存

流程簡述

  1. Linux主機之Docker安裝和ReveseProxy建置
  2. git clone下來docker-compose建置檔案和config檔案
  3. 設定要自動錄影的直播頻道
  4. docker-compose up -d

架構

WWW

nginx Server (Reverse Proxy) (SSL證書申請、Renew)
├ Jobber (Cron) (定時檢查磁碟使用率,在高於設定之百分比時,自動由舊起刪除錄影)
├┴ backup-dl (影片備份上傳機)
├ live-dl (直播監控錄影機)
└ youtube-dl-server (WebUI下載器)

建置

Linux主機和Docker安裝

請完成此文的建置章節
琳的備忘手札 [Docker] Linux主機之Docker安裝和ReveseProxy建置
/2020/11/linux-docker-setup-revese-proxy.html
另外,本專案完全可以部屬在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,最後上線前才改false
    • LETSENCRYPT_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_lecontainer停掉
    vim .env
    第一行LETSENCRYPT_TEST改為false
    重做compose
    docker-compose down && docker compose up -d
    檢查是否有成功要到正式證書
    注意紅框處,已沒有_test_字樣

  • 檢查自動錄影是否正常
    查看在../YoutubeRecordings/logs下是否有log輸出,並查看檔案內容
    ls ../YoutubeRecordings/logs
  • 檢查WebUI是否正常
    開啟你在此處設定的網址,看看是否能正常訪問網址

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: (可選)每次執行的最大下載數量,預設為10
    • FORMAT: (可選)自訂欲下載的格式,預設為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
  • 瀏覧至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參數

  1. 產出檔案的完整路徑
  2. 產出檔案之所在資料夾
  3. 影片id
  4. 影片標題
  5. 影片上傳者
  6. 上傳日期

附註: 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檔

32 則留言:

  1. 您好,最近嘗試自己架了伺服器起來
    想請問哪邊能設定下載的畫質嗎?下載好的好像都只有720P

    回覆刪除
    回覆
    1. 在config中可以帶入youtube-dl參數
      預設是會下載最高畫質
      https://github.com/jim60105/docker-youtube-dl/blob/master/config_live-dl.yml#L67

      刪除
  2. 大大您好,
    首先先不好意思@@,我對程式語言還在摸索,有幾個問題想詢問一下:
    1. 請問大大提供的這個和Live-dl差別是只在於自動刪檔嗎?因為我在想Live-dl本身不關掉似乎就是永久自動備份?

    2. 最近只有在MacOS成功執行Live-dl,但Windows怎麼試不知為何都無法,我在想大大所提供的和Live-dl是否是代表只能在Linux和MacOS環境下進行?但看大大的照片似乎是在Windows環境下進行的(附註下面的照片似乎是windows?),忽然抱持希望想問一下。
    (Windows我都有下載Live-dl所需的Dependencies,但都說No platform/architecture supported, please install it manually.)

    3. 請問自動抓到的實況檔案出現的json和log的意義是?我刪除後也不會讓影片出錯,所以想說這個有需要留存嗎?

    不好意思問題有點多,若大大有閒時間再回覆就好。
    感謝感謝m(_ _)m

    回覆刪除
    回覆
    1. 1. 這個專案下就使用到live-dl,但是是我自己魔改過的版本。像是支援cookie登入、ts改成mp4,詳見commit log https://github.com/jim60105/live-dl
      2. 建議了解一下什麼是docker
      3. json是在下載的影片資訊;log是下載記錄,可以不用留

      刪除
    2. 謝謝回覆,我用VM裝了Ubuntu後照著大大的流程走,過程滿順利,但目前卡在一個點,請問「HOST: WebUI網址」指得是什麼網址?我看大大是用自己本身的blog的網址...而我就沒改了,直接用live-dl.domain.com。
      但在執行docker logs proxy_le -f的時候,等很久後跳出Verify error, please check log file.

      另外想請問一下這版的live-dl的實況錄製時間是否也是6小就會斷開?因為有時候vtuber會開超過6hr...上網找都沒找到解決方法QQ

      謝謝。

      刪除
    3. 1. 建議了解有關網域名稱、SSL憑證(我的專案下是用Let's Encrypt)。SSL不是必要的。
      2. 是這個issue吧 https://github.com/sparanoid/live-dl/issues/1
      就說明,6H似乎是youtube連結的有效期
      我在直播錄制上不是用streamlink而是youtube-dl,我不確定youtube-dl有沒有handle這個,但我猜hls應該沒有這個問題
      另外因為有自動重命名功能,不會有檔案覆寫狀況,再怎樣頂多是6H後斷開寫新的檔
      我沒有實測過6H,沒有肯定回答

      刪除
    4. 請問這個意思是要去申請自己的網域才能進行後續的步驟嗎?

      刪除
    5. 沒用網域reverse proxy沒得做routing
      你可以修改docker-compose file,把port開出去直接從ip:port連,就不使用reverse proxy了

      刪除
  3. 您好,首先感謝您慷慨分享該套件組合,讓我們可以方便的備份可能被版權掃到逝去的歌回。
    因為近期才架設起來,手上的VT還尚未有會員直播,想請教一下,關於本套件是否有辦法針對會員限定做監控並監錄?
    另外想請教關於Callback在直播結束後重新再下載這方面的,是會將直播完整再下載?
    還是說假設如果開始錄製的時間已在直播開始後10分鐘,僅會重新下載直播後10分鐘開始的區塊?
    問題有點多但不太懂程式語言,所以打了較長的文章來做詢問,真是非常抱歉。

    回覆刪除
    回覆
    1. 是否有辦法針對會員限定做監控並監錄
      A: 沒辦法,live-dl是檢查「頻道網址/live」頁面,而會限直播不會連到這裡
      Callback是會將直播完整再下載?
      A: Youtube的DASH下載只有最後的兩小時:兩小時內的直播是完整的,超過兩小時的就只有最後的兩小時。剩下的要等它算完影片才有提供完整下載。所以這個重載callback主要是對應interval漏掉的開頭20秒和直播中斷訊,如果直播超過兩小時就不太適用。

      刪除
    2. 好的,感謝您的回應。
      在live-dl的修改LOG內看到貌似有預計新增Discord的通知機制,期待大大的功能上線><
      再次感謝您開慷分享QAQ

      刪除
    3. Discord通知上個月底有別人實作了,但我還沒去看
      之後把它撿進來

      刪除
    4. 您好,又來打擾您了,想請教最近更動的版本是否已經完成可以使用?
      如果您已經完成了,我再來重新架設一次並更動為新版的版本,期待您的回覆,謝謝。

      刪除
    5. Discord通知功能撿是撿進來了,但我還沒測,我最近在寫backup-dl
      backup-dl要設定Blob Storage會比較進階,可能之後才會寫文件

      刪除
    6. 剛剛有嘗試裝起來了,這次的版本是不是更改為從追蹤到剛開始直播的才會通知和啟用錄影的模式?
      上次的版本貌似是在開啟監控前,如果已經先開始直播的話,在系統開啟後一樣會通知和開始錄影需要監控的頻道。
      TG通知目前都正常,錄影應該也是有錄影,但測試時程可能要加長不能有太快速的,Discord通知功能我可能還要研究一下設定><

      刪除
    7. 另外backup-dl要設定Blob Storage這個我比較沒有理解用途,是要將錄影好的上傳至雲端這種用途嗎@@?
      目前我的備份方式是將想要備份的檔案複製到Google共用雲端上。

      刪除
    8. live-dl除了加上Discord通知以外沒有其它改變
      backup-dl是下載頻道裡所有影片的非dash格式,然後上傳到Blob Storage,用途是要備一份畫質格式最好的影片做封存

      刪除
    9. backup-dl 有辦法讓他下載到local端就好嗎

      刪除
    10. 冰霜 不行,它不是這樣設計的
      上傳至Blob Storage是核心功能之一,不大幅調整是拆不開的

      刪除
  4. 大大您好,真的很感謝您做出了這麼方便的容器
    想冒昧的請教您一下,是否有參數或是可以調整的地方,讓live-dl可以給使用者自行選擇要不要輸出 json/log/metadata,以及ffmpeg轉檔的影片格式呢?

    回覆刪除
    回覆
    1. 如果用skip_metadata的話,會連嵌入的影片封面和影片資料也一起不寫,這部份的功能是做在一起的
      輸出格式是寫死mp4,你可以再寫個batch放進callback.sh讓它載完後再轉檔

      刪除
    2. 了解@@!!!! 感謝您的回答!

      刪除
  5. 好奇你怎麼做到自動開始錄製直播的?
    你掃描的頻率是每幾分鐘就去掃說有開直播的嗎?
    因為有時候可能開了待機所有會突然刪掉之類的問題

    回覆刪除
    回覆
    1. 每十秒檢查一次 https://www.youtube.com/channel/{ChannelID}/live 這個網址

      刪除
    2. 感謝解惑,另外想問一個問題。最近在用 yt-dlp 搭配 live-from-start 下載歌回
      但因為不留檔,它最後都會 fail 不能最後正常的 merge 在影片檔內,這有方法解嗎?
      還是建議不留檔的歌回直接用 ytarchive 嗎?

      刪除
    3. 不留檔的歌回直接用 ytarchive
      >> 是

      https://github.com/yt-dlp/yt-dlp/issues/2137
      最新那個回覆是你? 就是這個Open issue
      這件事我在另一篇文中有提到: https://blog.maki0419.com/2022/01/youtube-download-ytdlp-ffmpeg.html

      刪除
  6. 感謝您提供這個教學
    然後在get會限直播url
    我有看一下別人寫的discord bot
    是使用https://www.youtube.com/feeds/videos.xml?channel_id=
    這種方式取得url
    給您做個參考

    回覆刪除
    回覆
    1. 這是RSS feed,我自己也有在用 (用在Facebook粉專的新影片通知轉發)
      它只會廣播公開影片而已,不會有會限影片
      除非直播主作了「影片先以公開影片上架,然後才轉會限」這樣的操作才會被廣播

      刪除
    2. 具體的證明,現時點可以查看這個feed
      https://www.youtube.com/feeds/videos.xml?channel_id=UCD1QOCJIAPsMKMvRSXjLahw
      這一部會限影片不在裡面
      https://www.youtube.com/watch?v=jjX-gldVnZo

      刪除
    3. 同場加映,這是Youtube自動產生的會限影片清單
      https://www.youtube.com/playlist?list=UUMOD1QOCJIAPsMKMvRSXjLahw
      只要把UUMO後面代換成頻道id UC後面的內容就行了

      但是因為它在「直播結束後」才會有影片,所以不能用在錄檔,只能用在備份而已

      刪除
    4. 這個我倒沒有注意到
      感謝您的確認

      刪除

本站遭到垃圾留言(病毒連結)攻擊,開啟審核模式。留言後並不會馬上公開顯示。

目錄