mirror of
https://github.com/Serial-ATA/lofty-rs
synced 2025-03-04 14:57:17 +00:00
Switch to new derive proc macro
This commit is contained in:
parent
7419e49891
commit
c8f6a0ebc2
9 changed files with 86 additions and 41 deletions
|
@ -29,7 +29,7 @@ base64 = "0.13.0"
|
|||
byteorder = "1.4.3"
|
||||
cfg-if = "1.0.0"
|
||||
|
||||
lofty_attr = "0.1.7"
|
||||
lofty_attr = "0.1.8"
|
||||
|
||||
[features]
|
||||
default = ["all_tags"]
|
||||
|
|
|
@ -6,7 +6,7 @@ use crate::{
|
|||
use std::fs::File;
|
||||
use std::io::{Read, Seek};
|
||||
|
||||
use lofty_attr::impl_tag;
|
||||
use lofty_attr::LoftyTag;
|
||||
|
||||
#[derive(Default)]
|
||||
struct AiffInnerTag {
|
||||
|
@ -15,8 +15,13 @@ struct AiffInnerTag {
|
|||
copyright_id: Option<String>,
|
||||
}
|
||||
|
||||
#[impl_tag(AiffInnerTag, TagType::AiffText)]
|
||||
pub struct AiffTag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents Aiff Text Chunks
|
||||
pub struct AiffTag {
|
||||
inner: AiffInnerTag,
|
||||
#[expected(TagType::AiffText)]
|
||||
_format: TagType,
|
||||
}
|
||||
|
||||
impl AiffTag {
|
||||
#[allow(missing_docs)]
|
||||
|
@ -33,6 +38,7 @@ impl AiffTag {
|
|||
author_id,
|
||||
copyright_id,
|
||||
},
|
||||
_format: TagType::AiffText,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,10 +9,15 @@ use std::io::{Read, Seek};
|
|||
|
||||
use ape::Item;
|
||||
pub use ape::Tag as ApeInnerTag;
|
||||
use lofty_attr::{get_set_methods, impl_tag};
|
||||
use lofty_attr::{get_set_methods, LoftyTag};
|
||||
|
||||
#[impl_tag(ApeInnerTag, TagType::Ape)]
|
||||
pub struct ApeTag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents an APEv2 tag
|
||||
pub struct ApeTag {
|
||||
inner: ApeInnerTag,
|
||||
#[expected(TagType::Ape)]
|
||||
_format: TagType,
|
||||
}
|
||||
|
||||
impl ApeTag {
|
||||
#[allow(missing_docs)]
|
||||
|
@ -23,6 +28,7 @@ impl ApeTag {
|
|||
{
|
||||
Ok(Self {
|
||||
inner: ape::read_from(reader)?,
|
||||
_format: TagType::Ape,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,27 +11,35 @@ use std::io::{Read, Seek, SeekFrom};
|
|||
|
||||
use filepath::FilePath;
|
||||
pub use id3::Tag as Id3v2InnerTag;
|
||||
use lofty_attr::impl_tag;
|
||||
use lofty_attr::LoftyTag;
|
||||
|
||||
#[impl_tag(Id3v2InnerTag, TagType::Id3v2(Id3Format::Mp3))]
|
||||
pub struct Id3v2Tag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents an ID3 tag
|
||||
pub struct Id3v2Tag {
|
||||
inner: Id3v2InnerTag,
|
||||
#[expected(TagType::Id3v2(Id3Format::Mp3))]
|
||||
_format: TagType,
|
||||
}
|
||||
|
||||
impl Id3v2Tag {
|
||||
#[allow(missing_docs)]
|
||||
#[allow(clippy::missing_errors_doc)]
|
||||
pub fn read_from<R>(reader: &mut R, format: &Id3Format) -> Result<Self>
|
||||
pub fn read_from<R>(reader: &mut R, format: Id3Format) -> Result<Self>
|
||||
where
|
||||
R: Read + Seek,
|
||||
{
|
||||
match format {
|
||||
Id3Format::Mp3 => Ok(Self {
|
||||
inner: Id3v2InnerTag::read_from(reader)?,
|
||||
_format: TagType::Id3v2(format),
|
||||
}),
|
||||
Id3Format::Riff => Ok(Self {
|
||||
inner: Id3v2InnerTag::read_from_wav_reader(reader)?,
|
||||
_format: TagType::Id3v2(format),
|
||||
}),
|
||||
Id3Format::Aiff => Ok(Self {
|
||||
inner: Id3v2InnerTag::read_from_aiff_reader(reader)?,
|
||||
_format: TagType::Id3v2(format),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
@ -370,9 +378,7 @@ impl AudioTagEdit for Id3v2Tag {
|
|||
}
|
||||
|
||||
fn tag_type(&self) -> TagType {
|
||||
// Unsure how to get the Id3Format back
|
||||
// Shouldn't matter much for ID3 though
|
||||
TagType::Id3v2(Id3Format::Mp3)
|
||||
self._format.clone()
|
||||
}
|
||||
|
||||
fn get_key(&self, key: &str) -> Option<&str> {
|
||||
|
|
|
@ -7,11 +7,16 @@ use std::borrow::Cow;
|
|||
use std::fs::File;
|
||||
use std::io::{Read, Seek};
|
||||
|
||||
use lofty_attr::impl_tag;
|
||||
use lofty_attr::LoftyTag;
|
||||
pub use mp4ameta::{Fourcc, Tag as Mp4InnerTag};
|
||||
|
||||
#[impl_tag(Mp4InnerTag, TagType::Mp4)]
|
||||
pub struct Mp4Tag {}
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents an MPEG-4 tag
|
||||
pub struct Mp4Tag {
|
||||
inner: Mp4InnerTag,
|
||||
#[expected(TagType::Mp4)]
|
||||
_format: TagType,
|
||||
}
|
||||
|
||||
impl Mp4Tag {
|
||||
#[allow(missing_docs)]
|
||||
|
@ -22,6 +27,7 @@ impl Mp4Tag {
|
|||
{
|
||||
Ok(Self {
|
||||
inner: Mp4InnerTag::read_from(reader)?,
|
||||
_format: TagType::Mp4,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,14 +20,13 @@ use std::convert::{TryFrom, TryInto};
|
|||
use std::fs::File;
|
||||
use std::io::{Read, Seek, SeekFrom};
|
||||
|
||||
use lofty_attr::{get_set_methods, impl_tag};
|
||||
use lofty_attr::{get_set_methods, LoftyTag};
|
||||
use unicase::UniCase;
|
||||
|
||||
struct OggInnerTag {
|
||||
vendor: String,
|
||||
comments: HashMap<UniCase<String>, String>,
|
||||
pictures: Option<Cow<'static, [Picture]>>,
|
||||
format: Option<OggFormat>,
|
||||
}
|
||||
|
||||
impl Default for OggInnerTag {
|
||||
|
@ -36,7 +35,6 @@ impl Default for OggInnerTag {
|
|||
vendor: String::new(),
|
||||
comments: HashMap::default(),
|
||||
pictures: None,
|
||||
format: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -79,14 +77,29 @@ impl OggInnerTag {
|
|||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(feature = "format-opus")] {
|
||||
#[impl_tag(OggInnerTag, TagType::Ogg(OggFormat::Opus))]
|
||||
pub struct OggTag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents vorbis comments from multiple OGG formats
|
||||
pub struct OggTag {
|
||||
inner: OggInnerTag,
|
||||
#[expected(TagType::Ogg(OggFormat::Opus))]
|
||||
_format: TagType,
|
||||
}
|
||||
} else if #[cfg(feature = "format-vorbis")] {
|
||||
#[impl_tag(OggInnerTag, TagType::Ogg(OggFormat::Vorbis))]
|
||||
pub struct OggTag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents vorbis comments from multiple OGG formats
|
||||
pub struct OggTag {
|
||||
inner: OggInnerTag,
|
||||
#[expected(TagType::Ogg(OggFormat::Vorbis))]
|
||||
_format: TagType,
|
||||
}
|
||||
} else {
|
||||
#[impl_tag(OggInnerTag, TagType::Ogg(OggFormat::Flac))]
|
||||
pub struct OggTag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents vorbis comments from multiple OGG formats
|
||||
pub struct OggTag {
|
||||
inner: OggInnerTag,
|
||||
#[expected(TagType::Ogg(OggFormat::Flac))]
|
||||
_format: TagType,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -95,17 +108,18 @@ impl TryFrom<OGGTags> for OggTag {
|
|||
type Error = LoftyError;
|
||||
|
||||
fn try_from(inp: OGGTags) -> Result<Self> {
|
||||
let mut tag = Self::default();
|
||||
let mut tag = Self::new();
|
||||
|
||||
let vendor = inp.0;
|
||||
let pictures = inp.1;
|
||||
let comments = inp.2;
|
||||
|
||||
tag._format = TagType::Ogg(inp.3);
|
||||
|
||||
tag.inner = OggInnerTag {
|
||||
vendor,
|
||||
comments,
|
||||
pictures: (!pictures.is_empty()).then(|| Cow::from(pictures)),
|
||||
format: Some(inp.3),
|
||||
};
|
||||
|
||||
Ok(tag)
|
||||
|
@ -117,7 +131,7 @@ impl TryFrom<metaflac::Tag> for OggTag {
|
|||
type Error = LoftyError;
|
||||
|
||||
fn try_from(inp: metaflac::Tag) -> Result<Self> {
|
||||
let mut tag = Self::default();
|
||||
let mut tag = Self::new();
|
||||
|
||||
if let Some(comments) = inp.vorbis_comments() {
|
||||
let mut user_comments = comments.comments.clone();
|
||||
|
@ -140,11 +154,12 @@ impl TryFrom<metaflac::Tag> for OggTag {
|
|||
}
|
||||
}
|
||||
|
||||
tag._format = TagType::Ogg(OggFormat::Flac);
|
||||
|
||||
tag.inner = OggInnerTag {
|
||||
vendor: comments.vendor_string.clone(),
|
||||
comments: comment_collection,
|
||||
pictures: Some(Cow::from(pictures)),
|
||||
format: Some(OggFormat::Flac),
|
||||
};
|
||||
|
||||
return Ok(tag);
|
||||
|
@ -159,12 +174,13 @@ impl TryFrom<metaflac::Tag> for OggTag {
|
|||
impl OggTag {
|
||||
#[allow(missing_docs)]
|
||||
#[allow(clippy::missing_errors_doc)]
|
||||
pub fn read_from<R>(reader: &mut R, format: &OggFormat) -> Result<Self>
|
||||
pub fn read_from<R>(reader: &mut R, format: OggFormat) -> Result<Self>
|
||||
where
|
||||
R: Read + Seek,
|
||||
{
|
||||
Ok(Self {
|
||||
inner: OggInnerTag::read_from(reader, format)?,
|
||||
inner: OggInnerTag::read_from(reader, &format)?,
|
||||
_format: TagType::Ogg(format),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -369,9 +385,7 @@ impl AudioTagEdit for OggTag {
|
|||
}
|
||||
|
||||
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())
|
||||
self._format.clone()
|
||||
}
|
||||
|
||||
fn get_key(&self, key: &str) -> Option<&str> {
|
||||
|
|
|
@ -7,7 +7,7 @@ use std::collections::HashMap;
|
|||
use std::fs::File;
|
||||
use std::io::{Read, Seek};
|
||||
|
||||
use lofty_attr::{get_set_methods, impl_tag};
|
||||
use lofty_attr::{get_set_methods, LoftyTag};
|
||||
|
||||
struct RiffInnerTag {
|
||||
data: HashMap<String, String>,
|
||||
|
@ -21,8 +21,13 @@ impl Default for RiffInnerTag {
|
|||
}
|
||||
}
|
||||
|
||||
#[impl_tag(RiffInnerTag, TagType::RiffInfo)]
|
||||
pub struct RiffTag;
|
||||
#[derive(LoftyTag)]
|
||||
/// Represents a RIFF INFO LIST
|
||||
pub struct RiffTag {
|
||||
inner: RiffInnerTag,
|
||||
#[expected(TagType::RiffInfo)]
|
||||
_format: TagType,
|
||||
}
|
||||
|
||||
impl RiffTag {
|
||||
#[allow(missing_docs)]
|
||||
|
@ -35,6 +40,7 @@ impl RiffTag {
|
|||
inner: RiffInnerTag {
|
||||
data: riff::read_from(reader)?,
|
||||
},
|
||||
_format: TagType::RiffInfo,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,7 +120,8 @@
|
|||
clippy::doc_markdown,
|
||||
clippy::let_underscore_drop,
|
||||
clippy::match_wildcard_for_single_variants,
|
||||
clippy::semicolon_if_nothing_returned
|
||||
clippy::semicolon_if_nothing_returned,
|
||||
clippy::used_underscore_binding
|
||||
)]
|
||||
|
||||
mod types;
|
||||
|
|
|
@ -97,7 +97,7 @@ impl Tag {
|
|||
#[cfg(feature = "format-ape")]
|
||||
TagType::Ape => Ok(Box::new(ApeTag::read_from(reader)?)),
|
||||
#[cfg(feature = "format-id3")]
|
||||
TagType::Id3v2(format) => Ok(Box::new(Id3v2Tag::read_from(reader, &format)?)),
|
||||
TagType::Id3v2(format) => Ok(Box::new(Id3v2Tag::read_from(reader, format)?)),
|
||||
#[cfg(feature = "format-mp4")]
|
||||
TagType::Mp4 => Ok(Box::new(Mp4Tag::read_from(reader)?)),
|
||||
#[cfg(feature = "format-riff")]
|
||||
|
@ -107,7 +107,7 @@ impl Tag {
|
|||
feature = "format-flac",
|
||||
feature = "format-opus"
|
||||
))]
|
||||
TagType::Ogg(format) => Ok(Box::new(OggTag::read_from(reader, &format)?)),
|
||||
TagType::Ogg(format) => Ok(Box::new(OggTag::read_from(reader, format)?)),
|
||||
#[cfg(feature = "format-aiff")]
|
||||
TagType::AiffText => Ok(Box::new(AiffTag::read_from(reader)?)),
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue