lxh2875931338
|
18308d9d4e
|
feat(metadata): 元数据分阶段探测(128KB → 512KB)+ song_key 改为纯 URL
渐进探测:
- FileProvider.getFile 增加 maxBytes 参数,WebDAV 按需只取头部
- MetadataService 先取 128KB 读标签;title/artist 都为空时再补到 512KB
- 缓存文件按上限区分(metadata_<hash>_128k.part / _512k.part)
song_key:
- 从 md5(url|size) 改为 md5(url)。分阶段探测的大小不同,
带 size 会让同一首歌产生两个键;URL 在各阶段稳定。
- 代价:同 URL 换内容不自动失效,由清除单曲缓存/forceRefresh 兜底
- 数据库升到 v6,清空 songs / metadata_cache(可再生)
验证(release,真机):
📦 取头部 128KB(上限 128KB,不再整文件下载)
🧭 状态机: first_seen → pending(validations=1)
📊 pending conf=0.92 evidence={...}
✅ saved: 两生关 - 谢安琪
测试:新增 song_key 3 个用例,累计 19 个全绿。
|
2026-10-24 20:28:50 +08:00 |
|
lxh2875931338
|
b8138ad125
|
feat(metadata): 元数据引擎第 3 步之一——一致性与冲突感知的状态机
之前只要 confidence>=0.6 且 validation_count>=2 就升级 verified,
两次读到不同结果也会被当成"验证通过",错误标签一旦写入很难纠正。
新增 MetadataStability(纯函数,可单测):
- 首次见到 → pending(first_seen),次数 1
- 与上次记录标题/艺术家冲突 → pending(conflict),次数重置为 1
- 一致且次数 >= 2、置信度达标 → verified(stable)
- 置信度不足 → pending(low_confidence),次数继续累计
- 字段缺失不算冲突;比较时忽略大小写与首尾空格
metadata_service 改为调用该状态机,并打印判定原因:
🧭 [MetadataService] 状态机: stable → verified(validations=2)
测试:新增 test/metadata_stability_test.dart 7 个用例,
连同原有 9 个共 16 个,flutter test 全绿。
已构建并安装 release 验证。
|
2026-10-24 20:24:55 +08:00 |
|
lxh2875931338
|
30111a5f0c
|
feat(metadata): 元数据引擎第 2 步——置信度模型 + pending/verified 状态机
之前 evaluate() 写死 0.8、decide() 直接透传,history 参数没人用,
"自学习"只有骨架。这次补上:
置信度(MetadataNormalizer.evaluate)
- 字段来源可追溯:NormalizedMetadata 新增 titleFromTag / artistFromTag / albumFromTag
- 基础分 0.25;标题 +0.20、标题来自标签再 +0.10(文件名当标题则 -0.10)
- 艺术家 +0.15、来自标签 +0.10;专辑 +0.10;年份 +0.03;封面 +0.02
- 历史一致性:同艺人 >=2 条 +0.05,同专辑 >=2 条 +0.03
- 结果 clamp 到 0.05~0.98,且每个加分项写入 evidence,便于日志解释
状态机(MetadataService)
- 只有 confidence>=0.6 且 status=verified 的记录才直接命中
- pending 记录下次播放会重新读取并合并(自修复)
- validation_count 累加;>=2 次且置信度达标才升级为 verified
- 新结果置信度低于旧结果时保留旧字段,只累加验证次数
- 日志输出 status / confidence / validation_count / evidence
测试
- 新增 test/metadata_normalizer_test.dart,9 个用例覆盖来源标记、分级、
历史加权、证据、阈值;flutter test 全绿
真机验证
- 起播看门狗在真实弱网下触发:23:44:50 打开失败 → 15s 后自动重连 →
1.4s 出声(open 仅 100ms)
|
2026-10-23 23:45:29 +08:00 |
|
lxh2875931338
|
46a9add5cb
|
build+fix: debug 包独立为 .dev,并修复元数据缓存永远查不到
包名:
- debug 使用 com.lxh.qingting_player.dev(应用名"清听 Dev"),可与 release 并存
- release 保持 com.lxh.qingting_player
- Android 包名每一段必须以字母开头,因此用 .dev 而非 _dev
- AGP 9 需显式开启 buildFeatures.resValues;移除 manifest 中已废弃的 package 属性
元数据(两个独立原因叠加):
1. song_key 之前用 String.hashCode / 本地临时文件 mtime,都不稳定;
2. songs.remote_path 存的是完整 URL,而所有查询都用相对路径(song.id),
getSongByPath 永远 miss,UI 只能回退到文件名。
- 新增 utils/song_key.dart:songKeyFor(url,size)=md5(url|size),跨进程稳定
- metadata_service: remote_path 改存 fileId(相对路径),并改用稳定 song_key
- audio_service / file_provider: 同步使用稳定键
- 数据库升级 v5:清空 songs / metadata_cache(可再生缓存;歌单与收藏按路径存储,不受影响)
- device-check.ps1: 支持 -Package,默认校验 dev 包,启动组件改为向 PackageManager 解析
验证:两次独立 dart 进程 song_key 输出一致;真机 debug/release 并存安装,单实例自检通过。
|
2026-10-22 23:47:32 +08:00 |
|
lxh2875931338
|
f2b4d1f46d
|
通知中心封面图显示
部分界面的信息更新
缓存系统初步引入
即将进入播放列表更新
|
2026-08-25 23:09:17 +08:00 |
|
lxh2875931338
|
0e8921742c
|
引入部分缓存机制
引入封面图信息
正在进入测试阶段
|
2026-08-25 22:13:36 +08:00 |
|
lxh2875931338
|
7bd23bfee6
|
metadata读取能力已达成,接下来会顺着路径完成部分缓存指针设计
|
2026-08-25 21:57:04 +08:00 |
|
lxh2875931338
|
d593ce05a1
|
现在的问题比较大,因为metadata的引入导致原有的部分播放进度信息推送错误
|
2026-08-23 20:29:31 +08:00 |
|
lxh2875931338
|
9a60441e04
|
基础实现代码框架先上,后面慢慢改逻辑
|
2026-08-23 19:24:16 +08:00 |
|