Skip to content

匯入管線

匯入會把一個檔案資料夾轉成符合發行版本的目錄項目,且不修改任何檔案位元組。本頁是使用指南所述流程背後的管線。

監看資料夾由平台的檔案系統事件監控,經過 debounce,並在變更時重新掃描;掃描會與既有候選清單比對,而不是從頭開始。掃描器會把資料夾分類為一個發行版本(音訊直接位於其中,或像 CD1/CD2 這類碟形子資料夾),或把它遞迴成合集。檔案會先依副檔名分類為音訊、圖片與文件,然後探測音訊:真正重要的編解碼器是 FFmpeg 在位元組中找到的,而不是副檔名。含有部分下載標記的資料夾會被排除,直到下載完成。

CUE sheet 會把一個音訊映像檔轉成曲目清單。Parser 處理 pregap 與 postgap、每曲 performer 與 ISRC,以及單檔映像與每曲一檔的 CUE 版面。曲目邊界會從 CUE frame(1/75 秒)轉成精確樣本位置,稍後成為播放使用的位元組與樣本區段。

識別會在一次 pass 中從資料夾讀出三種證據:

  • disc ID,CD 精確曲目版面的 MusicBrainz 指紋,從擷取記錄或 CUE sheet 計算;
  • 條碼,由平台視覺框架從圖片掃描解碼,並從 CUE catalog 欄位讀取;
  • 文字:來自圖片 OCR、資料夾與檔名,以及擷取文字檔中的目錄編號與自由文字。

內嵌音訊標籤刻意不作為證據:它們描述標籤工具相信什麼,而不是壓片是什麼。(使用者以未知發行版本匯入時,它們會提供 fallback 中繼資料。)

Disc ID 與條碼會並行查詢,disc ID 查 MusicBrainz,條碼同時查 MusicBrainz 與 Discogs,結果會交叉確認:同意同一個發行群組的結果會收斂,目錄編號相符會縮小壓片清單,訊號之間的不一致會明確顯示為衝突給使用者,而不是無聲猜一個最佳結果。每個結果都帶有 provenance(由 disc ID、條碼、目錄相符找到),因此 UI 能說明為何提供某列。

MusicBrainz 以匿名方式查詢,並嚴格維持每秒一次請求。Discogs 使用者鑰匙圈中的個人 token 驗證,依其速率限制調整與重試;被拒絕的 token 會被如此回報,讓 UI 可標記它,而不是讓搜尋安靜失敗。回應會按 session 快取,勝出的任何來源原始 JSON 會封存在資料庫中,以供未來重新解讀。

確認匯入會依序執行:

  1. 解碼驗證:每首曲目從頭到尾解碼;無法完整解碼的擷取會在寫入任何內容前匯入失敗(config flag 可停用)。
  2. 響度分析:在同一次解碼 pass 中測量每曲與每張專輯的 integrated loudness 與 true peak,儲存供 replay-gain 使用。
  3. 封面選擇:所選圖片(遠端、資料夾圖片或內嵌圖片)會重新算圖為顯示縮圖;如果原圖來自資料夾,原圖會保留在發行版本檔案中。
  4. 原子寫入:發行版本、曲目、名單、身分、格式、segments、檔案與封面會在同一個 transaction 中提交。沒有半匯入狀態。

發行版本會落地並就地引用使用者檔案。如果使用者選擇雲端管理,上傳會在提交後作為儲存轉換發生,而檔案的原始位元組始終是事實來源;使用者交給 bae 的任何內容都不會被刪除或改動。

每個發行版本會記錄其匯入資料夾結構(相對路徑與大小,與位置無關)的內容雜湊。重新掃描會用它標記已在資料庫中的資料夾,同一份擷取重新匯入時會找到並替換先前的發行版本,而不是建立重複項目。