mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-07 10:31:46 +00:00
refactor
This commit is contained in:
1 parent
9a23a5715f
commit
183ee40b65
7 files changed
+47
-48
No files matched your search
Generated
+1
@@ -797,6 +797,7 @@ dependencies = [
|
||||
"test_data",
|
||||
"tokens",
|
||||
"tokio",
|
||||
"url_utils",
|
||||
"uuid 1.18.1",
|
||||
"workspace-build-acceleration",
|
||||
"world_labs_api",
|
||||
|
||||
@@ -22,6 +22,7 @@ fal_client.workspace = true
|
||||
muapi_client.workspace = true
|
||||
seedance2pro.workspace = true
|
||||
tokens.workspace = true
|
||||
url_utils.workspace = true
|
||||
world_labs_api.workspace = true
|
||||
|
||||
# External
|
||||
|
||||
+11
-48
@@ -5,14 +5,18 @@ use crate::generate::generate_video::generate_video_response::{
|
||||
GenerateVideoResponse, Seedance2proVideoResponsePayload,
|
||||
};
|
||||
use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0::PlanSeedance2proSeedance2p0;
|
||||
use crate::utils::download_file::download_file;
|
||||
use seedance2pro::requests::generate_video::generate_video::{
|
||||
GenerateVideoArgs, generate_video,
|
||||
generate_video, GenerateVideoArgs,
|
||||
};
|
||||
use seedance2pro::requests::prepare_file_upload::prepare_file_upload::{
|
||||
PrepareFileUploadArgs, prepare_file_upload,
|
||||
prepare_file_upload, PrepareFileUploadArgs,
|
||||
};
|
||||
use seedance2pro::requests::upload_file::upload_file::{
|
||||
UploadFileArgs, upload_file,
|
||||
upload_file, UploadFileArgs,
|
||||
};
|
||||
use url_utils::extension::extract_extension_from_url::{
|
||||
extract_extension_from_url_str, ExtractExtensions,
|
||||
};
|
||||
|
||||
pub async fn execute_seedance2pro_seedance2p0(
|
||||
@@ -57,21 +61,19 @@ async fn upload_to_seedance2pro(
|
||||
session: &seedance2pro::creds::seedance2pro_session::Seedance2ProSession,
|
||||
source_url: &str,
|
||||
) -> Result<String, ArtcraftRouterError> {
|
||||
// Extract file extension from URL
|
||||
let extension = extract_extension(source_url).unwrap_or("bin");
|
||||
let extension = extract_extension_from_url_str(source_url, &ExtractExtensions::All)
|
||||
.map(|ext| ext.without_period().to_string())
|
||||
.unwrap_or_else(|| "jpg".to_string());
|
||||
|
||||
// Download the file
|
||||
let file_bytes = download_file(source_url).await?;
|
||||
|
||||
// Prepare the upload (get a signed URL)
|
||||
let prepare_response = prepare_file_upload(PrepareFileUploadArgs {
|
||||
session,
|
||||
extension: extension.to_string(),
|
||||
extension,
|
||||
})
|
||||
.await
|
||||
.map_err(|err| ArtcraftRouterError::Provider(ProviderError::Seedance2Pro(err)))?;
|
||||
|
||||
// Upload the file
|
||||
let upload_response = upload_file(UploadFileArgs {
|
||||
upload_url: prepare_response.upload_url,
|
||||
file_bytes,
|
||||
@@ -108,42 +110,3 @@ async fn upload_optional_url_list(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Download a file from a URL, returning its bytes.
|
||||
async fn download_file(url: &str) -> Result<Vec<u8>, ArtcraftRouterError> {
|
||||
let response = reqwest::get(url)
|
||||
.await
|
||||
.map_err(|err| ArtcraftRouterError::FileDownload(format!("Failed to download {}: {}", url, err)))?;
|
||||
|
||||
if !response.status().is_success() {
|
||||
return Err(ArtcraftRouterError::FileDownload(
|
||||
format!("Download failed for {} with status {}", url, response.status())
|
||||
));
|
||||
}
|
||||
|
||||
response.bytes()
|
||||
.await
|
||||
.map(|b| b.to_vec())
|
||||
.map_err(|err| ArtcraftRouterError::FileDownload(format!("Failed to read bytes from {}: {}", url, err)))
|
||||
}
|
||||
|
||||
/// Extract the file extension from a URL path, ignoring query parameters.
|
||||
fn extract_extension(url: &str) -> Option<&str> {
|
||||
let path = url.split('?').next().unwrap_or(url);
|
||||
let filename = path.rsplit('/').next()?;
|
||||
let dot_pos = filename.rfind('.')?;
|
||||
Some(&filename[dot_pos + 1..])
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_extract_extension() {
|
||||
assert_eq!(extract_extension("https://example.com/image.png"), Some("png"));
|
||||
assert_eq!(extract_extension("https://example.com/video.mp4?token=abc"), Some("mp4"));
|
||||
assert_eq!(extract_extension("https://example.com/path/to/file.jpg"), Some("jpg"));
|
||||
assert_eq!(extract_extension("https://example.com/noext"), None);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ pub mod api;
|
||||
pub mod client;
|
||||
pub mod errors;
|
||||
pub mod generate;
|
||||
pub mod utils;
|
||||
|
||||
#[cfg(test)]
|
||||
pub mod test_helpers;
|
||||
@@ -0,0 +1,19 @@
|
||||
use crate::errors::artcraft_router_error::ArtcraftRouterError;
|
||||
|
||||
/// Download a file from a URL, returning its bytes.
|
||||
pub async fn download_file(url: &str) -> Result<Vec<u8>, ArtcraftRouterError> {
|
||||
let response = reqwest::get(url)
|
||||
.await
|
||||
.map_err(|err| ArtcraftRouterError::FileDownload(format!("Failed to download {}: {}", url, err)))?;
|
||||
|
||||
if !response.status().is_success() {
|
||||
return Err(ArtcraftRouterError::FileDownload(
|
||||
format!("Download failed for {} with status {}", url, response.status())
|
||||
));
|
||||
}
|
||||
|
||||
response.bytes()
|
||||
.await
|
||||
.map(|b| b.to_vec())
|
||||
.map_err(|err| ArtcraftRouterError::FileDownload(format!("Failed to read bytes from {}: {}", url, err)))
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub mod download_file;
|
||||
@@ -228,4 +228,17 @@ mod tests {
|
||||
let ext = extract_extension_from_url_str(url, &ExtractExtensions::All);
|
||||
assert!(ext.is_none());
|
||||
}
|
||||
|
||||
fn extract_extension_all(url: &str) -> Option<String> {
|
||||
extract_extension_from_url_str(url, &ExtractExtensions::All)
|
||||
.map(|ext| ext.without_period().to_string())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extract_various_extensions() {
|
||||
assert_eq!(extract_extension_all("https://example.com/image.png").as_deref(), Some("png"));
|
||||
assert_eq!(extract_extension_all("https://example.com/video.mp4?token=abc").as_deref(), Some("mp4"));
|
||||
assert_eq!(extract_extension_all("https://example.com/path/to/file.jpg").as_deref(), Some("jpg"));
|
||||
assert_eq!(extract_extension_all("https://example.com/noext"), None);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user