From ebcccbbf836b290431b110bcda865d9a88f54f02 Mon Sep 17 00:00:00 2001 From: James Youngman Date: Sat, 10 Jul 2021 11:16:57 +0100 Subject: [PATCH] Add support for track numbering in ID3 TRCK style (NN/MM). This fixes https://github.com/TianyiShi2001/audiotags/issues/5 Example FLAC metadata using this style: comment[0]: album=Chosen Lords comment[1]: discid=820d4b0a comment[2]: title=Reunion 2 comment[3]: artist=Aphex Twin comment[4]: tracknumber=2/10 --- assets/meep.flac | Bin 0 -> 26253 bytes src/components/flac_tag.rs | 25 +++++++++++++++++++------ tests/io.rs | 11 +++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 assets/meep.flac diff --git a/assets/meep.flac b/assets/meep.flac new file mode 100644 index 0000000000000000000000000000000000000000..53d4ba67d28d44d1f96851a415122bee25725e92 GIT binary patch literal 26253 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 JfByggSql_JFp2;G literal 0 HcmV?d00001 diff --git a/src/components/flac_tag.rs b/src/components/flac_tag.rs index 2320d60..c62f7ba 100644 --- a/src/components/flac_tag.rs +++ b/src/components/flac_tag.rs @@ -125,12 +125,9 @@ impl AudioTagEdit for FlacTag { } fn track_number(&self) -> Option { - if let Some(Ok(n)) = self.get_first("TRACKNUMBER").map(|x| x.parse::()) { - Some(n) - } else { - None - } + self.track_number_pair().0 } + fn set_track_number(&mut self, v: u16) { self.set_first("TRACKNUMBER", &v.to_string()) } @@ -140,7 +137,8 @@ impl AudioTagEdit for FlacTag { if let Some(Ok(n)) = self.get_first("TOTALTRACKS").map(|x| x.parse::()) { Some(n) } else { - None + // Support "NN/MM" in the style of ID3-style TRCK. + self.track_number_pair().1 } } fn set_total_tracks(&mut self, v: u16) { @@ -214,3 +212,18 @@ impl AudioTagWrite for FlacTag { Ok(()) } } + +impl FlacTag { + fn track_number_pair(&self) -> (Option, Option) { + if let Some(s) = self.get_first("TRACKNUMBER") { + let mut parts = s.split("/").fuse().map(|t| t.parse().ok()); + // Manually unpack the first two items instead of using + // collect() so that we can avoid allocating a Vec. + let track = parts.next().flatten(); + let total = parts.next().flatten(); + (track, total) + } else { + (None, None) + } + } +} diff --git a/tests/io.rs b/tests/io.rs index 744ab99..04688fd 100644 --- a/tests/io.rs +++ b/tests/io.rs @@ -52,3 +52,14 @@ macro_rules! test_file { test_file!(test_mp3, "assets/a.mp3"); test_file!(test_m4a, "assets/a.m4a"); test_file!(test_flac, "assets/a.flac"); + +#[test] +fn test_id3_style_track_number() { + // Verify that we can consume TRACKNUMER tags in the style of the + // ID3 TRCK tag. This is non-standard (for Vorbis comments) but + // other tools (such as easytags) will read it (but, AFAIK, not + // write it). + let tags = Tag::default().read_from_path("assets/meep.flac").unwrap(); + assert_eq!(tags.track_number(), Some(1)); + assert_eq!(tags.total_tracks(), Some(6)); +}