diff --git a/src/app/formats.rs b/src/app/formats.rs index bc4c807..73474cf 100644 --- a/src/app/formats.rs +++ b/src/app/formats.rs @@ -132,7 +132,12 @@ mod ape_ext { } pub fn read_strings(items: Vec<&ape::Item>) -> Vec<String> { - items.iter().filter_map(|i| read_string(i)).collect() + items + .iter() + .filter_map(|i| read_string(i)) + // TODO This is a workaround for https://github.com/rossnomann/ape/issues/10 + .flat_map(|s| s.split('\0').map(str::to_string).collect::<Vec<_>>()) + .collect() } pub fn read_i32(item: &ape::Item) -> Option<i32> { @@ -301,7 +306,7 @@ fn read_mp4<P: AsRef<Path>>(path: P) -> Result<SongMetadata, Error> { #[test] fn reads_file_metadata() { - let sample_tags = SongMetadata { + let expected_without_duration = SongMetadata { disc_number: Some(3), track_number: Some(1), title: Some("TEST TITLE".into()), @@ -316,49 +321,41 @@ fn reads_file_metadata() { genres: vec!["TEST GENRE".into()], labels: vec!["TEST LABEL".into()], }; - let flac_sample_tag = SongMetadata { + let expected_with_duration = SongMetadata { duration: Some(0), - ..sample_tags.clone() - }; - let mp3_sample_tag = SongMetadata { - duration: Some(0), - ..sample_tags.clone() - }; - let m4a_sample_tag = SongMetadata { - duration: Some(0), - ..sample_tags.clone() + ..expected_without_duration.clone() }; assert_eq!( read_metadata(Path::new("test-data/formats/sample.aif")).unwrap(), - sample_tags + expected_without_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.mp3")).unwrap(), - mp3_sample_tag + expected_with_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.ogg")).unwrap(), - sample_tags + expected_without_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.flac")).unwrap(), - flac_sample_tag + expected_with_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.m4a")).unwrap(), - m4a_sample_tag + expected_with_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.opus")).unwrap(), - sample_tags + expected_without_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.ape")).unwrap(), - sample_tags + expected_without_duration ); assert_eq!( read_metadata(Path::new("test-data/formats/sample.wav")).unwrap(), - sample_tags + expected_without_duration ); } @@ -393,14 +390,14 @@ fn reads_embedded_artwork() { #[test] fn reads_multivalue_fields() { - let expected = SongMetadata { + let expected_without_duration = SongMetadata { disc_number: Some(3), track_number: Some(1), title: Some("TEST TITLE".into()), artists: vec!["TEST ARTIST".into(), "OTHER ARTIST".into()], album_artists: vec!["TEST ALBUM ARTIST".into(), "OTHER ALBUM ARTIST".into()], album: Some("TEST ALBUM".into()), - duration: Some(0), + duration: None, year: Some(2016), has_artwork: false, lyricists: vec!["TEST LYRICIST".into(), "OTHER LYRICIST".into()], @@ -408,8 +405,16 @@ fn reads_multivalue_fields() { genres: vec!["TEST GENRE".into(), "OTHER GENRE".into()], labels: vec!["TEST LABEL".into(), "OTHER LABEL".into()], }; + let expected_with_duration = SongMetadata { + duration: Some(0), + ..expected_without_duration.clone() + }; assert_eq!( - read_metadata(Path::new("test-data/multivalue.mp3")).unwrap(), - expected + read_metadata(Path::new("test-data/multivalue/multivalue.mp3")).unwrap(), + expected_with_duration + ); + assert_eq!( + read_metadata(Path::new("test-data/multivalue/multivalue.ape")).unwrap(), + expected_without_duration ); } diff --git a/test-data/multivalue/multivalue.ape b/test-data/multivalue/multivalue.ape new file mode 100644 index 0000000..d3d3757 Binary files /dev/null and b/test-data/multivalue/multivalue.ape differ diff --git a/test-data/multivalue.mp3 b/test-data/multivalue/multivalue.mp3 similarity index 100% rename from test-data/multivalue.mp3 rename to test-data/multivalue/multivalue.mp3