现在的问题比较大,因为metadata的引入导致原有的部分播放进度信息推送错误

This commit is contained in:
2026-08-23 20:29:31 +08:00
parent 9a60441e04
commit d593ce05a1
9 changed files with 203 additions and 167 deletions
+21 -17
View File
@@ -2,39 +2,43 @@
import 'metadata_model.dart';
class MetadataNormalizer {
/// 标准化原始数据(清洗空格、推断、fallback)
NormalizedMetadata normalize(RawMetadata raw,
{String fileName = '', String filePath = ''}) {
// 1. 修剪空格
final title = raw.title.trim();
final artist = raw.artist.trim();
final album = raw.album.trim();
final albumArtist = raw.albumArtist.trim();
// 2. 如果 title 为空,尝试从文件名推断
// 2. 如果 title 为空,从文件名推断
final finalTitle =
title.isNotEmpty ? title : _inferTitleFromFileName(fileName);
// 3. 如果 artist 为空,尝试从路径推断或使用默认值
// 3. 如果 artist 为空,从路径推断或使用默认值
final finalArtist =
artist.isNotEmpty ? artist : _inferArtistFromPath(filePath);
// 4. 如果 performers 不为空且 artist 为空,用 performers 的第一个
final finalArtist2 = finalArtist.isNotEmpty
? finalArtist
: (raw.performers.isNotEmpty ? raw.performers.first : '未知艺术家');
return NormalizedMetadata(
title: finalTitle,
artist: finalArtist,
artist: finalArtist2,
album: album,
albumArtist: albumArtist,
composer: raw.composer.trim(),
genre: raw.genre.trim(),
genres: raw.genres,
performers: raw.performers,
year: raw.year,
trackNumber: raw.trackNumber,
trackTotal: raw.trackTotal,
discNumber: raw.discNumber,
totalDisc: raw.totalDisc,
duration: raw.duration,
artwork: raw.artwork,
);
}
String _inferTitleFromFileName(String fileName) {
// 去掉扩展名
final dotIndex = fileName.lastIndexOf('.');
if (dotIndex > 0) {
return fileName.substring(0, dotIndex).trim();
@@ -43,10 +47,8 @@ class MetadataNormalizer {
}
String _inferArtistFromPath(String filePath) {
// 简单推断:尝试从路径中的文件夹名获取
final parts = filePath.split(RegExp(r'[/\\]'));
if (parts.length >= 2) {
// 倒数第二个文件夹可能是艺术家
final candidate = parts[parts.length - 2].trim();
if (candidate.isNotEmpty && !candidate.contains(' ')) {
return candidate;
@@ -55,10 +57,8 @@ class MetadataNormalizer {
return '未知艺术家';
}
/// 评估候选元数据(第一阶段:直接接受,不纠错)
CandidateMetadata evaluate(
NormalizedMetadata normalized, List<Map<String, dynamic>> history) {
// 第一阶段:置信度固定为 0.8(文件名+标签混合)
return CandidateMetadata(
metadata: normalized,
confidence: 0.8,
@@ -66,18 +66,22 @@ class MetadataNormalizer {
);
}
/// 决策是否修正(第一阶段:直接接受)
FinalMetadata decide(CandidateMetadata candidate, {double threshold = 0.6}) {
return FinalMetadata(
title: candidate.metadata.title,
artist: candidate.metadata.artist,
album: candidate.metadata.album,
albumArtist: candidate.metadata.albumArtist,
composer: candidate.metadata.composer,
genre: candidate.metadata.genre,
genre: candidate.metadata.genres.isNotEmpty
? candidate.metadata.genres.first
: '',
genres: candidate.metadata.genres,
performers: candidate.metadata.performers,
year: candidate.metadata.year,
trackNumber: candidate.metadata.trackNumber,
trackTotal: candidate.metadata.trackTotal,
discNumber: candidate.metadata.discNumber,
totalDisc: candidate.metadata.totalDisc,
duration: candidate.metadata.duration,
artwork: candidate.metadata.artwork,
source: 'normalized',
);