From 336bb4c6e598d1cc59be09ad04402f6cb86f4e57 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 16 May 2025 00:02:09 -0400 Subject: [PATCH] wip --- Cargo.lock | 1 + crates/lib/api_clients/fal_client/Cargo.toml | 1 + crates/lib/api_clients/fal_client/src/lib.rs | 1 + .../fal_client/src/model/fal_endpoint.rs | 12 ++++++ .../api_clients/fal_client/src/model/mod.rs | 2 + .../src/model/queue_tracking_data.rs | 41 +++++++++++++++++++ .../src/requests/kling_16_image_to_video.rs | 6 --- .../src/utils/clone_queue_payload.rs | 7 ++-- .../src/utils/image_file_to_base64_url.rs | 0 .../api_clients/fal_client/src/utils/mod.rs | 2 +- .../src/file_to_base64_url.rs | 21 +++++++++- 11 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 crates/lib/api_clients/fal_client/src/model/fal_endpoint.rs create mode 100644 crates/lib/api_clients/fal_client/src/model/mod.rs create mode 100644 crates/lib/api_clients/fal_client/src/model/queue_tracking_data.rs delete mode 100644 crates/lib/api_clients/fal_client/src/utils/image_file_to_base64_url.rs diff --git a/Cargo.lock b/Cargo.lock index e394acc988..eb72aa232d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4254,6 +4254,7 @@ dependencies = [ "file_to_base64_url", "filesys", "futures 0.3.31", + "reqwest 0.12.15", "serde", "testing", "tokio", diff --git a/crates/lib/api_clients/fal_client/Cargo.toml b/crates/lib/api_clients/fal_client/Cargo.toml index 902940c758..15a2be53fa 100644 --- a/crates/lib/api_clients/fal_client/Cargo.toml +++ b/crates/lib/api_clients/fal_client/Cargo.toml @@ -25,6 +25,7 @@ anyhow = { workspace = true } chrono = { workspace = true } fal = { version = "0.3.6", features = ["endpoints"] } futures = { workspace = true } +reqwest = { workspace = true } serde = { workspace = true } tokio = { workspace = true } url = { workspace = true } diff --git a/crates/lib/api_clients/fal_client/src/lib.rs b/crates/lib/api_clients/fal_client/src/lib.rs index 69d90419cb..7eaa23d1c9 100644 --- a/crates/lib/api_clients/fal_client/src/lib.rs +++ b/crates/lib/api_clients/fal_client/src/lib.rs @@ -6,5 +6,6 @@ extern crate fal; pub mod creds; pub mod fal_error_plus; +pub mod model; pub mod requests; pub mod utils; diff --git a/crates/lib/api_clients/fal_client/src/model/fal_endpoint.rs b/crates/lib/api_clients/fal_client/src/model/fal_endpoint.rs new file mode 100644 index 0000000000..c3950c8bb4 --- /dev/null +++ b/crates/lib/api_clients/fal_client/src/model/fal_endpoint.rs @@ -0,0 +1,12 @@ +#[derive(Clone, Copy, Debug)] +pub enum FalEndpoint { + Kling16ImageToVideo, +} + +impl FalEndpoint { + pub fn url(&self) -> String { + match self { + FalEndpoint::Kling16ImageToVideo => "https://api.fal.ai/v1/kling16/image-to-video".to_string(), + } + } +} diff --git a/crates/lib/api_clients/fal_client/src/model/mod.rs b/crates/lib/api_clients/fal_client/src/model/mod.rs new file mode 100644 index 0000000000..ff9991ae07 --- /dev/null +++ b/crates/lib/api_clients/fal_client/src/model/mod.rs @@ -0,0 +1,2 @@ +pub mod queue_tracking_data; +mod fal_endpoint; \ No newline at end of file diff --git a/crates/lib/api_clients/fal_client/src/model/queue_tracking_data.rs b/crates/lib/api_clients/fal_client/src/model/queue_tracking_data.rs new file mode 100644 index 0000000000..35c5610653 --- /dev/null +++ b/crates/lib/api_clients/fal_client/src/model/queue_tracking_data.rs @@ -0,0 +1,41 @@ +use fal::queue::{Queue, QueueResponse}; +use reqwest::Client; +use serde::de::DeserializeOwned; +use errors::AnyhowResult; +use crate::creds::fal_api_key::FalApiKey; +use crate::model::fal_endpoint::FalEndpoint; + +#[derive(Clone, Debug)] +pub struct QueueTrackingData { + pub fal_endpoint: FalEndpoint, + pub request_id: String, + pub response_url: String, + pub status_url: String, + pub cancel_url: String, +} + +impl QueueTrackingData { + pub fn from_queue_response(queue: &Queue) -> AnyhowResult { + let fal_endpoint = FalEndpoint::Kling16ImageToVideo; // TODO: Get the endpoint from the queue response + + Ok(Self { + fal_endpoint, + request_id: queue.payload.request_id.clone(), + response_url: queue.payload.response_url.clone(), + status_url: queue.payload.status_url.clone(), + cancel_url: queue.payload.cancel_url.clone(), + }) + } + + pub fn to_queue_response(&self, api_key: &FalApiKey) -> AnyhowResult> { + let client = Client::new(); + let endpoint = self.fal_endpoint.url(); + let payload = QueueResponse { + request_id: self.request_id.clone(), + response_url: self.response_url.clone(), + status_url: self.status_url.clone(), + cancel_url: self.cancel_url.clone(), + }; + Ok(Queue::new(client, endpoint, api_key.0.clone(), payload)) + } +} diff --git a/crates/lib/api_clients/fal_client/src/requests/kling_16_image_to_video.rs b/crates/lib/api_clients/fal_client/src/requests/kling_16_image_to_video.rs index 153286152f..83b3636ba4 100644 --- a/crates/lib/api_clients/fal_client/src/requests/kling_16_image_to_video.rs +++ b/crates/lib/api_clients/fal_client/src/requests/kling_16_image_to_video.rs @@ -65,12 +65,6 @@ pub async fn kling_16_image_to_video>(args: Kling16Args<'_, P>) - let payload = result.payload; - let test : Queue = Queue::new(; - result.client().clone(), - result.endpoint(), - args.api_key.0.clone(), - result.payload().clone(), - ); println!("Result... {:?} - {:?}", result, Utc::now().format("%Y-%m-%dT%H:%M:%S").to_string()); std::io::stdout().flush().unwrap(); diff --git a/crates/lib/api_clients/fal_client/src/utils/clone_queue_payload.rs b/crates/lib/api_clients/fal_client/src/utils/clone_queue_payload.rs index f2b2da137d..b8b78bee1a 100644 --- a/crates/lib/api_clients/fal_client/src/utils/clone_queue_payload.rs +++ b/crates/lib/api_clients/fal_client/src/utils/clone_queue_payload.rs @@ -1,6 +1,7 @@ +use crate::utils::clone_queue_response::clone_queue_response; use fal::queue::{Queue, QueueResponse}; use serde::de::DeserializeOwned; -pub fn clone_queue_payload(payload: &Queue) -> QueueResponse { - // TODO... -} \ No newline at end of file +pub fn clone_queue_payload(queue: &Queue) -> QueueResponse { + clone_queue_response(&queue.payload) +} diff --git a/crates/lib/api_clients/fal_client/src/utils/image_file_to_base64_url.rs b/crates/lib/api_clients/fal_client/src/utils/image_file_to_base64_url.rs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/crates/lib/api_clients/fal_client/src/utils/mod.rs b/crates/lib/api_clients/fal_client/src/utils/mod.rs index 5a429ca78e..18c0af1eb4 100644 --- a/crates/lib/api_clients/fal_client/src/utils/mod.rs +++ b/crates/lib/api_clients/fal_client/src/utils/mod.rs @@ -1,2 +1,2 @@ pub mod clone_queue_payload; -mod clone_queue_response; \ No newline at end of file +pub mod clone_queue_response; \ No newline at end of file diff --git a/crates/lib/files/file_to_base64_url/src/file_to_base64_url.rs b/crates/lib/files/file_to_base64_url/src/file_to_base64_url.rs index 6e6097b8be..49040ff512 100644 --- a/crates/lib/files/file_to_base64_url/src/file_to_base64_url.rs +++ b/crates/lib/files/file_to_base64_url/src/file_to_base64_url.rs @@ -1,5 +1,5 @@ use anyhow::anyhow; -use base64::prelude::{BASE64_STANDARD, BASE64_URL_SAFE, BASE64_URL_SAFE_NO_PAD}; +use base64::prelude::BASE64_STANDARD; use base64::Engine; use errors::AnyhowResult; use mimetypes::mimetype_info::mimetype_info::MimetypeInfo; @@ -24,3 +24,22 @@ pub fn file_to_base64_url>(path: P) -> AnyhowResult { _ => Err(anyhow!("unknown or unsupported mime type: {}", mime.mime_type())), } } + +#[cfg(test)] +mod tests { + use errors::AnyhowResult; + use testing::test_file_path::test_file_path; + use crate::file_to_base64_url::file_to_base64_url; + + #[test] + fn test_file_to_base64_url() -> AnyhowResult<()> { + let path = test_file_path("test_data/image/juno.jpg")?; + let base64_url = file_to_base64_url(path)?; + + assert!(base64_url.starts_with("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD")); + assert!(base64_url.ends_with("z8c2LAteJ5zOIDcX5m04K3P/2Q==")); + assert_eq!(base64_url.len(), 223991); + + Ok(()) + } +} \ No newline at end of file