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

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

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

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

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

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

  • artists, albums, works: слоят за групиране. Албум събира изданията си и сочи към основното; произведенията образуват граф родител/дете за класическа структура.
  • releases: централната единица, по един ред за всяко импортирано копие. Пренася фактите за натискане (етикет, номер на каталога, баркод, страна, формат, година), произход на метаданните по избор, хеш на съдържанието на импортираната папка и измерена сила на звука на албума. Без произход означава, че метаданните са въведени директно; външен произход казва точното изходно издание, докато записва локален източник на моментна снимка.
  • release_identities: точни външни идентичности за това, което дадено издание е. Без редове означава, че няма външна идентичност. Всеки ред се нарича издание и група от издания, а едно издание може да съдържа идентичности и в двата източника едновременно. Това е отделно от произхода: идентичността може да се промени, без да се твърди, че текущите редактируеми метаданни са били нулирани от този източник.
  • 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 (вижте по-долу).
  • people, ratings, history, playlists, playlist_entries: профилът на всеки човек и това, което той записва за себе си. Това са таблици на собственика: само устройствата на автора им могат да ги променят. Редовете на history и playlists живеят всеки или в общото хранилище на домакинството, или в личния кръг на човека.

Синхронизирано и локално

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

Всяка таблица по-горе се синхронизира безусловно: редовете на локално издание стигат до всяко устройство като тези на всяко друго издание, така че всяко устройство знае какво притежава домакинството, а оценка или запис в плейлист, сочещ песен от локално издание, сочи ред, който всяко устройство може да прочете. На импортиращото устройство остават само аудиото на изданието и пътищата, на които се намира. Всяка таблица се декларира с идентичността на реда си, аудиторията си, дали е таблица на собственика и файловете, които носи; тест държи декларациите точно на този списък.

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

  • playback_state: текуща песен, позиция, опашка, сила на звука, разбъркване и повторение. Възпроизвеждането е факт на устройството.
  • Таблиците за сканиране и импорт: наблюдавани папки, сканирания, кандидати за импорт и техните чернови.
  • source_release и таблиците под него: това, което bae е извлякъл от всяко издание от MusicBrainz и Discogs, което е изтеглил — фактите за албума и пресата, пълният списък с песни с участниците и произведенията, вариантите за обложка и как го наричат другите каталози — с ключ по изданието на доставчика, а не по локално издание. Суровият JSON не се пази; всяко устройство може да изтегли изданието отново.
  • local_release_files: пътищата и времената на промяна на файловете на локално издание на това устройство.
  • local_history: слушания от преди човекът на това устройство да има профил, преместени в личния му кръг, когато профилът бъде създаден.

Редакциите на две устройства се сливат клетка по клетка, като по-късната редакция печели клетка, променена и от двете. coven води счетоводството на сливането в собствени таблици, така че таблиците на bae не носят колони с часовник.

Аудиото и изображенията са файлове на coven, като всеки вид е пространство от имена със собствен лимит на кеша на устройството: release_files (20 GiB), covers (512 MiB), artist_images (256 MiB) и avatars (64 MiB). Редът сочи към файла си чрез идентификатора на файла в coven: file в release_files, covers и artist_images и avatar_id в people. Размерът, хешът на съдържанието и местоположението на файла са на coven и се четат чрез съединяване с coven_files.

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

Всеки файл се качва шифрован под случайно име, на път, фиксиран при подготовката му, така че по-късно преименуване никога не мести обекта. Файлът никога не променя байтовете си: ново изображение е нов файл.

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

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

Всеки импорт създава издание с нов случаен идентификатор и собствени редове за песни и файлове. Всяко устройство записва в local_release_origin SHA-256 на сортираните относителни пътища, размери и времена на промяна на файловете, прочетени от всеки негов импорт; записът никога не се синхронизира. Папка, чийто хеш това устройство е записало, е в раздела за завършени импорти, където и да е преместена, а редът ѝ посочва единственото издание, импортирано от нея. Повторен импорт на същите файлове на това устройство е неуспешен и разделът за завършени импорти не предлага действие за повторен импорт.