Add AudioTagEdit::tag_type

Signed-off-by: Serial <69764315+Serial-ATA@users.noreply.github.com>
This commit is contained in:
Serial 2021-07-10 20:24:12 -04:00
parent c673c7fcbb
commit 65b5f131aa
10 changed files with 46 additions and 11 deletions

View file

@ -67,6 +67,10 @@ impl AudioTagEdit for AiffTag {
fn remove_copyright(&mut self) {
self.inner.copyright_id = None
}
fn tag_type(&self) -> TagType {
TagType::AiffText
}
}
impl AudioTagWrite for AiffTag {

View file

@ -278,6 +278,10 @@ impl AudioTagEdit for ApeTag {
fn remove_total_discs(&mut self) {
self.remove_key(UniCase::from("Disc"))
}
fn tag_type(&self) -> TagType {
TagType::Ape
}
}
impl AudioTagWrite for ApeTag {

View file

@ -13,7 +13,7 @@ use filepath::FilePath;
pub use id3::Tag as Id3v2InnerTag;
use lofty_attr::impl_tag;
#[impl_tag(Id3v2InnerTag, TagType::Id3v2(Id3Format::Default))]
#[impl_tag(Id3v2InnerTag, TagType::Id3v2(Id3Format::Mp3))]
pub struct Id3v2Tag;
impl Id3v2Tag {
@ -24,13 +24,13 @@ impl Id3v2Tag {
R: Read + Seek,
{
match format {
Id3Format::Default => Ok(Self {
Id3Format::Mp3 => Ok(Self {
inner: Id3v2InnerTag::read_from(reader)?,
}),
Id3Format::Riff => Ok(Self {
inner: Id3v2InnerTag::read_from_wav_reader(reader)?,
}),
Id3Format::Form => Ok(Self {
Id3Format::Aiff => Ok(Self {
inner: Id3v2InnerTag::read_from_aiff_reader(reader)?,
}),
}
@ -368,6 +368,12 @@ impl AudioTagEdit for Id3v2Tag {
fn remove_total_discs(&mut self) {
self.inner.remove_total_discs();
}
fn tag_type(&self) -> TagType {
// Unsure how to get the Id3Format back
// Shouldn't matter much for ID3 though
TagType::Id3v2(Id3Format::Mp3)
}
}
impl AudioTagWrite for Id3v2Tag {

View file

@ -290,6 +290,10 @@ impl AudioTagEdit for Mp4Tag {
fn remove_total_discs(&mut self) {
self.inner.remove_total_discs();
}
fn tag_type(&self) -> TagType {
TagType::Mp4
}
}
impl AudioTagWrite for Mp4Tag {

View file

@ -27,6 +27,7 @@ struct OggInnerTag {
vendor: String,
comments: HashMap<UniCase<String>, String>,
pictures: Option<Cow<'static, [Picture]>>,
format: Option<OggFormat>,
}
impl Default for OggInnerTag {
@ -35,6 +36,7 @@ impl Default for OggInnerTag {
vendor: String::new(),
comments: HashMap::default(),
pictures: None,
format: None,
}
}
}
@ -103,6 +105,7 @@ impl TryFrom<OGGTags> for OggTag {
vendor,
comments,
pictures: (!pictures.is_empty()).then(|| Cow::from(pictures)),
format: Some(inp.3),
};
Ok(tag)
@ -141,6 +144,7 @@ impl TryFrom<metaflac::Tag> for OggTag {
vendor: comments.vendor_string.clone(),
comments: comment_collection,
pictures: Some(Cow::from(pictures)),
format: Some(OggFormat::Flac),
};
return Ok(tag);
@ -363,6 +367,12 @@ impl AudioTagEdit for OggTag {
fn remove_total_discs(&mut self) {
self.remove_key("TOTALDISCS");
}
fn tag_type(&self) -> TagType {
// A format is added when the OggTag is created, and it is **never** None.
// This is safe to unwrap
TagType::Ogg(self.inner.format.clone().unwrap())
}
}
impl AudioTagWrite for OggTag {

View file

@ -130,6 +130,10 @@ impl AudioTagEdit for RiffTag {
fn remove_total_discs(&mut self) {
self.remove_disc_number()
}
fn tag_type(&self) -> TagType {
TagType::RiffInfo
}
}
impl AudioTagWrite for RiffTag {

View file

@ -167,9 +167,9 @@ pub enum OggFormat {
/// ID3 tag's underlying format
pub enum Id3Format {
/// MP3
Default,
Mp3,
/// AIFF
Form,
Aiff,
/// RIFF/WAV/WAVE
Riff,
}
@ -180,9 +180,9 @@ impl TagType {
#[cfg(feature = "format-ape")]
"ape" => Ok(Self::Ape),
#[cfg(feature = "format-id3")]
"aiff" | "aif" => Ok(Self::Id3v2(Id3Format::Form)),
"aiff" | "aif" => Ok(Self::Id3v2(Id3Format::Aiff)),
#[cfg(feature = "format-id3")]
"mp3" => Ok(Self::Id3v2(Id3Format::Default)),
"mp3" => Ok(Self::Id3v2(Id3Format::Mp3)),
#[cfg(all(feature = "format-riff", feature = "format-id3"))]
"wav" | "wave" | "riff" => Ok(Self::Id3v2(Id3Format::Riff)),
#[cfg(feature = "format-opus")]
@ -216,7 +216,7 @@ impl TagType {
#[cfg(feature = "format-ape")]
77 if sig.starts_with(b"MAC") => Ok(Self::Ape),
#[cfg(feature = "format-id3")]
73 if sig.starts_with(b"ID3") || sig.starts_with(b"id3") => Ok(Self::Id3v2(Id3Format::Default)),
73 if sig.starts_with(b"ID3") || sig.starts_with(b"id3") => Ok(Self::Id3v2(Id3Format::Mp3)),
#[cfg(any(feature = "format-id3", feature = "format-aiff"))]
70 if sig.starts_with(b"FORM") => {
data.seek(SeekFrom::Start(8))?;
@ -250,7 +250,7 @@ impl TagType {
data.seek(SeekFrom::Start(0))?;
if found_id3 {
return Ok(Self::Id3v2(Id3Format::Form));
return Ok(Self::Id3v2(Id3Format::Aiff));
}
}

View file

@ -113,6 +113,9 @@ pub trait AudioTagEdit {
u32_accessor!(disc_number);
u32_accessor!(total_discs);
/// Returns the TagType
fn tag_type(&self) -> TagType;
}
/// Functions for writing to a file

View file

@ -31,6 +31,6 @@ fn test_conversions() {
let tag = tag.to_dyn_tag(TagType::Ogg(OggFormat::Vorbis));
convert_tag!(tag);
let tag = tag.to_dyn_tag(TagType::Id3v2(Id3Format::Form));
let tag = tag.to_dyn_tag(TagType::Id3v2(Id3Format::Aiff));
convert_tag!(tag);
}

View file

@ -17,7 +17,7 @@ fn test_inner() {
let tag: OggTag = innertag.try_into().unwrap();
// Turn the VorbisTag into a Box<dyn AudioTag>
let id3tag = tag.to_dyn_tag(TagType::Id3v2(Id3Format::Default));
let id3tag = tag.to_dyn_tag(TagType::Id3v2(Id3Format::Mp3));
// Write Box<dyn AudioTag> to `a.mp3`
id3tag