渐进探测: - 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 个全绿。
25 lines
873 B
Dart
25 lines
873 B
Dart
// test/song_key_test.dart
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:qingting_player/utils/song_key.dart';
|
|
|
|
void main() {
|
|
group('songKeyFor', () {
|
|
test('同一 URL 多次计算结果一致(跨进程稳定)', () {
|
|
const url = 'https://example.com/dav/music/a.flac';
|
|
expect(songKeyFor(url), songKeyFor(url));
|
|
});
|
|
|
|
test('与探测大小无关:不同阶段的头部请求得到同一个键', () {
|
|
// 键只依赖 URL,因此 128KB / 512KB 两次探测不会产生两个缓存键
|
|
const url = 'https://example.com/dav/music/b.flac';
|
|
final key = songKeyFor(url);
|
|
expect(key, songKeyForUrl(url));
|
|
expect(key.length, 32); // md5 十六进制
|
|
});
|
|
|
|
test('不同 URL 得到不同键', () {
|
|
expect(songKeyFor('https://x/a.flac'), isNot(songKeyFor('https://x/b.flac')));
|
|
});
|
|
});
|
|
}
|