Datamodel
De catalogus van bae is gewone SQLite, tabel voor tabel gedeclareerd aan coven: gesynchroniseerde tabellen reizen naar elk apparaat dat ze kan lezen; niet-gedeclareerde tabellen verlaten het apparaat nooit. Die splitsing is de meest dragende beslissing van het datamodel, dus deze pagina is eromheen georganiseerd.
De catalogusgraaf
Link naar deze sectieHet gesynchroniseerde hart van het schema:
artists,albums,works: de groepeerlaag. Een album verzamelt zijn releases en wijst naar een primaire; werken vormen een ouder/kind-graaf voor klassieke structuur.releases: de centrale entiteit, één rij per geïmporteerde kopie, bevat de persingsgegevens (label, catalogusnummer, barcode, land, formaat, jaar), optionele herkomst van de metagegevens, een hash van de inhoud van de geïmporteerde map en de gemeten albumluidheid. Geen herkomst betekent dat de metagegevens rechtstreeks zijn ingevoerd; externe herkomst geeft de exacte bronrelease aan, terwijl Bestandstags een lokale snapshotbron registreert.release_identities: exacte externe identiteiten voor wat een release is. Geen rijen betekenen geen externe identiteit. Elke rij noemt een MusicBrainz of Discogs release en release groep, en een release kan identiteiten in beide bronnen tegelijkertijd bevatten. Dit is gescheiden van herkomst: identiteit kan veranderen zonder te beweren dat de huidige bewerkbare metadata van die bron is gereset.tracksmettrack_artists, plusrelease_artist_rolesentrack_artist_roles: tracklijsten en credits, elke credit met zijn bron getagd.track_works,work_parts,work_artists: opnamen gekoppeld aan de werken die ze uitvoeren.audio_formatsenaudio_format_segments: de afspeelspecificaties. Per track: codec, sample rate, bitdiepte, kanalen, gemeten loudness en peak, en pregaplengtes. Segmenten mappen een track op geordende byte- en samplevensters van zijn bronbestanden, waarmee een track uit een CUE-rip, inclusief pregap, regio’s van een groot bestand of meerdere bestanden kan overspannen.release_files,covers,artist_images: blobdragende tabellen. Rijen zijn catalogusvermeldingen; de bytes leven in de bloblaag van coven (zie hieronder).people,ratings,history,playlists,playlist_entries: het profiel van elke persoon en wat hij voor zichzelf vastlegt. Dit zijn eigenaarstabellen: alleen de apparaten van hun auteur kunnen ze wijzigen. Rijen vanhistoryenplaylistsstaan elk ofwel in de gedeelde store van het huishouden, ofwel in de privékring van de persoon.
Gesynchroniseerd en lokaal
Link naar deze sectieElke tabel hierboven synchroniseert, onvoorwaardelijk: de rijen van een lokale release bereiken elk apparaat zoals die van elke andere release, dus elk apparaat weet wat het huishouden bezit, en een beoordeling of afspeellijstvermelding die naar een track van een lokale release wijst, wijst naar een rij die elk apparaat kan lezen. Alleen de audio van de release, en de paden waar die staat, blijven op het importerende apparaat. Elke tabel wordt gedeclareerd met zijn rij-identiteit, zijn publiek, of het een eigenaarstabel is, en de bestanden die hij draagt; een test houdt de declaraties precies op die lijst.
Volledig lokale tabellen, nooit aan coven gedeclareerd:
playback_state: huidige track, positie, wachtrij, volume, shuffle en repeat. Afspelen is een apparaatfeit.- De scan- en importtabellen: gevolgde mappen, scans, importkandidaten en hun concepten.
source_releaseen de tabellen eronder: wat bae heeft geëxtraheerd uit elke opgehaalde release van MusicBrainz en Discogs — album- en persgegevens, de volledige tracklijst met credits en werken, hoesopties en hoe andere catalogi hem noemen — gecodeerd door providerrelease in plaats van door een lokale release. De ruwe JSON wordt niet bewaard; elk apparaat kan een release opnieuw ophalen.local_release_files: de bestandspaden en wijzigingstijden van een lokale release op dit apparaat.local_history: afspeelbeurten van voordat de persoon van dit apparaat een profiel had, die naar zijn privékring gaan wanneer dat wordt gemaakt.
De bewerkingen van twee apparaten worden cel voor cel samengevoegd, waarbij de latere bewerking een cel wint die beide wijzigden. coven houdt de samenvoegboekhouding bij in eigen tabellen, dus de tabellen van bae dragen geen klokkolommen.
Audio en afbeeldingen zijn coven-bestanden, elk soort een naamruimte met zijn eigen apparaatcachebudget: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB), en avatars (64 MiB). Een rij verwijst naar zijn bestand via de id van het coven-bestand: file op release_files, covers en artist_images, en avatar_id op people. De grootte, de inhoudshash en de locatie van het bestand zijn van coven en worden gelezen via een join met coven_files.
Releasebestanden zijn van de gebruiker: de bestanden van een lokale release zijn de bestanden van de gebruiker op hun oorspronkelijke paden, vastgelegd in local_release_files, en de rijen ervan verwijzen naar geen enkel coven-bestand. De release naar de cloud verplaatsen zet elk bestand in één write klaar bij coven en laat elke rij naar zijn bestand wijzen; zodra het laatste is opgeslagen, zet coven ze allemaal tegelijk over naar de cloud, en andere apparaten halen elk bij de eerste read in de cache. Hoezen, artiestafbeeldingen en avatars zijn van bae: bae produceert de bytes (hoezen worden opnieuw gerenderd als JPEG-thumbnails van maximaal 600px breed), en een apparaat haalt elk op wanneer het voor het eerst wordt getoond en houdt het tot het budget van zijn naamruimte het verdringt.
Elk bestand wordt versleuteld geüpload onder een willekeurige naam, op een pad dat wordt vastgelegd wanneer het wordt klaargezet, zodat een latere naamswijziging het object nooit verplaatst. Een bestand verandert nooit van bytes: een nieuwe afbeelding is een nieuw bestand.
Identiteit van een rip
Link naar deze sectieElke import maakt een release met een nieuwe willekeurige ID en eigen rijen voor nummers en bestanden. Elk apparaat legt in local_release_origin een SHA-256 vast van de gesorteerde relatieve paden, groottes en wijzigingstijden van de bestanden die elk van zijn imports las; dat gegeven wordt nooit gesynchroniseerd. Een map waarvan dit apparaat de hash vastlegde, staat op het tabblad voor voltooide imports, waar hij ook heen is verplaatst, en zijn rij noemt de ene release die eruit is geïmporteerd. Dezelfde bestanden op dat apparaat opnieuw importeren mislukt, en het tabblad voor voltooide imports biedt geen herimport aan.