_youtube_converter.py · _wikipedia_converter.py · _rss_converter.py · _zip_converter.py · _epub_converter.py · _outlook_msg_converter.py這家族分兩種:URL 專用 converter(YouTube / Wikipedia / RSS)在 accepts
裡看 stream_info.url 決定接單,只取正文/標題/字幕;容器 converter
(ZIP / EPUB / Outlook .msg)把一包東西拆開遞迴處理。
accepts 看 URL 是否 youtube.com / youtu.be。convert
用 youtube-transcript-api 抓字幕(需要 [youtube-transcription] extra),
並抓頁面 meta 取標題/描述。有趣的工程細節:
_findKey(json, key) — 遞迴搜尋 YouTube 嵌入 JSON 的巢狀 key。_retry_operation — 對容易失敗的網路操作做 3 次重試、延遲 2 秒。URL 以 wikipedia.org/wiki/ 開頭才接;convert 抓頁面後
只保留正文節點,丟掉導覽/側欄/頁尾——這是「專用 converter 為何存在」的最佳例子。
_check_xml 先偷讀串流前幾個位元組確認是 <?(XML);
_feed_type 依 root element 判斷 rss 或 feed(Atom),
再分派到 _parse_rss_type / _parse_atom_type,輸出各項目標題/連結/內容。
constructor 接收 markitdown 本身(拿來遞迴轉換子檔);accepts 看
application/zip / .zip。輸出以 ## File: <路徑> 分節、
維持原始結構、結束後清理暫存目錄(tempfile.TemporaryDirectory)。
用 defusedxml.minidom 安全解析:META-INF/container.xml 找
content.opf 路徑 → 解析 metadata(title/authors/language…)與 manifest/spine →
依 spine 順序把每章 XHTML 用內部的 HtmlConverter 轉 Markdown。輸出最前面插入
**Title:** ... 中繼資料。
docstring 特別提到它是「accepts 需要讀 stream 才能判斷」的例子——判斷 .msg 的 OLE 結構後 務必把 stream 位置復原。輸出 From/To/Subject 標頭 + 內文。