Modelo de dados
O catálogo de bae é SQLite comum, declarado para coven tabela por tabela: tabelas sincronizadas viajam para todo dispositivo que pode lê-las; tabelas não declaradas nunca saem do dispositivo. A divisão é a decisão mais determinante do modelo de dados, então esta página se organiza em torno dela.
O grafo do catálogo
Seção intitulada “O grafo do catálogo”O coração sincronizado do esquema:
artists,albums,works: a camada de agrupamento. Um álbum agrega seus lançamentos e aponta para um primário; obras formam um grafo pai/filho para estrutura clássica.releases: a entidade central, uma linha por cópia importada. carrega os fatos de prensagem (etiqueta, número de catálogo, código de barras, país, formato, ano), proveniência de metadados opcionais, um hash de conteúdo da pasta importada e loudness do álbum medido. sem proveniência significa que os metadados foram inseridos diretamente; proveniência externa nomeia o lançamento de origem exata, enquanto Tags dos arquivos registra uma fonte de instantâneo local.release_identities: identidades externas exatas para o que uma versão é. Nenhuma linha significa nenhuma identidade externa. Cada linha nomeia uma versão MusicBrainz ou Discogs e um grupo de versões, e uma versão pode conter identidades em ambas as fontes ao mesmo tempo. Isso é separado da proveniência: a identidade pode mudar sem afirmar que os metadados editáveis atuais foram redefinidos a partir dessa fonte.trackscomtrack_artists, maisrelease_artist_rolesetrack_artist_roles: listas de faixas e créditos, cada crédito marcado com sua fonte.track_works,work_parts,work_artists: gravações vinculadas às obras que executam.audio_formatseaudio_format_segments: as especificações de reprodução. Por faixa: codec, taxa de amostragem, profundidade de bits, canais, intensidade sonora e pico medidos, e durações de pregap. Segmentos mapeiam uma faixa para janelas ordenadas de bytes e amostras dos arquivos-fonte, que é como a faixa de um rip CUE, incluindo pregap, pode atravessar regiões de um arquivo grande ou de vários arquivos.release_files,covers,artist_images: tabelas que carregam blobs. Linhas são entradas de catálogo; os bytes vivem na camada de blobs de coven (veja abaixo).people,ratings,history,playlists,playlist_entries: o perfil de cada pessoa e o que ela registra para si. São tabelas de proprietário: só os dispositivos do autor podem alterá-las. As linhas dehistoryeplaylistsvivem, cada uma, ou no store compartilhado da casa ou no círculo privado da pessoa.
Sincronizado e local
Seção intitulada “Sincronizado e local”Toda tabela acima sincroniza, incondicionalmente: as linhas de um lançamento local chegam a todo dispositivo como as de qualquer outro lançamento, então todo dispositivo sabe o que a casa possui, e uma avaliação ou entrada de playlist que aponta para uma faixa de um lançamento local aponta para uma linha que todo dispositivo consegue ler. Só o áudio do lançamento, e os caminhos onde ele está, ficam no dispositivo de importação. Cada tabela é declarada com sua identidade de linha, seu público, se é uma tabela de proprietário e os arquivos que carrega; um teste mantém as declarações exatamente nessa lista.
Tabelas totalmente locais, nunca declaradas para coven:
playback_state: faixa atual, posição, fila, volume, aleatório e repetição. Reprodução é um fato do dispositivo.- As tabelas de varredura e importação: pastas monitoradas, varreduras, candidatos de importação e seus rascunhos.
source_releasee as tabelas abaixo dela: o que o bae extraiu de cada lançamento do MusicBrainz e do Discogs que buscou — os dados do álbum e da prensagem, a tracklist completa com créditos e obras, as opções de capa e como os outros catálogos o chamam — com chave por versão do provedor em vez de uma versão local. O JSON bruto não é guardado; qualquer dispositivo pode buscar um lançamento de novo.local_release_files: os caminhos de arquivo e horários de modificação de um lançamento local neste dispositivo.local_history: reproduções de antes de a pessoa deste dispositivo ter um perfil, movidas para o círculo privado dela quando ele é criado.
As edições de dois dispositivos se mesclam célula por célula, e a edição posterior vence uma célula que os dois mudaram. coven mantém o controle da mesclagem em suas próprias tabelas, então as tabelas de bae não carregam colunas de relógio.
Áudio e imagens são arquivos de coven, cada tipo um espaço de nomes com seu próprio limite de cache por dispositivo: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB) e avatars (64 MiB). Uma linha referencia seu arquivo pelo id do arquivo de coven: file em release_files, covers e artist_images, e avatar_id em people. O tamanho, o hash do conteúdo e a localização do arquivo são de coven, lidos com um join em coven_files.
Arquivos de lançamento são do usuário: os arquivos de um lançamento local são os arquivos do usuário nos caminhos originais, registrados em local_release_files, e suas linhas não referenciam nenhum arquivo de coven. Mover o lançamento para a nuvem prepara cada arquivo em coven em uma única escrita e faz cada linha apontar para seu arquivo; quando o último é armazenado, coven passa todos juntos para a nuvem, e outros dispositivos buscam cada um para o cache na primeira leitura. Capas, imagens de artistas e avatares são de bae: bae produz os bytes (capas são renderizadas novamente como miniaturas JPEG com no máximo 600px de largura), e um dispositivo busca cada um quando ele é mostrado pela primeira vez e o mantém até que o limite do seu espaço de nomes o remova.
Todo arquivo sobe criptografado com um nome aleatório, em um caminho fixado quando ele é preparado, para que uma renomeação posterior nunca mova o objeto. Um arquivo nunca muda seus bytes: uma imagem nova é um arquivo novo.
Identidade de um rip
Seção intitulada “Identidade de um rip”Cada importação cria um lançamento com um novo ID aleatório e suas próprias linhas de faixas e arquivos. Cada dispositivo registra em local_release_origin um SHA-256 dos caminhos relativos ordenados, tamanhos e datas de modificação dos arquivos lidos por cada uma de suas importações; esse registro nunca é sincronizado. Uma pasta cujo hash este dispositivo registrou fica na aba de importações concluídas, para onde quer que tenha sido movida, e sua linha indica o único lançamento importado dela. Importar de novo os mesmos arquivos nesse dispositivo falha, e a aba de importações concluídas não oferece reimportação.