Zum Inhalt springen

Datenmodell

Der Katalog von bae ist gewöhnliches SQLite, Tabelle für Tabelle bei coven deklariert: Synchronisierte Tabellen reisen zu jedem Gerät, das sie lesen kann; nicht deklarierte Tabellen verlassen das Gerät nie. Diese Trennung ist die tragende Entscheidung des Datenmodells, daher ist diese Seite darum aufgebaut.

Der Kataloggraph

Link zu diesem Abschnitt

Das synchronisierte Herz des Schemas:

  • artists, albums, works: die Gruppierungsschicht. Ein Album sammelt seine Releases und zeigt auf ein primäres; Werke bilden einen Eltern-Kind-Graphen für klassische Struktur.
  • releases: die zentrale Einheit, eine Zeile pro importierter Kopie, enthält die Pressungsdaten (Label, Katalognummer, Barcode, Land, Format, Jahr), optionale Metadaten-Herkunft, einen Inhalts-Hash des importierten Ordners und die gemessene Album-Lautstärke. Keine Herkunft bedeutet, dass die Metadaten direkt eingegeben wurden; externe Herkunft bezeichnet die exakte Quellen-Veröffentlichung, während Datei-Tags eine lokale Snapshot-Quelle aufzeichnet.
  • release_identities: Exakte externe Identitäten für das, was ein Release ist. Keine Zeilen bedeuten keine externe Identität. Jede Zeile nennt ein MusicBrainz- oder Discogs-Release und eine Release-Gruppe, und ein Release kann Identitäten in beiden Quellen gleichzeitig enthalten. Dies ist getrennt von der Provenienz: Die Identität kann sich ändern, ohne dass behauptet wird, dass die aktuellen editierbaren Metadaten von dieser Quelle zurückgesetzt wurden.
  • tracks mit track_artists, plus release_artist_roles und track_artist_roles: Tracklisten und Mitwirkende, jede Mitwirkung mit ihrer Quelle markiert.
  • track_works, work_parts, work_artists: Aufnahmen, die mit den Werken verknüpft sind, die sie aufführen.
  • audio_formats und audio_format_segments: die Wiedergabespezifikationen. Pro Track: Codec, Abtastrate, Bittiefe, Kanäle, gemessene Lautheit und Spitze sowie Pregap-Längen. Segmente bilden einen Track auf geordnete Byte- und Sample-Fenster seiner Quelldateien ab; so kann der Track eines CUE-Rips, einschließlich Pregap, Bereiche einer großen Datei oder mehrerer Dateien überspannen.
  • release_files, covers, artist_images: Blob-tragende Tabellen. Zeilen sind Katalogeinträge; die Bytes leben in der Blob-Schicht von coven (siehe unten).
  • people, ratings, history, playlists, playlist_entries: das Profil jeder Person und was sie für sich selbst festhält. Das sind Besitzertabellen: Nur die Geräte ihres Autors können sie ändern. Zeilen von history und playlists liegen jeweils entweder im gemeinsamen Store des Haushalts oder im privaten Kreis der Person.

Synchronisiert und lokal

Link zu diesem Abschnitt

Jede Tabelle oben synchronisiert, bedingungslos: Die Zeilen eines lokalen Releases erreichen jedes Gerät wie die jedes anderen Releases, sodass jedes Gerät weiß, was der Haushalt besitzt, und eine Bewertung oder ein Playlist-Eintrag, der auf einen Track eines lokalen Releases zeigt, auf eine Zeile zeigt, die jedes Gerät lesen kann. Nur das Audio des Releases und die Pfade, an denen es liegt, bleiben auf dem importierenden Gerät. Jede Tabelle wird mit ihrer Zeilenidentität, ihrem Publikum, ob sie eine Besitzertabelle ist, und den Dateien, die sie trägt, deklariert; ein Test hält die Deklarationen exakt auf dieser Liste.

Vollständig lokale Tabellen, nie bei coven deklariert:

  • playback_state: aktueller Track, Position, Warteschlange, Lautstärke, Mischen und Wiederholen. Wiedergabe ist eine Gerätetatsache.
  • Die Scan- und Importtabellen: überwachte Ordner, Scans, Importkandidaten und ihre Entwürfe.
  • source_release und die Tabellen darunter: was bae aus jedem abgerufenen MusicBrainz- und Discogs-Release extrahiert hat — Album- und Pressungsangaben, die vollständige Titelliste mit Mitwirkenden und Werken, Cover-Optionen und wie andere Kataloge es nennen — nach dem Release des Anbieters statt nach einem lokalen Release geschlüsselt. Das rohe JSON wird nicht aufbewahrt; jedes Gerät kann ein Release erneut abrufen.
  • local_release_files: die Dateipfade und Änderungszeiten eines lokalen Releases auf diesem Gerät.
  • local_history: Wiedergaben von vor der Zeit, als die Person dieses Geräts ein Profil hatte, die in ihren privaten Kreis verschoben werden, sobald es erstellt ist.

Die Änderungen zweier Geräte werden Zelle für Zelle zusammengeführt, wobei die spätere Änderung eine Zelle gewinnt, die beide geändert haben. coven führt die Buchhaltung dafür in eigenen Tabellen, daher tragen die Tabellen von bae keine Uhrspalten.

Audio und Bilder sind coven-Dateien, jede Art ein Namensraum mit eigenem Geräte-Cache-Budget: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB) und avatars (64 MiB). Eine Zeile verweist über die ID der coven-Datei auf ihre Datei: file in release_files, covers und artist_images und avatar_id in people. Größe, Inhalts-Hash und Speicherort der Datei gehören coven und werden über einen Join mit coven_files gelesen.

Release-Dateien gehören dem Benutzer: Die Dateien eines lokalen Releases sind die Dateien des Benutzers an ihren ursprünglichen Pfaden, erfasst in local_release_files, und seine Zeilen verweisen auf keine coven-Datei. Das Verschieben des Releases in die Cloud stellt jede Datei in einem Schreibvorgang bei coven bereit und lässt jede Zeile auf ihre Datei zeigen; sobald die letzte gespeichert ist, schaltet coven sie alle gemeinsam auf die Cloud um, und andere Geräte holen jede beim ersten Lesen in den Cache. Cover, Künstlerbilder und Avatare gehören bae: bae erzeugt die Bytes (Cover werden als JPEG-Thumbnails mit höchstens 600 px Breite neu gerendert), und ein Gerät holt jedes, wenn es zum ersten Mal angezeigt wird, und behält es, bis das Budget seines Namensraums es verdrängt.

Jede Datei wird verschlüsselt unter einem zufälligen Namen hochgeladen, an einem Pfad, der beim Bereitstellen festgelegt wird, sodass eine spätere Umbenennung das Objekt nie verschiebt. Eine Datei ändert nie ihre Bytes: Ein neues Bild ist eine neue Datei.

Identität eines Rips

Link zu diesem Abschnitt

Jeder Import erstellt eine Veröffentlichung mit einer neuen zufälligen ID und eigenen Titel- und Dateizeilen. Jedes Gerät speichert in local_release_origin einen SHA-256 der sortierten relativen Pfade, Größen und Änderungszeiten der Dateien, die jeder seiner Importe gelesen hat; dieser Eintrag wird nie synchronisiert. Ein Ordner, dessen Hash dieses Gerät gespeichert hat, steht im Tab für abgeschlossene Importe, wohin er auch verschoben wurde, und seine Zeile nennt die eine daraus importierte Veröffentlichung. Ein erneuter Import derselben Dateien auf diesem Gerät schlägt fehl, und der Tab für abgeschlossene Importe bietet keinen erneuten Import an.