データモデル
bae のカタログは通常の SQLite で、coven に対してテーブルごとに宣言されます。同期テーブルは競合クロックを持ち、すべてのデバイスへ移動します。未宣言のテーブルはデバイスを出ません。この分割がデータモデルの最も重要な決定なので、このページはそれを軸にしています。
カタロググラフ
このセクションへのリンク同期されるスキーマの中心は次のとおりです。
artists、albums、works: グループ化層です。アルバムはリリースを集約し、primary のものを指します。作品はクラシック構造のための親子グラフを作ります。releases: 中心エンティティで、盤ごとに 1 行です。盤の事実(レーベル、カタログ番号、バーコード、国、形式、年)、メタデータソース、インポートしたフォルダーの内容ハッシュ、測定済みアルバムラウドネスを持ちます。release_identities: ソースごとに、そのリリースが何であるかを表します。行がなければ不明です。MusicBrainz または Discogs の行にリリース ID があれば正確、なければ近似です。1 つのリリースは両方のソースの身元を同時に持てます。tracksとtrack_artists、さらにrelease_artist_rolesとtrack_artist_roles: トラックリストとクレジットです。各クレジットにはソースが付けられます。track_works、work_parts、work_artists: 録音を、それが演奏する作品へ結び付けます。audio_formatsとaudio_format_segments: 再生仕様です。トラックごとに、コーデック、サンプルレート、ビット深度、チャンネル、測定済みラウドネスとピーク、プリギャップ長を持ちます。セグメントは、トラックをソースファイルの順序付きバイトおよびサンプル窓へ対応付けます。これにより、CUE リッピングのトラックはプリギャップ込みで 1 つの大きなファイルの領域、または複数ファイルにまたがれます。release_files、covers、artist_images: blob を持つテーブルです。行はカタログ項目で、バイト列は coven の blob 層にあります(下記)。
同期、ゲート、ローカル
このセクションへのリンク上記はすべて同期されますが、無条件ではありません。releases は remote 列をゲートとするルートとして宣言されます。リリース行とそのサブツリー全体(トラック、ファイル、クレジット、形式、カバー)は、remote が true の間、つまりリリースがクラウド管理対象である間だけ同期されます。リリースを managed に切り替えるとサブツリーが公開されます。unmanaged リリースは、スキーマが同期対象でも、完全にインポートしたデバイス上に残ります。祖先テーブル(artists、albums、works)は、同期されるリリースがまだ参照している間だけ同期されるため、デバイスは配下に何もないアーティストを受け取りません。
coven に宣言されない、完全にローカルなテーブルは次のとおりです。
playback_state: 現在のトラック、位置、キュー、音量、シャッフル、リピート。再生はデバイスの事実です。imports: インポート操作の追跡。release_metadata: MusicBrainz と Discogs からの元 JSON のアーカイブ。将来の再解釈のために保持します。
すべての同期テーブルは _updated_at ハイブリッド論理クロック列を持ちます。これは coven がフィールドごとの同時編集の順序付けに使うレジスターです。同期対象集合とクロック保持集合が完全に等しいことはテストで保証されます。
Blob
このセクションへのリンク音声と画像は、3 つの名前空間で coven の blob 層を通ります。それぞれが独自のデバイスキャッシュ上限を持ちます。release_files(20 GiB)、covers(512 MiB)、artist_images(256 MiB)です。
リリースファイルはユーザー提供で、遅延キャッシュされます。管理外リリースでは、blob は元のパスにあるユーザーファイルへの外部参照です。管理対象では、初回読み取り時にキャッシュへ取得されるアップロード済みオブジェクトです。カバーとアーティスト画像はホスト提供で、先にキャッシュされます。bae がバイト列を生成し(カバーは幅最大 600px の JPEG サムネイルとして再描画されます)、各デバイスが 取得時に取得するため、グリッドはローカルで表示されます。
不透明ホームでは、blob は意味のない内容キーの下にアップロードされます。閲覧可能ホームでは、各 blob 行が読みやすいクラウドパスを記録します。音声は {artist}/{album}/{filename}、カバーは {album}/{release}/cover.{ext} です。これはアップロード時に一度計算されるため、後で名前を変更してもオブジェクトは移動しません。
リッピングの身元
このセクションへのリンクreleases.content_hash は、インポートしたフォルダーのファイル構造(相対パスとサイズ)に対する SHA-256 です。フォルダーがディスク上のどこにあるかには依存しません。bae はこれにより、監視フォルダーに再び現れたインポート済みリッピングを認識し、再インポート時には置き換えるべきリリースを見つけます。