use std::path::{Path, PathBuf};
use lofty::{read_from_path, Accessor, ItemKey, TaggedFileExt};
use crate::error::{MtagError, MtagResult};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct TrackMetadata {
pub source_path: PathBuf,
pub artist: Option<String>,
pub album: Option<String>,
pub album_artist: Option<String>,
pub disc: Option<String>,
pub track: Option<String>,
pub title: Option<String>,
}
pub fn read_track_metadata(path: &Path) -> MtagResult<TrackMetadata> {
let tagged_file = read_from_path(path).map_err(|source| MtagError::ReadMetadata {
path: path.to_path_buf(),
source,
})?;
let tag = tagged_file
.primary_tag()
.or_else(|| tagged_file.first_tag())
.ok_or_else(|| MtagError::MissingTags {
path: path.to_path_buf(),
})?;
Ok(TrackMetadata {
source_path: path.to_path_buf(),
artist: clean_string(tag.artist().as_deref()),
album: clean_string(tag.album().as_deref()),
album_artist: clean_string(tag.get_string(&ItemKey::AlbumArtist)),
disc: tag.disk().map(|disk| disk.to_string()),
track: tag.track().map(|track| track.to_string()),
title: clean_string(tag.title().as_deref()),
})
}
fn clean_string(value: Option<&str>) -> Option<String> {
value
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToOwned::to_owned)
}