现在的问题比较大,因为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
+56 -54
View File
@@ -1,71 +1,74 @@
// lib/metadata/metadata_model.dart
import 'dart:typed_data';
/// 从音频文件读取的原始元数据(未经任何处理)
/// 从音频文件读取的原始元数据
class RawMetadata {
final String title;
final String artist;
final String album;
final String albumArtist;
final String composer;
final String genre;
final List<String> genres; // ⬅️ 改为 List<String>
final List<String> performers; // ⬅️ 新增
final int year;
final int trackNumber;
final int trackTotal;
final int discNumber;
final int totalDisc;
final Duration? duration;
final Uint8List? artwork;
const RawMetadata({
this.title = '',
this.artist = '',
this.album = '',
this.albumArtist = '',
this.composer = '',
this.genre = '',
this.genres = const [],
this.performers = const [],
this.year = 0,
this.trackNumber = 0,
this.trackTotal = 0,
this.discNumber = 0,
this.totalDisc = 0,
this.duration,
this.artwork,
});
/// 判断是否为空(没有任何有效信息)
bool get isEmpty =>
title.isEmpty &&
artist.isEmpty &&
album.isEmpty &&
albumArtist.isEmpty &&
composer.isEmpty &&
genre.isEmpty &&
year == 0 &&
trackNumber == 0 &&
discNumber == 0 &&
artwork == null;
genres.isEmpty &&
performers.isEmpty &&
year == 0;
bool get isNotEmpty => !isEmpty;
}
/// 经过标准化处理后的元数据
/// 标准化后的元数据
class NormalizedMetadata {
final String title;
final String artist;
final String album;
final String albumArtist;
final String composer;
final String genre;
final List<String> genres;
final List<String> performers;
final int year;
final int trackNumber;
final int trackTotal;
final int discNumber;
final int totalDisc;
final Duration? duration;
final Uint8List? artwork;
const NormalizedMetadata({
this.title = '',
this.artist = '',
this.album = '',
this.albumArtist = '',
this.composer = '',
this.genre = '',
this.genres = const [],
this.performers = const [],
this.year = 0,
this.trackNumber = 0,
this.trackTotal = 0,
this.discNumber = 0,
this.totalDisc = 0,
this.duration,
this.artwork,
});
@@ -73,54 +76,43 @@ class NormalizedMetadata {
title.isEmpty &&
artist.isEmpty &&
album.isEmpty &&
albumArtist.isEmpty &&
composer.isEmpty &&
genre.isEmpty &&
year == 0 &&
trackNumber == 0 &&
discNumber == 0 &&
artwork == null;
genres.isEmpty &&
performers.isEmpty &&
year == 0;
bool get isNotEmpty => !isEmpty;
}
/// 带置信度的候选元数据
class CandidateMetadata {
final NormalizedMetadata metadata;
final double confidence; // 0.0 ~ 1.0
final Map<String, double> evidence; // 证据来源权重
const CandidateMetadata({
required this.metadata,
required this.confidence,
this.evidence = const {},
});
}
/// 最终确认的元数据
class FinalMetadata {
final String title;
final String artist;
final String album;
final String albumArtist;
final String composer;
final String genre;
final String genre; // ⬅️ 简化为单个流派(取第一个)
final List<String> genres; // ⬅️ 保留完整列表
final List<String> performers;
final int year;
final int trackNumber;
final int trackTotal;
final int discNumber;
final int totalDisc;
final Duration? duration;
final Uint8List? artwork;
final String source; // 'file_tag', 'filename', 'cache', 'user_corrected'
final String source;
const FinalMetadata({
this.title = '',
this.artist = '',
this.album = '',
this.albumArtist = '',
this.composer = '',
this.genre = '',
this.genres = const [],
this.performers = const [],
this.year = 0,
this.trackNumber = 0,
this.trackTotal = 0,
this.discNumber = 0,
this.totalDisc = 0,
this.duration,
this.artwork,
this.source = 'unknown',
});
@@ -129,13 +121,23 @@ class FinalMetadata {
title.isEmpty &&
artist.isEmpty &&
album.isEmpty &&
albumArtist.isEmpty &&
composer.isEmpty &&
genre.isEmpty &&
year == 0 &&
trackNumber == 0 &&
discNumber == 0 &&
artwork == null;
genres.isEmpty &&
performers.isEmpty &&
year == 0;
bool get isNotEmpty => !isEmpty;
}
/// 候选元数据
class CandidateMetadata {
final NormalizedMetadata metadata;
final double confidence;
final Map<String, double> evidence;
const CandidateMetadata({
required this.metadata,
required this.confidence,
this.evidence = const {},
});
}