From 137ced0ead8ce21de7affbec0b9671526e0ecd12 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 15 Mar 2026 22:20:22 -0400 Subject: [PATCH] better ergo --- Cargo.lock | 1 + crates/service/web/storyteller_web/Cargo.toml | 1 + ...ce_2p0_multi_function_video_gen_handler.rs | 26 +++++++++++-------- .../lookup/lookup_media_file_urls_as_map.rs | 16 ++---------- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e0053f867..54f535599a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11598,6 +11598,7 @@ dependencies = [ "tts_common", "url", "url_config", + "url_utils", "user_input_common", "user_traits_component", "users", diff --git a/crates/service/web/storyteller_web/Cargo.toml b/crates/service/web/storyteller_web/Cargo.toml index e99a087152..b56adf3158 100644 --- a/crates/service/web/storyteller_web/Cargo.toml +++ b/crates/service/web/storyteller_web/Cargo.toml @@ -79,6 +79,7 @@ thumbnail_generator = { path = "../../../api_clients/thumbnail_generator" } tokens.workspace = true tts_common = { path = "../../../lib/tts_common" } url_config = { path = "../../../lib/url_config" } +url_utils = { path = "../../../lib/url_utils" } user_input_common = { path = "../../../lib/user_input_common" } users.workspace = true videos = { path = "../../../lib/files/videos" } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs index a62e26c63f..fe7a045315 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs @@ -8,7 +8,7 @@ use crate::http_server::endpoints::generate::common::payments_error_test::paymen 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_media_file_urls_as_map::{lookup_media_file_urls_as_map, MediaFileUrlEntry}; +use crate::util::lookup::lookup_media_file_urls_as_map::lookup_media_file_urls_as_map; use actix_web::web::Json; use actix_web::{web, HttpRequest}; use artcraft_api_defs::generate::video::multi_function::seedance_2p0_multi_function_video_gen::{ @@ -42,6 +42,7 @@ use seedance2pro::requests::upload_file::upload_file::{upload_file, UploadFileAr use sqlx::Acquire; use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; +use url_utils::extension::extract_extension_from_url::{extract_extension_from_url_str, ExtractExtensions}; /// Seedance 2.0 Multi-Function video generation (text-to-video, keyframe, and reference). #[utoipa::path( @@ -144,7 +145,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( None => None, Some(token) => match file_urls_by_token.get(token) { None => return Err(CommonWebError::BadInputWithSimpleMessage("Start frame media not found.".to_string())), - Some(entry) => Some(upload_to_seedance2pro(&session, &entry.cdn_url, &entry.extension).await?), + Some(url) => Some(upload_to_seedance2pro(&session, url).await?), } }; @@ -152,7 +153,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( None => None, Some(token) => match file_urls_by_token.get(token) { None => return Err(CommonWebError::BadInputWithSimpleMessage("End frame media not found.".to_string())), - Some(entry) => Some(upload_to_seedance2pro(&session, &entry.cdn_url, &entry.extension).await?), + Some(url) => Some(upload_to_seedance2pro(&session, url).await?), } }; @@ -164,8 +165,8 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( for token in tokens { match file_urls_by_token.get(token) { None => return Err(CommonWebError::BadInputWithSimpleMessage("Reference image media not found.".to_string())), - Some(entry) => { - let seedance_url = upload_to_seedance2pro(&session, &entry.cdn_url, &entry.extension).await?; + Some(url) => { + let seedance_url = upload_to_seedance2pro(&session, url).await?; urls.push(seedance_url); } } @@ -182,8 +183,8 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( for token in tokens { match file_urls_by_token.get(token) { None => return Err(CommonWebError::BadInputWithSimpleMessage("Reference video media not found.".to_string())), - Some(entry) => { - let seedance_url = upload_to_seedance2pro(&session, &entry.cdn_url, &entry.extension).await?; + Some(url) => { + let seedance_url = upload_to_seedance2pro(&session, url).await?; urls.push(seedance_url); } } @@ -200,8 +201,8 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( for token in tokens { match file_urls_by_token.get(token) { None => return Err(CommonWebError::BadInputWithSimpleMessage("Reference audio media not found.".to_string())), - Some(entry) => { - let seedance_url = upload_to_seedance2pro(&session, &entry.cdn_url, &entry.extension).await?; + Some(url) => { + let seedance_url = upload_to_seedance2pro(&session, url).await?; urls.push(seedance_url); } } @@ -442,8 +443,11 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( async fn upload_to_seedance2pro( session: &Seedance2ProSession, our_cdn_url: &str, - extension: &str, ) -> Result { + let extension = extract_extension_from_url_str(our_cdn_url, &ExtractExtensions::All) + .map(|ext| ext.without_period().to_string()) + .unwrap_or_else(|| "png".to_string()); + let file_bytes = http_download_url_to_bytes(our_cdn_url) .await .map_err(|err| { @@ -454,7 +458,7 @@ async fn upload_to_seedance2pro( let prepare_result = prepare_file_upload(PrepareFileUploadArgs { session, - extension: extension.to_string(), + extension, }) .await .map_err(|err| { diff --git a/crates/service/web/storyteller_web/src/util/lookup/lookup_media_file_urls_as_map.rs b/crates/service/web/storyteller_web/src/util/lookup/lookup_media_file_urls_as_map.rs index 773b6d8001..809f70848b 100644 --- a/crates/service/web/storyteller_web/src/util/lookup/lookup_media_file_urls_as_map.rs +++ b/crates/service/web/storyteller_web/src/util/lookup/lookup_media_file_urls_as_map.rs @@ -12,17 +12,12 @@ use std::collections::{HashMap, HashSet}; use std::iter::FromIterator; use tokens::tokens::media_files::MediaFileToken; -pub struct MediaFileUrlEntry { - pub cdn_url: String, - pub extension: String, -} - pub async fn lookup_media_file_urls_as_map( http_request: &HttpRequest, mysql_connection: &mut PoolConnection, server_environment: ServerEnvironment, tokens: &[MediaFileToken], -) -> Result, CommonWebError> { +) -> Result, CommonWebError> { const CAN_SEE_DELETED: bool = false; let result = batch_get_media_files_by_tokens_with_connection( @@ -58,10 +53,6 @@ pub async fn lookup_media_file_urls_as_map( let file_urls = media_files.into_iter() .map(|file| { - let extension = file.maybe_public_bucket_extension - .clone() - .unwrap_or_else(|| "png".to_string()); - let public_bucket_path = MediaFileBucketPath::from_object_hash( &file.public_bucket_directory_hash, file.maybe_public_bucket_prefix.as_deref(), @@ -72,10 +63,7 @@ pub async fn lookup_media_file_urls_as_map( server_environment, &public_bucket_path); - (file.token, MediaFileUrlEntry { - cdn_url: media_links.cdn_url.to_string(), - extension, - }) + (file.token, media_links.cdn_url.to_string()) }) .collect::>();