// lib/metadata/metadata_reader.dart import 'dart:io'; 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: false); return RawMetadata( title: meta.title ?? '', artist: meta.artist ?? '', album: meta.album ?? '', // ⭐ genres 和 performers 是非空 List,直接使用 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, ); } catch (e) { return const RawMetadata(); } } /// 安全转换为 int,处理 Object 类型 int _toInt(dynamic value) { if (value == null) return 0; if (value is int) return value; if (value is String) return int.tryParse(value) ?? 0; // 有些字段可能是 double 或 num if (value is num) return value.toInt(); return 0; } }