47 lines
1.4 KiB
Dart
47 lines
1.4 KiB
Dart
// lib/metadata/metadata_reader.dart
|
|
import 'dart:io';
|
|
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 {
|
|
// ⭐ getImage: true 读取封面图
|
|
final meta = amr.readMetadata(file, getImage: true);
|
|
|
|
// ⭐ 提取第一张图片
|
|
Uint8List? artwork;
|
|
if (meta.pictures != null && meta.pictures!.isNotEmpty) {
|
|
artwork = meta.pictures.first.bytes;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|