From 175bd7a76947f1b60468f65ad5c2300eca9ee657 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Thu, 28 Aug 2025 16:26:49 -0400 Subject: [PATCH 1/2] Added queued coverart code --- src/managers/commit_manager.rs | 10 ++++++ src/syncers/upload.rs | 66 +++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/managers/commit_manager.rs b/src/managers/commit_manager.rs index a3281d4..00cd7d4 100644 --- a/src/managers/commit_manager.rs +++ b/src/managers/commit_manager.rs @@ -421,6 +421,7 @@ impl CommitManager { let token = &data.token; let song = &data.song; let album = &data.album; + let coverart = &data.coverart; println!("Queueing song"); @@ -452,6 +453,15 @@ impl CommitManager { println!("Queued metadata Id: {queued_metadata_id:?}"); + match up.queue_coverart(token, coverart).await { + Ok(id) => { + println!("Queued coverart Id: {id:?}"); + } + Err(err) => { + return Err(std::io::Error::other(err.to_string())); + } + } + Ok(()) } diff --git a/src/syncers/upload.rs b/src/syncers/upload.rs index f85568f..c51d201 100644 --- a/src/syncers/upload.rs +++ b/src/syncers/upload.rs @@ -27,6 +27,14 @@ mod response { pub data: Vec, } } + + pub mod queue_coverart { + #[derive(Debug, serde::Deserialize)] + pub struct Response { + pub message: String, + pub data: Vec + } + } } impl Upload { @@ -202,6 +210,62 @@ impl Upload { } } + pub async fn queue_coverart(&self, token: &icarus_models::token::AccessToken, coverart: &icarus_models::coverart::CoverArt) -> Result { + let coverartpath = coverart.path.clone(); + let file = tokio::fs::File::open(&coverartpath).await.unwrap(); + let stream = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new()); + let file_body = reqwest::Body::wrap_stream(stream); + + let file_name = std::path::Path::new(&coverartpath) + .file_name() + .and_then(|name| name.to_str()) + .map(String::from) + .unwrap_or("file".to_string()); + + let form = reqwest::multipart::Form::new().part( + "file", + reqwest::multipart::Part::stream(file_body) + .file_name(file_name) + .mime_str("application/octet-stream") + .unwrap(), + ); + + let endpoint = String::from("api/v2/coverart/queue"); + let url = format!("{}/{endpoint}", self.api.url); + println!("Url: {url:?}"); + + let mut headers = reqwest::header::HeaderMap::new(); + let (auth, auth_val) = syncers::common::auth_header(token).await; + headers.insert(auth, auth_val); + headers.insert("Accept", HeaderValue::from_str("*/*").unwrap()); + headers.insert("Connection", HeaderValue::from_str("keep-alive").unwrap()); + headers.insert("Cache-Control", HeaderValue::from_str("no-cache").unwrap()); + + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(300)) + .pool_idle_timeout(std::time::Duration::from_secs(30)) + .build() + .unwrap(); + match client + .post(url) + .headers(headers) + .multipart(form) + .send() + .await + { + Ok(response) => match response.json::().await { + Ok(resp) => { + println!("Message: {:?}", resp.message); + Ok(resp.data[0]) + } + Err(err) => Err(err), + }, + Err(err) => Err(err), + } + + // Ok(uuid::Uuid::nil()) + } + fn init_form( &self, song: &icarus_models::song::Song, @@ -236,7 +300,7 @@ impl Upload { pub fn set_api(&mut self, host: &str) { let api = models::api::Api { url: host.to_owned(), - version: String::from("v1"), + version: String::from(crate::parsers::api_parser::API_VERSION), endpoint: String::new(), }; self.api = api; -- 2.47.3 From b26175c97ad0144bb68a26f8874be5beaacc0042 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Thu, 28 Aug 2025 16:27:37 -0400 Subject: [PATCH 2/2] Code formatting and cleanup --- src/syncers/upload.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/syncers/upload.rs b/src/syncers/upload.rs index c51d201..f51ae60 100644 --- a/src/syncers/upload.rs +++ b/src/syncers/upload.rs @@ -32,7 +32,7 @@ mod response { #[derive(Debug, serde::Deserialize)] pub struct Response { pub message: String, - pub data: Vec + pub data: Vec, } } } @@ -210,17 +210,21 @@ impl Upload { } } - pub async fn queue_coverart(&self, token: &icarus_models::token::AccessToken, coverart: &icarus_models::coverart::CoverArt) -> Result { + pub async fn queue_coverart( + &self, + token: &icarus_models::token::AccessToken, + coverart: &icarus_models::coverart::CoverArt, + ) -> Result { let coverartpath = coverart.path.clone(); let file = tokio::fs::File::open(&coverartpath).await.unwrap(); let stream = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new()); let file_body = reqwest::Body::wrap_stream(stream); let file_name = std::path::Path::new(&coverartpath) - .file_name() - .and_then(|name| name.to_str()) - .map(String::from) - .unwrap_or("file".to_string()); + .file_name() + .and_then(|name| name.to_str()) + .map(String::from) + .unwrap_or("file".to_string()); let form = reqwest::multipart::Form::new().part( "file", @@ -262,8 +266,6 @@ impl Upload { }, Err(err) => Err(err), } - - // Ok(uuid::Uuid::nil()) } fn init_form( -- 2.47.3