Files
QingTing-Player/lib/metadata/metadata_reader.dart
T
lxh2875931338 f2b4d1f46d 通知中心封面图显示
部分界面的信息更新
缓存系统初步引入
即将进入播放列表更新
2026-08-25 23:09:17 +08:00

60 lines
1.8 KiB
Dart

// lib/metadata/metadata_reader.dart
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/foundation.dart';
import 'package:audio_metadata_reader/audio_metadata_reader.dart' as amr;
import 'metadata_model.dart';
class MetadataReader {
Future<RawMetadata> readRawMetadata(File file) async {
try {
final meta = amr.readMetadata(file, getImage: true);
debugPrint('📢 [MetadataReader] pictures count: ${meta.pictures.length}');
Uint8List? artwork;
if (meta.pictures.isNotEmpty) {
try {
final pic = meta.pictures.first;
// 尝试获取图片数据,兼容不同字段名
artwork = (pic as dynamic).bytes ?? (pic as dynamic).data;
if (artwork != null) {
debugPrint(
'📢 [MetadataReader] artwork extracted: ${artwork.length} bytes');
}
} catch (e) {
debugPrint('⚠️ [MetadataReader] artwork extraction failed: $e');
}
} else {
debugPrint('📢 [MetadataReader] no artwork found');
}
return RawMetadata(
title: meta.title ?? '',
artist: meta.artist ?? '',
album: meta.album ?? '',
genres: meta.genres,
performers: meta.performers,
year: _toInt(meta.year),
trackNumber: _toInt(meta.trackNumber),
trackTotal: _toInt(meta.trackTotal),
discNumber: _toInt(meta.discNumber),
totalDisc: _toInt(meta.totalDisc),
duration: meta.duration,
artwork: artwork,
);
} catch (e) {
debugPrint('⚠️ [MetadataReader] read failed: $e');
return const RawMetadata();
}
}
int _toInt(dynamic value) {
if (value == null) return 0;
if (value is int) return value;
if (value is String) return int.tryParse(value) ?? 0;
if (value is num) return value.toInt();
return 0;
}
}