diff --git a/Cargo.lock b/Cargo.lock index 04dff48..6bb66fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1175,6 +1175,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "time", "tokio", "uuid", ] diff --git a/Cargo.toml b/Cargo.toml index 1c5aace..d2052b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ futures = { version = "0.3.31" } reqwest = { version = "0.12.19", features = ["json", "stream"] } serde = { version = "1.0.218", features = ["derive"] } serde_json = { version = "1.0.139" } +time = { version = "0.3.41", features = ["macros", "serde"] } uuid = { version = "1.16.0", features = ["v4", "serde"] } icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.4.3" } icarus_envy = { git = "ssh://git@git.kundeng.us/phoenix/icarus_envy.git", tag = "v0.2.2-devel-84ea6e4c22-006" } diff --git a/src/main.rs b/src/main.rs index 6a41d11..58c76a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,11 +18,12 @@ async fn main() -> Result<(), Box> { Ok(song_queue_item) => { if !song_queue_item.data.is_empty() { println!("Song queue item: {:?}", song_queue_item); + let song_queue_id = song_queue_item.data[0].id; println!("Fetching song queue data"); match api::fetch_song_queue_data::get_data( &app_base_url, - &song_queue_item.data[0].id, + &song_queue_id, ) .await { @@ -41,15 +42,39 @@ async fn main() -> Result<(), Box> { println!("Saved at: {:?}", save_path); - // TODO: Get queued song's metadata - // TODO: Get queued coverart - // TODO: Get queued coverart's data - // TODO: Apply metadata to the queued song - // TODO: Update the queued song with the updated queued song - // TODO: Create song - // TODO: Create coverart - // TODO: Wipe data from queued song - // TODO: Wipe data from queued coverart + match api::get_metadata_queue::get( + &app_base_url, + &song_queue_id, + ) + .await + { + Ok(response) => { + match response.json::().await { + Ok(response) => { + let id = &response.data[0].id; + let metadata = &response.data[0].metadata; + let created_at = &response.data[0].created_at; + println!("Id: {:?}", id); + println!("Metadata: {:?}", metadata); + println!("Created at: {:?}", created_at); + // TODO: Get queued coverart + // TODO: Get queued coverart's data + // TODO: Apply metadata to the queued song (modifying file) + // TODO: Update the queued song with the updated queued song + // TODO: Create song + // TODO: Create coverart + // TODO: Wipe data from queued song + // TODO: Wipe data from queued coverart + } + Err(err) => { + eprintln!("Error: {:?}", err); + } + } + } + Err(err) => { + eprintln!("Error: {:?}", err); + } + } } Err(err) => { eprintln!("Error fetching song queue data: {:?}", err); @@ -159,4 +184,55 @@ mod api { } } } + + pub mod get_metadata_queue { + pub async fn get( + base_url: &String, + song_queue_id: &uuid::Uuid, + ) -> Result { + let client = reqwest::Client::new(); + let endpoint = String::from("api/v2/song/metadata/queue"); + let api_url = format!("{}/{}", base_url, endpoint); + client + .get(api_url) + .query(&[("song_queue_id", song_queue_id)]) + .send() + .await + } + + pub mod response { + use serde::{Deserialize, Serialize}; + + #[derive(Debug, Deserialize, Serialize)] + pub struct Metadata { + pub id: uuid::Uuid, + pub album: String, + pub album_artist: String, + pub artist: String, + pub disc: i32, + pub disc_count: i32, + pub duration: i64, + pub genre: String, + pub title: String, + pub track: i32, + pub track_count: i32, + pub year: i32, + } + + #[derive(Debug, Deserialize, Serialize)] + pub struct QueueItem { + pub id: uuid::Uuid, + pub metadata: Metadata, + #[serde(with = "time::serde::rfc3339")] + pub created_at: time::OffsetDateTime, + pub song_queue_id: uuid::Uuid, + } + + #[derive(Debug, Deserialize, Serialize)] + pub struct Response { + pub message: String, + pub data: Vec, + } + } + } }