diff --git a/Cargo.lock b/Cargo.lock index b13f7a11ad..0e1fc85c2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11250,6 +11250,7 @@ dependencies = [ "async-stripe 0.26.0", "async-trait", "base64 0.22.1", + "beeble_client", "billing_artcraft_component", "billing_component", "bootstrap", diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs index b8bcf83ca1..52128c9f29 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs @@ -13,7 +13,6 @@ use beeble_client::requests::start_generation::start_generation::{ start_generation, BeebleAlphaMode, BeebleGenerationType, StartGenerationArgs, StartGenerationRequest, }; -use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; use enums::by_table::prompts::prompt_type::PromptType; use enums::common::generation::common_generation_mode::CommonGenerationMode; use enums::common::generation::common_model_type::CommonModelType; @@ -25,17 +24,16 @@ use mysql_queries::queries::generic_inference::beeble::insert_generic_inference_ InsertGenericInferenceForBeebleWithAprioriJobTokenArgs, }; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; -use mysql_queries::queries::media_files::get::get_media_file::get_media_file_with_connection; use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs}; use tokens::tokens::generic_inference_jobs::InferenceJobToken; +use tokens::tokens::media_files::MediaFileToken; use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; -use crate::http_server::common_responses::media::media_links_builder::MediaLinksBuilder; use crate::http_server::endpoints::generate::common::payments_error_test::payments_error_test; -use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; use crate::state::server_state::ServerState; use crate::util::http_download_url_to_bytes::http_download_url_to_bytes; +use crate::util::lookup::lookup_image_urls_as_map::lookup_image_urls_as_map; /// Beeble SwitchX Video Edit #[utoipa::path( @@ -99,54 +97,41 @@ pub async fn beeble_switchx_edit_video_gen_handler( AdvancedCommonWebError::BadInputWithSimpleMessage("repeated idempotency token".to_string()) })?; - // ==================== LOOKUP MEDIA FILES ==================== // + // ==================== LOOKUP MEDIA FILES (BATCH) ==================== // - const IS_MOD: bool = false; - let media_domain = get_media_domain(&http_request); + let mut tokens_to_lookup: Vec = vec![source_video_media_token.clone()]; - // Source video (required) - let source_video_file = get_media_file_with_connection( - source_video_media_token, IS_MOD, &mut mysql_connection, - ).await - .map_err(|err| { - warn!("Error looking up source video: {:?}", err); - AdvancedCommonWebError::from_anyhow_error(err) + if let Some(ref_token) = &request.reference_image_media_token { + tokens_to_lookup.push(ref_token.clone()); + } + + let cdn_url_map = lookup_image_urls_as_map( + &http_request, + &mut mysql_connection, + server_state.server_environment, + &tokens_to_lookup, + ).await.map_err(|err| { + warn!("Error looking up media files: {:?}", err); + AdvancedCommonWebError::from(err) + })?; + + let source_video_cdn_url = cdn_url_map.get(source_video_media_token) + .ok_or_else(|| { + warn!("Source video media file not found: {:?}", source_video_media_token); + AdvancedCommonWebError::NotFound })? - .ok_or(AdvancedCommonWebError::NotFound)?; + .clone(); - let source_video_cdn_url = { - let path = MediaFileBucketPath::from_object_hash( - &source_video_file.public_bucket_directory_hash, - source_video_file.maybe_public_bucket_prefix.as_deref(), - source_video_file.maybe_public_bucket_extension.as_deref(), - ); - MediaLinksBuilder::from_media_path_and_env(media_domain, server_state.server_environment, &path) - .cdn_url.to_string() - }; - - // Reference image (optional) - let maybe_reference_image_cdn_url = if let Some(ref_token) = &request.reference_image_media_token { - let ref_file = get_media_file_with_connection(ref_token, IS_MOD, &mut mysql_connection) - .await - .map_err(|err| { - warn!("Error looking up reference image: {:?}", err); - AdvancedCommonWebError::from_anyhow_error(err) - })? - .ok_or(AdvancedCommonWebError::NotFound)?; - - let path = MediaFileBucketPath::from_object_hash( - &ref_file.public_bucket_directory_hash, - ref_file.maybe_public_bucket_prefix.as_deref(), - ref_file.maybe_public_bucket_extension.as_deref(), - ); - - Some( - MediaLinksBuilder::from_media_path_and_env(media_domain, server_state.server_environment, &path) - .cdn_url.to_string() - ) - } else { - None - }; + let maybe_reference_image_cdn_url = request.reference_image_media_token.as_ref() + .map(|ref_token| { + cdn_url_map.get(ref_token) + .cloned() + .ok_or_else(|| { + warn!("Reference image media file not found: {:?}", ref_token); + AdvancedCommonWebError::NotFound + }) + }) + .transpose()?; // ==================== DOWNLOAD & UPLOAD TO BEEBLE ==================== // @@ -162,8 +147,11 @@ pub async fn beeble_switchx_edit_video_gen_handler( info!("Downloaded source video: {} bytes", video_bytes.len()); - let video_extension = source_video_file.maybe_public_bucket_extension - .as_deref().unwrap_or("mp4"); + let video_extension = std::path::Path::new(&source_video_cdn_url) + .extension() + .and_then(|e| e.to_str()) + .unwrap_or("mp4"); + let video_filename = format!("{}.{}", source_video_media_token.as_str(), video_extension); let video_content_type = match video_extension { "mp4" => "video/mp4",