Към съдържанието

Модел на данните

Каталогът на bae е обикновен SQLite, деклариран към coven таблица по таблица: синхронизираните таблици носят часовник за конфликти и пътуват до всяко устройство; недекларираните таблици никога не напускат устройството. Това разделяне е най-важното решение в модела на данните, затова тази страница е организирана около него.

Графът на каталога

Връзка към този раздел

Синхронизираното сърце на схемата:

  • artists, albums, works: слоят за групиране. Албум събира изданията си и сочи към основното; произведенията образуват граф родител/дете за класическа структура.
  • releases: централната същност, един ред за всеки пресинг. Носи фактите за пресинга (лейбъл, каталожен номер, баркод, държава, формат, година), източника на метаданни, хеш на съдържанието на импортираната папка и измерената сила на звука на албума.
  • release_identities: какво е едно издание, по източник. Няма редове означава неизвестно; ред от MusicBrainz или Discogs с release ID означава точно; без него, приблизително. Едно издание може да държи идентичности и от двата източника едновременно.
  • tracks с track_artists, плюс release_artist_roles и track_artist_roles: списъци с песни и заслуги, като всяка заслуга е отбелязана с източника си.
  • track_works, work_parts, work_artists: записи, свързани с произведенията, които изпълняват.
  • audio_formats и audio_format_segments: спецификациите за възпроизвеждане. За всяка песен: кодек, честота на дискретизация, битова дълбочина, канали, измерена сила на звука и пик, и дължини на pregaps. Сегментите съпоставят песен към подредени прозорци от байтове и семпли в изходните файлове, така че песен от CUE рип, включително pregap, може да обхваща области от един голям файл или от няколко файла.
  • release_files, covers, artist_images: таблици, които носят blob-ове. Редовете са записи в каталога; байтовете живеят в blob слоя на coven (вижте по-долу).

Синхронизирано, ограничено, локално

Връзка към този раздел

Всичко горе се синхронизира, но не безусловно. releases е декларирана като ограничен корен върху колоната си remote: редът на изданието и цялото му поддърво (песни, файлове, заслуги, формати, обложка) се синхронизират само докато remote е true, тоест докато изданието се управлява в облака. Превключването на издание към управлявано публикува поддървото; неуправлявано издание остава изцяло на импортиращото устройство, въпреки че схемата му е синхронизирана. Таблиците предци (artists, albums, works) се синхронизират само докато някое синхронизирано издание още ги сочи, така че устройство никога не получава изпълнител без нищо под него.

Изцяло локални таблици, никога недекларирани към coven:

  • playback_state: текуща песен, позиция, опашка, сила на звука, разбъркване и повторение. Възпроизвеждането е факт на устройството.
  • imports: проследяване на операция по импортиране.
  • release_metadata: архивиран суров JSON от MusicBrainz и Discogs, пазен за бъдещо тълкуване.

Всяка синхронизирана таблица носи _updated_at колона с хибриден логически часовник, регистърът, по който coven подрежда едновременните редакции поле по поле; тест налага синхронизираният набор и наборът с часовник да са точно еднакви.

Аудиото и изображенията минават през blob слоя на coven в три пространства от имена, всяко със собствен лимит на кеша на устройството: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB).

Файловете на издания са дадени от потребителя и се кешират при нужда: за неуправлявано издание blob-ът е външна препратка към файла на потребителя на оригиналния му път; за управлявано издание е качен обект, който се изтегля в кеша при първо четене. Обложките и изображенията на изпълнители се предоставят от приложението и се кешират предварително: bae произвежда байтовете (обложките се рендерират наново като JPEG миниатюри с ширина най-много 600px), а всяко устройство ги изтегля при получаване на промени, така че решетките се рендерират локално.

В непрозрачен дом blob-овете се качват под безсмислени ключове за съдържание. В прегледен дом всеки blob ред записва четим облачен път ({artist}/{album}/{filename} за аудио, {album}/{release}/cover.{ext} за обложки), изчислен веднъж при качване, така че по-късно преименуване никога не мести обекта.

Идентичност на рип

Връзка към този раздел

releases.content_hash е SHA-256 върху файловата структура на импортираната папка (относителни пътища и размери), независимо от мястото на папката на диска. Така bae разпознава вече импортиран рип, когато той отново се появи в наблюдавана папка, и така повторните импорти намират изданието, което трябва да заменят.