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

2020/12/16 監控程式
live-dl程式在12/12掛了,大概是因為Youtube改動頁面
我上次發的issue下有人提供了替代方案,目前測起來能用
youtbe-dl-server的module reload issue也修了
這兩個我都更新了image,請做docker-compose pull

前言


本文希望建置起能永久自動運作的Youtube直播備份機
此專案目標定位為「錄影備份」,在發生直播主事後砍檔/砍歌時,我才會到伺服器尋找備份
是故,本專案不著重在錄影後的檔案處理,而是在磁碟滿時做自動刪檔

概觀

本專案核心目標

  • 以docker-compose技術,將建置server的難度維持在...還可以?
  • 監控指定的頻道,直播時自動錄製功能
  • 磁碟滿時自動刪檔功能
  • 也能手動下載指定影片

本文適合對象

  • 初級以上的linux操作基礎
  • 有自己的主機或NAS,沒有可以現在租 (不然你東西想放哪裡?)

功能說明

  • 手動下載會儲存在主機的 ../YoutubeRecordings/ 之下,可以在 docker-compose.yml修改
  • 可以在錄影完成後執行callback bash script
  • Jobber會在每日的01:00 UTC檢查磁碟使用率,並由舊檔案刪起,直到磁碟使用率降到設定值(或直到沒有檔案)

流程簡述

  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) (定時檢查磁碟使用率,在高於設定之百分比時,自動由舊起刪除錄影)
├ live-dl (直播監控錄影機)
└ youtube-dl-server (WebUI下載器)

建置

Linux主機和Docker安裝

請完成此文的建置章節
琳的備忘手札 [Docker] Linux主機之Docker安裝和ReveseProxy建置
/2020/11/linux-docker-setup-revese-proxy.html
另外,本專案完全可以部屬在Windows10機器上,以圖為證
請自行轉換所有步驟在Windows執行

live-dl建置

  • cd到欲儲存影片的位置,例如我想放在/YoutubeDL
    mkdir /YoutubeDL && cd /YoutubeDL
  • git clone專案
    git clone https://github.com/jim60105/docker-live-dl.git
    本專案有submodule
    如果想要build docker image,請用git pull --recurse-submodules
  • 進入docker-live-dl資料夾
    cd docker-live-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 -v && docker compose up -d
    檢查是否有成功要到正式證書
    注意紅框處,已沒有_test_字樣

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

附註: 下載會員限定影片

此專案支援以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
務必妥善保管

附註: 不部屬之單次執行

若要單次執行而不部屬,可直接docker run
我有build好了image在此: https://hub.docker.com/r/jim60105/live-dl

例如

docker run --rm
        -v D:\YoutubeDownload:/youtube-dl
        -v D:\YoutubeDownload\cookies.txt:/usr/src/app/cookies.txt
        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
        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. 上傳日期

沒有留言:

張貼留言