播放统计——按歌曲稳定身份记录的累计时长、每日桶与周月年窗口
记录维度
PlaybackStatsRepository 按歌曲稳定身份记录,每个歌曲条目包含:
| 字段 | 说明 |
|---|---|
| 播放次数 | 累计播放次数 |
| 累计收听时长 | 累计播放的毫秒数 |
| 首次播放时间 | 第一次播放的时间戳 |
| 最近播放时间 | 最近一次播放的时间戳 |
| 每日统计桶 | 按日期分桶的累计数据 |
窗口查询
统计页面支持按四种窗口查看:
- 日:今天的收听量
- 周:近 7 天窗口
- 月:近 30 天窗口
- 年:近 365 天窗口
- 总计:全部历史累计
周/月/年窗口是滑动窗口,不是日历窗口——从当前时刻往前推固定天数。
延迟批量写入
播放和流量统计采用延迟批量写入策略:
- 播放结束后不是立刻写数据库,而是在内存中累积
- 到关键生命周期阶段(应用暂停、页面切换、定时 flush)时统一写入
- 这样可以避免高频小写入拖慢数据库性能
同步合并
播放统计参与 GitHub/WebDAV 同步。同步时的合并规则:
- 全量累计保留:每台设备的累计播放次数和时长都保留,不互相覆盖
- 每日桶:按日期合并,同一日期的数据相加
- 旧版兼容:旧版 bucket-only 数据(只有每日桶、没有全量累计)会被提升为可见累计
周榜和月榜由同步后的歌曲收听统计动态生成:
- 周榜门槛:累计收听 ≥ 10 分钟
- 月榜门槛:累计收听 ≥ 30 分钟
播放累计与每日桶不再按数量淘汰(历史版本有这个设计,已移除),流量统计保留自己的窗口淘汰策略。
歌单级统计
除了歌曲维度,还统计:
- 歌单打开次数
- 本地歌单累计播放
- 本地歌单每日播放
歌单统计同样参与同步,按设备分片合并。
为什么不同步到第三方平台
出于账号安全考虑,NeriPlayer 不向网易云 / Bilibili / YouTube Music 上传本地播放历史和播放统计。中心化音乐平台的客户端通常存在风控与行为采样机制,直接上报历史播放数据可能触发异常登录、异常播放或账号冻结等风险。这是刻意的设计选择。