// 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 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; } }