feat(ncm §20): 音质体系全量——八档UI/VIP检测缓存/逐级降级下首恢复/fee门禁/默认极高HQ
- core: 9档枚举(顺序=降级链, DOLBY映射保留不进UI/链) + level_key(sky/sky_c51)
+ level_gate(CVIP/SVIP门槛) + song_url surround档附加immerseType=c51
+ song_url_auto全档表降级(out_level回填/响应level静默降档采信/try_fn可注入)
+ vip_info(weapi v2优先v1兜底) + parse_vip_info离线可测 + NCM_ERR_VIP(-15)
- app/logic/account.c(新): account.json会员态缓存(uid/nick/vip/双expire/checked_at)
刷新=登录后/超1天/到期后各一次不轮询; account_vip本地到期降档视图
- player_manager: 用户档按会员钳顶后逐级降级(不硬拒,缓存键仍用户档),
fee∈{1,4}且非会员→NCM_ERR_VIP零请求(缓存命中优先), eff_level回填
- UI: 设置页八档(规格+门槛+未解锁标注,允许选定), 播放页时间行中央
生效档/已降级至xx小字, VIP专享文案; 默认档Hi-Res→极高HQ(存量设置保留)
- 验证(0真实请求): degrade_sim 90例矩阵全PASS; player_flow_sim P1-P8全PASS;
test_ncm_core vip解析9例宿主+qemu全PASS; 窗口/分页/缓存/封面/audiod sim全PASS;
mipsel -Wall -Wextra 0 warning; 6页离屏rc=0。未部署真机(留主会话)
This commit is contained in:
1 parent
ab4dfb4f9c
commit
bdd9e898f4
23 files changed
+1026
-70
No files matched your search
@@ -89,6 +89,7 @@ typedef struct ncm_play_run {
|
||||
int64_t dl_done; /* 本曲已下载字节(缓冲期进度反馈,§18) */
|
||||
int64_t dl_total; /* 本曲标称大小(song_url 返回;0=未知) */
|
||||
int has_track; /* 当前是否有可播曲目(含 url 获取中) */
|
||||
int eff_level; /* 实际生效音质档(§20;≠用户档时播放页标注「已降级至 xx」;-1=未定) */
|
||||
/* 播放曲快照(REPORT §17):run_song 起播时把歌曲对象整体拷入(mu 保护),
|
||||
* 之后播放/歌词/IPC/UI 全读快照而非窗口——窗口滑出当前播放曲也不影响播放。 */
|
||||
ncm_song_t play_song;
|
||||
@@ -115,6 +116,10 @@ typedef struct ncm_app_state {
|
||||
/* 账号 */
|
||||
char uid[32];
|
||||
char nickname[128];
|
||||
/* 会员态(§20,account.json 落盘:data/account.json;刷新=登录后/超 1 天/到期后一次) */
|
||||
int vip; /* NCM_VIP_*(NONE/CVIP/SVIP) */
|
||||
int64_t vip_expire_ms; /* 当前档到期时间(ms;0=无/未知) */
|
||||
int64_t vip_checked_at; /* vip/info 最近获取时间(秒) */
|
||||
|
||||
/* 我的歌单 */
|
||||
ncm_playlist_t playlists[NCM_PLAYLIST_MAX];
|
||||
@@ -290,6 +295,13 @@ int appstate_song_fetch(int gidx, ncm_song_t *out); /* 任意全局下标物化
|
||||
* 不滑窗(播放线程用,避免与浏览视口抢窗口) */
|
||||
void appstate_adopt_songs(int n); /* 收编外部已填的 songs[0..n)(搜索结果)为窗口 base=0,
|
||||
* 同步 song_ids/track_ids_count(播放上下文) */
|
||||
|
||||
/* account(app/logic/account.c,§20 会员态):account.json 落盘 + 刷新策略
|
||||
* (登录后/缓存超 1 天/到期后 各查一次,不轮询——风控)。 */
|
||||
void account_load(void); /* appstate_init 时读 account.json 恢复 vip 态 */
|
||||
int account_vip(void); /* 当前有效会员档(到期自动降档视图,不联网) */
|
||||
int account_level_cap(void); /* 会员态允许的最高音质档(NONE→EXHIGH/CVIP→HIRES/SVIP→SURROUND) */
|
||||
void account_vip_maybe_refresh(int force); /* worker 线程上下文调用(含网络,单次) */
|
||||
void appstate_apply_playlist_cover(int idx);
|
||||
void appstate_set_playing_song(int idx, const char *cover_url);
|
||||
int appstate_current_playing(void); /* 返回当前播放歌曲下标(UI) */
|
||||
@@ -340,6 +352,11 @@ int player_manager_load_lyric(void); /* 为当前曲目拉歌词并
|
||||
int player_manager_error(void);
|
||||
int player_manager_current_song(ncm_song_t *out); /* 播放曲快照锁内拷贝;0=有效 -1=无(REPORT §17) */
|
||||
void player_manager_dl(int64_t *done, int64_t *total); /* 本曲下载进度(字节;total=0 未知,§18) */
|
||||
int player_manager_eff_level(void); /* 实际生效音质档(§20;-1=未定) */
|
||||
|
||||
/* 音质档位显示名/规格(ui/chrome.c,§20 八档 UI 权威口径;settings/player 共用) */
|
||||
const char *ncm_level_name(int lv); /* 短名:标准/极高 HQ/无损 SQ/Hi-Res/高清臻音/臻音全景声/超清母带/沉浸环绕声 */
|
||||
const char *ncm_level_spec(int lv); /* 规格:128kbps / ≤320kbps / 48kHz·16bit / ... */
|
||||
|
||||
/* songmeta(app/logic/songmeta.c):歌曲元数据本地缓存(<cache_dir>/meta/<id>.bin),
|
||||
* 拉过的 song_detail 结果序列化落盘,再次入窗免重复请求(REPORT §17)。 */
|
||||
|
||||
Reference in new issue
Block a user