2021年10月19日 星期二

Python 筆記 - 研究 yt-dlp / youtube-dl 流程與開發方式

幫同事查了一下程式邏輯,下手的方向:
  • 入口點在哪
  • 到底怎樣跑
  • 我要怎樣擴充或貢獻一個影音網站 extractor
github.com/yt-dlp/yt-dlp 來看,入口點就直接看 yt-dlp.sh 即可:

% git clone https://github.com/yt-dlp/yt-dlp
% cd yt-dlp 
% python3 yt_dlp/__main__.py 
Usage: __main__.py [OPTIONS] URL [URL...]

__main__.py: error: You must provide at least one URL.
Type yt-dlp --help to see a list of all options.

接著掃一下 yt_dlp/__main__.py 和 yt_dlp/__init__.py 就略懂他在處理 command line 的參數,而程式的本體是在 yt_dlp/YoutubeDL.py 檔案,一樣在追個 yt_dlp/YoutubeDL.py 裡的 class YoutubeDL 中的 def __init__() 裡,可以看到 self.add_default_info_extractors() 這步,如此就把 yt_dlp/extractor/ 眾多網站影音分析爬蟲狀態初始化好。

接著,給予一則影音網站連結:

% python3 yt_dlp/__main__.py https://www.facebook.com/UserID/videos/VideoID/

程式就會在 yt_dlp/YoutubeDL.py extract_info() 分析做事,像是把所有 extractor 都瀏覽一次,透過呼叫 ie.suitable(url) 的機制判斷。這時可以對應在 yt_dlp/extractor/common.py 中,看到 class InfoExtractor(object) 裡的 suitable() 定義並用 _match_valid_url() 和 _VALID_URL 實作,這時回去猜 yt_dlp/extractor/facebook.py 時,找不到 suitable() 也找不到 _match_valid_url() 時,就可以猜應該是 _VALID_URL 的實作方式了。

回到 yt_dlp/YoutubeDL.py 時,在 extract_info() 分析做事時,找到合適的 extractor 後,就會立即靠 ie.extract(url) 解析,而實際實作是靠 _real_extract()。再找一下 yt_dlp/extractor/facebook.py 中是否有定義 extract() 或 _real_extract(),即可當作解析網站的程式邏輯入口點。

最後,想要擴充某個網站或是修補加強某個網站,就可以去改對應的 extractor 了。並且可以把在當前目錄下,不斷靠 yt-dlp.sh 去實測,也滿方便的。

沒有留言:

張貼留言