云存储
云端主目录是用户已经拥有的存储中的一个位置。每个提供商都通过 coven 中同一个存储接口驱动;各提供商不同的是登录、设置方式,以及其他人和设备如何到达它。
| 提供商 | 登录 | 你自己的新设备 | 你邀请的人 |
|---|---|---|---|
| S3-compatible | Access key + secret | 恢复码,加上在二维码中随它一起携带的你的访问密钥 | 为对方创建的访问密钥 |
| Dropbox | OAuth,由 coven 保管 | 恢复码,然后登录你的 Dropbox | 资料库的共享文件夹共享给对方的账户 |
| OneDrive | OAuth,由 coven 保管 | 恢复码,然后登录你的 OneDrive | 资料库的文件夹共享给对方的账户 |
| iCloud (CloudKit) | Apple Account,无需登录 | 恢复码,也可从 iCloud 钥匙串中选取 | 资料库的 CloudKit 区域共享给对方的 Apple Account |
S3-compatible 覆盖 AWS、Backblaze B2、Cloudflare R2、Wasabi,以及任何使用该 API 的其他服务。设置表单只询问 bucket、region、endpoint 和访问密钥;coven 会根据 endpoint 的主机识别已知服务,并补全与它们通信的方式。高级 中有可选的 key prefix 和服务配置选项,默认为自动。对于 coven 不认识的服务,检测设置 会用该密钥探测 bucket 并显示它找到的结果。设置会在保存任何内容之前检查提供商,因此拼写错误会在设置时失败,而不是第一次同步时失败,bae 也会用通俗的话说明 coven 给出的原因。Dropbox、OneDrive 和 iCloud 只存在于完整 bae 版本;baeium 构建会编译掉它们。
登录和文件夹
Section titled “登录和文件夹”coven 自行完成 Dropbox 和 OneDrive 的登录,因此没有任何 token 经过 bae。桌面端由浏览器打开提供商页面,本地监听器接收那一次 redirect;移动端则由平台的登录界面完成。coven 把 token 保存在 OS keyring 中,提供商拒绝某个 token 时会刷新一次;刷新失败会在同步状态中显示为 登录 操作,而不是静默重试循环。
登录后,用户选择资料库放在哪里。在 Dropbox 上它是一个共享文件夹,因为家庭资料库要共享给其他人的账户;为此 bae 使用完整 Dropbox 访问权限,而不是应用文件夹。如果还没有共享文件夹,bae 会提示先在 Dropbox 中共享一个文件夹,再重新查找。在 OneDrive 上可以是任意文件夹,从顶层开始浏览,也可以在那里新建一个。
CloudKit 完全不需要流程:coven 在 Apple 平台上以已登录 Apple Account 的身份驱动它。
在主目录内,每个对象路径都以资料库的 store id 开头:coven 的编号变更序列、它的 snapshot、加入请求和已存储的文件。多个资料库可以共用同一个 Dropbox 或 OneDrive 文件夹,而不会触碰彼此的对象。
每个对象都会加密并以随机名称存储;没有明文模式。bae 的文件是 coven 文件,由四张同步表的行引用:release_files、covers、artist_images,以及每个 people 行上的头像。文件路径在暂存时就已固定,因此重命名专辑永远不会移动它。见加密。
真实网络下的行为
Section titled “真实网络下的行为”播放读取是 ranged:播放器获取它需要的加密分块,而不是整个文件,并在按顺序播放文件时提前获取。速率限制和临时提供商错误会按同一个退避计划重试,并在给出 retry-after 时遵守它。上传队列能跨重启保留:退出应用打断的上传会接着进行,而不是从头开始,已暂停的上传也会保持暂停。