mirror of
https://github.com/Serial-ATA/lofty-rs
synced 2025-03-04 14:57:17 +00:00
Add AudioTagEdit::tag_type
Signed-off-by: Serial <69764315+Serial-ATA@users.noreply.github.com>
This commit is contained in:
parent
c673c7fcbb
commit
65b5f131aa
10 changed files with 46 additions and 11 deletions
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
12
src/tag.rs
12
src/tag.rs
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue