_stream_info.py · _uri_utils.py · _exceptions.py這三個檔案是核心的「周邊積木」:StreamInfo 是整個調度系統流通的資料結構
(graphify 掃描顯示它是全圖連線數最多的 god node,154 條邊);_uri_utils 負責
file:/data: URI 的解析;_exceptions 定義例外層。
六個欄位都可為 None:mimetype / extension / charset / filename / local_path / url。
frozen=True(不可變)+ kw_only=True——安全且防錯位。
來源:本機路徑、URL、HTTP header(Content-Type/Content-Disposition)、或呼叫端手動提供。
因為 frozen,要「在既有線索上補強」就得複製。邏輯:asdict 當基底,
對傳入的 StreamInfo 只蓋非 None 欄位、對 kwargs 全部蓋上。這是 _convert 各入口
疊加猜測的核心工具。
用 urllib.request.url2pathname 解出 path;netloc 非空且非 localhost 時
convert_uri 會拒絕(防 file://evil-host/... 這種繞路)。
處理 data:<mimetype>;charset=...;base64,<payload> 格式,
解 base64 後回傳,供 convert_uri 丟給 convert_stream。
讓呼叫端可以「一個 except 抓全部 MarkItDown 錯誤」。
MissingDependencyException 是「優雅降級」的訊號——audio 等 converter 捕獲它
就跳過該功能繼續輸出 metadata;UnsupportedFormatException 表示型別完全沒人認得。
FailedConversionAttempt 夾帶 converter 與 exc_info
(例外型別+值+traceback);FileConversionException.__init__ 收 attempts 清單,
str() 時把每個 converter 的失敗原因列出來——這是 _convert 全軍覆沒時
能看到「每個人為什麼失敗」的關鍵。