use mpris::Metadata;
#[derive(Debug, Default, PartialEq)]
pub struct Track {
artist: String,
title: String,
album: Option<String>,
}
impl Track {
pub fn artist(&self) -> &str {
&self.artist
}
pub fn title(&self) -> &str {
&self.title
}
pub fn album(&self) -> Option<&str> {
self.album.as_deref()
}
pub fn new(artist: &str, title: &str, album: Option<&str>) -> Self {
Self {
artist: artist.to_owned(),
title: title.to_owned(),
album: album.and_then(|album| {
if !album.is_empty() {
Some(album.to_owned())
} else {
None
}
}),
}
}
pub fn clear(&mut self) {
self.artist.clear();
self.title.clear();
self.album.take();
}
pub fn clone_from(&mut self, other: &Self) {
self.artist.clone_from(&other.artist);
self.title.clone_from(&other.title);
self.album.clone_from(&other.album);
}
pub fn from_metadata(metadata: &Metadata) -> Self {
let artist = metadata
.artists()
.as_ref()
.and_then(|artists| artists.first().copied())
.unwrap_or("")
.to_owned();
let title = metadata.title().unwrap_or("").to_owned();
let album = metadata.album_name().and_then(|album| {
if !album.is_empty() {
Some(album.to_owned())
} else {
None
}
});
Self {
artist,
title,
album,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use mpris::MetadataValue;
use std::collections::HashMap;
#[test]
fn test_new() {
assert_eq!(
Track::new("Enter Shikari", "Live Outside", None).album(),
None
);
assert_eq!(
Track::new("Dimension", "Psycho", Some("Organ")).album(),
Some("Organ")
);
}
#[test]
fn test_from_metadata() {
let mut metadata_without_album = HashMap::new();
metadata_without_album.insert(
"xesam:artists".to_owned(),
MetadataValue::Array(vec![MetadataValue::String("Billy Joel".to_owned())]),
);
metadata_without_album.insert(
"xesam:title".to_owned(),
MetadataValue::String("We didn't start the fire".to_owned()),
);
let metadata_without_album = Metadata::from(metadata_without_album);
let track_without_album = Track::from_metadata(&metadata_without_album);
assert_eq!(track_without_album.album(), None);
let mut metadata_empty_album = HashMap::new();
metadata_empty_album.insert(
"xesam:artist".to_owned(),
MetadataValue::Array(vec![MetadataValue::String("The Prodigy".to_owned())]),
);
metadata_empty_album.insert(
"xesam:title".to_owned(),
MetadataValue::String("Wild Frontier".to_owned()),
);
metadata_empty_album.insert(
"xesam:album".to_owned(),
MetadataValue::String("".to_owned()),
);
let metadata_empty_album = Metadata::from(metadata_empty_album);
let track_empty_album = Track::from_metadata(&metadata_empty_album);
assert_eq!(track_empty_album.album(), None);
let mut metadata_with_album = HashMap::new();
metadata_with_album.insert(
"xesam:artist".to_owned(),
MetadataValue::Array(vec![MetadataValue::String("Men At Work".to_owned())]),
);
metadata_with_album.insert(
"xesam:title".to_owned(),
MetadataValue::String("Who Can It Be Now?".to_owned()),
);
metadata_with_album.insert(
"xesam:album".to_owned(),
MetadataValue::String("Business As Usual".to_owned()),
);
let metadata_with_album = Metadata::from(metadata_with_album);
let track_with_album = Track::from_metadata(&metadata_with_album);
assert_eq!(track_with_album.album(), Some("Business As Usual"));
}
}