From 7625449434ee0fb627cf186740aca592bed9d969 Mon Sep 17 00:00:00 2001
From: Antoine Gersant <antoine.gersant@lesforges.org>
Date: Mon, 3 Feb 2025 20:58:28 -0800
Subject: [PATCH] Update ape dependency to new version

---
 Cargo.lock         |  4 ++--
 Cargo.toml         |  2 +-
 src/app/formats.rs | 48 +++++++++++++++++++++-------------------------
 3 files changed, 25 insertions(+), 29 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 16a2a34..80f47b0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -52,9 +52,9 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
 
 [[package]]
 name = "ape"
-version = "0.5.0"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cdc864958f3a41f67f998dd2fe9635a525d2f232787d0268690b5e0876a2262"
+checksum = "8fb0a5091f05526b27cd637f680c0b20ecc3af600bc74bbf1069fef11d323ab5"
 dependencies = [
  "byteorder",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index a7d9d96..153c23c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,7 +12,7 @@ ui = ["native-windows-gui", "native-windows-derive"]
 lto = "thin"
 
 [dependencies]
-ape = "0.5"
+ape = "0.6"
 axum-extra = { version = "0.10.0", features = ["typed-header"] }
 axum-range = { version = "0.5.0" }
 bitcode = { version = "0.6.3", features = ["serde"] }
diff --git a/src/app/formats.rs b/src/app/formats.rs
index 73474cf..ab6b77f 100644
--- a/src/app/formats.rs
+++ b/src/app/formats.rs
@@ -125,57 +125,53 @@ mod ape_ext {
 	use std::sync::LazyLock;
 
 	pub fn read_string(item: &ape::Item) -> Option<String> {
-		match item.value {
-			ape::ItemValue::Text(ref s) => Some(s.clone()),
-			_ => None,
-		}
+		item.try_into().ok().map(str::to_string)
 	}
 
-	pub fn read_strings(items: Vec<&ape::Item>) -> Vec<String> {
-		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_strings(item: Option<&ape::Item>) -> Vec<String> {
+		let Some(item) = item else {
+			return vec![];
+		};
+		let strings: Vec<&str> = item.try_into().unwrap_or_default();
+		strings.into_iter().map(str::to_string).collect()
 	}
 
 	pub fn read_i32(item: &ape::Item) -> Option<i32> {
-		match item.value {
-			ape::ItemValue::Text(ref s) => s.parse::<i32>().ok(),
-			_ => None,
-		}
+		item.try_into()
+			.ok()
+			.map(|s: &str| s.parse::<i32>().ok())
+			.flatten()
 	}
 
 	static X_OF_Y_REGEX: LazyLock<Regex> = LazyLock::new(|| Regex::new(r#"^\d+"#).unwrap());
 
 	pub fn read_x_of_y(item: &ape::Item) -> Option<u32> {
-		match item.value {
-			ape::ItemValue::Text(ref s) => {
+		item.try_into()
+			.ok()
+			.map(|s: &str| {
 				if let Some(m) = X_OF_Y_REGEX.find(s) {
 					s[m.start()..m.end()].parse().ok()
 				} else {
 					None
 				}
-			}
-			_ => None,
-		}
+			})
+			.flatten()
 	}
 }
 
 fn read_ape<P: AsRef<Path>>(path: P) -> Result<SongMetadata, Error> {
 	let tag = ape::read_from_path(path)?;
-	let artists = ape_ext::read_strings(tag.items("Artist"));
+	let artists = ape_ext::read_strings(tag.item("Artist"));
 	let album = tag.item("Album").and_then(ape_ext::read_string);
-	let album_artists = ape_ext::read_strings(tag.items("Album artist"));
+	let album_artists = ape_ext::read_strings(tag.item("Album artist"));
 	let title = tag.item("Title").and_then(ape_ext::read_string);
 	let year = tag.item("Year").and_then(ape_ext::read_i32);
 	let disc_number = tag.item("Disc").and_then(ape_ext::read_x_of_y);
 	let track_number = tag.item("Track").and_then(ape_ext::read_x_of_y);
-	let lyricists = ape_ext::read_strings(tag.items("LYRICIST"));
-	let composers = ape_ext::read_strings(tag.items("COMPOSER"));
-	let genres = ape_ext::read_strings(tag.items("GENRE"));
-	let labels = ape_ext::read_strings(tag.items("PUBLISHER"));
+	let lyricists = ape_ext::read_strings(tag.item("LYRICIST"));
+	let composers = ape_ext::read_strings(tag.item("COMPOSER"));
+	let genres = ape_ext::read_strings(tag.item("GENRE"));
+	let labels = ape_ext::read_strings(tag.item("PUBLISHER"));
 	Ok(SongMetadata {
 		artists,
 		album_artists,