diff --git a/src/components/tags/ape_tag.rs b/src/components/tags/ape_tag.rs index dc7580fe..4cf9ccad 100644 --- a/src/components/tags/ape_tag.rs +++ b/src/components/tags/ape_tag.rs @@ -7,6 +7,7 @@ use crate::{ pub use ape::Tag as ApeInnerTag; +use ape::Item; use filepath::FilePath; use std::fs::File; use std::path::Path; @@ -85,6 +86,18 @@ impl AudioTagEdit for ApeTag { self.remove_key("Artist") } + fn date(&self) -> Option { + self.get_value("Date").map(std::string::ToString::to_string) + } + + fn set_date(&mut self, date: &str) { + self.set_value("Date", date) + } + + fn remove_date(&mut self) { + self.remove_key("Date") + } + fn year(&self) -> Option { if let Some(Ok(y)) = self .get_value("Date") @@ -131,13 +144,16 @@ impl AudioTagEdit for ApeTag { } fn album_cover(&self) -> Option { - // TODO + if let Some(val) = self.inner.item("Cover Art (Front)") { + return get_picture(val); + } + None } - fn set_album_cover(&mut self, _cover: Picture) { + fn set_album_cover(&mut self, cover: Picture) { // TODO + self.set_value("Cover Art (Front)", "TODO") } - fn remove_album_cover(&mut self) { self.remove_key("Cover Art (Front)") } @@ -234,6 +250,14 @@ impl AudioTagEdit for ApeTag { } } +fn get_picture(item: &Item) -> Option { + if let ape::ItemValue::Binary(bin) = &item.value { + // TODO + } + + None +} + impl AudioTagWrite for ApeTag { fn write_to(&self, file: &mut File) -> Result<()> { // Write only uses paths, this is annoying diff --git a/src/components/tags/id3_tag.rs b/src/components/tags/id3_tag.rs index a6a39b30..1d414404 100644 --- a/src/components/tags/id3_tag.rs +++ b/src/components/tags/id3_tag.rs @@ -93,6 +93,33 @@ impl AudioTagEdit for Id3v2Tag { self.inner.remove_artist() } + fn date(&self) -> Option { + if let Some(released) = self.inner.get("TDRL") { + if let id3::frame::Content::Text(date) = &released.content() { + return Some(date.clone()); + } + } + + if let Some(recorded) = self.inner.get("TRDC") { + if let id3::frame::Content::Text(date) = &recorded.content() { + return Some(date.clone()); + } + } + + None + } + + fn set_date(&mut self, date: &str) { + if let Ok(t) = date.parse::() { + self.inner.set_date_released(t) + } + } + + fn remove_date(&mut self) { + self.inner.remove_date_released(); + self.inner.remove_date_recorded(); + } + fn year(&self) -> Option { self.inner.year() } diff --git a/src/components/tags/vorbis_tag.rs b/src/components/tags/vorbis_tag.rs index 51bb4e94..5c2ffcce 100644 --- a/src/components/tags/vorbis_tag.rs +++ b/src/components/tags/vorbis_tag.rs @@ -295,6 +295,20 @@ impl AudioTagEdit for VorbisTag { self.inner.remove_key("ARTIST"); } + fn date(&self) -> Option { + self.inner + .get_value("DATE") + .map(std::string::ToString::to_string) + } + + fn set_date(&mut self, date: &str) { + self.inner.set_value("DATE", date) + } + + fn remove_date(&mut self) { + self.inner.remove_key("DATE") + } + fn year(&self) -> Option { if let Some(Ok(y)) = self .inner diff --git a/src/macros.rs b/src/macros.rs index c24b02f0..c7072f7c 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -79,8 +79,8 @@ macro_rules! impl_tag { total_tracks: inp.total_tracks(), disc_number: inp.disc_number(), total_discs: inp.total_discs(), - comments: None, - date: None, // TODO + comments: None, // TODO + date: inp.date(), } } } diff --git a/src/traits.rs b/src/traits.rs index 11bed670..059d7356 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -30,6 +30,21 @@ pub trait AudioTagEdit { /// Removes the artist string fn remove_artist(&mut self); + /// Returns the track date + fn date(&self) -> Option { + self.year().map(|y| y.to_string()) + } + /// Sets the track date + fn set_date(&mut self, date: &str) { + if let Ok(d) = date.parse::() { + self.set_year(d) + } + } + /// Removes the track date + fn remove_date(&mut self) { + self.remove_year() + } + /// Returns the track year fn year(&self) -> Option; /// Sets the track year diff --git a/src/types/anytag.rs b/src/types/anytag.rs index e6ac1167..d172c063 100644 --- a/src/types/anytag.rs +++ b/src/types/anytag.rs @@ -14,7 +14,7 @@ pub struct AnyTag<'a> { /// The track year pub year: Option, /// The track date - pub date: Option<&'a str>, + pub date: Option, /// The track number pub track_number: Option, /// The total tracks