metadata读取能力已达成,接下来会顺着路径完成部分缓存指针设计

This commit is contained in:
2026-08-25 21:57:04 +08:00
parent b75ea9e4ce
commit 7bd23bfee6
8 changed files with 107 additions and 35 deletions
+46 -8
View File
@@ -1,38 +1,76 @@
// lib/metadata/metadata_service.dart
// ⭐ 移除未使用的 import 'dart:io';
import 'package:flutter/foundation.dart'; // ⭐ 添加
import 'metadata_model.dart';
import 'metadata_reader.dart';
import 'metadata_normalizer.dart';
import 'metadata_cache.dart';
import 'file_provider.dart';
class MetadataService {
static final MetadataService _instance = MetadataService._internal();
factory MetadataService() => _instance;
MetadataService._internal();
final MetadataReader _reader = MetadataReader();
final MetadataNormalizer _normalizer = MetadataNormalizer();
final MetadataCache _cache = MetadataCache();
/// 临时版本:不进行实际文件读取,只返回基于文件名的 fallback
FileProvider _getProvider(String url) {
if (url.startsWith('http://') || url.startsWith('https://')) {
return WebDAVFileProvider();
}
return LocalFileProvider();
}
Future<FinalMetadata> getMetadata({
required String url,
required String fileName,
required String fileId,
bool forceRefresh = false,
}) async {
// 1. 检查缓存(如果有)
// 1. 检查缓存
if (!forceRefresh) {
final cached = await _cache.get(fileId);
if (cached != null && cached.isNotEmpty) {
debugPrint('📦 [MetadataService] cache hit: ${cached.title}');
return cached;
}
}
// 2. 暂时不读取文件,直接 fallback
final fallback = _fallbackFromFileName(fileName);
// 2. 获取文件
final provider = _getProvider(url);
final file = await provider.getFile(url);
// 3. 缓存结果(即使 fallback 也缓存,避免频繁调用)
if (fallback.isNotEmpty) {
await _cache.put(fileId, fallback);
if (file == null || !await file.exists()) {
debugPrint(
'⚠️ [MetadataService] file not available, using filename fallback');
return _fallbackFromFileName(fileName);
}
return fallback;
// 3. 读取 metadata
final raw = await _reader.readRawMetadata(file);
// 4. 标准化
final normalized = _normalizer.normalize(
raw,
fileName: fileName,
filePath: url,
);
// 5. 评估(第一阶段:直接接受)
final history = await _cache.getHistory(normalized.artist, limit: 10);
final candidate = _normalizer.evaluate(normalized, history);
final finalMetadata = _normalizer.decide(candidate);
// 6. 缓存
if (finalMetadata.isNotEmpty) {
await _cache.put(fileId, finalMetadata);
debugPrint(
'✅ [MetadataService] metadata saved: ${finalMetadata.title} - ${finalMetadata.artist}');
}
return finalMetadata;
}
FinalMetadata _fallbackFromFileName(String fileName) {