From a28de5a71276217738fb9e3856fe195985806a37 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 11:26:55 -0500 Subject: [PATCH 1/8] tsk-50: Moving file --- src/{ => properties}/properties.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{ => properties}/properties.rs (100%) diff --git a/src/properties.rs b/src/properties/properties.rs similarity index 100% rename from src/properties.rs rename to src/properties/properties.rs -- 2.43.0 From 4459d89eabfb82fc4c6d5825477aa1d7ade56270 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 11:29:36 -0500 Subject: [PATCH 2/8] tsk-50: Created properties module --- src/properties/mod.rs | 35 +++++++++++++++++++++++++++++++++++ src/properties/properties.rs | 34 ---------------------------------- 2 files changed, 35 insertions(+), 34 deletions(-) create mode 100644 src/properties/mod.rs diff --git a/src/properties/mod.rs b/src/properties/mod.rs new file mode 100644 index 0000000..c8d1de8 --- /dev/null +++ b/src/properties/mod.rs @@ -0,0 +1,35 @@ +pub mod properties; + +#[cfg(test)] +mod tests { + use crate::test_util; + + #[test] + fn test_get_duration() { + let filename = test_util::util::get_filename(1); + let dir = String::from(test_util::util::TESTFILEDIRECTORY); + + match test_util::util::file_exists(&dir, &filename) { + Ok(_) => { + let filepath = test_util::util::get_full_path(&dir, &filename).unwrap(); + match super::properties::get_duration(&filepath) { + Ok(duration) => { + let song_duration: u64 = 41; + let fetched_song_duration = duration.as_secs(); + + assert_eq!( + song_duration, fetched_song_duration, + "Durations should match, but they don't {song_duration} {fetched_song_duration} ({duration:?})" + ); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + } +} diff --git a/src/properties/properties.rs b/src/properties/properties.rs index 3e28031..69970e9 100644 --- a/src/properties/properties.rs +++ b/src/properties/properties.rs @@ -15,37 +15,3 @@ pub fn get_duration(song_path: &String) -> Result Err(err), } } - -#[cfg(test)] -mod tests { - use crate::test_util; - - #[test] - fn test_get_duration() { - let filename = test_util::util::get_filename(1); - let dir = String::from(test_util::util::TESTFILEDIRECTORY); - - match test_util::util::file_exists(&dir, &filename) { - Ok(_) => { - let filepath = test_util::util::get_full_path(&dir, &filename).unwrap(); - match super::get_duration(&filepath) { - Ok(duration) => { - let song_duration: u64 = 41; - let fetched_song_duration = duration.as_secs(); - - assert_eq!( - song_duration, fetched_song_duration, - "Durations should match, but they don't {song_duration} {fetched_song_duration} ({duration:?})" - ); - } - Err(err) => { - assert!(false, "Error: {err:?}"); - } - } - } - Err(err) => { - assert!(false, "Error: {err:?}"); - } - } - } -} -- 2.43.0 From ff1c7c9a59362c68b67dd1e5da18750d0e6077f7 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 11:34:40 -0500 Subject: [PATCH 3/8] tsk-50: File rename --- src/properties/{properties.rs => audio.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/properties/{properties.rs => audio.rs} (100%) diff --git a/src/properties/properties.rs b/src/properties/audio.rs similarity index 100% rename from src/properties/properties.rs rename to src/properties/audio.rs -- 2.43.0 From 6df220ad73aab4d12dd7ae7a874d2173249acb9d Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 11:47:10 -0500 Subject: [PATCH 4/8] tsk-50: Added properties --- src/properties/audio.rs | 7 +++---- src/properties/mod.rs | 42 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/properties/audio.rs b/src/properties/audio.rs index 69970e9..9324a5f 100644 --- a/src/properties/audio.rs +++ b/src/properties/audio.rs @@ -1,13 +1,12 @@ use lofty::file::AudioFile; -pub fn get_duration(song_path: &String) -> Result { - match std::fs::File::open(song_path) { +pub fn get_properties(songpath: &str) -> Result { + match std::fs::File::open(songpath) { Ok(mut content) => { match lofty::flac::FlacFile::read_from(&mut content, lofty::config::ParseOptions::new()) { Ok(flac_file) => { - let properties = flac_file.properties(); - Ok(properties.duration()) + Ok(*flac_file.properties()) } Err(err) => Err(std::io::Error::other(err.to_string())), } diff --git a/src/properties/mod.rs b/src/properties/mod.rs index c8d1de8..c86f23f 100644 --- a/src/properties/mod.rs +++ b/src/properties/mod.rs @@ -1,4 +1,42 @@ -pub mod properties; +pub mod audio; + + +#[derive(Clone, Debug, Default)] +pub struct SongProperties { + pub duration: std::time::Duration, + pub sample_rate: u32, + pub bitrate: u32, + pub overall_bitrate: u32, + pub bit_depth: u8, + pub channels: u8, +} + + +pub fn get_song_properties(song_path: &str) -> Result { + match audio::get_properties(song_path) { + Ok(flac_properties) => { + Ok(SongProperties { + duration: flac_properties.duration(), + sample_rate: flac_properties.sample_rate(), + bitrate: flac_properties.audio_bitrate(), + overall_bitrate: flac_properties.overall_bitrate(), + bit_depth: flac_properties.bit_depth(), + channels: flac_properties.channels(), + }) + } + Err(err) => Err(err), + } +} + +pub fn get_duration(song_path: &String) -> Result { + match get_song_properties(song_path) { + Ok(song_properties) => { + Ok(song_properties.duration) + } + Err(err) => Err(err), + } +} + #[cfg(test)] mod tests { @@ -12,7 +50,7 @@ mod tests { match test_util::util::file_exists(&dir, &filename) { Ok(_) => { let filepath = test_util::util::get_full_path(&dir, &filename).unwrap(); - match super::properties::get_duration(&filepath) { + match super::get_duration(&filepath) { Ok(duration) => { let song_duration: u64 = 41; let fetched_song_duration = duration.as_secs(); -- 2.43.0 From 3d1e360c4d7c0256673e2141a60cca7ba2206203 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 12:02:23 -0500 Subject: [PATCH 5/8] tsk-50: Added test --- src/properties/mod.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/properties/mod.rs b/src/properties/mod.rs index c86f23f..fd2af32 100644 --- a/src/properties/mod.rs +++ b/src/properties/mod.rs @@ -70,4 +70,47 @@ mod tests { } } } + + #[test] + fn test_song_properties() { + let filename = test_util::util::get_filename(1); + let dir = String::from(test_util::util::TESTFILEDIRECTORY); + + match test_util::util::file_exists(&dir, &filename) { + Ok(_) => { + let filepath = test_util::util::get_full_path(&dir, &filename).unwrap(); + match super::get_song_properties(&filepath) { + Ok(song_properties) => { + let song_duration: u64 = 41; + let bitrate: u32 = 1; + let overall_bitrate: u32 = 3; + let bit_depth: u8 = 24; + let channels: u8 = 2; + + let fetched_song_duration = song_properties.duration.as_secs(); + let fetched_bitrate = song_properties.bitrate; + let fetched_overall_bitrate = song_properties.overall_bitrate; + let fetched_bit_depth = song_properties.bit_depth; + let fetched_channels = song_properties.channels; + + assert_eq!( + song_duration, fetched_song_duration, + "Durations should match, but they don't {song_duration} {fetched_song_duration} ({song_properties:?})" + ); + + assert_eq!(bitrate, fetched_bitrate, "Bitrates do not match {bitrate:?} {fetched_bitrate:?} {song_properties:?}"); + assert_eq!(overall_bitrate, fetched_overall_bitrate, "Overall bitrates do not match {overall_bitrate:?} {fetched_overall_bitrate:?} {song_properties:?}"); + assert_eq!(bit_depth, fetched_bit_depth, "Bit depth do not match {bit_depth:?} {fetched_bit_depth:?} {song_properties:?}"); + assert_eq!(channels, fetched_channels, "Channels do not match {channels:?} {fetched_channels:?} {song_properties:?}"); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + } } -- 2.43.0 From 7c1b3a437fe345bdbcaf874b0bf0b43253c6ead5 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 12:21:09 -0500 Subject: [PATCH 6/8] tsk-50: Changes and code formatting: --- src/lib.rs | 28 ++++++++----- src/properties/audio.rs | 4 +- src/properties/mod.rs | 88 +++++++++++++++++++++++------------------ 3 files changed, 70 insertions(+), 50 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index dd4820b..cb40592 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,10 +19,7 @@ pub mod test_util { Err(err) => Err(err), } } - pub fn get_full_path( - directory: &String, - filename: &String, - ) -> Result { + pub fn get_full_path(directory: &str, filename: &str) -> Result { match path_buf(directory, filename) { Ok(pf) => Ok(pf.display().to_string()), Err(err) => Err(err), @@ -39,6 +36,12 @@ pub mod test_util { std::fs::copy(src_path, dest_path) } + pub fn remove_file(filepath: &str) -> Result<(), std::io::Error> { + let f_path = std::path::Path::new(filepath); + + std::fs::remove_file(f_path) + } + pub fn get_data_from_file(source_path: &str) -> Result, std::io::Error> { match std::fs::File::open(source_path) { Ok(mut file) => { @@ -52,13 +55,23 @@ pub mod test_util { } } - pub fn file_exists(directory: &String, filename: &String) -> Result { + pub fn file_exists(directory: &str, filename: &str) -> Result { match path_buf(directory, filename) { Ok(pf) => Ok(pf.exists()), Err(err) => Err(err), } } + pub fn generate_newfilepath(directory: &str) -> Result { + match generate_filename() { + Ok(filename) => match get_full_path(directory, &filename) { + Ok(filepath) => Ok(filepath), + Err(err) => Err(err), + }, + Err(err) => Err(err), + } + } + pub fn generate_filename() -> Result { let mut filename = String::from("track-"); let length = 20; @@ -78,10 +91,7 @@ pub mod test_util { Ok(format!("{filename}.flac")) } - fn path_buf( - directory: &String, - filename: &String, - ) -> Result { + fn path_buf(directory: &str, filename: &str) -> Result { let dir_path = std::path::Path::new(&directory); Ok(dir_path.join(filename)) } diff --git a/src/properties/audio.rs b/src/properties/audio.rs index 9324a5f..e74034d 100644 --- a/src/properties/audio.rs +++ b/src/properties/audio.rs @@ -5,9 +5,7 @@ pub fn get_properties(songpath: &str) -> Result { match lofty::flac::FlacFile::read_from(&mut content, lofty::config::ParseOptions::new()) { - Ok(flac_file) => { - Ok(*flac_file.properties()) - } + Ok(flac_file) => Ok(*flac_file.properties()), Err(err) => Err(std::io::Error::other(err.to_string())), } } diff --git a/src/properties/mod.rs b/src/properties/mod.rs index fd2af32..65752f2 100644 --- a/src/properties/mod.rs +++ b/src/properties/mod.rs @@ -1,6 +1,5 @@ pub mod audio; - #[derive(Clone, Debug, Default)] pub struct SongProperties { pub duration: std::time::Duration, @@ -11,33 +10,27 @@ pub struct SongProperties { pub channels: u8, } - pub fn get_song_properties(song_path: &str) -> Result { match audio::get_properties(song_path) { - Ok(flac_properties) => { - Ok(SongProperties { - duration: flac_properties.duration(), - sample_rate: flac_properties.sample_rate(), - bitrate: flac_properties.audio_bitrate(), - overall_bitrate: flac_properties.overall_bitrate(), - bit_depth: flac_properties.bit_depth(), - channels: flac_properties.channels(), - }) - } + Ok(flac_properties) => Ok(SongProperties { + duration: flac_properties.duration(), + sample_rate: flac_properties.sample_rate(), + bitrate: flac_properties.audio_bitrate(), + overall_bitrate: flac_properties.overall_bitrate(), + bit_depth: flac_properties.bit_depth(), + channels: flac_properties.channels(), + }), Err(err) => Err(err), } } -pub fn get_duration(song_path: &String) -> Result { +pub fn get_duration(song_path: &str) -> Result { match get_song_properties(song_path) { - Ok(song_properties) => { - Ok(song_properties.duration) - } + Ok(song_properties) => Ok(song_properties.duration), Err(err) => Err(err), } } - #[cfg(test)] mod tests { use crate::test_util; @@ -79,30 +72,49 @@ mod tests { match test_util::util::file_exists(&dir, &filename) { Ok(_) => { let filepath = test_util::util::get_full_path(&dir, &filename).unwrap(); - match super::get_song_properties(&filepath) { - Ok(song_properties) => { - let song_duration: u64 = 41; - let bitrate: u32 = 1; - let overall_bitrate: u32 = 3; - let bit_depth: u8 = 24; - let channels: u8 = 2; + let new_filepath = test_util::util::generate_newfilepath(&dir).unwrap(); - let fetched_song_duration = song_properties.duration.as_secs(); - let fetched_bitrate = song_properties.bitrate; - let fetched_overall_bitrate = song_properties.overall_bitrate; - let fetched_bit_depth = song_properties.bit_depth; - let fetched_channels = song_properties.channels; + match test_util::util::copy_file(&filepath, &new_filepath) { + Ok(_) => match super::get_song_properties(&filepath) { + Ok(song_properties) => { + let song_duration: u64 = 41; + let bitrate: u32 = 1; + let overall_bitrate: u32 = 3; + let bit_depth: u8 = 24; + let channels: u8 = 2; - assert_eq!( - song_duration, fetched_song_duration, - "Durations should match, but they don't {song_duration} {fetched_song_duration} ({song_properties:?})" - ); + let fetched_song_duration = song_properties.duration.as_secs(); + let fetched_bitrate = song_properties.bitrate; + let fetched_overall_bitrate = song_properties.overall_bitrate; + let fetched_bit_depth = song_properties.bit_depth; + let fetched_channels = song_properties.channels; - assert_eq!(bitrate, fetched_bitrate, "Bitrates do not match {bitrate:?} {fetched_bitrate:?} {song_properties:?}"); - assert_eq!(overall_bitrate, fetched_overall_bitrate, "Overall bitrates do not match {overall_bitrate:?} {fetched_overall_bitrate:?} {song_properties:?}"); - assert_eq!(bit_depth, fetched_bit_depth, "Bit depth do not match {bit_depth:?} {fetched_bit_depth:?} {song_properties:?}"); - assert_eq!(channels, fetched_channels, "Channels do not match {channels:?} {fetched_channels:?} {song_properties:?}"); - } + assert_eq!( + song_duration, fetched_song_duration, + "Durations should match, but they don't {song_duration} {fetched_song_duration} ({song_properties:?})" + ); + + assert_eq!( + bitrate, fetched_bitrate, + "Bitrates do not match {bitrate:?} {fetched_bitrate:?} {song_properties:?}" + ); + assert_eq!( + overall_bitrate, fetched_overall_bitrate, + "Overall bitrates do not match {overall_bitrate:?} {fetched_overall_bitrate:?} {song_properties:?}" + ); + assert_eq!( + bit_depth, fetched_bit_depth, + "Bit depth do not match {bit_depth:?} {fetched_bit_depth:?} {song_properties:?}" + ); + assert_eq!( + channels, fetched_channels, + "Channels do not match {channels:?} {fetched_channels:?} {song_properties:?}" + ); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + }, Err(err) => { assert!(false, "Error: {err:?}"); } -- 2.43.0 From fe7b591a2f1ae5af455aa7cbacb93003ffa57c55 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 12:26:30 -0500 Subject: [PATCH 7/8] tsk-50: Updating test --- src/properties/mod.rs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/properties/mod.rs b/src/properties/mod.rs index 65752f2..69f08f6 100644 --- a/src/properties/mod.rs +++ b/src/properties/mod.rs @@ -43,16 +43,25 @@ mod tests { match test_util::util::file_exists(&dir, &filename) { Ok(_) => { let filepath = test_util::util::get_full_path(&dir, &filename).unwrap(); - match super::get_duration(&filepath) { - Ok(duration) => { - let song_duration: u64 = 41; - let fetched_song_duration = duration.as_secs(); + let new_filepath = test_util::util::generate_newfilepath(&dir).unwrap(); - assert_eq!( - song_duration, fetched_song_duration, - "Durations should match, but they don't {song_duration} {fetched_song_duration} ({duration:?})" - ); - } + match test_util::util::copy_file(&filepath, &new_filepath) { + Ok(_) => match super::get_duration(&new_filepath) { + Ok(duration) => { + test_util::util::remove_file(&new_filepath).unwrap(); + + let song_duration: u64 = 41; + let fetched_song_duration = duration.as_secs(); + + assert_eq!( + song_duration, fetched_song_duration, + "Durations should match, but they don't {song_duration} {fetched_song_duration} ({duration:?})" + ); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + }, Err(err) => { assert!(false, "Error: {err:?}"); } @@ -75,8 +84,10 @@ mod tests { let new_filepath = test_util::util::generate_newfilepath(&dir).unwrap(); match test_util::util::copy_file(&filepath, &new_filepath) { - Ok(_) => match super::get_song_properties(&filepath) { + Ok(_) => match super::get_song_properties(&new_filepath) { Ok(song_properties) => { + test_util::util::remove_file(&new_filepath).unwrap(); + let song_duration: u64 = 41; let bitrate: u32 = 1; let overall_bitrate: u32 = 3; -- 2.43.0 From 5d1ea47127afde0774007bc796cebb404f045001 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 6 Nov 2025 12:26:39 -0500 Subject: [PATCH 8/8] tsk-50: Version bump --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 663a929..a2f85d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -104,7 +104,7 @@ dependencies = [ [[package]] name = "icarus_meta" -version = "0.4.4" +version = "0.4.5" dependencies = [ "imghdr", "infer", diff --git a/Cargo.toml b/Cargo.toml index b98b2eb..38c59e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_meta" -version = "0.4.4" +version = "0.4.5" edition = "2024" rust-version = "1.90" -- 2.43.0