diff --git a/src/components/tags/mp4_tag.rs b/src/components/tags/mp4_tag.rs index c4247146..e24960c9 100644 --- a/src/components/tags/mp4_tag.rs +++ b/src/components/tags/mp4_tag.rs @@ -112,17 +112,17 @@ impl AudioTagEdit for Mp4Tag { fn front_cover(&self) -> Option { self.inner.artwork().and_then(|data| match data { mp4ameta::Data::Jpeg(d) => Some(Picture { - pic_type: PictureType::CoverFront, // TODO + pic_type: PictureType::Other, data: d.clone(), mime_type: MimeType::Jpeg, }), mp4ameta::Data::Png(d) => Some(Picture { - pic_type: PictureType::CoverFront, // TODO + pic_type: PictureType::Other, data: d.clone(), mime_type: MimeType::Png, }), mp4ameta::Data::Bmp(d) => Some(Picture { - pic_type: PictureType::CoverFront, // TODO + pic_type: PictureType::Other, data: d.clone(), mime_type: MimeType::Bmp, }), @@ -131,7 +131,7 @@ impl AudioTagEdit for Mp4Tag { } fn set_front_cover(&mut self, cover: Picture) { - self.remove_front_cover(); + self.inner.remove_artwork(); self.inner.add_artwork(match cover.mime_type { MimeType::Png => mp4ameta::Data::Png(cover.data), @@ -146,19 +146,42 @@ impl AudioTagEdit for Mp4Tag { } fn back_cover(&self) -> Option { - todo!() + self.front_cover() } fn set_back_cover(&mut self, cover: Picture) { - todo!() + self.set_front_cover(cover) } fn remove_back_cover(&mut self) { - todo!() + self.inner.remove_artwork(); } fn pictures(&self) -> Option> { - todo!() + let mut pictures = Vec::new(); + + for art in self.inner.artworks() { + let info = match art { + mp4ameta::Data::Png(d) => Some((MimeType::Png, d.clone())), + mp4ameta::Data::Jpeg(d) => Some((MimeType::Jpeg, d.clone())), + mp4ameta::Data::Bmp(d) => Some((MimeType::Bmp, d.clone())), + _ => None, + }; + + if let Some((mime_type, data)) = info { + pictures.push(Picture { + pic_type: PictureType::Other, + mime_type, + data, + }) + } + } + + if pictures.is_empty() { + None + } else { + Some(pictures) + } } fn remove_track(&mut self) { diff --git a/tests/io.rs b/tests/io.rs index 1307ec75..4d93695f 100644 --- a/tests/io.rs +++ b/tests/io.rs @@ -50,8 +50,8 @@ macro_rules! add_tags { let file = stringify!($file); - // Skip this since RIFF INFO doesn't store images - if file != stringify!("tests/assets/a.wav") { + // Skip this since RIFF INFO doesn't store images, and MP4 doesn't specify what pictures are + if file != stringify!("tests/assets/a.wav") && file != stringify!("tests/assets/a.m4a") { println!("Setting front cover"); tag.set_front_cover(covers.0.clone()); assert_eq!(tag.front_cover(), Some(covers.0)); @@ -61,6 +61,19 @@ macro_rules! add_tags { assert_eq!(tag.back_cover(), Some(covers.1)); } + // All MP4 Pictures are PictureType::Other + if file == stringify!("tests/assets/a.m4a") { + let cover = Picture { + pic_type: PictureType::Other, + mime_type: MimeType::Jpeg, + data: vec![0, 74, 80, 69, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0], + }; + + println!("Setting cover"); + tag.set_front_cover(cover.clone()); + assert_eq!(tag.front_cover(), Some(cover)); + } + println!("Writing"); tag.write_to_path($file).unwrap(); };