Modelo de datos
El catálogo de bae es SQLite ordinario, declarado a coven tabla por tabla: las tablas sincronizadas viajan a cada dispositivo que puede leerlas; las tablas no declaradas nunca salen del dispositivo. La división es la decisión más determinante del modelo de datos, así que esta página se organiza alrededor de ella.
El grafo del catálogo
Enlace a esta secciónEl corazon sincronizado del esquema:
artists,albums,works: la capa de agrupación. Un álbum agrega sus lanzamientos y apunta a uno principal; las obras forman un grafo padre/hijo para estructura clásica.releases: la entidad central, una fila por copia importada. Lleva los hechos de prensado (etiqueta, número de catálogo, código de barras, país, formato, año), la procedencia de metadatos opcionales, un hash de contenido de la carpeta importada, y el volumen medido del álbum. Sin procedencia significa que los metadatos se ingresaron directamente; la procedencia externa nombra el lanzamiento de la fuente exacta, mientras que Etiquetas de archivo registra una fuente de instantánea local.release_identities: identidades externas exactas de lo que es una versión. Sin filas significa que no hay identidad externa. Cada fila nombra una versión y un grupo de versiones MusicBrainz o Discogs, y una versión puede contener identidades en ambas fuentes a la vez. Esto es independiente de la procedencia: la identidad puede cambiar sin afirmar que los metadatos editables actuales se restablecieron desde esa fuente.trackscontrack_artists, másrelease_artist_rolesytrack_artist_roles: listas de pistas y créditos, cada crédito etiquetado con su fuente.track_works,work_parts,work_artists: grabaciones vinculadas a las obras que interpretan.audio_formatsyaudio_format_segments: las especificaciones de reproducción. Por pista: codec, frecuencia de muestreo, profundidad de bits, canales, sonoridad y pico medidos, y longitudes de pregap. Los segmentos mapean una pista a ventanas ordenadas de bytes y muestras de sus archivos fuente, que es como una pista de una copia CUE, incluido el pregap, puede abarcar regiones de un archivo grande o varios archivos.release_files,covers,artist_images: tablas que llevan blobs. Las filas son entradas de catálogo; los bytes viven en la capa de blobs de coven (ver abajo).people,ratings,history,playlists,playlist_entries: el perfil de cada persona y lo que registra para sí misma. Son tablas de propietario: solo los dispositivos de su autor pueden cambiarlas. Las filas dehistoryyplaylistsviven cada una o en el almacén compartido del hogar o en el círculo privado de la persona.
Sincronizado y local
Enlace a esta secciónCada tabla de arriba se sincroniza, incondicionalmente: las filas de un lanzamiento local llegan a cada dispositivo como las de cualquier otro lanzamiento, así que cada dispositivo sabe lo que tiene el hogar, y una valoración o entrada de lista que apunta a una pista de un lanzamiento local apunta a una fila que cada dispositivo puede leer. Solo el audio del lanzamiento, y las rutas donde está, se quedan en el dispositivo que lo importó. Cada tabla se declara con su identidad de fila, su audiencia, si es una tabla de propietario y los archivos que lleva; una prueba ajusta las declaraciones exactamente a esa lista.
Tablas totalmente locales, nunca declaradas a coven:
playback_state: pista actual, posición, cola, volumen, aleatorio y repetición. La reproducción es un hecho del dispositivo.- Las tablas de escaneo e importación: carpetas vigiladas, escaneos, candidatos de importación y sus borradores.
source_releasey las tablas que cuelgan de ella: lo que bae extrajo de cada lanzamiento de MusicBrainz y Discogs que obtuvo —los datos del álbum y del prensaje, la lista completa de pistas con créditos y obras, las opciones de portada y cómo lo llaman otros catálogos—, con clave por versión del proveedor en lugar de una versión local. El JSON sin procesar no se guarda; cualquier dispositivo puede volver a obtener un lanzamiento.local_release_files: las rutas de archivo y las fechas de modificación de un lanzamiento local en este dispositivo.local_history: reproducciones de antes de que la persona de este dispositivo tuviera perfil, que pasan a su círculo privado cuando se crea.
Las ediciones de dos dispositivos se combinan celda por celda, y la edición posterior gana una celda que ambos cambiaron. coven lleva la contabilidad de la combinación en sus propias tablas, así que las tablas de bae no llevan columnas de reloj.
El audio y las imágenes son archivos de coven, cada tipo un espacio de nombres con su propio presupuesto de caché por dispositivo: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB) y avatars (64 MiB). Una fila referencia su archivo por el id del archivo de coven: file en release_files, covers y artist_images, y avatar_id en people. El tamaño, el hash del contenido y la ubicación del archivo son de coven y se leen con una unión con coven_files.
Los archivos de lanzamiento son del usuario: los archivos de un lanzamiento local son los archivos del usuario en sus rutas originales, registrados en local_release_files, y sus filas no referencian ningún archivo de coven. Mover el lanzamiento a la nube prepara cada archivo en coven en una sola escritura y hace que cada fila apunte a su archivo; cuando el último queda guardado, coven los pasa todos a la nube a la vez, y otros dispositivos traen cada uno a la caché en la primera lectura. Las portadas, imágenes de artistas y avatares son de bae: bae produce los bytes (las portadas se vuelven a renderizar como miniaturas JPEG de como máximo 600px de ancho), y un dispositivo obtiene cada una cuando se muestra por primera vez y la conserva hasta que el presupuesto de su espacio de nombres la desaloja.
Cada archivo se sube cifrado bajo un nombre aleatorio, en una ruta fijada cuando se prepara, para que un cambio de nombre posterior nunca mueva el objeto. Un archivo nunca cambia sus bytes: una imagen nueva es un archivo nuevo.
Identidad de una copia
Enlace a esta secciónCada importación crea un lanzamiento con un ID aleatorio nuevo y sus propias filas de pistas y archivos. Cada dispositivo guarda en local_release_origin un SHA-256 de las rutas relativas ordenadas, tamaños y fechas de modificación de los archivos que leyó cada una de sus importaciones; ese registro nunca se sincroniza. Una carpeta cuyo hash guardó este dispositivo está en la pestaña de completados, se haya movido adonde se haya movido, y su fila nombra el único lanzamiento importado de ella. Importar de nuevo los mismos archivos en ese dispositivo falla, y la pestaña de completados no ofrece volver a importar.