無論是 youtube-dl 或是後繼的分支 yt-dlp 都是用來下載網站影音的好工具,各大知名的影音網站都支援,真的是「超級強」,唯一的缺點它是屬於命令列的工具(對不畏懼指令的人,反而更能把 yt-dlp 的特色完全發揮)。如果不想面對指令,我也弄了一個只要填填資料就能用的,放在這篇文章中,可以試試看:
上面這個小工具是在 Google Colab 的虛薿機以 Python 來處理表單資料,再使用 yt-dlp 的模組來執行影音下載及後續的處理,
關於 yt-dlp 在下指令時,可用的功能選項語法,可以參考官方的說明:
模組中的應用方式可以參考 yt-dlp 的官方說明:
一開始,我以為就是將命令模式用的參數套到模組中就好了,很簡單嘛!哈~真的是太單純了!yt-dlp 的參數包羅萬向,有的參數是用在前端,有的參數是用在後端;同一個功能,名稱及所屬的階層亦不同。感覺直接下指令好像單純一點。
例如,下載影片後,只想儲存 mp3 聲音檔(如果使用預設工具,它是在最後時以 FFmpeg 來進行轉檔),在命令列中使用的是這樣的參數:
--extract-audio --audio-format mp3
但是在 Python 中使用 yt_dlp 模組時,最少必須在設定中使用:
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
}]
哈!當初為了這個卡關很久,因為一開始,要嘛去搜尋別人的討論或心得;不然就是直接追 yt-dlp 的原始碼。有收穫,但是花了很多時間。
重點來了!昨天在這個網頁中找到了寶:
裡面提到了有一個名為「cli_to_api.py」的工具:
我們只要將在下 yd-dlp 命令時用的參數給 cli_to_api.py ,它就會提供轉換的建議,可以輕鬆地應用在 Python 中。例如,我輸入:
python cli_to_api.py --extract-audio --audio-format mp3
它就給我這樣的內容:
The arguments passed translate to:
{'final_ext': 'mp3',
'format': 'bestaudio/best',
'postprocessors': [{'key': 'FFmpegExtractAudio',
'nopostoverwrites': False,
'preferredcodec': 'mp3',
'preferredquality': '5'}]}
Combining these with the CLI defaults gives:
{'extract_flat': 'discard_in_playlist',
'final_ext': 'mp3',
'format': 'bestaudio/best',
'fragment_retries': 10,
'ignoreerrors': 'only_download',
'postprocessors': [{'key': 'FFmpegExtractAudio',
'nopostoverwrites': False,
'preferredcodec': 'mp3',
'preferredquality': '5'},
{'key': 'FFmpegConcat',
'only_multi_video': True,
'when': 'playlist'}],
'retries': 10}
真的是太令人感動了!愛死開源的社群了,讓人功力馬上大增!
另一個例子,如果想讓 yt-dlp 可以將有分章節的 YouTube 影片,下載後一個章節儲存一個檔案,命令列可以使用這個參數:
--split-chapters
使用 cli_to_api.py 來轉換一下:
The arguments passed translate to:
{'postprocessors': [{'force_keyframes': False, 'key': 'FFmpegSplitChapters'}]}
Combining these with the CLI defaults gives:
{'extract_flat': 'discard_in_playlist',
'fragment_retries': 10,
'ignoreerrors': 'only_download',
'postprocessors': [{'force_keyframes': False, 'key': 'FFmpegSplitChapters'},
{'key': 'FFmpegConcat',
'only_multi_video': True,
'when': 'playlist'}],
'retries': 10}
關鍵的設定是:
{'postprocessors': [{'force_keyframes': False, 'key': 'FFmpegSplitChapters'}]}
真是要命!害我鬼打牆,一直以為用「'split_chapters': True」,然後下指令明明成功了,在 Python 中,就是沒效果。
另外,以 chapters 儲存為什麼檔名的語法,順便筆記一下,命令列的參數:
-o "chapter:%(title)s-%(section_number)02d-%(section_title)s.%(ext)s"
用在 embedding 時:
'outtmpl': {'chapter': '%(title)s-%(section_number)02d-%(section_title)s.%(ext)s'}
怕檔名有用到特列的字,保險一點,還可以再加上 --windows-filenames 參數:
'windowsfilenames': True
有了 cli_to_api.py 這個小工具,真的是幫了大大的忙,讓人可以更體驗到 yt-dlp 這工具的強大。