Modello dati
Il catalogo di bae è SQLite ordinario, dichiarato a coven tabella per tabella: le tabelle sincronizzate viaggiano verso ogni dispositivo che può leggerle; le tabelle non dichiarate non lasciano mai il dispositivo. La divisione è la decisione più portante del modello dati, quindi questa pagina è organizzata attorno a essa.
Il grafo del catalogo
Link a questa sezioneIl cuore sincronizzato dello schema:
artists,albums,works: il livello di raggruppamento. Un album aggrega le sue release e punta a una principale; le opere formano un grafo padre/figlio per la struttura classica.releases: l’entità centrale, una riga per ogni copia importata; contiene i dati relativi alla stampa (etichetta, numero di catalogo, codice a barre, paese, formato, anno), la provenienza dei metadati opzionali, un hash del contenuto della cartella importata e l’audio misurato dell’album. Nessuna provenienza significa che i metadati sono stati inseriti direttamente; la provenienza esterna indica l’esatta versione originale, mentre Tag dei file registra una sorgente locale di snapshot.release_identities: identità esterne esatte per ciò che una release è. Nessuna riga significa nessuna identità esterna. Ogni riga nomina una release e un gruppo di release MusicBrainz o Discogs, e una release può contenere identità in entrambe le fonti contemporaneamente. Questo è separato dalla provenienza: l’identità può cambiare senza affermare che i metadati modificabili correnti sono stati reimpostati da quella fonte.trackscontrack_artists, piùrelease_artist_rolesetrack_artist_roles: liste tracce e crediti, ogni credito etichettato con la sua fonte.track_works,work_parts,work_artists: registrazioni collegate alle opere che eseguono.audio_formatseaudio_format_segments: le specifiche di riproduzione. Per traccia: codec, frequenza di campionamento, profondità in bit, canali, sonorità e picco misurati, e lunghezze dei pregap. I segmenti mappano una traccia su finestre ordinate di byte e campioni dei suoi file sorgente, ed è così che la traccia di un rip CUE, pregap incluso, può attraversare regioni di un file grande o di più file.release_files,covers,artist_images: tabelle che portano blob. Le righe sono voci di catalogo; i byte vivono nel livello blob di coven (vedi sotto).people,ratings,history,playlists,playlist_entries: il profilo di ogni persona e ciò che registra per sé. Sono tabelle del proprietario: solo i dispositivi del loro autore possono cambiarle. Le righe dihistoryeplaylistsvivono ciascuna o nello store condiviso della famiglia o nella cerchia privata della persona.
Sincronizzato e locale
Link a questa sezioneOgni tabella sopra si sincronizza, incondizionatamente: le righe di una release locale raggiungono ogni dispositivo come quelle di qualunque altra release, così ogni dispositivo sa cosa possiede la famiglia, e una valutazione o una voce di playlist che punta a una traccia di una release locale punta a una riga che ogni dispositivo può leggere. Solo l’audio della release, e i percorsi in cui si trova, restano sul dispositivo che l’ha importata. Ogni tabella è dichiarata con la sua identità di riga, il suo pubblico, se è una tabella del proprietario e i file che porta; un test vincola le dichiarazioni esattamente a quell’elenco.
Tabelle completamente locali, mai dichiarate a coven:
playback_state: traccia corrente, posizione, coda, volume, ordine casuale e ripetizione. La riproduzione è un fatto del dispositivo.- Le tabelle di scansione e importazione: cartelle monitorate, scansioni, candidati all’importazione e le loro bozze.
source_releasee le tabelle sotto di essa: ciò che bae ha estratto da ogni pubblicazione MusicBrainz e Discogs recuperata — i dati dell’album e della stampa, la tracklist completa con crediti e opere, le copertine disponibili e come la chiamano gli altri cataloghi — con chiave di rilascio del fornitore piuttosto che di rilascio locale. Il JSON grezzo non viene conservato; qualsiasi dispositivo può recuperare di nuovo una pubblicazione.local_release_files: i percorsi dei file e le date di modifica di una release locale su questo dispositivo.local_history: gli ascolti precedenti al profilo della persona di questo dispositivo, spostati nella sua cerchia privata quando viene creato.
Le modifiche di due dispositivi si fondono cella per cella, e la modifica più tarda vince una cella cambiata da entrambi. coven tiene la contabilità della fusione nelle proprie tabelle, quindi le tabelle di bae non portano colonne di clock.
Audio e immagini sono file di coven, ciascun tipo uno spazio dei nomi con il proprio budget di cache per dispositivo: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB) e avatars (64 MiB). Una riga fa riferimento al suo file tramite l’id del file di coven: file in release_files, covers e artist_images, e avatar_id in people. Dimensione, hash del contenuto e posizione del file appartengono a coven e si leggono con un join su coven_files.
I file delle release appartengono all’utente: i file di una release locale sono i file dell’utente nei loro percorsi originali, registrati in local_release_files, e le sue righe non fanno riferimento a nessun file di coven. Spostare la release nel cloud prepara ogni file in coven in una sola scrittura e fa puntare ogni riga al suo file; quando l’ultimo è conservato, coven li passa tutti insieme al cloud, e gli altri dispositivi recuperano ciascuno in cache alla prima lettura. Copertine, immagini artista e avatar appartengono a bae: bae produce i byte (le copertine vengono renderizzate di nuovo come miniature JPEG larghe al massimo 600px), e un dispositivo recupera ciascuno la prima volta che viene mostrato e lo tiene finché il budget del suo spazio dei nomi non lo rimuove.
Ogni file viene caricato cifrato sotto un nome casuale, in un percorso fissato quando viene preparato, così una rinomina successiva non sposta mai l’oggetto. Un file non cambia mai i suoi byte: un’immagine nuova è un file nuovo.
Identità di un rip
Link a questa sezioneOgni importazione crea una versione con un nuovo ID casuale e righe proprie per tracce e file. Ogni dispositivo registra in local_release_origin uno SHA-256 dei percorsi relativi ordinati, delle dimensioni e delle date di modifica dei file letti da ciascuna delle sue importazioni; questo dato non viene mai sincronizzato. Una cartella di cui questo dispositivo ha registrato l’hash è nella scheda delle importazioni completate ovunque sia stata spostata, e la sua riga indica l’unica versione importata da essa. Importare di nuovo gli stessi file su quel dispositivo non riesce, e la scheda delle importazioni completate non offre una nuova importazione.