mirror of
https://github.com/Serial-ATA/lofty-rs
synced 2024-11-15 08:57:08 +00:00
Add TaggedFile methods to cover the majority of use cases
This commit is contained in:
parent
711702b504
commit
8bd2fbfa65
1 changed files with 57 additions and 3 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::logic::id3::v2::Id3v2Version;
|
||||||
use crate::{FileProperties, LoftyError, Result, Tag, TagType};
|
use crate::{FileProperties, LoftyError, Result, Tag, TagType};
|
||||||
|
|
||||||
use byteorder::ReadBytesExt;
|
use byteorder::ReadBytesExt;
|
||||||
|
@ -20,11 +21,64 @@ pub trait AudioFile {
|
||||||
/// This is used when the [`FileType`] has to be guessed
|
/// This is used when the [`FileType`] has to be guessed
|
||||||
pub struct TaggedFile {
|
pub struct TaggedFile {
|
||||||
/// The file's type
|
/// The file's type
|
||||||
pub ty: FileType,
|
ty: FileType,
|
||||||
/// The file's audio properties
|
/// The file's audio properties
|
||||||
pub properties: FileProperties,
|
properties: FileProperties,
|
||||||
/// A collection of the file's tags
|
/// A collection of the file's tags
|
||||||
pub tags: Vec<Tag>,
|
tags: Vec<Tag>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TaggedFile {
|
||||||
|
/// Gets the file's "Primary tag", or the one most likely to be used in the target format
|
||||||
|
///
|
||||||
|
/// | [`FileType`] | [`TagType`] |
|
||||||
|
/// |--------------------------|------------------|
|
||||||
|
/// | `AIFF`, `MP3`, `WAV` | `Id3v2` |
|
||||||
|
/// | `APE` | `Ape` |
|
||||||
|
/// | `FLAC`, `Opus`, `Vorbis` | `VorbisComments` |
|
||||||
|
/// | `MP4` | `Mp4Atom` |
|
||||||
|
pub fn primary_tag(&self) -> Option<&Tag> {
|
||||||
|
let pred = match self.ty {
|
||||||
|
FileType::AIFF | FileType::MP3 | FileType::WAV => {
|
||||||
|
|t: &&Tag| t.tag_type() == &TagType::Id3v2(Id3v2Version::V4)
|
||||||
|
},
|
||||||
|
FileType::APE => |t: &&Tag| t.tag_type() == &TagType::Ape,
|
||||||
|
FileType::FLAC | FileType::Opus | FileType::Vorbis => {
|
||||||
|
|t: &&Tag| t.tag_type() == &TagType::VorbisComments
|
||||||
|
},
|
||||||
|
FileType::MP4 => |t: &&Tag| t.tag_type() == &TagType::Mp4Atom,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.tags.iter().find(pred)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a mutable reference to the file's "Primary tag"
|
||||||
|
///
|
||||||
|
/// See [`primary_tag`](Self::primary_tag) for an explanation
|
||||||
|
pub fn primary_tag_mut(&mut self) -> Option<&mut Tag> {
|
||||||
|
let pred = match self.ty {
|
||||||
|
FileType::AIFF | FileType::MP3 | FileType::WAV => {
|
||||||
|
|t: &&mut Tag| t.tag_type() == &TagType::Id3v2(Id3v2Version::V4)
|
||||||
|
},
|
||||||
|
FileType::APE => |t: &&mut Tag| t.tag_type() == &TagType::Ape,
|
||||||
|
FileType::FLAC | FileType::Opus | FileType::Vorbis => {
|
||||||
|
|t: &&mut Tag| t.tag_type() == &TagType::VorbisComments
|
||||||
|
},
|
||||||
|
FileType::MP4 => |t: &&mut Tag| t.tag_type() == &TagType::Mp4Atom,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.tags.iter_mut().find(pred)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the first tag, if there are any
|
||||||
|
pub fn first_tag(&self) -> Option<&Tag> {
|
||||||
|
self.tags.first()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a mutable reference to the first tag, if there are any
|
||||||
|
pub fn first_tag_mut(&mut self) -> Option<&mut Tag> {
|
||||||
|
self.tags.first_mut()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The type of file read
|
/// The type of file read
|
||||||
|
|
Loading…
Reference in a new issue