听歌历史同步(网易云)
CurrentMusic 的播放仍以本地记录为准,同时在用户已绑定网易云账号时异步写入该账号的听歌历史。
触发方式
播放端仍然只调用本地接口:
POST /cm/plays/{ncmId} # 开始播放
POST /cm/plays/{ncmId} {"ms":…} # 播放中增量上报,前端约每 30 秒一次
服务端在 POST /plays/{ncmId} 内额外做两件事:
- 开始播放:用用户自己的
ncmbindcookie 异步写网易云startplay(/api/feedback/weblog),尽量让「最近播放」立即出现; - 累计满 60 秒:取该次播放的累计真实收听毫秒数,异步调用
API-enhanced
/scrobble(eapi通道,startplay + play),写入网易云听歌记录/排行。
开始播放 → startplay(尽力)
累计 60s → scrobble(time=累计秒数) → user/record 可见
行为与边界
- 只有绑定网易云的 CurrentMusic 用户才会同步;未绑定只写本地
plays。 - 使用用户自己的绑定 cookie,不使用服务器共享 SVIP 账号。
- 同步是异步的:网络失败不会让
/plays失败、不会卡播放;本地时长照常累计。 - 每次播放最多写一次合格
play;通过plays.ncm_synced原子领取,失败会放回, 下一个 30 秒增量会重试。 - 未满 60 秒的播放不会进入网易云听歌排行;开始播放的 startplay 仍可能进入“最近播放” (取决于网易云上游是否接受该次客户端日志)。
- 本地
plays与网易云记录可能因上游风控、账号未绑定、网络失败而短暂不一致; 不修改本地历史来“补齐”网易云。 - 只有歌曲播放(不含 MV/视频/播客声音)走这条同步链路。
相关字段
plays 新增 ncm_synced(0/1,单次播放是否已写合格网易云记录),旧库启动时自动补列。
接口字段与 docs/lyrics-api.md 等无关,不需要客户端改动。
验证
在已绑定账号上,完整播放超过 60 秒后,可在网易云「最近播放 / 听歌排行」中看到该曲; 服务端不会把本地未满 60 秒的播放强行补成合格记录。