yt-dlp筆記

yt-dlp 筆記 

安裝:

Homebrew安裝,和apt指令類似。往後更新也是直接用Homebrew upgrade即可。

#!/bin/bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install youtube-dl ffmpeg ffprobe
brew upgrade yt-dlp

環境:

#!/bin/bash
sudo diskutil mount /dev/disk7s1 /Volumes/Jet330

設置:

#!/bin/bash
nano /etc/yt-dlp.conf
# Lines starting with # are comments

# Always extract audio
-x

# Do not copy the mtime
#--no-mtime

# Use this proxy
#--proxy 127.0.0.1:3128

# 存到外接硬碟F碟的ydl目錄內
#-o ~/mnt/f/ydl/%(title)s.%(ext)s
# 存到外接硬碟Jet330的yt-dlp目錄內,並依照清單建立子資料夾
-o ~/Volumes/Jet330/yt-dlp/%(playlist)s/%(title)s.%(ext)s

音檔(mp3)指令:

#!/bin/bash
yt-dlp -x --audio-format mp3 --embed-thumbnail --add-metadata -c -i -a <playlist file> --download-archive archive.txt

影檔(mp4)指令:

#!/bin/bash
yt-dlp -f 'bestvideo+bestaudio[ext=m4a]' --merge-output-format mkv -c -i -a yt-dlp.txt --download-archive archive.txt

進一步了解 

壹、用指令下載音樂

$ yt-dlp
    -x                                  # 萃取聲音
    --audio-format mp3                  # 聲音格式 mp3
    --embed-thumbnail                   # 擷取縮圖
    --add-metadata                      # 置入metadata
    -c                                  # 續傳
    -i                                  # 忽略錯誤訊息
    -a                                  # 呼叫批次檔案
    <Play-List-Txt>                     # 影片網址,一行一個,存成文字檔
    --downloaded-archive archive.txt    # 下載紀錄

貳、用指令下載影片

$ yt-dlp
    -f 'bestvideo+bestaudio[ext=m4a]'   # 指定影片格式,小寫
    --merge-output-format mkv           # 合併成mkv
    -c                                  # 續傳
    -i                                  # 忽略錯誤訊息
    -a                                  # 呼叫批次檔案
    <Play-List-Txt>                     # 影片網址,一行一個,存成文字檔
    --downloaded-archive archive.txt    # 下載紀錄

參、更新下載
全更新:

$ yt-dlp  xxx                        # 相關設定不再贅述
    --downloaded-archive archive.txt    # 這紀錄是關鍵

按時間、按最新來更新:(例子是下載7天內最新10部)

$ yt-dlp xxx                        # 相關設定不再贅述
    --downloaded-archive archive.txt    # 這紀錄是關鍵
    --dateafter now-7days               # 7天內
    --playlist-end 10                   # 最新10部

過程
單一音樂轉mp3、縮圖、metadata

yt-dlp -x --audio-format mp3 --embed-thumbnail --add-metadata <audio-URL>

大多數的情況下,取聲音、最佳音質,用mp3格式這樣就行了。

yt-dlp -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 <audio-URL>

在某些情況下,會轉成m4a

yt-dlp -f bestaudio  <audio-URL> --exec "ffmpeg -i {}  -codec:a libmp3lame -qscale:a 0 {}.mp3 && rm {} "

簡單到不可思議的播放清單下載

yt-dlp -i <playlist ID>

但是非常任性的下載了最好品質的mkv,如果是下載舌尖上的中國很好,但我只是下載幾首老歌,還是給我mp3吧。

yt-dlp -x --audio-format mp3 --embed-thumbnail --add-metadata -i <playlist ID>

那能不能一次下載多個PlayList?然後記住哪些下載過了。下次再執行相同指令的時候,只會下載相同清單裡,尚未下載的部分。而且,這樣做的另一個好處是,只需要更新<playlist file>

yt-dlp -x --audio-format mp3 --embed-thumbnail --add-metadata -c -i -a <playlist file> --download-archive archive.txt

不介意影片檔案格式是mkv的話,下載影片相對簡單。但如果有檔案格式、大小、字幕、或其他更多需求,就得理解影片和音樂的差異。若想同時指定聲音和影像的格式,比方:選擇最佳影像和最佳聲音,並且合併成mp4。

yt-dlp -f 'bestvideo+bestaudio[ext=m4a]' --merge-output-format mp4 <URL>

具體來說,可以歸納成這樣的指令:

yt-dlp -f 'bestvideo+bestaudio[ext=m4a]' --merge-output-format mkv -c -i -a yt-dlp.txt --download-archive archive.txt

或者,最好畫質、最小容量(從左至右依序選擇)

yt-dlp -f 303+251/best --merge-output-format mkv -cia yt-dlp.txt --download-archive archive.txt

註1:mkv可以替換為mp4,ogg,webm或flv。
註2:yt-dlp.txt可替換為任何文字檔案名。
註3:想重新下載,可移除archive.txt內任一下載紀錄或直接移除archive.txt。

支援下載網站

進階1 

ffmpeg指令

影片有幾個進階的做法,比方說,擷取影片中的一小段來做展示或說明:

ffmpeg -ss 開始時間 -t 長度 -i 來源檔案.mp4 -acodec copy -vcodec copy 輸出檔案.mp4

把影片檔轉成聲音檔:

ffmpeg -i video.mp4 audio.mp3

mp3第5秒起,剪30秒。(如:手機鈴聲)

ffmpeg -ss 5 -i input.mp3 -t 30 output.mp3

mp3去掉前30秒。

ffmpeg -ss 30 -i input.mp3 outputfile.mp3

註1:-ss 是從檔案的第幾分幾秒開始處理
註2:-t 是指要處理多少時間
註3:時間格式 hh:mm:ss


比方一部影片檔案分割成2個檔案,分別執行:
前1小時,切成一個獨立檔案:

ffmpeg -t 01:00:00 -i input.mp4 -acodec copy -vcodec copy output1.mp4

第2個小時到最後,切成一個獨立檔案:

ffmpeg -ss 01:00:00  -i input.mp4 -acodec copy -vcodec copy output2.mp4

進階 2 

自動化 

步驟:

  1. 創建腳本檔案 (download_audio.sh):
    在終端機中執行:

    nano ~/download_audio.sh
    

    貼入以下內容:

    #!/bin/bash
    
    # 設定 yt-dlp 指令
    youtube_dl_command='yt-dlp -x --audio-format mp3 --embed-thumbnail --add-metadata -c -i -a /ydl_a_20250603.txt --download-archive /archive.txt'
    
    # 設定儲存目錄
    output_dir="/Desktop/yt-dlp"
    
    # 確保儲存目錄存在,如果不存在則創建它
    mkdir -p "$output_dir"
    
    # 切換到儲存目錄下執行 yt-dlp,這樣下載的檔案會直接儲存在該目錄
    cd "$output_dir"
    
    # 執行 yt-dlp 指令
    eval "$youtube_dl_command"
    
    echo "音訊下載完成於 $(date)"
    
  2. 使腳本可執行:
    在終端機中執行:

    chmod +x ~/download_audio.sh
    
  3. 創建 launchd 配置文件 (com.yourname.downloadaudio.plist):
    在終端機中執行:

    nano ~/Library/LaunchAgents/com.yourname.downloadaudio.plist
    

    貼入以下內容(請將 /Users/你的使用者名稱/download_audio.sh 替換為你的實際腳本路徑):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "[http://www.apple.com/DTDs/PropertyList-1.0.dtd](http://www.apple.com/DTDs/PropertyList-1.0.dtd)">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.yourname.downloadaudio</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/你的使用者名稱/download_audio.sh</string>
        </array>
        <key>StartInterval</key>
        <integer>86400</integer>
        <key>StandardErrorPath</key>
        <string>/tmp/download_audio.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/download_audio.log</string>
    </dict>
    </plist>
    
  4. 載入 launchd 配置:
    在終端機中執行:

    launchctl load ~/Library/LaunchAgents/com.yourname.downloadaudio.plist
    

這樣就設定完成,你的 yt-dlp 指令將會每天自動執行,並將音訊檔案儲存到 /Desktop/yt-dlp 目錄下。