資料模型
bae 的目錄是一般 SQLite,逐表宣告給 coven:同步表會前往每個能讀取它們的裝置;未宣告的表永遠不離開裝置。這個分割是資料模型最承重的決定,因此本頁圍繞它組織。
Schema 中會同步的核心:
artists、albums、works:群組層。專輯聚合其發行版本並指向一個主要版本;作品形成古典結構的父子圖。- **
releases* : 中央实体,每個匯入的副本一行,包含打印事实(标签、目录编号、条形码、国家、格式、年份 ) 、 可选元数据来源、导入文件夹的内容哈希值和测量的专辑音量。 没有来源意味着元数据是直接输入的;外部来源指定了准确的源发行日期,而檔案標籤记录了本地快照来源。 - **
release_identities* : 发布版本 * 的确切外部标识。 没有行意味着没有外部标识。 每行都命名一个 MusicBrainz 或 Discogs 发布版本和发布组,一个发布版本可以同时在两个来源中拥有标识。 这是与来源分开的:标识可以改变,而不声称当前可编辑的元数据是从该来源重置的。 tracks搭配track_artists,以及release_artist_roles與track_artist_roles:曲目清單與名單,每個名單都標記其來源。track_works、work_parts、work_artists:錄音連到它們演出的作品。audio_formats與audio_format_segments:播放規格。每曲:編解碼器、取樣率、位元深度、聲道、測得響度與峰值,以及 pregap 長度。Segments 將曲目映射到其來源檔案中有序的位元組與樣本區段;這就是 CUE 擷取的曲目(包含 pregap)能跨越一個大型檔案或多個檔案區域的方式。release_files、covers、artist_images:帶有 blob 的表。列是目錄項目;位元組存在 coven 的 blob 層中(見下方)。people、ratings、history、playlists、playlist_entries:每個人的個人檔案,以及此人為自己記錄的內容。這些是擁有者表:只有其作者的裝置能變更它們。history與playlists的每一列要不位於家庭共用的存放區中,要不位於此人的私人圈子中。
上面的每個表都會無條件同步:本機發行版本的列與其他發行版本一樣會抵達每個裝置,因此每個裝置都知道家庭擁有什麼,指向本機發行版本中某首曲目的評分或播放清單項目,指向的也是每個裝置都能讀取的列。只有該發行版本的音訊及其所在路徑會留在匯入裝置上。每個表宣告時都帶有其列識別、受眾、是否為擁有者表,以及它攜帶的檔案;測試會讓這些宣告與該清單完全一致。
完全本機且永不宣告給 coven 的表:
playback_state:目前曲目、位置、佇列、音量、隨機播放與重複播放。播放是裝置事實。- 掃描與匯入表:監看的資料夾、掃描、匯入候選及其草稿。
source_release及其下屬資料表:bae 從每個取得過的 MusicBrainz 與 Discogs 發行中擷取的內容——專輯與壓片資訊、含署名與作品的完整曲目表、封面選項,以及其他目錄對它的稱呼——以提供者發行而非本地發行作為鍵。原始 JSON 不會保存;任何裝置都能重新取得發行。local_release_files:本機發行版本在此裝置上的檔案路徑與修改時間。local_history:此裝置的人擁有個人檔案之前的播放紀錄,會在個人檔案建立時移入此人的私人圈子。
兩台裝置的編輯會逐格合併,雙方都改過的儲存格以較晚的編輯為準。coven 在自己的表中維護合併紀錄,因此 bae 的表不帶時鐘欄位。
音訊與圖片是 coven 檔案,每種類型是一個命名空間,各自有裝置快取預算:release_files(20 GiB)、covers(512 MiB)、artist_images(256 MiB)與 avatars(64 MiB)。列透過 coven 檔案的 id 引用其檔案:release_files、covers 與 artist_images 上是 file,people 上是 avatar_id。檔案的大小、內容雜湊與位置屬於 coven,透過聯結 coven_files 讀取。
發行版本檔案屬於使用者:本機發行版本的檔案就是使用者位於原始路徑的檔案,記錄在 local_release_files 中,其列不引用任何 coven 檔案。把發行版本移至雲端會以一次寫入把每個檔案暫存到 coven,並讓每一列指向其檔案;最後一個檔案儲存完成後,coven 會把它們一起切換到雲端,其他裝置會在第一次讀取時把每個檔案抓入快取。封面、藝人圖片與頭像屬於 bae:bae 產生位元組(封面會重新算圖為最寬 600px 的 JPEG 縮圖),裝置會在每張圖片首次顯示時抓取它,並保留到其命名空間的預算將其逐出為止。
每個檔案都會以隨機名稱加密上傳,路徑在暫存時固定,因此稍後重新命名不會移動物件。檔案的位元組永不改變:新圖片就是新檔案。
每次匯入都會建立一個使用新隨機 ID 的發行版本,並擁有獨立的曲目及檔案記錄。每台裝置都會在 local_release_origin 中記錄其每次匯入所讀取檔案的排序後相對路徑、大小及修改時間的 SHA-256;此記錄從不同步。本裝置記錄過雜湊的資料夾無論移到哪裡都在已完成分頁中,其列指向從中匯入的唯一發行版本。在該裝置上再次匯入相同的檔案會失敗,已完成分頁不提供重新匯入操作。