渐进探测: - 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 个全绿。
19 lines
699 B
Dart
19 lines
699 B
Dart
// lib/utils/song_key.dart
|
|
import 'dart:convert';
|
|
import 'package:crypto/crypto.dart';
|
|
|
|
/// 歌曲缓存键(song_key)。
|
|
///
|
|
/// 只用 URL:元数据读取是"分阶段取头部"的,第一次可能只取 128KB、
|
|
/// 第二次补到 512KB。如果键里带文件大小,两次会得到不同的键,缓存立刻失效;
|
|
/// URL 在这些阶段之间是稳定的。
|
|
///
|
|
/// 代价:同一个 URL 换了文件内容时不会自动失效,由"清除单曲缓存 /
|
|
/// forceRefresh"兜底。
|
|
String songKeyFor(String url) {
|
|
return md5.convert(utf8.encode(url)).toString();
|
|
}
|
|
|
|
/// 语义化别名,用于临时文件命名等场景。
|
|
String songKeyForUrl(String url) => songKeyFor(url);
|