Przejdź do treści

Model danych

Katalog bae to zwykłe SQLite, deklarowane do coven tabela po tabeli: synchronizowane tabele podróżują na każde urządzenie, które może je czytać; tabele niedeklarowane nigdy nie opuszczają urządzenia. Ten podział jest najważniejszą decyzją modelu danych, więc ta strona jest zorganizowana wokół niego.

Graf katalogu

Link do tej sekcji

Synchronizowane serce schematu:

  • artists, albums, works: warstwa grupowania. Album agreguje swoje wydania i wskazuje podstawowe; dzieła tworzą graf rodzic/dziecko dla struktury klasycznej.
  • releases: jednostka centralna, jeden wiersz na każdą zaimportowaną kopię. Przenosi fakty naciskania (etykieta, numer katalogowy, kod kreskowy, kraj, format, rok), opcjonalne pochodzenie metadanych, hash zawartości importowanego folderu i zmierzoną głośność albumu. Brak pochodzenia oznacza, że metadane zostały wprowadzone bezpośrednio; pochodzenie zewnętrzne określa dokładne wydanie źródłowe, podczas gdy Tagi plików rejestruje lokalne źródło migawki.
  • release_identities: dokładne tożsamości zewnętrzne tego, czym wydanie jest. Brak wierszy oznacza brak tożsamości zewnętrznej. Każdy wiersz nazywa wydanie MusicBrainz lub Discogs i grupę wydań, a wydanie może zawierać tożsamości w obu źródłach jednocześnie. Jest to odrębne od pochodzenia: tożsamość może się zmienić bez twierdzenia, że bieżące edytowalne metadane zostały zresetowane z tego źródła.
  • tracks z track_artists, plus release_artist_roles i track_artist_roles: listy utworów i przypisania, każde przypisanie oznaczone źródłem.
  • track_works, work_parts, work_artists: nagrania połączone z dziełami, które wykonują.
  • audio_formats i audio_format_segments: specyfikacje odtwarzania. Per utwór: kodek, częstotliwość próbkowania, głębia bitowa, kanały, zmierzona głośność i szczyt oraz długości pregapów. Segmenty mapują utwór na uporządkowane okna bajtów i próbek jego plików źródłowych; tak utwór z ripu CUE, włącznie z pregapem, może obejmować regiony jednego dużego pliku albo kilku plików.
  • release_files, covers, artist_images: tabele niosące bloby. Wiersze są wpisami katalogu; bajty żyją w warstwie blobów coven (zobacz niżej).
  • people, ratings, history, playlists, playlist_entries: profil każdej osoby i to, co zapisuje dla siebie. To tabele właściciela: tylko urządzenia ich autora mogą je zmieniać. Wiersze history i playlists żyją każdy albo we wspólnym magazynie domowników, albo w prywatnym kręgu osoby.

Synchronizowane i lokalne

Link do tej sekcji

Każda tabela powyżej synchronizuje się bezwarunkowo: wiersze lokalnego wydania docierają na każde urządzenie jak wiersze każdego innego wydania, więc każde urządzenie wie, co mają domownicy, a ocena albo wpis playlisty wskazujący utwór lokalnego wydania wskazuje wiersz, który każde urządzenie może przeczytać. Na urządzeniu importującym zostaje tylko audio wydania i ścieżki, pod którymi leży. Każda tabela jest deklarowana z tożsamością wiersza, odbiorcami, informacją, czy jest tabelą właściciela, i plikami, które niesie; test trzyma deklaracje dokładnie przy tej liście.

Tabele w pełni lokalne, nigdy niedeklarowane do coven:

  • playback_state: bieżący utwór, pozycja, kolejka, głośność, losowanie i powtarzanie. Odtwarzanie jest faktem urządzenia.
  • Tabele skanowania i importu: obserwowane foldery, skany, kandydaci do importu i ich szkice.
  • source_release i tabele pod nią: to, co bae wyodrębnił z każdego pobranego wydania z MusicBrainz i Discogs — dane albumu i tłoczenia, pełna lista utworów z twórcami i dziełami, opcje okładki oraz to, jak nazywają je inne katalogi — kluczowane przez wydanie dostawcy, a nie przez wydanie lokalne. Surowy JSON nie jest przechowywany; każde urządzenie może pobrać wydanie ponownie.
  • local_release_files: ścieżki plików i czasy modyfikacji lokalnego wydania na tym urządzeniu.
  • local_history: odtworzenia sprzed czasu, gdy osoba tego urządzenia miała profil, przenoszone do jej prywatnego kręgu, gdy profil powstaje.

Edycje dwóch urządzeń scalają się komórka po komórce, a późniejsza edycja wygrywa komórkę zmienioną przez oba. coven prowadzi księgowość scalania we własnych tabelach, więc tabele bae nie niosą kolumn zegara.

Audio i obrazy są plikami coven, każdy rodzaj to przestrzeń nazw z własnym limitem cache urządzenia: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB) i avatars (64 MiB). Wiersz wskazuje swój plik przez id pliku coven: file w release_files, covers i artist_images oraz avatar_id w people. Rozmiar, skrót zawartości i położenie pliku należą do coven i są odczytywane przez złączenie z coven_files.

Pliki wydań należą do użytkownika: pliki lokalnego wydania to pliki użytkownika pod ich oryginalnymi ścieżkami, zapisane w local_release_files, a jego wiersze nie wskazują żadnego pliku coven. Przeniesienie wydania do chmury w jednym zapisie przygotowuje każdy plik w coven i kieruje każdy wiersz na jego plik; gdy ostatni zostanie zapisany, coven przełącza je wszystkie naraz na chmurę, a inne urządzenia pobierają każdy do cache przy pierwszym odczycie. Okładki, obrazy wykonawców i awatary należą do bae: bae tworzy bajty (okładki są ponownie renderowane jako miniatury JPEG o szerokości najwyżej 600px), a urządzenie pobiera każdy z nich, gdy zostanie pierwszy raz pokazany, i trzyma go, dopóki limit jego przestrzeni nazw go nie usunie.

Każdy plik jest wysyłany zaszyfrowany pod losową nazwą, pod ścieżką ustaloną przy jego przygotowaniu, więc późniejsza zmiana nazwy nigdy nie przenosi obiektu. Plik nigdy nie zmienia swoich bajtów: nowy obraz to nowy plik.

Tożsamość ripu

Link do tej sekcji

Każdy import tworzy wydanie z nowym losowym identyfikatorem i własnymi wierszami utworów oraz plików. Każde urządzenie zapisuje w local_release_origin SHA-256 posortowanych ścieżek względnych, rozmiarów i czasów modyfikacji plików odczytanych przez każdy jego import; ten zapis nigdy nie jest synchronizowany. Folder, którego hash to urządzenie zapisało, jest na karcie ukończonych importów, dokądkolwiek go przeniesiono, a jego wiersz wskazuje jedyne wydanie z niego zaimportowane. Ponowny import tych samych plików na tym urządzeniu kończy się niepowodzeniem, a karta ukończonych importów nie oferuje ponownego importu.