现在的问题比较大,因为metadata的引入导致原有的部分播放进度信息推送错误
This commit is contained in:
@@ -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 {},
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user