데이터 모델
bae의 카탈로그는 일반 SQLite이며, coven에 table별로 선언됩니다. 동기화되는 table은 그것을 읽을 수 있는 모든 기기로 이동합니다. 선언되지 않은 table은 기기를 떠나지 않습니다. 이 분리는 데이터 모델에서 가장 load-bearing한 결정이므로, 이 페이지는 그 기준으로 구성되어 있습니다.
카탈로그 그래프
이 섹션으로 연결schema에서 동기화되는 중심부는 다음과 같습니다.
artists,albums,works: 묶음 계층입니다. 앨범은 릴리스를 모으고 primary 릴리스를 가리킵니다. 작품은 클래식 구조를 위한 부모/자식 그래프를 이룹니다.releases: 중앙 엔티티, 가져온 사본마다 한 행. 프레싱 사실(레이블, 카탈로그 번호, 바코드, 국가, 포맷, 연도), 옵션 메타데이터 출처, 가져온 폴더의 콘텐츠 해시, 앨범 음량 측정을 담고 있습니다. 출처가 없다면 메타데이터가 직접 입력되었음을 의미합니다. 외부 출처는 정확한 소스 릴리스 이름을 나타내며 파일 태그는 로컬 스냅샷 소스를 기록합니다.release_identities: 릴리스의 정확한 외부 식별자. 행이 없으면 외부 식별자가 없음을 의미합니다. 각 행은 MusicBrainz 또는 Discogs 릴리스와 릴리스 그룹의 이름을 갖고 있으며, 릴리스는 두 소스에서 동시에 식별자를 보유할 수 있습니다. 이것은 출처와 분리되어 있습니다: 식별자는 현재 편집 가능한 메타데이터가 해당 소스에서 재설정되었다고 주장하지 않고도 변경될 수 있습니다.- **
tracks**와track_artists, 그리고 **release_artist_roles**와track_artist_roles: 트랙 목록과 크레딧입니다. 각 크레딧에는 소스가 붙습니다. track_works,work_parts,work_artists: 녹음을 그들이 연주하는 작품에 연결합니다.- **
audio_formats**와audio_format_segments: 재생 spec입니다. 트랙별 codec, sample rate, bit depth, channels, 측정 loudness와 peak, pregap length가 있습니다. Segment는 트랙을 소스 파일의 정렬된 byte 및 sample window에 매핑합니다. 그래서 CUE 리핑의 트랙이 pregap을 포함해 하나의 큰 파일 여러 영역이나 여러 파일에 걸칠 수 있습니다. release_files,covers,artist_images: blob을 가진 table입니다. row는 카탈로그 항목이고, 바이트는 coven의 blob 계층에 있습니다(아래 참고).people,ratings,history,playlists,playlist_entries: 각 사람의 프로필과 그 사람이 자신을 위해 기록하는 것입니다. 이들은 소유자 table이며, 작성자의 기기만 바꿀 수 있습니다.history와playlists의 각 row는 가족의 공유 스토어나 그 사람의 비공개 서클 중 한 곳에 있습니다.
동기화와 로컬
이 섹션으로 연결위의 모든 table은 무조건 동기화됩니다. 로컬 릴리스의 row도 다른 릴리스처럼 모든 기기에 닿으므로 모든 기기가 가족이 가진 것을 알 수 있고, 로컬 릴리스의 트랙을 가리키는 평점이나 재생 목록 항목은 모든 기기가 읽을 수 있는 row를 가리킵니다. 가져온 기기에 남는 것은 릴리스의 오디오와 그 경로뿐입니다. 각 table은 row 식별 방식, 대상 범위, 소유자 table 여부, 담는 파일과 함께 선언되며, 테스트가 선언을 정확히 이 목록에 맞춥니다.
완전히 local인 table은 coven에 선언되지 않습니다.
playback_state: 현재 트랙, 위치, 대기열, 볼륨, 셔플과 반복입니다. 재생은 기기의 사실입니다.- 스캔과 가져오기 table: 감시 폴더, 스캔, 가져오기 후보와 그 초안입니다.
source_release및 그 아래 테이블: bae가 가져온 각 MusicBrainz 및 Discogs 릴리스에서 추출한 것 — 앨범과 프레싱 정보, 크레디트와 작품을 포함한 전체 트랙리스트, 커버 후보, 다른 카탈로그에서 부르는 이름 — 으로, 로컬 릴리스가 아닌 공급자 릴리스에 의해 키가 지정됩니다. raw JSON은 보관하지 않으며, 어느 기기든 릴리스를 다시 가져올 수 있습니다.local_release_files: 이 기기에 있는 로컬 릴리스의 파일 경로와 수정 시각입니다.local_history: 이 기기의 사람이 프로필을 갖기 전의 재생 기록으로, 프로필이 만들어지면 그 사람의 비공개 서클로 옮겨집니다.
두 기기의 편집은 셀 단위로 병합되며, 둘 다 바꾼 셀은 나중 편집이 이깁니다. coven은 병합 기록을 자체 table에 두므로 bae의 table에는 clock column이 없습니다.
Blob
이 섹션으로 연결오디오와 이미지는 coven 파일이며, 종류마다 하나의 네임스페이스로 기기 캐시 예산이 따로 있습니다. release_files(20 GiB), covers(512 MiB), artist_images(256 MiB), avatars(64 MiB)입니다. row는 coven 파일의 id로 자기 파일을 참조합니다. release_files, covers, artist_images에서는 file, people에서는 avatar_id입니다. 파일의 크기, 콘텐츠 해시, 위치는 coven의 것이며 coven_files와 조인해서 읽습니다.
릴리스 파일은 사용자의 것입니다. 로컬 릴리스의 파일은 원래 경로에 있는 사용자 파일로, local_release_files에 기록되며, 그 row는 어떤 coven 파일도 참조하지 않습니다. 릴리스를 클라우드로 옮기면 한 번의 write로 모든 파일을 coven에 스테이징하고 각 row가 해당 파일을 가리키게 합니다. 마지막 파일이 저장되면 coven이 모두를 함께 클라우드로 전환하고, 다른 기기는 첫 읽기 때 각 파일을 캐시로 가져옵니다. 커버, 아티스트 이미지, 아바타는 bae의 것입니다. bae가 바이트를 만들고(커버는 최대 너비 600px의 JPEG 썸네일로 다시 렌더링), 기기는 각각을 처음 표시할 때 가져와 해당 네임스페이스의 예산이 밀어낼 때까지 보관합니다.
모든 파일은 스테이징될 때 고정되는 경로에 무작위 이름으로 암호화되어 업로드되므로, 나중에 이름을 바꿔도 객체는 이동하지 않습니다. 파일의 바이트는 절대 바뀌지 않습니다. 새 이미지는 새 파일입니다.
리핑본의 신원
이 섹션으로 연결가져올 때마다 새로운 임의 ID와 자체 트랙 및 파일 행을 가진 릴리스를 만듭니다. 각 기기는 자신의 각 가져오기가 읽은 파일들의 정렬된 상대 경로, 크기, 수정 시각의 SHA-256을 local_release_origin에 기록하며, 이 기록은 동기화되지 않습니다. 이 기기가 해시를 기록한 폴더는 어디로 옮겨지든 완료 탭에 있고, 그 행은 그 폴더에서 가져온 단 하나의 릴리스를 가리킵니다. 같은 기기에서 같은 파일을 다시 가져오면 실패하며, 완료 탭은 다시 가져오기 동작을 제공하지 않습니다.