Compare commits

...
Author SHA1 Message Date
Brandon Thomas 9e472656b2 store more metadata on spz uploads 2025-12-09 01:59:39 -05:00
2 changed files with 81 additions and 31 deletions
@@ -40,7 +40,6 @@ pub struct MediaFileInsertBuilder {
origin_product_category: MediaFileOriginProductCategory, // NB: Non-nullable field
// maybe_origin_model_type: Option<MediaFileOriginModelType>,
// maybe_origin_model_token: Option<&'a ModelWeightToken>,
// maybe_origin_filename: Option<String>,
// Media info
maybe_mime_type: Option<String>,
@@ -51,6 +50,10 @@ pub struct MediaFileInsertBuilder {
maybe_frame_width: Option<u32>,
maybe_frame_height: Option<u32>,
checksum_sha2: Option<String>, // NB: Non-nullable field
// File name
maybe_title: Option<String>,
maybe_origin_filename: Option<String>,
// Media info for certain product areas
maybe_engine_category: Option<MediaFileEngineCategory>, // TODO: Deprecate
@@ -100,6 +103,8 @@ impl MediaFileInsertBuilder {
maybe_frame_width: None,
maybe_frame_height: None,
checksum_sha2: None,
maybe_title: None,
maybe_origin_filename: None,
maybe_engine_category: None,
maybe_batch_generation_token: None,
public_bucket_directory_hash: None,
@@ -176,7 +181,6 @@ impl MediaFileInsertBuilder {
// TODO: Method for maybe_origin_model_type
// TODO: Method for maybe_origin_model_token
// TODO: Method for maybe_origin_filename
pub fn mime_type(mut self, mime_type: &str) -> Self {
self.maybe_mime_type = Some(mime_type.to_string());
@@ -226,7 +230,16 @@ impl MediaFileInsertBuilder {
self
}
// TODO: maybe_title
pub fn maybe_title(mut self, maybe_title: Option<&str>) -> Self {
self.maybe_title = maybe_title.map(|title| title.to_string());
self
}
pub fn maybe_origin_filename(mut self, maybe_origin_filename: Option<&str>) -> Self {
self.maybe_origin_filename = maybe_origin_filename.map(|s| s.to_string());
self
}
// TODO: maybe_text_transcript
// TODO: maybe_scene_source_media_file_token
// TODO: maybe_prompt_token
@@ -274,7 +287,7 @@ impl MediaFileInsertBuilder {
origin_product_category: self.origin_product_category,
maybe_origin_model_type: None, // TODO
maybe_origin_model_token: None, // TODO
maybe_origin_filename: None, // TODO
maybe_origin_filename: self.maybe_origin_filename,
maybe_mime_type: self.maybe_mime_type.as_deref(),
file_size_bytes: self.file_size_bytes,
maybe_duration_millis: self.maybe_duration_millis,
@@ -284,7 +297,7 @@ impl MediaFileInsertBuilder {
maybe_frame_height: self.maybe_frame_height,
maybe_engine_category: self.maybe_engine_category,
checksum_sha2: &checksum_sha2,
maybe_title: None, // TODO
maybe_title: self.maybe_title.as_deref(),
maybe_text_transcript: None, // TODO
maybe_scene_source_media_file_token: None, // TODO
maybe_prompt_token: self.maybe_prompt_token.as_ref(),
@@ -7,6 +7,7 @@ use log::{error, info, warn};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::media_files::media_file_class::MediaFileClass;
use enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums::by_table::media_files::media_file_type::MediaFileType;
use enums::common::visibility::Visibility;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
@@ -15,6 +16,7 @@ use media::decode_basic_audio_info::decode_basic_audio_bytes_info;
use mimetypes::mimetype_for_bytes::get_mimetype_for_bytes;
use mimetypes::mimetype_to_extension::mimetype_to_extension;
use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token;
use mysql_queries::queries::media_files::create::insert_builder::media_file_insert_builder::MediaFileInsertBuilder;
use mysql_queries::queries::media_files::create::specialized_insert::insert_media_file_from_file_upload::{insert_media_file_from_file_upload, InsertMediaFileFromUploadArgs, UploadType};
use tokens::tokens::media_files::MediaFileToken;
@@ -356,10 +358,23 @@ pub async fn process_upload_media_file(
MediaFileType::Bvh => Some(".bvh".to_string()),
MediaFileType::Fbx => Some(".fbx".to_string()),
MediaFileType::Gltf => Some(".gltf".to_string()),
MediaFileType::Spz => Some(".spz".to_string()),
_ => None,
};
}
// For WorldLabs spz files.
let is_world_labs_spz= upload_media_request.file_name
.as_deref()
.map(|filename| filename.trim().to_ascii_lowercase())
.filter(|filename| filename.contains("ceramic"))
.filter(|filename| filename.ends_with(".spz"))
.is_some();
if is_world_labs_spz {
extension = Some(".ceramic.spz".to_string());
}
const PREFIX : Option<&str> = Some("upload_");
let public_upload_path = MediaFileBucketPath::generate_new(PREFIX, extension.as_deref());
@@ -376,39 +391,61 @@ pub async fn process_upload_media_file(
MediaFileUploadError::ServerError
})?;
let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
maybe_media_class: Some(media_file_class),
media_file_type,
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility,
upload_type,
maybe_engine_category: None,
maybe_prompt_token: None,
maybe_batch_token: None,
maybe_animation_type: None,
maybe_mime_type: Some(mime_type),
file_size_bytes: file_size_bytes as u64,
maybe_duration_millis: None, // TODO: Fix this?
sha256_checksum: &hash,
maybe_title: upload_media_request.title.as_deref(),
maybe_scene_source_media_file_token: None,
is_intermediate_system_file: false, // NB: is_user_upload = TRUE
public_bucket_directory_hash: public_upload_path.get_object_hash(),
maybe_public_bucket_prefix: PREFIX,
maybe_public_bucket_extension: extension.as_deref(),
pool: &server_state.mysql_pool,
})
let media_token = MediaFileInsertBuilder::new()
.maybe_creator_user(maybe_user_token.as_ref())
.maybe_creator_anonymous_visitor(maybe_avt_token.as_ref())
.creator_ip_address(&ip_address)
.public_bucket_directory_hash(&public_upload_path)
.media_file_class(media_file_class)
.media_file_type(media_file_type)
.media_file_origin_category(MediaFileOriginCategory::Upload)
.creator_set_visibility(creator_set_visibility)
.mime_type(mime_type)
.file_size_bytes(file_size_bytes as u64)
.checksum_sha2(&hash)
.maybe_title(upload_media_request.title.as_deref())
.maybe_origin_filename(upload_media_request.file_name.as_deref())
.is_intermediate_system_file(false)
.insert_pool(&server_state.mysql_pool)
.await
.map_err(|err| {
warn!("New generic download creation DB error: {:?}", err);
MediaFileUploadError::ServerError
})?;
info!("new media file id: {} token: {:?}", record_id, &token);
//let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
// maybe_media_class: Some(media_file_class), // DONE
// media_file_type, // DONE
// maybe_creator_user_token: maybe_user_token.as_ref(), // DONE
// maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), // DONE
// creator_ip_address: &ip_address, // DONE
// creator_set_visibility, // DONE
// upload_type, // DONE - weird type
// maybe_engine_category: None, // DONE
// maybe_prompt_token: None, // DONE
// maybe_batch_token: None, // DONE
// maybe_animation_type: None, // DONE
// maybe_mime_type: Some(mime_type), // DONE
// file_size_bytes: file_size_bytes as u64, // DONE
// maybe_duration_millis: None, // TODO: Fix this? // DONE
// sha256_checksum: &hash, // DONE
// maybe_title: upload_media_request.title.as_deref(), // DONE
// maybe_scene_source_media_file_token: None, // DONE
// is_intermediate_system_file: false, // NB: is_user_upload = TRUE // DONE
// public_bucket_directory_hash: public_upload_path.get_object_hash(), // DONE
// maybe_public_bucket_prefix: PREFIX, // DONE
// maybe_public_bucket_extension: extension.as_deref(), // DONE
// pool: &server_state.mysql_pool,
//})
// .await
// .map_err(|err| {
// warn!("New generic download creation DB error: {:?}", err);
// MediaFileUploadError::ServerError
// })?;
info!("new media file - token: {:?}", &media_token);
Ok(SuccessCase::MediaSuccessfullyUploaded {
media_file_token: token,
media_file_token: media_token,
})
}