2024年11月10日 星期日

開發 yt-dlp 應用的好幫手 cli_to_api.py

2024年11月10日 星期日

無論是 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 這工具的強大。

相關連結


沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket