diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic.rs index 7b1970dd5a..4b68b2d1f3 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic.rs @@ -14,6 +14,7 @@ use enums::common::visibility::Visibility; use errors::AnyhowResult; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::batch_generations::BatchGenerationToken; +use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::model_weights::ModelWeightToken; use tokens::tokens::prompts::PromptToken; @@ -71,6 +72,9 @@ pub struct InsertArgs<'a> { // If batch generated, this is the batch token. pub maybe_batch_token: Option<&'a BatchGenerationToken>, + // If produced by an inference job, the job that generated this file. + pub maybe_source_job_token: Option<&'a InferenceJobToken>, + // Storage details pub public_bucket_directory_hash: &'a str, pub maybe_public_bucket_prefix: Option<&'a str>, @@ -165,6 +169,7 @@ pub async fn insert_media_file_generic( maybe_scene_source_media_file_token: args.maybe_scene_source_media_file_token, maybe_prompt_token: args.maybe_prompt_token, maybe_batch_token: args.maybe_batch_token, + maybe_source_job_token: args.maybe_source_job_token, public_bucket_directory_hash: args.public_bucket_directory_hash, maybe_public_bucket_prefix: args.maybe_public_bucket_prefix, maybe_public_bucket_extension: args.maybe_public_bucket_extension, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_executor.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_executor.rs index 720197dbe6..299a0c75be 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_executor.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_executor.rs @@ -14,6 +14,7 @@ use enums::common::platform_type::PlatformType; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::batch_generations::BatchGenerationToken; +use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::model_weights::ModelWeightToken; use tokens::tokens::prompts::PromptToken; @@ -74,6 +75,9 @@ where // If batch generated, this is the batch token. pub maybe_batch_token: Option<&'a BatchGenerationToken>, + // If produced by an inference job, the job that generated this file. + pub maybe_source_job_token: Option<&'a InferenceJobToken>, + // Storage details pub public_bucket_directory_hash: &'a str, pub maybe_public_bucket_prefix: Option<&'a str>, @@ -159,6 +163,7 @@ where maybe_origin_filename = ?, maybe_batch_token = ?, + maybe_source_job_token = ?, maybe_mime_type = ?, file_size_bytes = ?, @@ -218,6 +223,7 @@ where args.maybe_origin_filename, args.maybe_batch_token.map(|t| t.as_str()), + args.maybe_source_job_token.map(|t| t.as_str()), args.maybe_mime_type, args.file_size_bytes, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_from_job.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_from_job.rs index c1c3cf1f58..dea821fdc2 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_from_job.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/generic_insert/insert_media_file_generic_from_job.rs @@ -99,6 +99,7 @@ pub async fn insert_media_file_generic_from_job( is_user_upload: false, // NB: Jobs typically won't be user uploads. Maybe this becomes a param in the future(?) maybe_audio_encoding: args.maybe_audio_encoding, maybe_batch_token: args.maybe_batch_token, + maybe_source_job_token: Some(&args.job.inference_job_token), maybe_creator_anonymous_visitor_token: args.job.maybe_creator_anonymous_visitor_token_typed.as_ref(), maybe_creator_category_synthetic_id_category: args.maybe_creator_category_synthetic_id_category, maybe_creator_file_synthetic_id_category: args.maybe_creator_file_synthetic_id_category, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_builder/media_file_insert_builder.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_builder/media_file_insert_builder.rs index 5d11884ed1..59ef1b8704 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_builder/media_file_insert_builder.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_builder/media_file_insert_builder.rs @@ -13,6 +13,7 @@ use enums::common::generation_provider::GenerationProvider; use enums::common::platform_type::PlatformType; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::batch_generations::BatchGenerationToken; +use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; @@ -75,6 +76,9 @@ pub struct MediaFileInsertBuilder { // // If batch generated, this is the batch token. maybe_batch_generation_token: Option, + // If produced by an inference job, the job that generated this file. + maybe_source_job_token: Option, + // Cover image (e.g. thumbnail for 3D splats) maybe_cover_image_media_file_token: Option, @@ -117,6 +121,7 @@ impl MediaFileInsertBuilder { maybe_origin_filename: None, maybe_engine_category: None, maybe_batch_generation_token: None, + maybe_source_job_token: None, maybe_cover_image_media_file_token: None, public_bucket_directory_hash: None, maybe_prompt_token: None, @@ -263,6 +268,11 @@ impl MediaFileInsertBuilder { self } + pub fn maybe_source_job_token(mut self, maybe_job_token: Option<&InferenceJobToken>) -> Self { + self.maybe_source_job_token = maybe_job_token.cloned(); + self + } + pub fn maybe_cover_image_media_file_token(mut self, maybe_token: Option<&MediaFileToken>) -> Self { self.maybe_cover_image_media_file_token = maybe_token.cloned(); self @@ -348,6 +358,7 @@ impl MediaFileInsertBuilder { maybe_scene_source_media_file_token: None, // TODO maybe_prompt_token: self.maybe_prompt_token.as_ref(), maybe_batch_token: self.maybe_batch_generation_token.as_ref(), + maybe_source_job_token: self.maybe_source_job_token.as_ref(), public_bucket_directory_hash: bucket_path.get_object_hash(), maybe_public_bucket_prefix: bucket_path.get_optional_prefix(), maybe_public_bucket_extension: bucket_path.get_optional_extension(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_media_file_from_studio_scene_render.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_media_file_from_studio_scene_render.rs index 9f616a8d99..32c12523e7 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_media_file_from_studio_scene_render.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/insert_media_file_from_studio_scene_render.rs @@ -108,6 +108,7 @@ pub async fn insert_media_file_from_studio_scene_render( maybe_text_transcript: None, maybe_origin_filename: None, maybe_batch_token: None, + maybe_source_job_token: None, // NB: Studio renders are client-side, not job outputs. maybe_prompt_token: None, maybe_mod_user_token: None, maybe_engine_category: None, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_cover_media_file.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_cover_media_file.rs index 78b01c05c7..8ec8d3b36a 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_cover_media_file.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_cover_media_file.rs @@ -12,6 +12,7 @@ use enums::common::platform_type::PlatformType; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::media_files::MediaFileToken; +use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; @@ -39,6 +40,9 @@ where pub maybe_prompt_token: Option<&'a PromptToken>, pub maybe_platform_type: Option, + /// The generation job the cover belongs to. + pub maybe_source_job_token: Option<&'a InferenceJobToken>, + pub mysql_executor: E, pub phantom: PhantomData<&'c E>, } @@ -95,6 +99,7 @@ where is_user_upload: false, maybe_audio_encoding: None, maybe_batch_token: None, + maybe_source_job_token: args.maybe_source_job_token, maybe_cover_image_media_file_token: None, maybe_creator_category_synthetic_id: None, maybe_creator_file_synthetic_id: None, diff --git a/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_image_job.rs b/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_image_job.rs index 9eee89cfb5..d85593c009 100644 --- a/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_image_job.rs +++ b/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_image_job.rs @@ -228,6 +228,7 @@ async fn download_and_store_one_image( .maybe_frame_width(result.maybe_width) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Image) .media_file_origin_category(MediaFileOriginCategory::Inference) diff --git a/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_video_job.rs b/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_video_job.rs index 360b0649ad..50c2107ba4 100644 --- a/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_video_job.rs +++ b/crates/service/job/seedance2_pro_job/src/jobs/order_processing_job/process_successful_video_job.rs @@ -134,6 +134,7 @@ pub async fn process_successful_video_job( .maybe_frame_width(maybe_frame_width) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Video) .media_file_origin_category(MediaFileOriginCategory::Inference) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/beeble/beeble_webhook_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/beeble/beeble_webhook_handler.rs index d4263ca251..6239cc7627 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/beeble/beeble_webhook_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/beeble/beeble_webhook_handler.rs @@ -375,6 +375,7 @@ async fn download_and_upload_video( .maybe_frame_width(maybe_frame_width) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Video) .media_file_origin_category(MediaFileOriginCategory::Inference) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/attach_cover_image.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/attach_cover_image.rs index 859cb62cd1..29de3b44c6 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/attach_cover_image.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/attach_cover_image.rs @@ -128,6 +128,7 @@ pub(crate) async fn attach_cover_image( public_bucket_path: &public_upload_path, maybe_origin_product_category, maybe_prompt_token: job.maybe_prompt_token.as_ref(), + maybe_source_job_token: Some(&job.job_token), maybe_platform_type: job.maybe_platform_type, mysql_executor: &server_state.mysql_pool, phantom: Default::default(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_audio_payload.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_audio_payload.rs index 7f4a2753f3..9ddac3e155 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_audio_payload.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_audio_payload.rs @@ -113,6 +113,7 @@ pub async fn process_audio_payload( .maybe_duration_millis(maybe_duration_millis) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Audio) .media_file_origin_category(MediaFileOriginCategory::Inference) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_image_payload.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_image_payload.rs index d83572a6cc..dc03386bb7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_image_payload.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_image_payload.rs @@ -162,6 +162,7 @@ async fn upload_single_image_bytes( .maybe_creator_user(job.maybe_creator_user_token.as_ref()) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Image) .media_file_origin_category(MediaFileOriginCategory::Inference) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_images_payload.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_images_payload.rs index 8c4d756116..16498467d3 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_images_payload.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_images_payload.rs @@ -247,6 +247,7 @@ async fn upload_image_bytes( .maybe_creator_user(job.maybe_creator_user_token.as_ref()) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Image) .media_file_origin_category(MediaFileOriginCategory::Inference) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_model_mesh_payload.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_model_mesh_payload.rs index 29226999a2..e158e04471 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_model_mesh_payload.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_model_mesh_payload.rs @@ -211,6 +211,7 @@ pub(crate) async fn upload_mesh_file( .maybe_creator_user(job.maybe_creator_user_token.as_ref()) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_origin_category(MediaFileOriginCategory::Inference) .media_file_type(media_file_type) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_video_payload.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_video_payload.rs index 0ad1022701..ccb675b66e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_video_payload.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal/process_success/process_video_payload.rs @@ -137,6 +137,7 @@ pub async fn process_video_payload( .maybe_frame_width(maybe_frame_width) .maybe_generation_provider(Some(GenerationProvider::Artcraft)) .maybe_prompt_token(job.maybe_prompt_token.as_ref()) + .maybe_source_job_token(Some(&job.job_token)) .maybe_platform_type(job.maybe_platform_type) .media_file_class(MediaFileClass::Video) .media_file_origin_category(MediaFileOriginCategory::Inference)