metadata读取能力已达成,接下来会顺着路径完成部分缓存指针设计
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user