Skip to content

加载、封面与缓存 ​

当前实现 ​

位置优化边界
web/src/stores/player.ts 与 web/src/components/mini-player.tsx本站歌单逐首播放,使用原生音频与独立封面不自动下载整个歌单
音源解析短缓存最长 90 秒;切歌中止旧请求,过期响应丢弃;失败刷新一次缓存源地址不保证上游持续有效
播放控制当前曲目 preload=auto,使用原生缓冲和 Range;音质切换保留进度浏览器自行决定缓冲大小;不下载下一首完整音频
封面与音源解析并行获取;网易云请求 320px 缩略图;独立图片层,控制栏置于底部图片失败使用本地占位图,不阻塞音频
私有对象缓存Worker 使用私有 R2;命中支持 Range不设置公共音频 CDN 缓存

R2 缓存策略 ​

使用 AUDIO_CACHE 绑定与 AUDIO_CACHE_ENABLED=true。桶保持私有。每次读取先验证会话或播放签名、歌单归属,再检查当前可获取的音源,最后读取对象。

音频键隔离平台、账号、会话、歌曲、实际音质、格式、码率、试听状态与源路径。封面按来源隔离,读取入口仍需授权。音频逻辑有效 1 小时、封面 24 小时;R2 生命周期分别在 1 天和 2 天删除。

缓存只接收有明确长度的完整文件:音频不超过 16 MiB、封面不超过 2 MiB。每个 Worker isolate 同时只填充一个对象。首次 Range 访问可能后台额外请求完整文件;大文件、未知长度或写入失败继续代理,不阻断播放。使用 x-mfu-cache: HIT / MISS / BYPASS 检查状态。

对象命中减少音乐平台回源,但仍有会话验证、D1 查询和音源权限检查。R2 不自动等于边缘 CDN;不能根据“已启用”推断实际提速。

Node.js / Docker 的磁盘缓存及 SQLite 历史规则保存在冻结版原始文档,与本页的 Worker / R2 配置分别维护。

如何测量 ​

用同一账号、歌曲、音质分别测首次访问与缓存命中:记录解析耗时、首字节耗时、完整下载耗时、缓存头、源格式和文件大小。拖动进度应返回 206 及正确 Content-Range;退出账号后原媒体链接应失败。国内线路与海外线路分开测试,避免把网络波动作为缓存收益。

MusicForUrl · MIT License