diff --git a/.sqlx/query-62f08d5f32bdc35e6faf43e3d21affa2dcf1501cda831cb88524bf1571d08e2f.json b/.sqlx/query-62f08d5f32bdc35e6faf43e3d21affa2dcf1501cda831cb88524bf1571d08e2f.json deleted file mode 100644 index c121d0f96e..0000000000 --- a/.sqlx/query-62f08d5f32bdc35e6faf43e3d21affa2dcf1501cda831cb88524bf1571d08e2f.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "MySQL", - "query": "\nUPDATE uploaded_videos\nSET\n maybe_width = ?,\n maybe_height = ?,\n maybe_resolution = ?,\n maybe_detected_model_family = ?,\n maybe_detected_model_type = ?,\n maybe_report = ?,\n maybe_updated_ip_address = ?,\n version = version + 1\nWHERE token = ?\nLIMIT 1\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 8 - }, - "nullable": [] - }, - "hash": "62f08d5f32bdc35e6faf43e3d21affa2dcf1501cda831cb88524bf1571d08e2f" -} diff --git a/.sqlx/query-64efd175fa4eb751be1125d55de93ed66a9fc6582e36cec4fc8225c350ec51e2.json b/.sqlx/query-64efd175fa4eb751be1125d55de93ed66a9fc6582e36cec4fc8225c350ec51e2.json deleted file mode 100644 index 878a306dd3..0000000000 --- a/.sqlx/query-64efd175fa4eb751be1125d55de93ed66a9fc6582e36cec4fc8225c350ec51e2.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "MySQL", - "query": "\nINSERT INTO uploaded_videos\nSET\n token = ?,\n sha1_checksum = ?,\n filesize_bytes = ?,\n maybe_width = ?,\n maybe_height = ?,\n maybe_resolution = ?,\n maybe_detected_model_family = ?,\n maybe_detected_model_type = ?,\n maybe_report = ?,\n upload_ip_address = ?,\n created_at = NOW()\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 10 - }, - "nullable": [] - }, - "hash": "64efd175fa4eb751be1125d55de93ed66a9fc6582e36cec4fc8225c350ec51e2" -} diff --git a/crates/schema/database/mysql_queries/src/queries/uploaded_videos/insert_uploaded_video.rs b/crates/schema/database/mysql_queries/src/queries/uploaded_videos/insert_uploaded_video.rs index 44caaf85a6..29b9f0ad15 100644 --- a/crates/schema/database/mysql_queries/src/queries/uploaded_videos/insert_uploaded_video.rs +++ b/crates/schema/database/mysql_queries/src/queries/uploaded_videos/insert_uploaded_video.rs @@ -12,6 +12,7 @@ where { pub sha1_checksum: &'e str, pub filesize_bytes: u32, + pub maybe_filename: Option<&'e str>, pub maybe_width: Option, pub maybe_height: Option, @@ -45,6 +46,7 @@ SET token = ?, sha1_checksum = ?, filesize_bytes = ?, + maybe_filename = ?, maybe_width = ?, maybe_height = ?, maybe_resolution = ?, @@ -57,6 +59,7 @@ SET token.as_str(), args.sha1_checksum, args.filesize_bytes, + args.maybe_filename, args.maybe_width, args.maybe_height, args.maybe_resolution, diff --git a/crates/schema/database/mysql_queries/src/queries/uploaded_videos/update_uploaded_video.rs b/crates/schema/database/mysql_queries/src/queries/uploaded_videos/update_uploaded_video.rs index 66be037508..d194d94ddc 100644 --- a/crates/schema/database/mysql_queries/src/queries/uploaded_videos/update_uploaded_video.rs +++ b/crates/schema/database/mysql_queries/src/queries/uploaded_videos/update_uploaded_video.rs @@ -12,6 +12,8 @@ where { pub token: &'e UploadedVideoToken, + pub maybe_filename: Option<&'e str>, + pub maybe_width: Option, pub maybe_height: Option, pub maybe_resolution: Option<&'e str>, @@ -41,6 +43,7 @@ where r#" UPDATE uploaded_videos SET + maybe_filename = ?, maybe_width = ?, maybe_height = ?, maybe_resolution = ?, @@ -52,6 +55,7 @@ SET WHERE token = ? LIMIT 1 "#, + args.maybe_filename, args.maybe_width, args.maybe_height, args.maybe_resolution, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/video_info/video_info_upload_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/video_info/video_info_upload_handler.rs index 893d2126d0..7268f2530a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/video_info/video_info_upload_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/video_info/video_info_upload_handler.rs @@ -10,6 +10,7 @@ use std::marker::PhantomData; use std::sync::Arc; use actix_multipart::form::tempfile::TempFile; +use actix_multipart::form::text::Text; use actix_multipart::form::MultipartForm; use actix_web::web::Json; use actix_web::{web, HttpRequest}; @@ -47,6 +48,11 @@ pub struct VideoInfoUploadForm { #[multipart(limit = "256 MiB")] #[schema(value_type = Vec, format = Binary)] file: TempFile, + + /// Optional filename to record. Falls back to the uploaded file's own name. + #[multipart(limit = "2 KiB")] + #[schema(value_type = Option, format = Binary)] + maybe_filename: Option>, } /// Detect a video's AI-generation provenance and persist the result. @@ -90,6 +96,16 @@ pub async fn video_info_upload_handler( let filesize_bytes = bytes.len().min(u32::MAX as usize) as u32; let ip_address = get_request_ip(&http_request); + // Prefer an explicit `maybe_filename` field; otherwise use the uploaded file's + // own name. Trimmed; empty becomes absent. + let maybe_filename = form + .maybe_filename + .as_ref() + .map(|filename| filename.as_str().to_string()) + .or_else(|| form.file.file_name.clone()) + .map(|filename| filename.trim().to_string()) + .filter(|filename| !filename.is_empty()); + let sha1_checksum = sha1_hash_bytes_as_crockford(&bytes).map_err(CommonWebError::from_error)?; @@ -154,6 +170,7 @@ pub async fn video_info_upload_handler( Some(existing) => { update_uploaded_video(UpdateUploadedVideoArgs { token: &existing.token, + maybe_filename: maybe_filename.as_deref(), maybe_width, maybe_height, maybe_resolution: maybe_resolution.as_deref(), @@ -171,6 +188,7 @@ pub async fn video_info_upload_handler( insert_uploaded_video(InsertUploadedVideoArgs { sha1_checksum: &sha1_checksum, filesize_bytes, + maybe_filename: maybe_filename.as_deref(), maybe_width, maybe_height, maybe_resolution: maybe_resolution.as_deref(),