From 87a63d72e6708125e81167edc936397f463bdd68 Mon Sep 17 00:00:00 2001 From: Tianyi Date: Tue, 27 Oct 2020 12:16:26 +0000 Subject: [PATCH] better config handling --- src/lib.rs | 184 ++++++++--------------------------------------------- 1 file changed, 28 insertions(+), 156 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6fe91428..fd1c8142 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,141 +17,7 @@ //! //! Theoretically it is possible to achieve zero-copy conversions if all parsers can parse into a unified struct. However, this is going to be a lot of work. I might be able to implement them, but it will be no sooner than the Christmas vacation. //! -//! ## Example -//! -//! (Due to copyright restrictions I cannot upload the actual audio files here) -//! -//! ```ignore -//! use audiotags::Tag; -//! fn main() { -//! const MP3: &'static str = "a.mp3"; -//! let mut tags = Tag::default().read_from_path(MP3).unwrap(); -//! // without this crate you would call id3::Tag::read_from_path() -//! println!("Title: {:?}", tags.title()); -//! println!("Artist: {:?}", tags.artist()); -//! tags.set_album_artist("CINDERELLA PROJECT"); -//! let album = tags.album().unwrap(); -//! println!("Album title and artist: {:?}", (album.title, album.artist)); -//! println!("Track: {:?}", tags.track()); -//! tags.write_to_path(MP3).unwrap(); -//! // Title: Some("お願い!シンデレラ") -//! // Artist: Some("高垣楓、城ヶ崎美嘉、小日向美穂、十時愛梨、川島瑞樹、日野茜、輿水幸子、佐久間まゆ、白坂小梅") -//! // Album title and artist: ("THE IDOLM@STER CINDERELLA GIRLS ANIMATION PROJECT 01 Star!!", Some("CINDERELLA PROJECT")) -//! // Track: (Some(2), Some(4)) -//! const M4A: &'static str = "b.m4a"; -//! let mut tags = Tag::default().read_from_path(M4A).unwrap(); -//! // without this crate you would call mp4ameta::Tag::read_from_path() -//! println!("Title: {:?}", tags.title()); -//! println!("Artist: {:?}", tags.artist()); -//! let album = tags.album().unwrap(); -//! println!("Album title and artist: {:?}", (album.title, album.artist)); -//! tags.set_total_tracks(4); -//! println!("Track: {:?}", tags.track()); -//! tags.write_to_path(M4A).unwrap(); -//! // Title: Some("ふわふわ時間") -//! // Artist: Some("桜高軽音部 [平沢唯・秋山澪・田井中律・琴吹紬(CV:豊崎愛生、日笠陽子、佐藤聡美、寿美菜子)]") -//! // Album title and artist: ("ふわふわ時間", Some("桜高軽音部 [平沢唯・秋山澪・田井中律・琴吹紬(CV:豊崎愛生、日笠陽子、佐藤聡美、寿美菜子)]")) -//! // Track: (Some(1), Some(4)) -//! const FLAC: &'static str = "c.flac"; -//! let mut tags = Tag::default().read_from_path(FLAC).unwrap(); -//! // without this crate you would call metaflac::Tag::read_from_path() -//! println!("Title: {:?}", tags.title()); -//! println!("Artist: {:?}", tags.artist()); -//! let album = tags.album().unwrap(); -//! println!("Album title and artist: {:?}", (album.title, album.artist)); -//! tags.set_year(2017); -//! println!("Year: {:?}", tags.year()); -//! tags.write_to_path(FLAC).unwrap(); -//! // Title: Some("意味/無/ジュニーク・ニコール") -//! // Artist: Some("岡部啓一") -//! // Album title and artist: ("NieR:Automata Original Soundtrack", Some("SQUARE ENIX")) -//! // Year: Some(2017) -//! } -//! ``` -//! -//! You can convert between different tag types: -//! -//! ```ignore -//! use audiotags::{Tag, TagType}; -//! -//! fn main() { -//! // we have an mp3 and an m4a file -//! const MP3_FILE: &'static str = "assets/a.mp3"; -//! const M4A_FILE: &'static str = "assets/a.m4a"; -//! // read tag from the mp3 file. Using `default()` so that the type of tag is guessed from the file extension -//! let mut mp3tag = Tag::default().read_from_path(MP3_FILE).unwrap(); -//! // set the title -//! mp3tag.set_title("title from mp3 file"); -//! // we can convert it to an mp4 tag and save it to an m4a file. -//! let mut mp4tag = mp3tag.into_tag(TagType::Mp4); -//! mp4tag.write_to_path(M4A_FILE).unwrap(); -//! -//! // reload the tag from the m4a file; this time specifying the tag type (you can also use `default()`) -//! let mp4tag_reload = Tag::with_tag_type(TagType::Mp4) -//! .read_from_path(M4A_FILE) -//! .unwrap(); -//! // the tag originated from an mp3 file is successfully written to an m4a file! -//! assert_eq!(mp4tag_reload.title(), Some("title from mp3 file")); -//! } -//! -//! ``` -//! -//! ## Supported Formats -//! -//! | File Fomat | Metadata Format | backend | -//! | ------------- | --------------------- | ----------------------------------------------------------- | -//! | `mp3` | id3v2.4 | [**id3**](https://github.com/polyfloyd/rust-id3) | -//! | `m4a/mp4/...` | MPEG-4 audio metadata | [**mp4ameta**](https://github.com/Saecki/rust-mp4ameta) | -//! | `flac` | Vorbis comment | [**metaflac**](https://github.com/jameshurst/rust-metaflac) | -//! -//! ## Getters and Setters -//! -//! ```ignore -//! pub trait AudioTag { -//! fn title(&self) -> Option<&str>; -//! fn set_title(&mut self, title: &str); -//! fn remove_title(&mut self); -//! fn artist(&self) -> Option<&str>; -//! fn remove_artist(&mut self); -//! fn set_artist(&mut self, artist: &str); -//! fn year(&self) -> Option; -//! fn set_year(&mut self, year: i32); -//! fn remove_year(&mut self); -//! fn album(&self) -> Option; -//! fn remove_album(&mut self); -//! fn album_title(&self) -> Option<&str>; -//! fn remove_album_title(&mut self); -//! fn album_artist(&self) -> Option<&str>; -//! fn remove_album_artist(&mut self); -//! fn album_cover(&self) -> Option; -//! fn remove_album_cover(&mut self); -//! fn set_album(&mut self, album: Album); -//! fn set_album_title(&mut self, v: &str); -//! fn set_album_artist(&mut self, v: &str); -//! fn set_album_cover(&mut self, cover: Picture); -//! fn track(&self) -> (Option, Option); -//! fn set_track(&mut self, track: (u16, u16)); -//! fn remove_track(&mut self); -//! fn track_number(&self) -> Option; -//! fn set_track_number(&mut self, track_number: u16); -//! fn remove_track_number(&mut self); -//! fn total_tracks(&self) -> Option; -//! fn set_total_tracks(&mut self, total_track: u16); -//! fn remove_total_tracks(&mut self); -//! fn disc(&self) -> (Option, Option); -//! fn set_disc(&mut self, disc: (u16, u16)); -//! fn remove_disc(&mut self); -//! fn disc_number(&self) -> Option; -//! fn set_disc_number(&mut self, disc_number: u16); -//! fn remove_disc_number(&mut self); -//! fn total_discs(&self) -> Option; -//! fn set_total_discs(&mut self, total_discs: u16); -//! fn remove_total_discs(&mut self); -//! fn write_to(&mut self, file: &mut File) -> Result<(), BoxedError>; -//! // cannot use impl AsRef -//! fn write_to_path(&mut self, path: &str) -> Result<(), BoxedError>; -//! } -//! ``` +//! See [README](https://github.com/TianyiShi2001/audiotags) for some examples. pub(crate) use audiotags_dev_macro::*; @@ -224,18 +90,18 @@ impl Tag { config: Config::default(), } } - // pub fn with_config(config: Config) -> Self { - // Self { - // tag_type: None, - // config: config.clone(), - // } - // } - // pub fn with_tag_type_and_config(tag_type: TagType, config: Config) -> Self { - // Self { - // tag_type: Some(tag_type), - // config: config.clone(), - // } - // } + pub fn with_config(config: Config) -> Self { + Self { + tag_type: None, + config: config.clone(), + } + } + pub fn with_tag_type_and_config(tag_type: TagType, config: Config) -> Self { + Self { + tag_type: Some(tag_type), + config: config.clone(), + } + } pub fn read_from_path(&self, path: impl AsRef) -> crate::Result> { match self.tag_type.unwrap_or(TagType::try_from_ext( @@ -247,15 +113,21 @@ impl Tag { .to_lowercase() .as_str(), )?) { - TagType::Id3v2 => Ok(Box::new( - Id3v2Tag::read_from_path(path)?, //).with_config(self.config.clone()), - )), - TagType::Mp4 => Ok(Box::new( - Mp4Tag::read_from_path(path)?, //).with_config(self.config.clone()), - )), - TagType::Flac => Ok(Box::new( - FlacTag::read_from_path(path)?, //.with_config(self.config.clone()), - )), + TagType::Id3v2 => Ok(Box::new({ + let mut t = Id3v2Tag::read_from_path(path)?; + t.set_config(self.config.clone()); + t + })), + TagType::Mp4 => Ok(Box::new({ + let mut t = Mp4Tag::read_from_path(path)?; + t.set_config(self.config.clone()); + t + })), + TagType::Flac => Ok(Box::new({ + let mut t = FlacTag::read_from_path(path)?; + t.set_config(self.config.clone()); + t + })), } } }