コンテンツへ移動

データモデル

bae のカタログは通常の SQLite で、coven に対してテーブルごとに宣言されます。同期テーブルは、それを読めるすべてのデバイスへ移動します。未宣言のテーブルはデバイスを出ません。この分割がデータモデルの最も重要な決定なので、このページはそれを軸にしています。

同期されるスキーマの中心は次のとおりです。

  • artists、albums、works: グループ化層です。アルバムはリリースを集約し、primary のものを指します。作品はクラシック構造のための親子グラフを作ります。
  • releases: 中央のエンティティ、インポートしたコピーごとに一行。プレス事実 (ラベル、カタログ番号、バーコード、国、フォーマット、年)、オプションのメタデータ出所、インポートされたフォルダのコンテンツハッシュ、アルバムの音量測定を記録します。出所なしはメタデータが直接入力されたことを意味します。外部出所は正確なソースリリースの名前を記録します。ファイルのタグはローカルのスナップショット出所を記録します。
  • release_identities: リリースの正確な外部アイデンティティ is。行がないと外部アイデンティティがありません。各行には MusicBrainz または Discogs のリリースとリリースグループの名前があり、リリースは両方のソースで同時にアイデンティティを保持できます。これはプロヴァンシャルとは別物です。アイデンティティは現在の編集可能なメタデータがそのソースからリセットされたと主張することなく変更できます。
  • 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 層にあります(下記)。
  • people、ratings、history、playlists、playlist_entries: 各人のプロフィールと、その人が自分のために記録するもの。これらは所有者テーブルで、変更できるのは作成者のデバイスだけです。history と playlists の各行は、家族の共有ストアか、その人の非公開サークルのどちらかに置かれます。

上記のテーブルはすべて無条件に同期されます。ローカルリリースの行も他のリリースと同じくすべてのデバイスに届くため、すべてのデバイスが家族の所有物を把握でき、ローカルリリースのトラックを指す評価やプレイリスト項目は、すべてのデバイスが読める行を指します。インポートしたデバイスに残るのは、リリースの音声とその置き場所のパスだけです。各テーブルは、行の識別方法、対象範囲、所有者テーブルかどうか、運ぶファイルとともに宣言され、テストがその宣言をこの一覧と正確に一致させます。

coven に宣言されない、完全にローカルなテーブルは次のとおりです。

  • playback_state: 現在のトラック、位置、キュー、音量、シャッフル、リピート。再生はデバイスの事実です。
  • スキャンとインポートのテーブル: 監視フォルダー、スキャン、インポート候補とその下書き。
  • source_release とその配下のテーブル: bae が取得した MusicBrainz と Discogs の各リリースから抽出したもの(アルバムとプレスの情報、クレジットと作品を含む全トラックリスト、カバーの候補、他のカタログでの呼び名)で、ローカルリリースではなくプロバイダリリースでキー付けされています。元の JSON は保存しません。どのデバイスもリリースを取得し直せます。
  • local_release_files: このデバイス上の、ローカルリリースのファイルパスと更新日時。
  • local_history: このデバイスの人がプロフィールを持つ前の再生。プロフィールが作られると、その人の非公開サークルへ移されます。

2 台のデバイスの編集はセルごとに統合され、両方が変更したセルでは後の編集が勝ちます。coven は統合の記録を自分のテーブルで管理するため、bae のテーブルはクロック列を持ちません。

音声と画像は coven のファイルです。種類ごとに 1 つの名前空間で、それぞれ独自のデバイスキャッシュ上限を持ちます。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 ファイルも参照しません。リリースをクラウドに移動すると、1 回の書き込みで各ファイルを coven にステージングし、各行をそのファイルに向けます。最後のファイルが保存されると coven はすべてを一斉にクラウドへ切り替え、他のデバイスは初回読み取り時にそれぞれをキャッシュへ取得します。カバー、アーティスト画像、アバターは bae のものです。bae がバイト列を生成し(カバーは幅最大 600px の JPEG サムネイルとして再描画されます)、デバイスはそれぞれを初めて表示するときに取得し、名前空間の上限によって追い出されるまで保持します。

すべてのファイルは、ステージングされた時点で固定されるパスに、ランダムな名前で暗号化してアップロードされます。そのため、後で名前を変更してもオブジェクトは移動しません。ファイルのバイト列は変わりません。新しい画像は新しいファイルです。

リッピングの身元

このセクションへのリンク

インポートのたびに、新しいランダムなIDと独立したトラック・ファイル行を持つリリースを作成します。各デバイスは、自分の各インポートが読み取ったファイルの、並べ替えた相対パス、サイズ、更新時刻のSHA-256を local_release_origin に記録します。この記録は同期されません。このデバイスがハッシュを記録したフォルダは、どこへ移動しても完了タブに表示され、その行にはそこからインポートした唯一のリリースが示されます。同じデバイスで同じファイルを再びインポートすると失敗し、完了タブに再インポート操作はありません。