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 个全绿。
This commit is contained in:
@@ -22,8 +22,8 @@ class MetadataService {
|
||||
final MetadataCache _memoryCache = MetadataCache();
|
||||
final SongDatabase _db = SongDatabase();
|
||||
|
||||
String _generateSongKey(String url, int fileSize) {
|
||||
return songKeyFor(url, fileSize);
|
||||
String _generateSongKey(String url) {
|
||||
return songKeyFor(url);
|
||||
}
|
||||
|
||||
FileProvider _getProvider(String url) {
|
||||
@@ -59,17 +59,28 @@ class MetadataService {
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 获取文件
|
||||
// 2. 分阶段取头部:先 128KB 拿 title/artist,读不到再补到 512KB。
|
||||
// 弱网下首包更小,标签能更快出来,也少占带宽。
|
||||
final provider = _getProvider(url);
|
||||
final file = await provider.getFile(url);
|
||||
var file = await provider.getFile(url, maxBytes: 128 * 1024);
|
||||
|
||||
if (file == null || !await file.exists()) {
|
||||
debugPrint('⚠️ [MetadataService] file not available, using fallback');
|
||||
return _fallbackFromFileName(fileName);
|
||||
}
|
||||
|
||||
var raw = await _reader.readRawMetadata(file);
|
||||
if (raw.title.isEmpty && raw.artist.isEmpty) {
|
||||
debugPrint('📦 [MetadataService] 128KB 没读到标签,补取到 512KB');
|
||||
final bigger = await provider.getFile(url, maxBytes: 512 * 1024);
|
||||
if (bigger != null && await bigger.exists()) {
|
||||
file = bigger;
|
||||
raw = await _reader.readRawMetadata(file);
|
||||
}
|
||||
}
|
||||
|
||||
final stat = await file.stat();
|
||||
final songKey = _generateSongKey(url, stat.size);
|
||||
final songKey = _generateSongKey(url);
|
||||
|
||||
// 3. SQLite 查询:只有「已验证」的记录才直接返回。
|
||||
// pending 记录会继续往下走,重新读取并累计 validation_count,
|
||||
@@ -114,10 +125,7 @@ class MetadataService {
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 读取原始 metadata
|
||||
final raw = await _reader.readRawMetadata(file);
|
||||
|
||||
// 5. 标准化
|
||||
// 4. 标准化(raw 已在上面分阶段读取)
|
||||
final normalized = _normalizer.normalize(
|
||||
raw,
|
||||
fileName: fileName,
|
||||
|
||||
Reference in New Issue
Block a user