数据模型
bae 的目录是普通 SQLite,逐表声明给 coven:同步表会传到每台能读取它们的设备;未声明表永远不离开设备。这个划分是数据模型中最承重的决定,因此本页围绕它组织。
schema 的同步核心:
artists、albums、works:分组层。专辑聚合自己的发行,并指向一个 primary;works 为古典结构形成父/子图。- **
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:播放规格。按曲目记录 codec、采样率、位深、声道、测量响度和峰值,以及 pregap 长度。segments 把曲目映射到其来源文件的有序字节窗口和采样窗口,这就是 CUE 抓轨中的曲目(包括 pregap)可以跨越一个大文件或多个文件区域的方式。release_files、covers、artist_images:带 blob 的表。行是目录项;字节存在 coven 的 blob 层中(见下文)。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 文件的 id 引用其文件:release_files、covers 和 artist_images 上是 file,people 上是 avatar_id。文件的大小、内容哈希和位置属于 coven,通过连接 coven_files 读取。
发行文件属于用户:本地发行的文件就是用户位于原始路径的文件,记录在 local_release_files 中,其行不引用任何 coven 文件。把发行移至云端会在一次写入中把每个文件暂存到 coven,并让每一行指向其文件;最后一个文件存储完成后,coven 把它们一起切换到云端,其他设备在第一次读取时把每个文件取入缓存。封面、艺人图像和头像属于 bae:bae 生成字节(封面会重新渲染为最宽 600px 的 JPEG 缩略图),设备在每个图像首次显示时获取它,并保留到其命名空间的预算将其逐出为止。
每个文件都会以随机名称加密上传,路径在暂存时固定,因此之后重命名不会移动对象。文件的字节永不改变:新图像就是新文件。
每次导入都会创建一个使用新随机 ID 的发行,并拥有独立的曲目和文件记录。每台设备都会在 local_release_origin 中记录其每次导入所读取文件的排序后相对路径、大小及修改时间的 SHA-256;该记录从不同步。本设备记录过哈希的文件夹无论移到哪里都在已完成标签页中,其行指向从中导入的唯一发行。在该设备上再次导入相同的文件会失败,已完成标签页不提供重新导入操作。