From 75621ea85a669abb97ce7c747269d322ce5bcd36 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 2 May 2025 22:18:31 -0400 Subject: [PATCH] emit task success / failure --- crates/desktop/tauri-artcraft/src/lib.rs | 3 +- .../src/threads/sora_task_polling_thread.rs | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/crates/desktop/tauri-artcraft/src/lib.rs b/crates/desktop/tauri-artcraft/src/lib.rs index 2727b1f7bd..5017b8769e 100644 --- a/crates/desktop/tauri-artcraft/src/lib.rs +++ b/crates/desktop/tauri-artcraft/src/lib.rs @@ -84,6 +84,7 @@ pub fn run() { let app_2 = app.clone(); let app_3 = app.clone(); + let app_4 = app.clone(); let app_data_root_3 = app_data_root_2.clone(); let app_data_root_4 = app_data_root_2.clone(); let sora_creds_manager_3 = sora_creds_manager_2.clone(); @@ -105,7 +106,7 @@ pub fn run() { tauri::async_runtime::spawn(sora_session_login_thread(app_2, app_data_root_2, sora_creds_manager_2)); tauri::async_runtime::spawn(main_window_thread(app_3, app_data_root_3, storyteller_creds_manager_2)); - tauri::async_runtime::spawn(sora_task_polling_thread(app_data_root_4, sora_creds_manager_3, storyteller_creds_manager_3, sora_task_queue_2)); + tauri::async_runtime::spawn(sora_task_polling_thread(app_4, app_data_root_4, sora_creds_manager_3, storyteller_creds_manager_3, sora_task_queue_2)); tauri::async_runtime::spawn(discord_presence_thread()); Ok(()) diff --git a/crates/desktop/tauri-artcraft/src/threads/sora_task_polling_thread.rs b/crates/desktop/tauri-artcraft/src/threads/sora_task_polling_thread.rs index fca4d97cec..220ae424b9 100644 --- a/crates/desktop/tauri-artcraft/src/threads/sora_task_polling_thread.rs +++ b/crates/desktop/tauri-artcraft/src/threads/sora_task_polling_thread.rs @@ -8,15 +8,28 @@ use log::{error, info}; use openai_sora_client::recipes::list_sora_task_status_with_session_auto_renew::{list_sora_task_status_with_session_auto_renew, StatusRequestArgs}; use openai_sora_client::requests::image_gen::image_gen_status::{Generation, TaskId, TaskStatus}; use reqwest::Url; +use serde_derive::Serialize; use std::fs::File; use std::io::Write; use std::path::PathBuf; -use tauri::AppHandle; -use tempdir::TempDir; use storyteller_client::media_files::upload_image_media_file_from_file::upload_image_media_file_from_file; use storyteller_client::utils::api_host::ApiHost; +use tauri::{AppHandle, Emitter}; +use tempdir::TempDir; +use tokens::tokens::media_files::MediaFileToken; + +#[derive(Debug, Clone, Serialize)] +pub struct SoraImageGenerationComplete { + pub media_file_token: MediaFileToken, +} + +#[derive(Debug, Clone, Serialize)] +pub struct SoraImageGenerationFailed { + pub prompt: String, +} pub async fn sora_task_polling_thread( + app_handle: AppHandle, app_data_root: AppDataRoot, sora_creds_manager: SoraCredentialManager, storyteller_creds_manager: StorytellerCredentialManager, @@ -24,6 +37,7 @@ pub async fn sora_task_polling_thread( ) -> ! { loop { let res = polling_loop( + &app_handle, &sora_creds_manager, &storyteller_creds_manager, &sora_task_queue, @@ -37,6 +51,7 @@ pub async fn sora_task_polling_thread( } async fn polling_loop( + app_handle: &AppHandle, sora_creds_manager: &SoraCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, sora_task_queue: &SoraTaskQueue, @@ -84,6 +99,14 @@ async fn polling_loop( TaskStatus::Unknown(_) => {} } } + + for task in failed_tasks.iter() { + if sora_task_queue.contains_key(&task.id)? { + app_handle.emit("sora-image-generation-failed", SoraImageGenerationFailed { + prompt: task.prompt.clone(), + })?; + } + } let failed_task_ids: Vec<&TaskId> = failed_tasks .iter() @@ -109,6 +132,10 @@ async fn polling_loop( let result = upload_image_media_file_from_file(&api_host, Some(&creds), download_path).await?; info!("Uploaded to API backend: {:?}", result.media_file_token); + + app_handle.emit("sora-image-generation-complete", SoraImageGenerationComplete { + media_file_token: result.media_file_token + })?; } }