mirror of
https://github.com/Serial-ATA/lofty-rs
synced 2024-12-14 06:32:33 +00:00
Add methods to set and remove all pictures, remove pointless panic
Signed-off-by: Serial <69764315+Serial-ATA@users.noreply.github.com>
This commit is contained in:
parent
e6eb8d8d40
commit
ac91cbfd63
5 changed files with 56 additions and 12 deletions
|
@ -1,4 +1,4 @@
|
|||
use crate::types::picture::APE_PICTYPES;
|
||||
use crate::types::picture::{APE_PICTYPES, PicType};
|
||||
use crate::{
|
||||
Album, AnyTag, AudioTag, AudioTagEdit, AudioTagWrite, Picture, Result, TagType, ToAny, ToAnyTag,
|
||||
};
|
||||
|
@ -259,6 +259,22 @@ impl AudioTagEdit for ApeTag {
|
|||
Some(Cow::from(pics))
|
||||
}
|
||||
}
|
||||
fn set_pictures(&mut self, pictures: Vec<Picture>) {
|
||||
self.remove_pictures();
|
||||
|
||||
for p in pictures {
|
||||
let key = p.pic_type.as_ape_key();
|
||||
|
||||
if let Ok(item) = ape::Item::from_binary(key, p.as_ape_bytes()) {
|
||||
self.inner.set_item(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
fn remove_pictures(&mut self) {
|
||||
for key in &APE_PICTYPES {
|
||||
self.inner.remove_item(key);
|
||||
}
|
||||
}
|
||||
|
||||
// Track number and total tracks are stored together as num/total?
|
||||
fn track_number(&self) -> Option<u32> {
|
||||
|
|
|
@ -310,6 +310,18 @@ impl AudioTagEdit for Id3v2Tag {
|
|||
|
||||
None
|
||||
}
|
||||
fn set_pictures(&mut self, pictures: Vec<Picture>) {
|
||||
self.remove_pictures();
|
||||
|
||||
for p in pictures {
|
||||
if let Ok(pic) = TryInto::<id3::frame::Picture>::try_into(p) {
|
||||
self.inner.add_picture(pic)
|
||||
}
|
||||
}
|
||||
}
|
||||
fn remove_pictures(&mut self) {
|
||||
self.inner.remove_all_pictures()
|
||||
}
|
||||
|
||||
fn track_number(&self) -> Option<u32> {
|
||||
self.inner.track()
|
||||
|
|
|
@ -184,14 +184,12 @@ impl AudioTagEdit for Mp4Tag {
|
|||
}
|
||||
|
||||
fn set_front_cover(&mut self, cover: Picture) {
|
||||
self.inner.remove_artwork();
|
||||
|
||||
self.inner.add_artwork(match cover.mime_type {
|
||||
MimeType::Png => mp4ameta::Data::Png(Vec::from(cover.data)),
|
||||
MimeType::Jpeg => mp4ameta::Data::Jpeg(Vec::from(cover.data)),
|
||||
MimeType::Bmp => mp4ameta::Data::Bmp(Vec::from(cover.data)),
|
||||
_ => panic!("Attempt to add an invalid image format to MP4"),
|
||||
});
|
||||
match cover.mime_type {
|
||||
MimeType::Png => self.inner.add_artwork(mp4ameta::Data::Png(Vec::from(cover.data))),
|
||||
MimeType::Jpeg => self.inner.add_artwork(mp4ameta::Data::Jpeg(Vec::from(cover.data))),
|
||||
MimeType::Bmp => self.inner.add_artwork(mp4ameta::Data::Bmp(Vec::from(cover.data))),
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
|
||||
fn remove_front_cover(&mut self) {
|
||||
|
@ -204,9 +202,6 @@ impl AudioTagEdit for Mp4Tag {
|
|||
fn set_back_cover(&mut self, cover: Picture) {
|
||||
self.set_front_cover(cover)
|
||||
}
|
||||
fn remove_back_cover(&mut self) {
|
||||
self.inner.remove_artwork();
|
||||
}
|
||||
|
||||
fn pictures(&self) -> Option<Cow<'static, [Picture]>> {
|
||||
let mut pictures = Vec::new();
|
||||
|
@ -235,6 +230,16 @@ impl AudioTagEdit for Mp4Tag {
|
|||
Some(Cow::from(pictures))
|
||||
}
|
||||
}
|
||||
fn set_pictures(&mut self, pictures: Vec<Picture>) {
|
||||
self.remove_pictures();
|
||||
|
||||
for p in pictures {
|
||||
self.set_front_cover(p)
|
||||
}
|
||||
}
|
||||
fn remove_pictures(&mut self) {
|
||||
self.inner.remove_artwork()
|
||||
}
|
||||
|
||||
fn track_number(&self) -> Option<u32> {
|
||||
self.inner.track_number().map(u32::from)
|
||||
|
|
|
@ -377,6 +377,13 @@ impl AudioTagEdit for OggTag {
|
|||
fn pictures(&self) -> Option<Cow<'static, [Picture]>> {
|
||||
self.inner.pictures.clone()
|
||||
}
|
||||
fn set_pictures(&mut self, pictures: Vec<Picture>) {
|
||||
self.remove_pictures();
|
||||
self.inner.pictures = Some(Cow::from(pictures))
|
||||
}
|
||||
fn remove_pictures(&mut self) {
|
||||
self.inner.pictures = None
|
||||
}
|
||||
|
||||
fn track_number(&self) -> Option<u32> {
|
||||
if let Some(Ok(n)) = self.inner.get_value("TRACKNUMBER").map(str::parse::<u32>) {
|
||||
|
|
|
@ -91,6 +91,10 @@ pub trait AudioTagEdit {
|
|||
fn pictures(&self) -> Option<Cow<'static, [Picture]>> {
|
||||
None
|
||||
}
|
||||
/// Replace all pictures
|
||||
fn set_pictures(&mut self, _pictures: Vec<Picture>) {}
|
||||
/// Remove all pictures
|
||||
fn remove_pictures(&mut self) {}
|
||||
|
||||
/// Returns the track number and total tracks
|
||||
fn track(&self) -> (Option<u32>, Option<u32>) {
|
||||
|
|
Loading…
Reference in a new issue