// 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(); FileProvider _getProvider(String url) { if (url.startsWith('http://') || url.startsWith('https://')) { return WebDAVFileProvider(); } return LocalFileProvider(); } Future getMetadata({ required String url, required String fileName, required String fileId, bool forceRefresh = false, }) async { // 1. 检查缓存 if (!forceRefresh) { final cached = await _cache.get(fileId); if (cached != null && cached.isNotEmpty) { debugPrint('📦 [MetadataService] cache hit: ${cached.title}'); return cached; } } // 2. 获取文件 final provider = _getProvider(url); final file = await provider.getFile(url); if (file == null || !await file.exists()) { debugPrint( '⚠️ [MetadataService] file not available, using filename fallback'); return _fallbackFromFileName(fileName); } // 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) { final dotIndex = fileName.lastIndexOf('.'); final title = dotIndex > 0 ? fileName.substring(0, dotIndex) : fileName; return FinalMetadata( title: title, artist: '未知艺术家', source: 'filename', ); } }