aboutsummaryrefslogtreecommitdiff
path: root/import/src/acoustid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'import/src/acoustid.rs')
-rw-r--r--import/src/acoustid.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/import/src/acoustid.rs b/import/src/acoustid.rs
new file mode 100644
index 0000000..fe47290
--- /dev/null
+++ b/import/src/acoustid.rs
@@ -0,0 +1,38 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2025 metamuffin <metamuffin.org>
+*/
+use anyhow::Result;
+use bincode::{Decode, Encode};
+use jellybase::cache::async_cache_memory;
+use serde::Deserialize;
+use std::{path::Path, process::Stdio, sync::Arc};
+use tokio::{io::AsyncReadExt, process::Command};
+
+#[derive(Debug, Encode, Decode, Deserialize)]
+pub(crate) struct Fingerprint {
+ duration: f32,
+ fingerprint: String,
+}
+
+pub(crate) async fn acoustid_fingerprint(path: &Path) -> Result<Arc<Fingerprint>> {
+ async_cache_memory(&["fpcalc", &path.to_string_lossy()], || async move {
+ let child = Command::new("fpcalc")
+ .arg("-json")
+ .arg(path)
+ .stdout(Stdio::piped())
+ .spawn()?;
+
+ let mut buf = Vec::new();
+ child.stdout.unwrap().read_to_end(&mut buf).await?;
+ let out: Fingerprint = serde_json::from_slice(&buf)?;
+
+ Ok(out)
+ })
+ .await
+}
+
+// pub(crate) async fn acoustid_mbid(fingerprint: Fingerprint) -> Result<Arc<Option<String>>> {
+// async_cache_memory(&["api-acoustid", fingerprint], generate)
+// }