From 1d5d63fda13bb91bdef99ca5e24dd1eb033cf3d8 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Wed, 8 Jul 2026 21:41:45 -0400 Subject: [PATCH] media files: stop reading and writing deprecated fields and values (#1758) --- ...0828208e497e68560246e588092bafd03eb59.json | 12 + ...4ddae9a60a2177369c58046abdee9ad1e91ee.json | 12 + ...7812944c61941964bb53815d31dc30d506be8.json | 12 - ...248a5b44499038c71b57fc9ea6c4722d170f.json} | 97 ++--- ...ead63727107dfce3366f3c1d12bc9d565c2c.json} | 97 ++--- ...c043bf1df4033463e5c5a18468c04af391e6a.json | 12 - .../endpoints/media_files/get_media_file.rs | 5 - .../src/seeding/media_files.rs | 2 +- .../src/seeding/seed_media_files.rs | 44 +- .../devenv/dev-upload-media-file/src/main.rs | 4 +- ...create_dimensional_media_file_documents.rs | 1 - .../grok_video_task_polling_thread.rs | 1 - .../threads/midjourney_long_polling_thread.rs | 1 - .../threads/worldlabs_marble_task_polling.rs | 1 - .../src/documents/media_file_document.rs | 2 - .../insert_media_file_generic.rs | 4 - .../insert_media_file_from_comfy_ui.rs | 6 +- .../insert_media_file_from_f5_tts.rs | 6 +- .../insert_media_file_from_face_animation.rs | 6 +- .../insert_media_file_from_rerender.rs | 6 +- .../insert_media_file_from_seed_vc.rs | 6 +- .../insert_media_file_from_studio_gen2.rs | 6 +- .../insert_media_file_from_tacotron2.rs | 6 +- ...insert_media_file_from_voice_conversion.rs | 6 +- .../insert_media_file_from_zero_shot_tts.rs | 6 +- .../media_files/get/batch_get_media_files.rs | 6 - .../queries/media_files/get/get_media_file.rs | 10 - ...or_elastic_search_backfill_using_cursor.rs | 20 - .../upsert_media_file_from_file_upload.rs | 9 - .../list_user_bookmarks_result.rs | 9 + .../by_table/media_files/media_file_type.rs | 385 +++++++++++++++++- .../update_engine_media_files.rs | 1 - .../sd/process_job_inference.rs | 9 +- .../process_job.rs | 4 +- .../web/storyteller_web/src/docs/api_doc.rs | 2 - .../engine/process_upload_media_file.rs | 23 +- .../upload_snapshot_media_file_handler.rs | 12 +- .../set_media_file_cover_image_handler.rs | 4 +- .../get/batch_get_media_files_handler.rs | 7 - .../media_files/get/get_media_file_handler.rs | 9 - .../upload/upload_audio_media_file_handler.rs | 6 +- .../process_upload_media_file.rs | 49 +-- .../upload/upload_image_media_file_handler.rs | 12 +- ...oad_new_engine_asset_media_file_handler.rs | 6 +- .../upload_new_video_media_file_handler.rs | 6 +- .../upload_video_media_file_handler.rs | 3 +- .../write_engine_asset_media_file_handler.rs | 1 - .../write_scene_file_media_file_handler.rs | 1 - .../media_uploads/upload_url_to_media_file.rs | 17 +- .../omni_upload_audio_media_file_handler.rs | 6 +- .../omni_upload_image_media_file_handler.rs | 12 +- .../omni_upload_video_media_file_handler.rs | 6 +- .../set_model_weight_cover_image_handler.rs | 4 +- .../weights/update/update_weight_handler.rs | 2 +- .../Classes/ApiManager/MediaFileApi.test.ts | 1 - .../libs/api/src/lib/enums/MediaFileType.ts | 25 -- frontend/libs/api/src/lib/models/MediaFile.ts | 3 +- .../libs/components/pagescene/src/index.ts | 1 - .../pagescene/src/lib/enums/MediaFileType.ts | 25 -- .../pagescene/src/lib/models/mediaInfo.ts | 2 - .../pagescene/src/lib/models/types.tsx | 2 - 61 files changed, 630 insertions(+), 431 deletions(-) create mode 100644 .sqlx/query-1c74e9c2dcc9205e2c9fe60a6de0828208e497e68560246e588092bafd03eb59.json create mode 100644 .sqlx/query-3af0a10ab0ed65daba9363605db4ddae9a60a2177369c58046abdee9ad1e91ee.json delete mode 100644 .sqlx/query-55706e6ac35be221b9d9c6e8b247812944c61941964bb53815d31dc30d506be8.json rename .sqlx/{query-f6c37066ab3e508050e81cf3bea38cc708b05c5c59ba1c322dcfb775e4b9e7a6.json => query-784ca68c6cb61d481b605bfe6ee3248a5b44499038c71b57fc9ea6c4722d170f.json} (74%) rename .sqlx/{query-57fa22e6cd4e82b801605c96eac21babd78df3df361b3be566993b78a46efef2.json => query-ad217c26087b2ebed6f2c9f79b16ead63727107dfce3366f3c1d12bc9d565c2c.json} (74%) delete mode 100644 .sqlx/query-ad2ffbd9f48e52678a5c61817bec043bf1df4033463e5c5a18468c04af391e6a.json diff --git a/.sqlx/query-1c74e9c2dcc9205e2c9fe60a6de0828208e497e68560246e588092bafd03eb59.json b/.sqlx/query-1c74e9c2dcc9205e2c9fe60a6de0828208e497e68560246e588092bafd03eb59.json new file mode 100644 index 0000000000..3a1f4df42b --- /dev/null +++ b/.sqlx/query-1c74e9c2dcc9205e2c9fe60a6de0828208e497e68560246e588092bafd03eb59.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "\n INSERT INTO media_files\n SET\n token = ?,\n\n media_class = ?,\n media_type = ?,\n\n is_user_upload = ?,\n is_intermediate_system_file = ?,\n\n origin_category = ?, \n origin_product_category = ?, \n maybe_origin_model_type = ?, \n maybe_origin_model_token = ?, \n maybe_origin_filename = ?,\n\n maybe_batch_token = ?,\n\n maybe_mime_type = ?,\n file_size_bytes = ?,\n maybe_duration_millis = ?,\n maybe_audio_encoding = ?, \n maybe_video_encoding = ?, \n maybe_frame_width = ?, \n maybe_frame_height = ?,\n maybe_prompt_token = ?,\n checksum_sha2 = ?,\n \n maybe_engine_category = ?,\n\n maybe_title = ?,\n maybe_text_transcript = ?,\n\n maybe_scene_source_media_file_token = ?,\n\n public_bucket_directory_hash = ?, \n maybe_public_bucket_prefix = ?, \n maybe_public_bucket_extension = ?, \n\n maybe_creator_user_token = ?, \n maybe_creator_anonymous_visitor_token = ?, \n\n creator_ip_address = ?, \n creator_set_visibility = ?, \n\n maybe_creator_file_synthetic_id = ?, \n maybe_creator_category_synthetic_id = ?,\n\n extra_file_modification_info = ?,\n\n maybe_generation_provider = ?,\n\n platform_type = ?,\n\n maybe_cover_image_media_file_token = ?,\n\n maybe_mod_user_token = ?,\n is_generated_on_prem = ?,\n generated_by_worker = ?,\n generated_by_cluster = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 41 + }, + "nullable": [] + }, + "hash": "1c74e9c2dcc9205e2c9fe60a6de0828208e497e68560246e588092bafd03eb59" +} diff --git a/.sqlx/query-3af0a10ab0ed65daba9363605db4ddae9a60a2177369c58046abdee9ad1e91ee.json b/.sqlx/query-3af0a10ab0ed65daba9363605db4ddae9a60a2177369c58046abdee9ad1e91ee.json new file mode 100644 index 0000000000..01461052db --- /dev/null +++ b/.sqlx/query-3af0a10ab0ed65daba9363605db4ddae9a60a2177369c58046abdee9ad1e91ee.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "\nINSERT INTO media_files\nSET\n token = ?,\n\n media_class = ?,\n media_type = ?,\n\n origin_category = ?,\n origin_product_category = ?,\n\n maybe_engine_category = ?,\n maybe_animation_type = ?,\n\n maybe_mime_type = ?,\n file_size_bytes = ?,\n\n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n\n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n\n is_user_upload = TRUE,\n\n maybe_origin_model_type = NULL,\n maybe_origin_model_token = NULL\n\nON DUPLICATE KEY UPDATE\n\n media_class = ?,\n media_type = ?,\n\n origin_category = ?,\n origin_product_category = ?,\n\n maybe_engine_category = ?,\n maybe_animation_type = ?,\n\n maybe_mime_type = ?,\n file_size_bytes = ?,\n\n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n\n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n\n is_user_upload = TRUE,\n\n maybe_origin_model_type = NULL,\n maybe_origin_model_token = NULL\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 37 + }, + "nullable": [] + }, + "hash": "3af0a10ab0ed65daba9363605db4ddae9a60a2177369c58046abdee9ad1e91ee" +} diff --git a/.sqlx/query-55706e6ac35be221b9d9c6e8b247812944c61941964bb53815d31dc30d506be8.json b/.sqlx/query-55706e6ac35be221b9d9c6e8b247812944c61941964bb53815d31dc30d506be8.json deleted file mode 100644 index 60445c9036..0000000000 --- a/.sqlx/query-55706e6ac35be221b9d9c6e8b247812944c61941964bb53815d31dc30d506be8.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "MySQL", - "query": "\nINSERT INTO media_files\nSET\n token = ?,\n\n media_class = ?,\n media_type = ?,\n\n origin_category = ?,\n origin_product_category = ?,\n\n maybe_engine_category = ?,\n maybe_animation_type = ?,\n\n maybe_media_subtype = ?,\n maybe_mime_type = ?,\n file_size_bytes = ?,\n\n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n\n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n\n is_user_upload = TRUE,\n\n maybe_origin_model_type = NULL,\n maybe_origin_model_token = NULL\n\nON DUPLICATE KEY UPDATE\n\n media_class = ?,\n media_type = ?,\n\n origin_category = ?,\n origin_product_category = ?,\n\n maybe_engine_category = ?,\n maybe_animation_type = ?,\n\n maybe_media_subtype = ?,\n maybe_mime_type = ?,\n file_size_bytes = ?,\n\n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n\n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n\n is_user_upload = TRUE,\n\n maybe_origin_model_type = NULL,\n maybe_origin_model_token = NULL\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 39 - }, - "nullable": [] - }, - "hash": "55706e6ac35be221b9d9c6e8b247812944c61941964bb53815d31dc30d506be8" -} diff --git a/.sqlx/query-f6c37066ab3e508050e81cf3bea38cc708b05c5c59ba1c322dcfb775e4b9e7a6.json b/.sqlx/query-784ca68c6cb61d481b605bfe6ee3248a5b44499038c71b57fc9ea6c4722d170f.json similarity index 74% rename from .sqlx/query-f6c37066ab3e508050e81cf3bea38cc708b05c5c59ba1c322dcfb775e4b9e7a6.json rename to .sqlx/query-784ca68c6cb61d481b605bfe6ee3248a5b44499038c71b57fc9ea6c4722d170f.json index edb44c109f..c7961faa35 100644 --- a/.sqlx/query-f6c37066ab3e508050e81cf3bea38cc708b05c5c59ba1c322dcfb775e4b9e7a6.json +++ b/.sqlx/query-784ca68c6cb61d481b605bfe6ee3248a5b44499038c71b57fc9ea6c4722d170f.json @@ -1,6 +1,6 @@ { "db_name": "MySQL", - "query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_class as `media_class: enums::by_table::media_files::media_file_class::MediaFileClass`,\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n m.maybe_engine_category as `maybe_engine_category: enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory`,\n m.maybe_animation_type as `maybe_animation_type: enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType`,\n\n m.maybe_media_subtype as `maybe_media_subtype: enums::by_table::media_files::media_file_subtype::MediaFileSubtype`,\n\n m.maybe_mime_type,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n\n m.maybe_batch_token as `maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken`,\n\n m.maybe_style_transfer_source_media_file_token as `maybe_style_transfer_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n m.maybe_scene_source_media_file_token as `maybe_scene_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n\n m.maybe_title,\n m.maybe_text_transcript,\n\n m.maybe_origin_filename,\n\n m.maybe_duration_millis,\n\n m.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n prompts.maybe_other_args as maybe_other_prompt_args,\n\n media_file_cover_image.public_bucket_directory_hash as maybe_file_cover_image_public_bucket_hash,\n media_file_cover_image.maybe_public_bucket_prefix as maybe_file_cover_image_public_bucket_prefix,\n media_file_cover_image.maybe_public_bucket_extension as maybe_file_cover_image_public_bucket_extension,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n m.is_user_upload,\n m.is_intermediate_system_file,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n model_weight_cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n model_weight_cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n model_weight_cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.extra_file_modification_info,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n featured_items.entity_token IS NOT NULL AS is_featured,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as media_file_cover_image\n ON media_file_cover_image.token = m.maybe_cover_image_media_file_token\nLEFT OUTER JOIN media_files as model_weight_cover_image\n ON model_weight_cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nLEFT OUTER JOIN prompts\n ON prompts.token = m.maybe_prompt_token\nLEFT OUTER JOIN featured_items\n ON featured_items.entity_type = 'media_file'\n AND featured_items.entity_token = m.token\n AND featured_items.deleted_at IS NULL\nWHERE\n m.token = ?\n ", + "query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_class as `media_class: enums::by_table::media_files::media_file_class::MediaFileClass`,\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n m.maybe_engine_category as `maybe_engine_category: enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory`,\n m.maybe_animation_type as `maybe_animation_type: enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType`,\n\n m.maybe_mime_type,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n\n m.maybe_batch_token as `maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken`,\n\n m.maybe_style_transfer_source_media_file_token as `maybe_style_transfer_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n m.maybe_scene_source_media_file_token as `maybe_scene_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n\n m.maybe_title,\n m.maybe_text_transcript,\n\n m.maybe_origin_filename,\n\n m.maybe_duration_millis,\n\n m.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n prompts.maybe_other_args as maybe_other_prompt_args,\n\n media_file_cover_image.public_bucket_directory_hash as maybe_file_cover_image_public_bucket_hash,\n media_file_cover_image.maybe_public_bucket_prefix as maybe_file_cover_image_public_bucket_prefix,\n media_file_cover_image.maybe_public_bucket_extension as maybe_file_cover_image_public_bucket_extension,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n m.is_user_upload,\n m.is_intermediate_system_file,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n model_weight_cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n model_weight_cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n model_weight_cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.extra_file_modification_info,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n featured_items.entity_token IS NOT NULL AS is_featured,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as media_file_cover_image\n ON media_file_cover_image.token = m.maybe_cover_image_media_file_token\nLEFT OUTER JOIN media_files as model_weight_cover_image\n ON model_weight_cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nLEFT OUTER JOIN prompts\n ON prompts.token = m.maybe_prompt_token\nLEFT OUTER JOIN featured_items\n ON featured_items.entity_type = 'media_file'\n AND featured_items.entity_token = m.token\n AND featured_items.deleted_at IS NULL\nWHERE\n m.token = ?\n ", "describe": { "columns": [ { @@ -55,16 +55,6 @@ }, { "ordinal": 5, - "name": "maybe_media_subtype: enums::by_table::media_files::media_file_subtype::MediaFileSubtype", - "type_info": { - "type": "VarString", - "flags": "BINARY", - "char_set": 224, - "max_size": 128 - } - }, - { - "ordinal": 6, "name": "maybe_mime_type", "type_info": { "type": "VarString", @@ -74,7 +64,7 @@ } }, { - "ordinal": 7, + "ordinal": 6, "name": "maybe_creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", @@ -84,7 +74,7 @@ } }, { - "ordinal": 8, + "ordinal": 7, "name": "maybe_creator_username", "type_info": { "type": "VarString", @@ -94,7 +84,7 @@ } }, { - "ordinal": 9, + "ordinal": 8, "name": "maybe_creator_display_name", "type_info": { "type": "VarString", @@ -104,7 +94,7 @@ } }, { - "ordinal": 10, + "ordinal": 9, "name": "maybe_creator_gravatar_hash", "type_info": { "type": "String", @@ -114,7 +104,7 @@ } }, { - "ordinal": 11, + "ordinal": 10, "name": "maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken", "type_info": { "type": "VarString", @@ -124,7 +114,7 @@ } }, { - "ordinal": 12, + "ordinal": 11, "name": "maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken", "type_info": { "type": "VarString", @@ -134,7 +124,7 @@ } }, { - "ordinal": 13, + "ordinal": 12, "name": "maybe_style_transfer_source_media_file_token: tokens::tokens::media_files::MediaFileToken", "type_info": { "type": "VarString", @@ -144,7 +134,7 @@ } }, { - "ordinal": 14, + "ordinal": 13, "name": "maybe_scene_source_media_file_token: tokens::tokens::media_files::MediaFileToken", "type_info": { "type": "VarString", @@ -154,7 +144,7 @@ } }, { - "ordinal": 15, + "ordinal": 14, "name": "maybe_title", "type_info": { "type": "VarString", @@ -164,7 +154,7 @@ } }, { - "ordinal": 16, + "ordinal": 15, "name": "maybe_text_transcript", "type_info": { "type": "Blob", @@ -174,7 +164,7 @@ } }, { - "ordinal": 17, + "ordinal": 16, "name": "maybe_origin_filename", "type_info": { "type": "VarString", @@ -184,7 +174,7 @@ } }, { - "ordinal": 18, + "ordinal": 17, "name": "maybe_duration_millis", "type_info": { "type": "Long", @@ -194,7 +184,7 @@ } }, { - "ordinal": 19, + "ordinal": 18, "name": "maybe_prompt_token: tokens::tokens::prompts::PromptToken", "type_info": { "type": "VarString", @@ -204,7 +194,7 @@ } }, { - "ordinal": 20, + "ordinal": 19, "name": "maybe_other_prompt_args", "type_info": { "type": "Blob", @@ -214,7 +204,7 @@ } }, { - "ordinal": 21, + "ordinal": 20, "name": "maybe_file_cover_image_public_bucket_hash", "type_info": { "type": "VarString", @@ -224,7 +214,7 @@ } }, { - "ordinal": 22, + "ordinal": 21, "name": "maybe_file_cover_image_public_bucket_prefix", "type_info": { "type": "VarString", @@ -234,7 +224,7 @@ } }, { - "ordinal": 23, + "ordinal": 22, "name": "maybe_file_cover_image_public_bucket_extension", "type_info": { "type": "VarString", @@ -244,7 +234,7 @@ } }, { - "ordinal": 24, + "ordinal": 23, "name": "creator_set_visibility: enums::common::visibility::Visibility", "type_info": { "type": "String", @@ -254,7 +244,7 @@ } }, { - "ordinal": 25, + "ordinal": 24, "name": "is_user_upload", "type_info": { "type": "Tiny", @@ -264,7 +254,7 @@ } }, { - "ordinal": 26, + "ordinal": 25, "name": "is_intermediate_system_file", "type_info": { "type": "Tiny", @@ -274,7 +264,7 @@ } }, { - "ordinal": 27, + "ordinal": 26, "name": "maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken", "type_info": { "type": "VarString", @@ -284,7 +274,7 @@ } }, { - "ordinal": 28, + "ordinal": 27, "name": "maybe_model_weights_title", "type_info": { "type": "VarString", @@ -294,7 +284,7 @@ } }, { - "ordinal": 29, + "ordinal": 28, "name": "maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType", "type_info": { "type": "VarString", @@ -304,7 +294,7 @@ } }, { - "ordinal": 30, + "ordinal": 29, "name": "maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory", "type_info": { "type": "VarString", @@ -314,7 +304,7 @@ } }, { - "ordinal": 31, + "ordinal": 30, "name": "maybe_model_cover_image_public_bucket_hash", "type_info": { "type": "VarString", @@ -324,7 +314,7 @@ } }, { - "ordinal": 32, + "ordinal": 31, "name": "maybe_model_cover_image_public_bucket_prefix", "type_info": { "type": "VarString", @@ -334,7 +324,7 @@ } }, { - "ordinal": 33, + "ordinal": 32, "name": "maybe_model_cover_image_public_bucket_extension", "type_info": { "type": "VarString", @@ -344,7 +334,7 @@ } }, { - "ordinal": 34, + "ordinal": 33, "name": "maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", @@ -354,7 +344,7 @@ } }, { - "ordinal": 35, + "ordinal": 34, "name": "maybe_model_weight_creator_username", "type_info": { "type": "VarString", @@ -364,7 +354,7 @@ } }, { - "ordinal": 36, + "ordinal": 35, "name": "maybe_model_weight_creator_display_name", "type_info": { "type": "VarString", @@ -374,7 +364,7 @@ } }, { - "ordinal": 37, + "ordinal": 36, "name": "maybe_model_weight_creator_gravatar_hash", "type_info": { "type": "String", @@ -384,7 +374,7 @@ } }, { - "ordinal": 38, + "ordinal": 37, "name": "extra_file_modification_info", "type_info": { "type": "Blob", @@ -394,7 +384,7 @@ } }, { - "ordinal": 39, + "ordinal": 38, "name": "public_bucket_directory_hash", "type_info": { "type": "VarString", @@ -404,7 +394,7 @@ } }, { - "ordinal": 40, + "ordinal": 39, "name": "maybe_public_bucket_prefix", "type_info": { "type": "VarString", @@ -414,7 +404,7 @@ } }, { - "ordinal": 41, + "ordinal": 40, "name": "maybe_public_bucket_extension", "type_info": { "type": "VarString", @@ -424,7 +414,7 @@ } }, { - "ordinal": 42, + "ordinal": 41, "name": "maybe_ratings_positive_count", "type_info": { "type": "Long", @@ -434,7 +424,7 @@ } }, { - "ordinal": 43, + "ordinal": 42, "name": "maybe_ratings_negative_count", "type_info": { "type": "Long", @@ -444,7 +434,7 @@ } }, { - "ordinal": 44, + "ordinal": 43, "name": "maybe_bookmark_count", "type_info": { "type": "Long", @@ -454,7 +444,7 @@ } }, { - "ordinal": 45, + "ordinal": 44, "name": "is_featured", "type_info": { "type": "LongLong", @@ -464,7 +454,7 @@ } }, { - "ordinal": 46, + "ordinal": 45, "name": "created_at", "type_info": { "type": "Timestamp", @@ -474,7 +464,7 @@ } }, { - "ordinal": 47, + "ordinal": 46, "name": "updated_at", "type_info": { "type": "Timestamp", @@ -511,7 +501,6 @@ true, true, true, - true, false, false, false, @@ -538,5 +527,5 @@ false ] }, - "hash": "f6c37066ab3e508050e81cf3bea38cc708b05c5c59ba1c322dcfb775e4b9e7a6" + "hash": "784ca68c6cb61d481b605bfe6ee3248a5b44499038c71b57fc9ea6c4722d170f" } diff --git a/.sqlx/query-57fa22e6cd4e82b801605c96eac21babd78df3df361b3be566993b78a46efef2.json b/.sqlx/query-ad217c26087b2ebed6f2c9f79b16ead63727107dfce3366f3c1d12bc9d565c2c.json similarity index 74% rename from .sqlx/query-57fa22e6cd4e82b801605c96eac21babd78df3df361b3be566993b78a46efef2.json rename to .sqlx/query-ad217c26087b2ebed6f2c9f79b16ead63727107dfce3366f3c1d12bc9d565c2c.json index 5690c5a3a9..21a5b1930f 100644 --- a/.sqlx/query-57fa22e6cd4e82b801605c96eac21babd78df3df361b3be566993b78a46efef2.json +++ b/.sqlx/query-ad217c26087b2ebed6f2c9f79b16ead63727107dfce3366f3c1d12bc9d565c2c.json @@ -1,6 +1,6 @@ { "db_name": "MySQL", - "query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_class as `media_class: enums::by_table::media_files::media_file_class::MediaFileClass`,\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n m.maybe_engine_category as `maybe_engine_category: enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory`,\n m.maybe_animation_type as `maybe_animation_type: enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType`,\n\n m.maybe_media_subtype as `maybe_media_subtype: enums::by_table::media_files::media_file_subtype::MediaFileSubtype`,\n\n m.maybe_mime_type,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n\n m.maybe_batch_token as `maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken`,\n\n m.maybe_style_transfer_source_media_file_token as `maybe_style_transfer_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n m.maybe_scene_source_media_file_token as `maybe_scene_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n\n\n m.maybe_title,\n m.maybe_text_transcript,\n\n m.maybe_origin_filename,\n\n m.maybe_duration_millis,\n\n m.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n prompts.maybe_other_args as maybe_other_prompt_args,\n\n media_file_cover_image.public_bucket_directory_hash as maybe_file_cover_image_public_bucket_hash,\n media_file_cover_image.maybe_public_bucket_prefix as maybe_file_cover_image_public_bucket_prefix,\n media_file_cover_image.maybe_public_bucket_extension as maybe_file_cover_image_public_bucket_extension,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n m.is_user_upload,\n m.is_intermediate_system_file,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n model_weight_cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n model_weight_cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n model_weight_cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.extra_file_modification_info,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n featured_items.entity_token IS NOT NULL AS is_featured,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as media_file_cover_image\n ON media_file_cover_image.token = m.maybe_cover_image_media_file_token\nLEFT OUTER JOIN media_files as model_weight_cover_image\n ON model_weight_cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nLEFT OUTER JOIN prompts\n ON prompts.token = m.maybe_prompt_token\nLEFT OUTER JOIN featured_items\n ON featured_items.entity_type = 'media_file'\n AND featured_items.entity_token = m.token\n AND featured_items.deleted_at IS NULL\nWHERE\n m.token = ?\n AND m.user_deleted_at IS NULL\n AND m.mod_deleted_at IS NULL\n ", + "query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_class as `media_class: enums::by_table::media_files::media_file_class::MediaFileClass`,\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n m.maybe_engine_category as `maybe_engine_category: enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory`,\n m.maybe_animation_type as `maybe_animation_type: enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType`,\n\n m.maybe_mime_type,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n\n m.maybe_batch_token as `maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken`,\n\n m.maybe_style_transfer_source_media_file_token as `maybe_style_transfer_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n m.maybe_scene_source_media_file_token as `maybe_scene_source_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n\n\n m.maybe_title,\n m.maybe_text_transcript,\n\n m.maybe_origin_filename,\n\n m.maybe_duration_millis,\n\n m.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n prompts.maybe_other_args as maybe_other_prompt_args,\n\n media_file_cover_image.public_bucket_directory_hash as maybe_file_cover_image_public_bucket_hash,\n media_file_cover_image.maybe_public_bucket_prefix as maybe_file_cover_image_public_bucket_prefix,\n media_file_cover_image.maybe_public_bucket_extension as maybe_file_cover_image_public_bucket_extension,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n m.is_user_upload,\n m.is_intermediate_system_file,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n model_weight_cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n model_weight_cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n model_weight_cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.extra_file_modification_info,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n featured_items.entity_token IS NOT NULL AS is_featured,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as media_file_cover_image\n ON media_file_cover_image.token = m.maybe_cover_image_media_file_token\nLEFT OUTER JOIN media_files as model_weight_cover_image\n ON model_weight_cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nLEFT OUTER JOIN prompts\n ON prompts.token = m.maybe_prompt_token\nLEFT OUTER JOIN featured_items\n ON featured_items.entity_type = 'media_file'\n AND featured_items.entity_token = m.token\n AND featured_items.deleted_at IS NULL\nWHERE\n m.token = ?\n AND m.user_deleted_at IS NULL\n AND m.mod_deleted_at IS NULL\n ", "describe": { "columns": [ { @@ -55,16 +55,6 @@ }, { "ordinal": 5, - "name": "maybe_media_subtype: enums::by_table::media_files::media_file_subtype::MediaFileSubtype", - "type_info": { - "type": "VarString", - "flags": "BINARY", - "char_set": 224, - "max_size": 128 - } - }, - { - "ordinal": 6, "name": "maybe_mime_type", "type_info": { "type": "VarString", @@ -74,7 +64,7 @@ } }, { - "ordinal": 7, + "ordinal": 6, "name": "maybe_creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", @@ -84,7 +74,7 @@ } }, { - "ordinal": 8, + "ordinal": 7, "name": "maybe_creator_username", "type_info": { "type": "VarString", @@ -94,7 +84,7 @@ } }, { - "ordinal": 9, + "ordinal": 8, "name": "maybe_creator_display_name", "type_info": { "type": "VarString", @@ -104,7 +94,7 @@ } }, { - "ordinal": 10, + "ordinal": 9, "name": "maybe_creator_gravatar_hash", "type_info": { "type": "String", @@ -114,7 +104,7 @@ } }, { - "ordinal": 11, + "ordinal": 10, "name": "maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken", "type_info": { "type": "VarString", @@ -124,7 +114,7 @@ } }, { - "ordinal": 12, + "ordinal": 11, "name": "maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken", "type_info": { "type": "VarString", @@ -134,7 +124,7 @@ } }, { - "ordinal": 13, + "ordinal": 12, "name": "maybe_style_transfer_source_media_file_token: tokens::tokens::media_files::MediaFileToken", "type_info": { "type": "VarString", @@ -144,7 +134,7 @@ } }, { - "ordinal": 14, + "ordinal": 13, "name": "maybe_scene_source_media_file_token: tokens::tokens::media_files::MediaFileToken", "type_info": { "type": "VarString", @@ -154,7 +144,7 @@ } }, { - "ordinal": 15, + "ordinal": 14, "name": "maybe_title", "type_info": { "type": "VarString", @@ -164,7 +154,7 @@ } }, { - "ordinal": 16, + "ordinal": 15, "name": "maybe_text_transcript", "type_info": { "type": "Blob", @@ -174,7 +164,7 @@ } }, { - "ordinal": 17, + "ordinal": 16, "name": "maybe_origin_filename", "type_info": { "type": "VarString", @@ -184,7 +174,7 @@ } }, { - "ordinal": 18, + "ordinal": 17, "name": "maybe_duration_millis", "type_info": { "type": "Long", @@ -194,7 +184,7 @@ } }, { - "ordinal": 19, + "ordinal": 18, "name": "maybe_prompt_token: tokens::tokens::prompts::PromptToken", "type_info": { "type": "VarString", @@ -204,7 +194,7 @@ } }, { - "ordinal": 20, + "ordinal": 19, "name": "maybe_other_prompt_args", "type_info": { "type": "Blob", @@ -214,7 +204,7 @@ } }, { - "ordinal": 21, + "ordinal": 20, "name": "maybe_file_cover_image_public_bucket_hash", "type_info": { "type": "VarString", @@ -224,7 +214,7 @@ } }, { - "ordinal": 22, + "ordinal": 21, "name": "maybe_file_cover_image_public_bucket_prefix", "type_info": { "type": "VarString", @@ -234,7 +224,7 @@ } }, { - "ordinal": 23, + "ordinal": 22, "name": "maybe_file_cover_image_public_bucket_extension", "type_info": { "type": "VarString", @@ -244,7 +234,7 @@ } }, { - "ordinal": 24, + "ordinal": 23, "name": "creator_set_visibility: enums::common::visibility::Visibility", "type_info": { "type": "String", @@ -254,7 +244,7 @@ } }, { - "ordinal": 25, + "ordinal": 24, "name": "is_user_upload", "type_info": { "type": "Tiny", @@ -264,7 +254,7 @@ } }, { - "ordinal": 26, + "ordinal": 25, "name": "is_intermediate_system_file", "type_info": { "type": "Tiny", @@ -274,7 +264,7 @@ } }, { - "ordinal": 27, + "ordinal": 26, "name": "maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken", "type_info": { "type": "VarString", @@ -284,7 +274,7 @@ } }, { - "ordinal": 28, + "ordinal": 27, "name": "maybe_model_weights_title", "type_info": { "type": "VarString", @@ -294,7 +284,7 @@ } }, { - "ordinal": 29, + "ordinal": 28, "name": "maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType", "type_info": { "type": "VarString", @@ -304,7 +294,7 @@ } }, { - "ordinal": 30, + "ordinal": 29, "name": "maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory", "type_info": { "type": "VarString", @@ -314,7 +304,7 @@ } }, { - "ordinal": 31, + "ordinal": 30, "name": "maybe_model_cover_image_public_bucket_hash", "type_info": { "type": "VarString", @@ -324,7 +314,7 @@ } }, { - "ordinal": 32, + "ordinal": 31, "name": "maybe_model_cover_image_public_bucket_prefix", "type_info": { "type": "VarString", @@ -334,7 +324,7 @@ } }, { - "ordinal": 33, + "ordinal": 32, "name": "maybe_model_cover_image_public_bucket_extension", "type_info": { "type": "VarString", @@ -344,7 +334,7 @@ } }, { - "ordinal": 34, + "ordinal": 33, "name": "maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", @@ -354,7 +344,7 @@ } }, { - "ordinal": 35, + "ordinal": 34, "name": "maybe_model_weight_creator_username", "type_info": { "type": "VarString", @@ -364,7 +354,7 @@ } }, { - "ordinal": 36, + "ordinal": 35, "name": "maybe_model_weight_creator_display_name", "type_info": { "type": "VarString", @@ -374,7 +364,7 @@ } }, { - "ordinal": 37, + "ordinal": 36, "name": "maybe_model_weight_creator_gravatar_hash", "type_info": { "type": "String", @@ -384,7 +374,7 @@ } }, { - "ordinal": 38, + "ordinal": 37, "name": "extra_file_modification_info", "type_info": { "type": "Blob", @@ -394,7 +384,7 @@ } }, { - "ordinal": 39, + "ordinal": 38, "name": "public_bucket_directory_hash", "type_info": { "type": "VarString", @@ -404,7 +394,7 @@ } }, { - "ordinal": 40, + "ordinal": 39, "name": "maybe_public_bucket_prefix", "type_info": { "type": "VarString", @@ -414,7 +404,7 @@ } }, { - "ordinal": 41, + "ordinal": 40, "name": "maybe_public_bucket_extension", "type_info": { "type": "VarString", @@ -424,7 +414,7 @@ } }, { - "ordinal": 42, + "ordinal": 41, "name": "maybe_ratings_positive_count", "type_info": { "type": "Long", @@ -434,7 +424,7 @@ } }, { - "ordinal": 43, + "ordinal": 42, "name": "maybe_ratings_negative_count", "type_info": { "type": "Long", @@ -444,7 +434,7 @@ } }, { - "ordinal": 44, + "ordinal": 43, "name": "maybe_bookmark_count", "type_info": { "type": "Long", @@ -454,7 +444,7 @@ } }, { - "ordinal": 45, + "ordinal": 44, "name": "is_featured", "type_info": { "type": "LongLong", @@ -464,7 +454,7 @@ } }, { - "ordinal": 46, + "ordinal": 45, "name": "created_at", "type_info": { "type": "Timestamp", @@ -474,7 +464,7 @@ } }, { - "ordinal": 47, + "ordinal": 46, "name": "updated_at", "type_info": { "type": "Timestamp", @@ -511,7 +501,6 @@ true, true, true, - true, false, false, false, @@ -538,5 +527,5 @@ false ] }, - "hash": "57fa22e6cd4e82b801605c96eac21babd78df3df361b3be566993b78a46efef2" + "hash": "ad217c26087b2ebed6f2c9f79b16ead63727107dfce3366f3c1d12bc9d565c2c" } diff --git a/.sqlx/query-ad2ffbd9f48e52678a5c61817bec043bf1df4033463e5c5a18468c04af391e6a.json b/.sqlx/query-ad2ffbd9f48e52678a5c61817bec043bf1df4033463e5c5a18468c04af391e6a.json deleted file mode 100644 index 46c8215c63..0000000000 --- a/.sqlx/query-ad2ffbd9f48e52678a5c61817bec043bf1df4033463e5c5a18468c04af391e6a.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "MySQL", - "query": "\n INSERT INTO media_files\n SET\n token = ?,\n\n media_class = ?,\n media_type = ?,\n\n is_user_upload = ?,\n is_intermediate_system_file = ?,\n\n origin_category = ?, \n origin_product_category = ?, \n maybe_origin_model_type = ?, \n maybe_origin_model_token = ?, \n maybe_origin_filename = ?,\n\n is_batch_generated = ?,\n maybe_batch_token = ?,\n\n maybe_mime_type = ?,\n file_size_bytes = ?,\n maybe_duration_millis = ?,\n maybe_audio_encoding = ?, \n maybe_video_encoding = ?, \n maybe_frame_width = ?, \n maybe_frame_height = ?,\n maybe_prompt_token = ?,\n checksum_sha2 = ?,\n \n maybe_engine_category = ?,\n\n maybe_title = ?,\n maybe_text_transcript = ?,\n\n maybe_scene_source_media_file_token = ?,\n\n public_bucket_directory_hash = ?, \n maybe_public_bucket_prefix = ?, \n maybe_public_bucket_extension = ?, \n\n maybe_creator_user_token = ?, \n maybe_creator_anonymous_visitor_token = ?, \n\n creator_ip_address = ?, \n creator_set_visibility = ?, \n\n maybe_creator_file_synthetic_id = ?, \n maybe_creator_category_synthetic_id = ?,\n\n extra_file_modification_info = ?,\n\n maybe_generation_provider = ?,\n\n platform_type = ?,\n\n maybe_cover_image_media_file_token = ?,\n\n maybe_mod_user_token = ?,\n is_generated_on_prem = ?,\n generated_by_worker = ?,\n generated_by_cluster = ?\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 42 - }, - "nullable": [] - }, - "hash": "ad2ffbd9f48e52678a5c61817bec043bf1df4033463e5c5a18468c04af391e6a" -} diff --git a/crates/api_clients/artcraft/artcraft_client/src/endpoints/media_files/get_media_file.rs b/crates/api_clients/artcraft/artcraft_client/src/endpoints/media_files/get_media_file.rs index 74f9c57ce6..7beef4ed4b 100644 --- a/crates/api_clients/artcraft/artcraft_client/src/endpoints/media_files/get_media_file.rs +++ b/crates/api_clients/artcraft/artcraft_client/src/endpoints/media_files/get_media_file.rs @@ -76,11 +76,6 @@ pub struct MediaFileInfo { /// this describes the animation regime used or supported. pub maybe_animation_type: Option, - // /// If the media file has a subtype, we'll report it. - // /// This is mostly used for Bevy engine files. - // #[deprecated(note="This was for the Bevy engine. Do not use.")] - // pub maybe_media_subtype: Option, - // /// Extension for the engine to load over remote:// URLs. // #[deprecated(note="This was for the Bevy engine. Do not use.")] // pub maybe_engine_extension: Option, diff --git a/crates/cli/devenv/dev-database-seed/src/seeding/media_files.rs b/crates/cli/devenv/dev-database-seed/src/seeding/media_files.rs index 6ac85b024c..f68648c3df 100644 --- a/crates/cli/devenv/dev-database-seed/src/seeding/media_files.rs +++ b/crates/cli/devenv/dev-database-seed/src/seeding/media_files.rs @@ -26,7 +26,7 @@ pub async fn seed_test_videos(mysql_pool: &Pool, user_token: UserToken) - let media1 = InsertArgs { pool: &mysql_pool, maybe_use_apriori_media_token: Some(&model_weight_token1), - media_file_type: MediaFileType::Video, + media_file_type: MediaFileType::Mp4, maybe_mime_type: Some(&*metadata1.mimetype), file_size_bytes: metadata1.file_size_bytes, sha256_checksum: &metadata1.sha256_checksum, diff --git a/crates/cli/devenv/dev-database-seed/src/seeding/seed_media_files.rs b/crates/cli/devenv/dev-database-seed/src/seeding/seed_media_files.rs index a44b98492a..1742e554b3 100644 --- a/crates/cli/devenv/dev-database-seed/src/seeding/seed_media_files.rs +++ b/crates/cli/devenv/dev-database-seed/src/seeding/seed_media_files.rs @@ -29,16 +29,16 @@ pub async fn seed_media_files(mysql_pool: &Pool, maybe_bucket_clients: Op // Delete the records if you want to re-seed. let media_files = [ // Audio - (HANASHI_USER_TOKEN, "m_21jxt406aattq2cna1xtgf5m4mjyyr", MediaFileType::Audio, "media/audio/voice-samples/biden.wav"), - (HANASHI_USER_TOKEN, "m_cxzabpxf88h10rshqraksxbqmhs41h", MediaFileType::Audio, "media/audio/voice-samples/brandon1.wav"), - (HANASHI_USER_TOKEN, "m_sq2vhrrmmbr079afk21543aa2jg53g", MediaFileType::Audio, "media/audio/voice-samples/brandon2.wav"), - (HANASHI_USER_TOKEN, "m_s61a8g3jnddr3xdg3gctsjxxk9jwja", MediaFileType::Audio, "media/audio/voice-samples/elon.wav"), - (HANASHI_USER_TOKEN, "m_e59fh75g76pvebx4qe4r4aymd93q30", MediaFileType::Audio, "media/audio/voice-samples/goku.wav"), - (HANASHI_USER_TOKEN, "m_ttq0ym8ht4v0z87zqz27fhadp0743c", MediaFileType::Audio, "media/audio/voice-samples/hillary.wav"), - (HANASHI_USER_TOKEN, "m_300bv6f141hv553fjf287p5gb76k37", MediaFileType::Audio, "media/audio/voice-samples/mario_impersonator.wav"), - (HANASHI_USER_TOKEN, "m_rd1ey2jem8a37r3vna2h9mht6zevs5", MediaFileType::Audio, "media/audio/voice-samples/rick.wav"), - (HANASHI_USER_TOKEN, "m_8n5epqfvs2vh60khap0s3ezem4epkc", MediaFileType::Audio, "media/audio/voice-samples/trump.wav"), - (HANASHI_USER_TOKEN, "m_g6dpwcpq51e6kvmpbbkdvgxfan9k1k", MediaFileType::Audio, "media/audio/voice-samples/trump_tts.wav"), + (HANASHI_USER_TOKEN, "m_21jxt406aattq2cna1xtgf5m4mjyyr", MediaFileType::Wav, "media/audio/voice-samples/biden.wav"), + (HANASHI_USER_TOKEN, "m_cxzabpxf88h10rshqraksxbqmhs41h", MediaFileType::Wav, "media/audio/voice-samples/brandon1.wav"), + (HANASHI_USER_TOKEN, "m_sq2vhrrmmbr079afk21543aa2jg53g", MediaFileType::Wav, "media/audio/voice-samples/brandon2.wav"), + (HANASHI_USER_TOKEN, "m_s61a8g3jnddr3xdg3gctsjxxk9jwja", MediaFileType::Wav, "media/audio/voice-samples/elon.wav"), + (HANASHI_USER_TOKEN, "m_e59fh75g76pvebx4qe4r4aymd93q30", MediaFileType::Wav, "media/audio/voice-samples/goku.wav"), + (HANASHI_USER_TOKEN, "m_ttq0ym8ht4v0z87zqz27fhadp0743c", MediaFileType::Wav, "media/audio/voice-samples/hillary.wav"), + (HANASHI_USER_TOKEN, "m_300bv6f141hv553fjf287p5gb76k37", MediaFileType::Wav, "media/audio/voice-samples/mario_impersonator.wav"), + (HANASHI_USER_TOKEN, "m_rd1ey2jem8a37r3vna2h9mht6zevs5", MediaFileType::Wav, "media/audio/voice-samples/rick.wav"), + (HANASHI_USER_TOKEN, "m_8n5epqfvs2vh60khap0s3ezem4epkc", MediaFileType::Wav, "media/audio/voice-samples/trump.wav"), + (HANASHI_USER_TOKEN, "m_g6dpwcpq51e6kvmpbbkdvgxfan9k1k", MediaFileType::Wav, "media/audio/voice-samples/trump_tts.wav"), // Images (HANASHI_USER_TOKEN, "m_cn5t6ywm9k1ge9qzzxst5krc5tm08m", MediaFileType::Jpg, "media/image/face-animator-inputs/bill.jpg"), (HANASHI_USER_TOKEN, "m_nf9xebrr8hd1bxkfy7src5k8nv2dzy", MediaFileType::Jpg, "media/image/face-animator-inputs/elon.jpg"), @@ -48,18 +48,18 @@ pub async fn seed_media_files(mysql_pool: &Pool, maybe_bucket_clients: Op (HANASHI_USER_TOKEN, "m_we7mnzbd76g4yn19dm6m53er0pjvew", MediaFileType::Png, "media/image/face-animator-inputs/san.png"), (HANASHI_USER_TOKEN, "m_wahwz92nxxfg0x42dw9fdrhwq30yk0", MediaFileType::Jpg, "media/image/face-animator-inputs/zelda.jpg"), // Video - (HANASHI_USER_TOKEN, "m_gedarcfdkxx3zv8zz2wmwsnc1r8jbp", MediaFileType::Video, "media/video/storyteller-studio-renders/girl-rotating-room.mp4"), - (HANASHI_USER_TOKEN, "m_3s74yyd4jwrjdp17yx1694n29jv5gr", MediaFileType::Video, "media/video/storyteller-studio-renders/hanashi-run.mp4"), - (HANASHI_USER_TOKEN, "m_p6d64gm1wawz25bmdahfded3366b9f", MediaFileType::Video, "media/video/storyteller-studio-renders/mocap-kiss.mp4"), - (HANASHI_USER_TOKEN, "m_szp2c77z6je965k44vc22xn9432a88", MediaFileType::Video, "media/video/storyteller-studio-renders/rotating-mocap-girl.mp4"), - (HANASHI_USER_TOKEN, "m_mdwspz81zymw9hvmb1d3jm830t25xe", MediaFileType::Video, "media/video/storyteller-studio-renders/rotating-mocap-m.mp4"), - (HANASHI_USER_TOKEN, "m_prcs6xkm8phs5y4a2dfwemwjy6n6z3", MediaFileType::Video, "media/video/storyteller-studio-renders/rotating-run-girl.mp4"), - (HANASHI_USER_TOKEN, "m_5j889dzw08vn9pbrscx1sncff43ekp", MediaFileType::Video, "media/video/storyteller-studio-renders/rotating-run-jww.mp4"), - (HANASHI_USER_TOKEN, "m_fwm2w6wbssez274ayz6x8ta0h1a9qp", MediaFileType::Video, "media/video/storyteller-studio-renders/rotating-run-pascal.mp4"), - (HANASHI_USER_TOKEN, "m_yqqkrt2srep6a35xg78114jn9epwg1", MediaFileType::Video, "media/video/storyteller-studio-renders/rotating-run-pop.mp4"), - (HANASHI_USER_TOKEN, "m_m4r043kez14pm6vaamsecpz8fafh7g", MediaFileType::Video, "media/video/video-style-transfer/man-explaining.mp4"), - (HANASHI_USER_TOKEN, "m_81gq3hygqvrahg6ncxbtcpjap4f9nv", MediaFileType::Video, "media/video/video-style-transfer/woman-gradient-background.mp4"), - (HANASHI_USER_TOKEN, "m_dp9ykj3yasjx69g2fx2bpd26wwjz0f", MediaFileType::Video, "media/video/video-style-transfer/woman-red-hair.mp4"), + (HANASHI_USER_TOKEN, "m_gedarcfdkxx3zv8zz2wmwsnc1r8jbp", MediaFileType::Mp4, "media/video/storyteller-studio-renders/girl-rotating-room.mp4"), + (HANASHI_USER_TOKEN, "m_3s74yyd4jwrjdp17yx1694n29jv5gr", MediaFileType::Mp4, "media/video/storyteller-studio-renders/hanashi-run.mp4"), + (HANASHI_USER_TOKEN, "m_p6d64gm1wawz25bmdahfded3366b9f", MediaFileType::Mp4, "media/video/storyteller-studio-renders/mocap-kiss.mp4"), + (HANASHI_USER_TOKEN, "m_szp2c77z6je965k44vc22xn9432a88", MediaFileType::Mp4, "media/video/storyteller-studio-renders/rotating-mocap-girl.mp4"), + (HANASHI_USER_TOKEN, "m_mdwspz81zymw9hvmb1d3jm830t25xe", MediaFileType::Mp4, "media/video/storyteller-studio-renders/rotating-mocap-m.mp4"), + (HANASHI_USER_TOKEN, "m_prcs6xkm8phs5y4a2dfwemwjy6n6z3", MediaFileType::Mp4, "media/video/storyteller-studio-renders/rotating-run-girl.mp4"), + (HANASHI_USER_TOKEN, "m_5j889dzw08vn9pbrscx1sncff43ekp", MediaFileType::Mp4, "media/video/storyteller-studio-renders/rotating-run-jww.mp4"), + (HANASHI_USER_TOKEN, "m_fwm2w6wbssez274ayz6x8ta0h1a9qp", MediaFileType::Mp4, "media/video/storyteller-studio-renders/rotating-run-pascal.mp4"), + (HANASHI_USER_TOKEN, "m_yqqkrt2srep6a35xg78114jn9epwg1", MediaFileType::Mp4, "media/video/storyteller-studio-renders/rotating-run-pop.mp4"), + (HANASHI_USER_TOKEN, "m_m4r043kez14pm6vaamsecpz8fafh7g", MediaFileType::Mp4, "media/video/video-style-transfer/man-explaining.mp4"), + (HANASHI_USER_TOKEN, "m_81gq3hygqvrahg6ncxbtcpjap4f9nv", MediaFileType::Mp4, "media/video/video-style-transfer/woman-gradient-background.mp4"), + (HANASHI_USER_TOKEN, "m_dp9ykj3yasjx69g2fx2bpd26wwjz0f", MediaFileType::Mp4, "media/video/video-style-transfer/woman-red-hair.mp4"), ]; let seed_tool_data_root = get_seed_tool_data_root(); diff --git a/crates/cli/devenv/dev-upload-media-file/src/main.rs b/crates/cli/devenv/dev-upload-media-file/src/main.rs index a2cd1e81a6..695229e021 100644 --- a/crates/cli/devenv/dev-upload-media-file/src/main.rs +++ b/crates/cli/devenv/dev-upload-media-file/src/main.rs @@ -73,14 +73,14 @@ pub async fn main() -> AnyhowResult<()> { match mimetype { Some("audio/wav") | Some("audio/x-wav") => { - media_file_type = MediaFileType::Video; + media_file_type = MediaFileType::Wav; maybe_mime_type = Some("audio/wav"); maybe_public_bucket_prefix = Some("dev_upload_"); maybe_public_bucket_extension = Some(".wav"); } Some("video/mp4") => { - media_file_type = MediaFileType::Video; + media_file_type = MediaFileType::Mp4; maybe_mime_type = mimetype; maybe_public_bucket_prefix = Some("dev_upload_"); maybe_public_bucket_extension = Some(".mp4"); diff --git a/crates/cli/production/elasticsearch-cli/src/plans/media_files/create_dimensional_media_file_documents.rs b/crates/cli/production/elasticsearch-cli/src/plans/media_files/create_dimensional_media_file_documents.rs index 5ad199bf68..9755aa0b2c 100644 --- a/crates/cli/production/elasticsearch-cli/src/plans/media_files/create_dimensional_media_file_documents.rs +++ b/crates/cli/production/elasticsearch-cli/src/plans/media_files/create_dimensional_media_file_documents.rs @@ -105,7 +105,6 @@ async fn create_document_from_record(elasticsearch: &Elasticsearch, record: Medi media_class: record.media_class, media_type: record.media_type, - maybe_media_subtype: record.maybe_media_subtype, maybe_engine_category: record.maybe_engine_category, maybe_animation_type: record.maybe_animation_type, diff --git a/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs b/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs index 9cad9c068a..c622cfde68 100644 --- a/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs +++ b/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs @@ -264,7 +264,6 @@ async fn upload_grok_video( // TODO: media_files.maybe_generation_provider // TODO: media_files.maybe_origin_model_type // TODO: media_files.maybe_origin_model_token (sref?) - // TODO: media_files.is_batch_generated // TODO: media_files.maybe_batch_token // TODO: media_files.is_user_upload diff --git a/crates/desktop/artcraft/src/services/midjourney/threads/midjourney_long_polling_thread.rs b/crates/desktop/artcraft/src/services/midjourney/threads/midjourney_long_polling_thread.rs index e78922c666..001f2b628f 100644 --- a/crates/desktop/artcraft/src/services/midjourney/threads/midjourney_long_polling_thread.rs +++ b/crates/desktop/artcraft/src/services/midjourney/threads/midjourney_long_polling_thread.rs @@ -294,7 +294,6 @@ async fn upload_midjourney_batch( // TODO: media_files.maybe_generation_provider // TODO: media_files.maybe_origin_model_type // TODO: media_files.maybe_origin_model_token (sref?) - // TODO: media_files.is_batch_generated // TODO: media_files.maybe_batch_token // TODO: media_files.is_user_upload diff --git a/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs b/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs index fd672e5496..45ea750e80 100644 --- a/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs +++ b/crates/desktop/artcraft/src/services/worldlabs/threads/worldlabs_marble_task_polling.rs @@ -254,7 +254,6 @@ async fn upload_spz_splat( // TODO: media_files.maybe_generation_provider // TODO: media_files.maybe_origin_model_type // TODO: media_files.maybe_origin_model_token (sref?) - // TODO: media_files.is_batch_generated // TODO: media_files.maybe_batch_token // TODO: media_files.is_user_upload diff --git a/crates/schema/database/elasticsearch_schema/src/documents/media_file_document.rs b/crates/schema/database/elasticsearch_schema/src/documents/media_file_document.rs index d088f75bbc..887dca36d1 100644 --- a/crates/schema/database/elasticsearch_schema/src/documents/media_file_document.rs +++ b/crates/schema/database/elasticsearch_schema/src/documents/media_file_document.rs @@ -6,7 +6,6 @@ use serde::{Deserialize, Serialize}; use enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType; use enums::by_table::media_files::media_file_class::MediaFileClass; use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::common::visibility::Visibility; use tokens::tokens::media_files::MediaFileToken; @@ -25,7 +24,6 @@ pub struct MediaFileDocument { pub media_class: MediaFileClass, pub media_type: MediaFileType, - pub maybe_media_subtype: Option, pub maybe_engine_category: Option, pub maybe_mime_type: Option, 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 b6e111e838..5642968e2f 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 @@ -117,8 +117,6 @@ pub async fn insert_media_file_generic( let mut maybe_creator_file_synthetic_id : Option = None; let mut maybe_creator_category_synthetic_id : Option = None; - let is_batch_generated = args.maybe_batch_token.is_some(); - let mut maybe_generation_provider_str = None; let mut is_intermediate_system_file = args.is_intermediate_system_file; let mut is_user_upload = args.is_user_upload; @@ -172,7 +170,6 @@ pub async fn insert_media_file_generic( maybe_origin_model_token = ?, maybe_origin_filename = ?, - is_batch_generated = ?, maybe_batch_token = ?, maybe_mime_type = ?, @@ -232,7 +229,6 @@ pub async fn insert_media_file_generic( args.maybe_origin_model_token.map(|t| t.to_string()), args.maybe_origin_filename, - is_batch_generated, args.maybe_batch_token.map(|t| t.as_str()), args.maybe_mime_type, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_comfy_ui.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_comfy_ui.rs index 7e5313608f..b874c30de7 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_comfy_ui.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_comfy_ui.rs @@ -82,6 +82,10 @@ pub async fn insert_media_file_from_comfy_ui(args: InsertArgs<'_>) -> AnyhowResu let maybe_model_type = args.maybe_model_type.map(|m| m.to_str()); + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Video); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -129,7 +133,7 @@ SET result_token.as_str(), MediaFileClass::Video.to_str(), - MediaFileType::Video.to_str(), // TODO(bt,2024-04-30): This needs to become "mp4" after a frontend migration + media_type.to_str(), ORIGIN_CATEGORY.to_str(), product.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_f5_tts.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_f5_tts.rs index a3763b33b1..0314e0b01f 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_f5_tts.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_f5_tts.rs @@ -69,6 +69,10 @@ pub async fn insert_media_file_from_f5_tts( const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference; const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::TextToSpeech; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Audio); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -116,7 +120,7 @@ SET result_token.as_str(), MediaFileClass::Audio.to_str(), - MediaFileType::Audio.to_str(), // TODO(bt,2024-04-30): This needs to become "wav" after a frontend migration + media_type.to_str(), ORIGIN_CATEGORY.to_str(), ORIGIN_PRODUCT_CATEGORY.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_face_animation.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_face_animation.rs index 4dd2a97048..6dea53123a 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_face_animation.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_face_animation.rs @@ -68,6 +68,10 @@ pub async fn insert_media_file_from_face_animation( const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::FaceAnimator; const ORIGIN_MODEL_TYPE : MediaFileOriginModelType = MediaFileOriginModelType::SadTalker; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Video); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -108,7 +112,7 @@ SET result_token.as_str(), MediaFileClass::Video.to_str(), - MediaFileType::Video.to_str(), + media_type.to_str(), ORIGIN_CATEGORY.to_str(), ORIGIN_PRODUCT_CATEGORY.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_rerender.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_rerender.rs index 901e4389a1..6c30295102 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_rerender.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_rerender.rs @@ -66,7 +66,9 @@ pub async fn insert_media_file_from_rerender( const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference; const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::VideoFilter; const ORIGIN_MODEL_TYPE : MediaFileOriginModelType = MediaFileOriginModelType::Rerender; - const MEDIA_TYPE : MediaFileType = MediaFileType::Video; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Video); // Coarse fallback for unrecognized mimes let record_id = { let query_result = sqlx::query!( @@ -109,7 +111,7 @@ SET ORIGIN_PRODUCT_CATEGORY.to_str(), ORIGIN_MODEL_TYPE.to_str(), - MEDIA_TYPE.to_str(), + media_type.to_str(), args.maybe_mime_type, args.file_size_bytes, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_seed_vc.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_seed_vc.rs index 8fbae2446e..dcd7f38abc 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_seed_vc.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_seed_vc.rs @@ -69,6 +69,10 @@ pub async fn insert_media_file_from_seed_vc( const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference; const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::TextToSpeech; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Audio); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -116,7 +120,7 @@ SET result_token.as_str(), MediaFileClass::Audio.to_str(), - MediaFileType::Audio.to_str(), // TODO(bt,2024-04-30): This needs to become "wav" after a frontend migration + media_type.to_str(), ORIGIN_CATEGORY.to_str(), ORIGIN_PRODUCT_CATEGORY.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_studio_gen2.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_studio_gen2.rs index 4f7d76a0b5..74a870a387 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_studio_gen2.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_studio_gen2.rs @@ -75,6 +75,10 @@ pub async fn insert_media_file_from_studio_gen2(args: InsertArgs<'_>) -> AnyhowR const MODEL_TYPE : MediaFileOriginModelType = MediaFileOriginModelType::StorytellerStudio; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Video); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -121,7 +125,7 @@ SET result_token.as_str(), MediaFileClass::Video.to_str(), - MediaFileType::Video.to_str(), // TODO(bt,2024-04-30): This needs to become "mp4" after a frontend migration + media_type.to_str(), ORIGIN_CATEGORY.to_str(), PRODUCT.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_tacotron2.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_tacotron2.rs index 2f21bcbf67..757ba3fb0f 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_tacotron2.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_tacotron2.rs @@ -69,6 +69,10 @@ pub async fn insert_media_file_from_tacotron2( const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference; const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::TextToSpeech; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Audio); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -116,7 +120,7 @@ SET result_token.as_str(), MediaFileClass::Audio.to_str(), - MediaFileType::Audio.to_str(), // TODO(bt,2024-04-30): This needs to become "wav" after a frontend migration + media_type.to_str(), ORIGIN_CATEGORY.to_str(), ORIGIN_PRODUCT_CATEGORY.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_voice_conversion.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_voice_conversion.rs index 6394be3a6f..f3bd5286cf 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_voice_conversion.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_voice_conversion.rs @@ -80,6 +80,10 @@ pub async fn insert_media_file_from_voice_conversion( const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference; const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::VoiceConversion; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Audio); // Coarse fallback for unrecognized mimes + let record_id = { let query_result = sqlx::query!( r#" @@ -122,7 +126,7 @@ SET result_token.as_str(), MediaFileClass::Audio.to_str(), - MediaFileType::Audio.to_str(), // TODO(bt,2024-04-30): This needs to become "wav" after a frontend migration + media_type.to_str(), ORIGIN_CATEGORY.to_str(), ORIGIN_PRODUCT_CATEGORY.to_str(), diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_zero_shot_tts.rs b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_zero_shot_tts.rs index 468a30be0f..c59c8e6efa 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_zero_shot_tts.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/create/specialized_insert/insert_media_file_from_zero_shot_tts.rs @@ -70,7 +70,9 @@ pub async fn insert_media_file_from_zero_shot( // Since fill this out apart of the funtion this seems like the only thing to change. const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference; const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::ZeroShotVoice; - const MEDIA_TYPE : MediaFileType = MediaFileType::Audio; + let media_type = args.maybe_mime_type + .and_then(MediaFileType::try_from_mime_type) + .unwrap_or(MediaFileType::Audio); // Coarse fallback for unrecognized mimes let record_id = { let query_result = sqlx::query!( @@ -118,7 +120,7 @@ pub async fn insert_media_file_from_zero_shot( args.job.maybe_raw_inference_text, - MEDIA_TYPE.to_str(), + media_type.to_str(), args.maybe_mime_type, args.file_size_bytes, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/get/batch_get_media_files.rs b/crates/schema/database/mysql_queries/src/queries/media_files/get/batch_get_media_files.rs index c626f98e2f..0a2f59908d 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/get/batch_get_media_files.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/get/batch_get_media_files.rs @@ -12,7 +12,6 @@ use enums::by_table::media_files::media_file_animation_type::MediaFileAnimationT use enums::traits::mysql_from_row::MySqlFromRow as _; use enums::by_table::media_files::media_file_class::MediaFileClass; use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::by_table::model_weights::weights_category::WeightsCategory; use enums::by_table::model_weights::weights_types::WeightsType; @@ -38,7 +37,6 @@ pub struct MediaFile { pub maybe_engine_category: Option, pub maybe_animation_type: Option, - pub maybe_media_subtype: Option, // TODO: Bucket hash bits. @@ -125,7 +123,6 @@ pub struct MediaFileRaw { pub maybe_engine_category: Option, pub maybe_animation_type: Option, - pub maybe_media_subtype: Option, // TODO: Bucket hash bits. @@ -234,7 +231,6 @@ pub async fn batch_get_media_files( media_type: record.media_type, maybe_engine_category: record.maybe_engine_category, maybe_animation_type: record.maybe_animation_type, - maybe_media_subtype: record.maybe_media_subtype, maybe_batch_token: record.maybe_batch_token, maybe_title: record.maybe_title, maybe_text_transcript: record.maybe_text_transcript, @@ -294,7 +290,6 @@ SELECT m.maybe_engine_category, m.maybe_animation_type, - m.maybe_media_subtype, users.token as maybe_creator_user_token, users.username as maybe_creator_username, @@ -390,7 +385,6 @@ impl FromRow<'_, MySqlRow> for MediaFileRaw { maybe_engine_category: MediaFileEngineCategory::try_from_mysql_row_nullable(row, "maybe_engine_category")?, maybe_animation_type: MediaFileAnimationType::try_from_mysql_row_nullable(row, "maybe_animation_type")?, - maybe_media_subtype: MediaFileSubtype::try_from_mysql_row_nullable(row, "maybe_media_subtype")?, maybe_batch_token: BatchGenerationToken::try_from_mysql_row_nullable(row, "maybe_batch_token")?, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/get/get_media_file.rs b/crates/schema/database/mysql_queries/src/queries/media_files/get/get_media_file.rs index 3cfd41f0aa..649a300657 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/get/get_media_file.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/get/get_media_file.rs @@ -8,7 +8,6 @@ use chrono::{DateTime, Utc}; use enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType; use enums::by_table::media_files::media_file_class::MediaFileClass; use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::by_table::model_weights::weights_category::WeightsCategory; use enums::by_table::model_weights::weights_types::WeightsType; @@ -39,8 +38,6 @@ pub struct MediaFile { pub maybe_engine_category: Option, pub maybe_animation_type: Option, - pub maybe_media_subtype: Option, - pub maybe_mime_type: Option, // TODO: Other media details (file size, dimensions, duration, etc.) @@ -134,8 +131,6 @@ pub struct MediaFileRaw { pub maybe_engine_category: Option, pub maybe_animation_type: Option, - pub maybe_media_subtype: Option, - pub maybe_mime_type: Option, pub maybe_batch_token: Option, @@ -263,7 +258,6 @@ pub async fn get_media_file_with_transactor( maybe_engine_category: record.maybe_engine_category, maybe_animation_type: record.maybe_animation_type, media_class: record.media_class, - maybe_media_subtype: record.maybe_media_subtype, maybe_mime_type: record.maybe_mime_type, maybe_batch_token: record.maybe_batch_token, maybe_style_transfer_source_media_file_token: record.maybe_style_transfer_source_media_file_token, @@ -327,8 +321,6 @@ SELECT m.maybe_engine_category as `maybe_engine_category: enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory`, m.maybe_animation_type as `maybe_animation_type: enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType`, - m.maybe_media_subtype as `maybe_media_subtype: enums::by_table::media_files::media_file_subtype::MediaFileSubtype`, - m.maybe_mime_type, users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`, @@ -450,8 +442,6 @@ SELECT m.maybe_engine_category as `maybe_engine_category: enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory`, m.maybe_animation_type as `maybe_animation_type: enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType`, - m.maybe_media_subtype as `maybe_media_subtype: enums::by_table::media_files::media_file_subtype::MediaFileSubtype`, - m.maybe_mime_type, users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/list/list_media_files_for_elastic_search_backfill_using_cursor.rs b/crates/schema/database/mysql_queries/src/queries/media_files/list/list_media_files_for_elastic_search_backfill_using_cursor.rs index 9e9008bf0d..5d542744c5 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/list/list_media_files_for_elastic_search_backfill_using_cursor.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/list/list_media_files_for_elastic_search_backfill_using_cursor.rs @@ -14,7 +14,6 @@ use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCat use enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory; use enums::by_table::media_files::media_file_origin_model_type::MediaFileOriginModelType; use enums::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::common::visibility::Visibility; use errors::AnyhowResult; @@ -42,7 +41,6 @@ pub struct MediaFileForElasticsearchRecord { pub maybe_origin_filename: Option, - pub is_batch_generated: bool, pub maybe_batch_token: Option, pub is_user_upload: bool, @@ -59,11 +57,8 @@ pub struct MediaFileForElasticsearchRecord { pub maybe_style_transfer_source_media_file_token: Option, pub maybe_scene_source_media_file_token: Option, - pub nsfw_status: String, - pub media_type: MediaFileType, pub media_class: MediaFileClass, - pub maybe_media_subtype: Option, pub maybe_mime_type: Option, pub file_size_bytes: u64, @@ -159,7 +154,6 @@ pub async fn list_media_files_for_elastic_search_backfill_using_cursor( maybe_origin_model_type: record.maybe_origin_model_type, maybe_origin_model_token: record.maybe_origin_model_token, maybe_origin_filename: record.maybe_origin_filename, - is_batch_generated: i8_to_bool(record.is_batch_generated), maybe_batch_token: record.maybe_batch_token, is_user_upload: i8_to_bool(record.is_user_upload), is_intermediate_system_file: i8_to_bool(record.is_intermediate_system_file), @@ -170,10 +164,8 @@ pub async fn list_media_files_for_elastic_search_backfill_using_cursor( maybe_cover_image_public_bucket_extension: record.maybe_cover_image_public_bucket_extension, maybe_style_transfer_source_media_file_token: record.maybe_style_transfer_source_media_file_token, maybe_scene_source_media_file_token: record.maybe_scene_source_media_file_token, - nsfw_status: record.nsfw_status, media_type: record.media_type, media_class: record.media_class, - maybe_media_subtype: record.maybe_media_subtype, maybe_mime_type: record.maybe_mime_type, file_size_bytes: record.file_size_bytes as u64, maybe_duration_millis: record.maybe_duration_millis.map(|d| d as u64), @@ -222,7 +214,6 @@ SELECT m.maybe_origin_model_token, m.maybe_origin_filename, - m.is_batch_generated, m.maybe_batch_token, m.is_user_upload, @@ -238,11 +229,8 @@ SELECT m.maybe_style_transfer_source_media_file_token, m.maybe_scene_source_media_file_token, - m.nsfw_status, - m.media_type, m.media_class, - m.maybe_media_subtype, m.maybe_mime_type, m.file_size_bytes, @@ -372,7 +360,6 @@ struct RawRecord { pub maybe_origin_filename: Option, - pub is_batch_generated: i8, pub maybe_batch_token: Option, pub is_user_upload: i8, @@ -389,11 +376,8 @@ struct RawRecord { pub maybe_style_transfer_source_media_file_token: Option, pub maybe_scene_source_media_file_token: Option, - pub nsfw_status: String, - pub media_type: MediaFileType, pub media_class: MediaFileClass, - pub maybe_media_subtype: Option, pub maybe_mime_type: Option, pub file_size_bytes: i32, @@ -459,7 +443,6 @@ impl FromRow<'_, MySqlRow> for RawRecord { maybe_origin_model_token: row.try_get("maybe_origin_model_token")?, maybe_origin_filename: row.try_get("maybe_origin_filename")?, - is_batch_generated: row.try_get("is_batch_generated")?, maybe_batch_token: BatchGenerationToken::try_from_mysql_row_nullable(row, "maybe_batch_token")?, is_user_upload: row.try_get("is_user_upload")?, @@ -475,11 +458,8 @@ impl FromRow<'_, MySqlRow> for RawRecord { maybe_style_transfer_source_media_file_token: row.try_get("maybe_style_transfer_source_media_file_token")?, maybe_scene_source_media_file_token: row.try_get("maybe_scene_source_media_file_token")?, - nsfw_status: row.try_get("nsfw_status")?, - media_type: MediaFileType::try_from_mysql_row(row, "media_type")?, media_class: MediaFileClass::try_from_mysql_row(row, "media_class")?, - maybe_media_subtype: MediaFileSubtype::try_from_mysql_row_nullable(row, "maybe_media_subtype")?, maybe_mime_type: row.try_get("maybe_mime_type")?, file_size_bytes: row.try_get("file_size_bytes")?, diff --git a/crates/schema/database/mysql_queries/src/queries/media_files/upsert/upsert_media_file_from_file_upload.rs b/crates/schema/database/mysql_queries/src/queries/media_files/upsert/upsert_media_file_from_file_upload.rs index 12d74bbecc..0913f64eee 100644 --- a/crates/schema/database/mysql_queries/src/queries/media_files/upsert/upsert_media_file_from_file_upload.rs +++ b/crates/schema/database/mysql_queries/src/queries/media_files/upsert/upsert_media_file_from_file_upload.rs @@ -8,7 +8,6 @@ use enums::by_table::media_files::media_file_class::MediaFileClass; use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory; use enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory; use enums::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::common::visibility::Visibility; use errors::AnyhowResult; @@ -43,8 +42,6 @@ pub struct UpsertMediaFileFromUploadArgs<'a> { pub upload_type: UploadType, - pub maybe_media_subtype: Option, - pub maybe_mime_type: Option<&'a str>, pub file_size_bytes: u64, pub duration_millis: u64, @@ -115,7 +112,6 @@ SET maybe_engine_category = ?, maybe_animation_type = ?, - maybe_media_subtype = ?, maybe_mime_type = ?, file_size_bytes = ?, @@ -150,7 +146,6 @@ ON DUPLICATE KEY UPDATE maybe_engine_category = ?, maybe_animation_type = ?, - maybe_media_subtype = ?, maybe_mime_type = ?, file_size_bytes = ?, @@ -185,8 +180,6 @@ ON DUPLICATE KEY UPDATE args.maybe_engine_category.map(|s| s.to_str()), args.maybe_animation_type.map(|s| s.to_str()), - args.maybe_media_subtype.map(|s| s.to_str()), - args.maybe_mime_type, args.file_size_bytes, @@ -216,8 +209,6 @@ ON DUPLICATE KEY UPDATE args.maybe_engine_category.map(|s| s.to_str()), args.maybe_animation_type.map(|s| s.to_str()), - args.maybe_media_subtype.map(|s| s.to_str()), - args.maybe_mime_type, args.file_size_bytes, diff --git a/crates/schema/database/mysql_queries/src/queries/users/user_bookmarks/list_user_bookmarks_result.rs b/crates/schema/database/mysql_queries/src/queries/users/user_bookmarks/list_user_bookmarks_result.rs index e60b4330f9..690ae8f6f6 100644 --- a/crates/schema/database/mysql_queries/src/queries/users/user_bookmarks/list_user_bookmarks_result.rs +++ b/crates/schema/database/mysql_queries/src/queries/users/user_bookmarks/list_user_bookmarks_result.rs @@ -183,9 +183,18 @@ impl RawUserBookmarkRecord { MediaFileType::Jpg => Some("image media file".to_string()), MediaFileType::Png => Some("image media file".to_string()), MediaFileType::Gif => Some("image media file".to_string()), + MediaFileType::Webp => Some("image media file".to_string()), MediaFileType::Mp4 => Some("video media file".to_string()), + MediaFileType::Webm => Some("video media file".to_string()), + MediaFileType::Mov => Some("video media file".to_string()), MediaFileType::Wav => Some("audio media file".to_string()), MediaFileType::Mp3 => Some("audio media file".to_string()), + MediaFileType::Opus => Some("audio media file".to_string()), + MediaFileType::Ogg => Some("audio media file".to_string()), + MediaFileType::Aac => Some("audio media file".to_string()), + MediaFileType::M4a => Some("audio media file".to_string()), + MediaFileType::Flac => Some("audio media file".to_string()), + MediaFileType::Json => Some("project file".to_string()), }), UserBookmarkEntityType::VoiceConversionModel => self.maybe_descriptive_text_voice_conversion_model_title, UserBookmarkEntityType::ZsVoice => self.maybe_descriptive_text_zs_voice_title, diff --git a/crates/schema/public/enums/src/by_table/media_files/media_file_type.rs b/crates/schema/public/enums/src/by_table/media_files/media_file_type.rs index 179cd39001..0204daa0a7 100644 --- a/crates/schema/public/enums/src/by_table/media_files/media_file_type.rs +++ b/crates/schema/public/enums/src/by_table/media_files/media_file_type.rs @@ -6,6 +6,8 @@ use strum::EnumCount; use strum::EnumIter; use utoipa::ToSchema; +use crate::by_table::media_files::media_file_class::MediaFileClass; + /// Used in the `media_files` table in a `VARCHAR(16)` field. /// /// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. @@ -90,6 +92,36 @@ pub enum MediaFileType { /// Mp3 audio Mp3, + + // ========================= LESS SUPPORT FOR THE FILES BELOW THIS LINE ========================= // + + /// Webp images + Webp, + + /// Webm videos + Webm, + + /// QuickTime videos + Mov, + + /// Opus audio + Opus, + + /// Ogg audio + Ogg, + + /// AAC audio + Aac, + + /// M4a audio + M4a, + + /// FLAC audio + Flac, + + /// Generic JSON documents (eg. internal project files). + /// NB: 3D scene files predate this and use `scene_json` instead. + Json, } // TODO(bt, 2022-12-21): This desperately needs MySQL integration tests! @@ -110,7 +142,53 @@ impl MediaFileType { pub fn is_jpg_or_png_or_legacy_image(&self) -> bool { matches!(self, Self::Jpg | Self::Png | Self::Image) } - + + /// Any image format, including the legacy coarse `Image` type. + pub fn is_image(&self) -> bool { + matches!(self, Self::Image | Self::Jpg | Self::Png | Self::Gif | Self::Webp) + } + + /// The broad `media_class` this file format belongs to. + pub fn to_media_class(&self) -> MediaFileClass { + match self { + Self::Audio + | Self::Wav + | Self::Mp3 + | Self::Opus + | Self::Ogg + | Self::Aac + | Self::M4a + | Self::Flac => MediaFileClass::Audio, + + Self::Image + | Self::Jpg + | Self::Png + | Self::Gif + | Self::Webp => MediaFileClass::Image, + + Self::Video + | Self::Mp4 + | Self::Webm + | Self::Mov => MediaFileClass::Video, + + Self::Bvh + | Self::Fbx + | Self::Obj + | Self::Glb + | Self::Gltf + | Self::Spz + | Self::SceneRon + | Self::SceneJson + | Self::Pmd + | Self::Vmd + | Self::Pmx + | Self::Csv => MediaFileClass::Dimensional, + + // Generic project documents don't have a class yet. + Self::Json => MediaFileClass::Unknown, + } + } + /// Returns the `MediaFileType` if the mime type matches one of the known types. /// This is not exhaustive. /// (NB: In general we shouldn't keep much application logic in the `enums` crate, @@ -119,19 +197,80 @@ impl MediaFileType { match mime_type { "image/jpeg" => Some(Self::Jpg), "image/png" => Some(Self::Png), + "image/gif" => Some(Self::Gif), + "image/webp" => Some(Self::Webp), "video/mp4" => Some(Self::Mp4), + "video/webm" => Some(Self::Webm), + "video/quicktime" => Some(Self::Mov), + "audio/wav" => Some(Self::Wav), + "audio/x-wav" => Some(Self::Wav), + "audio/wave" => Some(Self::Wav), + "audio/mpeg" => Some(Self::Mp3), + "audio/mp3" => Some(Self::Mp3), + "audio/opus" => Some(Self::Opus), + "audio/ogg" => Some(Self::Ogg), + "audio/aac" => Some(Self::Aac), + "audio/m4a" => Some(Self::M4a), + "audio/x-m4a" => Some(Self::M4a), + "audio/mp4" => Some(Self::M4a), + "audio/flac" => Some(Self::Flac), + "audio/x-flac" => Some(Self::Flac), "model/gltf-binary" => Some(Self::Glb), + "model/gltf+json" => Some(Self::Gltf), "model/fbx" => Some(Self::Fbx), "application/fbx" => Some(Self::Fbx), "model/obj" => Some(Self::Obj), - //"audio/wav" => Some(Self::Wav), // NB: Not sure if this is correct - //"audio/mpeg" => Some(Self::Mp3), // NB: Not sure if this is correct - //"image/gif" => Some(Self::Gif), // NB: Not sure if this is correct - //"model/gltf+json" => Some(Self::Gltf), // NB: Not sure if this is correct _ => None, } } - + + /// Tries the input as a filename first, then as a bare extension. + /// Useful as a fallback when `try_from_mime_type` fails. + pub fn try_from_filename_or_extension(filename_or_extension: &str) -> Option { + Self::try_from_filename(filename_or_extension) + .or_else(|| Self::try_from_extension(filename_or_extension)) + } + + /// Returns the `MediaFileType` for a filename by examining its extension. + pub fn try_from_filename(filename: &str) -> Option { + let (_, extension) = filename.trim().rsplit_once('.')?; + Self::try_from_extension(extension) + } + + /// Returns the `MediaFileType` for a known file extension. + /// Accepts extensions with or without a leading dot, in any letter case. + pub fn try_from_extension(extension: &str) -> Option { + let extension = extension.trim().trim_start_matches('.').to_ascii_lowercase(); + match extension.as_str() { + "jpg" | "jpeg" => Some(Self::Jpg), + "png" => Some(Self::Png), + "gif" => Some(Self::Gif), + "webp" => Some(Self::Webp), + "mp4" => Some(Self::Mp4), + "webm" => Some(Self::Webm), + "mov" => Some(Self::Mov), + "wav" => Some(Self::Wav), + "mp3" => Some(Self::Mp3), + "opus" => Some(Self::Opus), + "ogg" => Some(Self::Ogg), + "aac" => Some(Self::Aac), + "m4a" => Some(Self::M4a), + "flac" => Some(Self::Flac), + "bvh" => Some(Self::Bvh), + "fbx" => Some(Self::Fbx), + "obj" => Some(Self::Obj), + "glb" => Some(Self::Glb), + "gltf" => Some(Self::Gltf), + "spz" => Some(Self::Spz), + "pmd" => Some(Self::Pmd), + "vmd" => Some(Self::Vmd), + "pmx" => Some(Self::Pmx), + "csv" => Some(Self::Csv), + "json" => Some(Self::Json), + _ => None, + } + } + pub fn to_str(&self) -> &'static str { match self { Self::Audio => "audio", @@ -155,6 +294,15 @@ impl MediaFileType { Self::Mp4 => "mp4", Self::Wav => "wav", Self::Mp3 => "mp3", + Self::Webp => "webp", + Self::Webm => "webm", + Self::Mov => "mov", + Self::Opus => "opus", + Self::Ogg => "ogg", + Self::Aac => "aac", + Self::M4a => "m4a", + Self::Flac => "flac", + Self::Json => "json", } } @@ -181,6 +329,15 @@ impl MediaFileType { "mp4" => Ok(Self::Mp4), "wav" => Ok(Self::Wav), "mp3" => Ok(Self::Mp3), + "webp" => Ok(Self::Webp), + "webm" => Ok(Self::Webm), + "mov" => Ok(Self::Mov), + "opus" => Ok(Self::Opus), + "ogg" => Ok(Self::Ogg), + "aac" => Ok(Self::Aac), + "m4a" => Ok(Self::M4a), + "flac" => Ok(Self::Flac), + "json" => Ok(Self::Json), _ => Err(format!("invalid value: {:?}", value)), } } @@ -210,12 +367,22 @@ impl MediaFileType { Self::Mp4, Self::Wav, Self::Mp3, + Self::Webp, + Self::Webm, + Self::Mov, + Self::Opus, + Self::Ogg, + Self::Aac, + Self::M4a, + Self::Flac, + Self::Json, ]) } } #[cfg(test)] mod tests { + use crate::by_table::media_files::media_file_class::MediaFileClass; use crate::by_table::media_files::media_file_type::MediaFileType; use crate::test_helpers::assert_serialization; @@ -268,6 +435,15 @@ mod tests { assert_serialization(MediaFileType::Mp4, "mp4"); assert_serialization(MediaFileType::Wav, "wav"); assert_serialization(MediaFileType::Mp3, "mp3"); + assert_serialization(MediaFileType::Webp, "webp"); + assert_serialization(MediaFileType::Webm, "webm"); + assert_serialization(MediaFileType::Mov, "mov"); + assert_serialization(MediaFileType::Opus, "opus"); + assert_serialization(MediaFileType::Ogg, "ogg"); + assert_serialization(MediaFileType::Aac, "aac"); + assert_serialization(MediaFileType::M4a, "m4a"); + assert_serialization(MediaFileType::Flac, "flac"); + assert_serialization(MediaFileType::Json, "json"); } } @@ -296,6 +472,15 @@ mod tests { assert_eq!(MediaFileType::Mp4.to_str(), "mp4"); assert_eq!(MediaFileType::Wav.to_str(), "wav"); assert_eq!(MediaFileType::Mp3.to_str(), "mp3"); + assert_eq!(MediaFileType::Webp.to_str(), "webp"); + assert_eq!(MediaFileType::Webm.to_str(), "webm"); + assert_eq!(MediaFileType::Mov.to_str(), "mov"); + assert_eq!(MediaFileType::Opus.to_str(), "opus"); + assert_eq!(MediaFileType::Ogg.to_str(), "ogg"); + assert_eq!(MediaFileType::Aac.to_str(), "aac"); + assert_eq!(MediaFileType::M4a.to_str(), "m4a"); + assert_eq!(MediaFileType::Flac.to_str(), "flac"); + assert_eq!(MediaFileType::Json.to_str(), "json"); } #[test] @@ -320,8 +505,185 @@ mod tests { assert_eq!(MediaFileType::from_str("mp4").unwrap(), MediaFileType::Mp4); assert_eq!(MediaFileType::from_str("wav").unwrap(), MediaFileType::Wav); assert_eq!(MediaFileType::from_str("mp3").unwrap(), MediaFileType::Mp3); + assert_eq!(MediaFileType::from_str("webp").unwrap(), MediaFileType::Webp); + assert_eq!(MediaFileType::from_str("webm").unwrap(), MediaFileType::Webm); + assert_eq!(MediaFileType::from_str("mov").unwrap(), MediaFileType::Mov); + assert_eq!(MediaFileType::from_str("opus").unwrap(), MediaFileType::Opus); + assert_eq!(MediaFileType::from_str("ogg").unwrap(), MediaFileType::Ogg); + assert_eq!(MediaFileType::from_str("aac").unwrap(), MediaFileType::Aac); + assert_eq!(MediaFileType::from_str("m4a").unwrap(), MediaFileType::M4a); + assert_eq!(MediaFileType::from_str("flac").unwrap(), MediaFileType::Flac); + assert_eq!(MediaFileType::from_str("json").unwrap(), MediaFileType::Json); assert!(MediaFileType::from_str("foo").is_err()); } + + #[test] + fn to_media_class() { + assert_eq!(MediaFileType::Audio.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Image.to_media_class(), MediaFileClass::Image); + assert_eq!(MediaFileType::Video.to_media_class(), MediaFileClass::Video); + assert_eq!(MediaFileType::Bvh.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Fbx.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Obj.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Glb.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Gltf.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Spz.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::SceneRon.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::SceneJson.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Pmd.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Vmd.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Pmx.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Csv.to_media_class(), MediaFileClass::Dimensional); + assert_eq!(MediaFileType::Jpg.to_media_class(), MediaFileClass::Image); + assert_eq!(MediaFileType::Png.to_media_class(), MediaFileClass::Image); + assert_eq!(MediaFileType::Gif.to_media_class(), MediaFileClass::Image); + assert_eq!(MediaFileType::Webp.to_media_class(), MediaFileClass::Image); + assert_eq!(MediaFileType::Mp4.to_media_class(), MediaFileClass::Video); + assert_eq!(MediaFileType::Webm.to_media_class(), MediaFileClass::Video); + assert_eq!(MediaFileType::Mov.to_media_class(), MediaFileClass::Video); + assert_eq!(MediaFileType::Wav.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Mp3.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Opus.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Ogg.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Aac.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::M4a.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Flac.to_media_class(), MediaFileClass::Audio); + assert_eq!(MediaFileType::Json.to_media_class(), MediaFileClass::Unknown); + } + } + + mod format_detection { + use super::*; + + #[test] + fn try_from_mime_type() { + assert_eq!(MediaFileType::try_from_mime_type("image/jpeg"), Some(MediaFileType::Jpg)); + assert_eq!(MediaFileType::try_from_mime_type("image/png"), Some(MediaFileType::Png)); + assert_eq!(MediaFileType::try_from_mime_type("image/gif"), Some(MediaFileType::Gif)); + assert_eq!(MediaFileType::try_from_mime_type("image/webp"), Some(MediaFileType::Webp)); + assert_eq!(MediaFileType::try_from_mime_type("video/mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_mime_type("video/webm"), Some(MediaFileType::Webm)); + assert_eq!(MediaFileType::try_from_mime_type("video/quicktime"), Some(MediaFileType::Mov)); + assert_eq!(MediaFileType::try_from_mime_type("audio/wav"), Some(MediaFileType::Wav)); + assert_eq!(MediaFileType::try_from_mime_type("audio/x-wav"), Some(MediaFileType::Wav)); + assert_eq!(MediaFileType::try_from_mime_type("audio/wave"), Some(MediaFileType::Wav)); + assert_eq!(MediaFileType::try_from_mime_type("audio/mpeg"), Some(MediaFileType::Mp3)); + assert_eq!(MediaFileType::try_from_mime_type("audio/mp3"), Some(MediaFileType::Mp3)); + assert_eq!(MediaFileType::try_from_mime_type("audio/opus"), Some(MediaFileType::Opus)); + assert_eq!(MediaFileType::try_from_mime_type("audio/ogg"), Some(MediaFileType::Ogg)); + assert_eq!(MediaFileType::try_from_mime_type("audio/aac"), Some(MediaFileType::Aac)); + assert_eq!(MediaFileType::try_from_mime_type("audio/m4a"), Some(MediaFileType::M4a)); + assert_eq!(MediaFileType::try_from_mime_type("audio/x-m4a"), Some(MediaFileType::M4a)); + assert_eq!(MediaFileType::try_from_mime_type("audio/mp4"), Some(MediaFileType::M4a)); + assert_eq!(MediaFileType::try_from_mime_type("audio/flac"), Some(MediaFileType::Flac)); + assert_eq!(MediaFileType::try_from_mime_type("audio/x-flac"), Some(MediaFileType::Flac)); + assert_eq!(MediaFileType::try_from_mime_type("model/gltf-binary"), Some(MediaFileType::Glb)); + assert_eq!(MediaFileType::try_from_mime_type("model/gltf+json"), Some(MediaFileType::Gltf)); + assert_eq!(MediaFileType::try_from_mime_type("model/fbx"), Some(MediaFileType::Fbx)); + assert_eq!(MediaFileType::try_from_mime_type("application/fbx"), Some(MediaFileType::Fbx)); + assert_eq!(MediaFileType::try_from_mime_type("model/obj"), Some(MediaFileType::Obj)); + } + + #[test] + fn try_from_mime_type_unknown_mimes() { + // NB: application/json is deliberately unmapped — scene JSON, mood boards, + // and other project files can't be told apart by mime alone. + assert_eq!(MediaFileType::try_from_mime_type("application/json"), None); + // NB: application/gzip is the mime for spz splats, but gzip isn't + // necessarily a splat, so it stays unmapped. + assert_eq!(MediaFileType::try_from_mime_type("application/gzip"), None); + assert_eq!(MediaFileType::try_from_mime_type("application/octet-stream"), None); + assert_eq!(MediaFileType::try_from_mime_type("text/plain"), None); + assert_eq!(MediaFileType::try_from_mime_type(""), None); + assert_eq!(MediaFileType::try_from_mime_type("IMAGE/PNG"), None); + } + + #[test] + fn try_from_extension() { + assert_eq!(MediaFileType::try_from_extension("jpg"), Some(MediaFileType::Jpg)); + assert_eq!(MediaFileType::try_from_extension("jpeg"), Some(MediaFileType::Jpg)); + assert_eq!(MediaFileType::try_from_extension("png"), Some(MediaFileType::Png)); + assert_eq!(MediaFileType::try_from_extension("gif"), Some(MediaFileType::Gif)); + assert_eq!(MediaFileType::try_from_extension("webp"), Some(MediaFileType::Webp)); + assert_eq!(MediaFileType::try_from_extension("mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_extension("webm"), Some(MediaFileType::Webm)); + assert_eq!(MediaFileType::try_from_extension("mov"), Some(MediaFileType::Mov)); + assert_eq!(MediaFileType::try_from_extension("wav"), Some(MediaFileType::Wav)); + assert_eq!(MediaFileType::try_from_extension("mp3"), Some(MediaFileType::Mp3)); + assert_eq!(MediaFileType::try_from_extension("opus"), Some(MediaFileType::Opus)); + assert_eq!(MediaFileType::try_from_extension("ogg"), Some(MediaFileType::Ogg)); + assert_eq!(MediaFileType::try_from_extension("aac"), Some(MediaFileType::Aac)); + assert_eq!(MediaFileType::try_from_extension("m4a"), Some(MediaFileType::M4a)); + assert_eq!(MediaFileType::try_from_extension("flac"), Some(MediaFileType::Flac)); + assert_eq!(MediaFileType::try_from_extension("bvh"), Some(MediaFileType::Bvh)); + assert_eq!(MediaFileType::try_from_extension("fbx"), Some(MediaFileType::Fbx)); + assert_eq!(MediaFileType::try_from_extension("obj"), Some(MediaFileType::Obj)); + assert_eq!(MediaFileType::try_from_extension("glb"), Some(MediaFileType::Glb)); + assert_eq!(MediaFileType::try_from_extension("gltf"), Some(MediaFileType::Gltf)); + assert_eq!(MediaFileType::try_from_extension("spz"), Some(MediaFileType::Spz)); + assert_eq!(MediaFileType::try_from_extension("pmd"), Some(MediaFileType::Pmd)); + assert_eq!(MediaFileType::try_from_extension("vmd"), Some(MediaFileType::Vmd)); + assert_eq!(MediaFileType::try_from_extension("pmx"), Some(MediaFileType::Pmx)); + assert_eq!(MediaFileType::try_from_extension("csv"), Some(MediaFileType::Csv)); + assert_eq!(MediaFileType::try_from_extension("json"), Some(MediaFileType::Json)); + } + + #[test] + fn try_from_extension_normalization() { + // Leading dot + assert_eq!(MediaFileType::try_from_extension(".mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_extension(".spz"), Some(MediaFileType::Spz)); + // Case insensitivity + assert_eq!(MediaFileType::try_from_extension("JPG"), Some(MediaFileType::Jpg)); + assert_eq!(MediaFileType::try_from_extension(".WebP"), Some(MediaFileType::Webp)); + // Whitespace + assert_eq!(MediaFileType::try_from_extension(" png "), Some(MediaFileType::Png)); + assert_eq!(MediaFileType::try_from_extension(" .glb "), Some(MediaFileType::Glb)); + } + + #[test] + fn try_from_extension_unknown_extensions() { + assert_eq!(MediaFileType::try_from_extension("ron"), None); + assert_eq!(MediaFileType::try_from_extension("exe"), None); + assert_eq!(MediaFileType::try_from_extension("scene_json"), None); + assert_eq!(MediaFileType::try_from_extension("audio"), None); + assert_eq!(MediaFileType::try_from_extension(""), None); + assert_eq!(MediaFileType::try_from_extension("."), None); + } + + #[test] + fn try_from_filename() { + assert_eq!(MediaFileType::try_from_filename("photo.jpg"), Some(MediaFileType::Jpg)); + assert_eq!(MediaFileType::try_from_filename("PHOTO.JPEG"), Some(MediaFileType::Jpg)); + assert_eq!(MediaFileType::try_from_filename("clip.final.mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_filename("model.GLB"), Some(MediaFileType::Glb)); + assert_eq!(MediaFileType::try_from_filename("scene.spz"), Some(MediaFileType::Spz)); + assert_eq!(MediaFileType::try_from_filename("data.json"), Some(MediaFileType::Json)); + assert_eq!(MediaFileType::try_from_filename(" padded.png "), Some(MediaFileType::Png)); + // Failures + assert_eq!(MediaFileType::try_from_filename("archive.tar.gz"), None); + assert_eq!(MediaFileType::try_from_filename("noextension"), None); + assert_eq!(MediaFileType::try_from_filename("file."), None); + assert_eq!(MediaFileType::try_from_filename(".gitignore"), None); + assert_eq!(MediaFileType::try_from_filename(""), None); + // NB: a bare extension is not a filename (no dot separator) + assert_eq!(MediaFileType::try_from_filename("mp4"), None); + } + + #[test] + fn try_from_filename_or_extension() { + // Filenames + assert_eq!(MediaFileType::try_from_filename_or_extension("movie.mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_filename_or_extension("track.FLAC"), Some(MediaFileType::Flac)); + // Bare extensions, with and without a leading dot + assert_eq!(MediaFileType::try_from_filename_or_extension("mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_filename_or_extension(".mp4"), Some(MediaFileType::Mp4)); + assert_eq!(MediaFileType::try_from_filename_or_extension("webp"), Some(MediaFileType::Webp)); + // Failures + assert_eq!(MediaFileType::try_from_filename_or_extension("movie.xyz"), None); + assert_eq!(MediaFileType::try_from_filename_or_extension("unknown"), None); + assert_eq!(MediaFileType::try_from_filename_or_extension(""), None); + } } mod manual_variant_checks { @@ -330,7 +692,7 @@ mod tests { #[test] fn all_variants() { let mut variants = MediaFileType::all_variants(); - assert_eq!(variants.len(), 21); + assert_eq!(variants.len(), 30); assert_eq!(variants.pop_first(), Some(MediaFileType::Audio)); assert_eq!(variants.pop_first(), Some(MediaFileType::Image)); assert_eq!(variants.pop_first(), Some(MediaFileType::Video)); @@ -352,6 +714,15 @@ mod tests { assert_eq!(variants.pop_first(), Some(MediaFileType::Mp4)); assert_eq!(variants.pop_first(), Some(MediaFileType::Wav)); assert_eq!(variants.pop_first(), Some(MediaFileType::Mp3)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Webp)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Webm)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Mov)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Opus)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Ogg)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Aac)); + assert_eq!(variants.pop_first(), Some(MediaFileType::M4a)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Flac)); + assert_eq!(variants.pop_first(), Some(MediaFileType::Json)); assert_eq!(variants.pop_first(), None); } } diff --git a/crates/service/job/deprecated/es-update-job/src/tasks/update_engine_media_files/update_engine_media_files.rs b/crates/service/job/deprecated/es-update-job/src/tasks/update_engine_media_files/update_engine_media_files.rs index 17f83b9b58..d1ad3216dc 100644 --- a/crates/service/job/deprecated/es-update-job/src/tasks/update_engine_media_files/update_engine_media_files.rs +++ b/crates/service/job/deprecated/es-update-job/src/tasks/update_engine_media_files/update_engine_media_files.rs @@ -126,7 +126,6 @@ async fn create_document_from_record(elasticsearch: &Elasticsearch, record: Medi media_class: record.media_class, media_type: record.media_type, - maybe_media_subtype: record.maybe_media_subtype, maybe_engine_category: record.maybe_engine_category, maybe_animation_type: record.maybe_animation_type, diff --git a/crates/service/job/deprecated/inference_job/src/job/job_types/image_generation/sd/process_job_inference.rs b/crates/service/job/deprecated/inference_job/src/job/job_types/image_generation/sd/process_job_inference.rs index 50733c06fb..5188d13077 100644 --- a/crates/service/job/deprecated/inference_job/src/job/job_types/image_generation/sd/process_job_inference.rs +++ b/crates/service/job/deprecated/inference_job/src/job/job_types/image_generation/sd/process_job_inference.rs @@ -251,13 +251,8 @@ pub async fn process_job_inference( } }; - let media_type = match metadata.mimetype.as_ref() { - "image/png" => MediaFileType::Png, - "image/jpeg" => MediaFileType::Jpg, - "image/gif" => MediaFileType::Gif, - "image/webp" => MediaFileType::Image, // Fallback - _ => MediaFileType::Image, // Fallback - }; + let media_type = MediaFileType::try_from_mime_type(metadata.mimetype.as_ref()) + .unwrap_or(MediaFileType::Image); // Coarse fallback for unrecognized mimes // extra_file_modification_info: todo!(), // JSON ENCODED STRUCT let (media_file_token, _id) = insert_media_file_generic_from_job(InsertFromJobArgs { diff --git a/crates/service/job/deprecated/inference_job/src/job/job_types/render_engine_scene/render_engine_scene_to_video/process_job.rs b/crates/service/job/deprecated/inference_job/src/job/job_types/render_engine_scene/render_engine_scene_to_video/process_job.rs index ccb534b688..7d01f7995d 100644 --- a/crates/service/job/deprecated/inference_job/src/job/job_types/render_engine_scene/render_engine_scene_to_video/process_job.rs +++ b/crates/service/job/deprecated/inference_job/src/job/job_types/render_engine_scene/render_engine_scene_to_video/process_job.rs @@ -257,7 +257,9 @@ pub async fn process_job(args: BvhToWorkflowJobArgs<'_>) -> Result Some(MediaFileType::Audio), - "audio/m4a" /* .m4a */ => Some(MediaFileType::Audio), - "audio/mpeg" /* .mp3 */ => Some(MediaFileType::Audio), - "audio/ogg" /* .ogg */ => Some(MediaFileType::Audio), - "audio/opus" /* .opus */ => Some(MediaFileType::Audio), - "audio/x-flac" /* .flac */ => Some(MediaFileType::Audio), - "audio/x-wav" /* .wav */ => Some(MediaFileType::Audio), - // Image — `webp` has no dedicated variant yet - "image/gif" /* .gif */ => Some(MediaFileType::Gif), - "image/jpeg" /* .jpg */ => Some(MediaFileType::Jpg), - "image/png" /* .png */ => Some(MediaFileType::Png), - "image/webp" /* .webp */ => Some(MediaFileType::Image), // TODO: Replace. - // Video - "video/mp4" /* .mp4 */ => Some(MediaFileType::Video), - "video/quicktime" /* .mov */ => Some(MediaFileType::Video), - "video/webm" /* .webm */ => Some(MediaFileType::Video), - _ => None, - }; + // NB: mimetypes are gated by the allow-list check above; this only maps + // the already-permitted set to concrete media types. + media_file_type = MediaFileType::try_from_mime_type(mimetype); let do_audio_decode = match mimetype { // TODO: Revisit when Safari can send us this metadata consistently diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/image_studio/upload/upload_snapshot_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/image_studio/upload/upload_snapshot_media_file_handler.rs index 6f5733a9ad..cef5836164 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/image_studio/upload/upload_snapshot_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/image_studio/upload/upload_snapshot_media_file_handler.rs @@ -236,13 +236,11 @@ pub async fn upload_snapshot_media_file_handler( MediaFileUploadError::ServerError })?; - let media_file_type = match mimetype.as_str() { - "image/jpeg" => MediaFileType::Jpg, - "image/png" => MediaFileType::Png, - "image/gif" => MediaFileType::Gif, - "image/webp" => MediaFileType::Image, // Fallback - _ => MediaFileType::Image, // Fallback - }; + let maybe_upload_filename = form.snapshot.file_name.as_deref(); + + let media_file_type = MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Image); // Coarse fallback for unrecognized files let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Image), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/set_media_file_cover_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/set_media_file_cover_image_handler.rs index 8a8c75774a..f412dbf342 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/set_media_file_cover_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/set_media_file_cover_image_handler.rs @@ -129,9 +129,9 @@ pub async fn set_media_file_cover_image_handler( //let can_use_image = media_file.creator_set_visibility == Visibility::Public // && media_file.media_type == MediaFileType::Image; - let can_use_image = media_file.media_type == MediaFileType::Image; + let can_use_image = media_file.media_type.is_image(); - if !can_use_image { + if !can_use_image { return Err(CommonWebError::BadInputWithSimpleMessage("Invalid media file token.".to_string())); } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs index 30e9abc827..a86fb2cc52 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs @@ -10,7 +10,6 @@ use chrono::{DateTime, Utc}; use enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType; use enums::by_table::media_files::media_file_class::MediaFileClass; use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::by_table::model_weights::weights_category::WeightsCategory; use enums::by_table::model_weights::weights_types::WeightsType; @@ -79,11 +78,6 @@ pub struct BatchMediaFileInfo { /// this describes the animation regime used or supported. pub maybe_animation_type: Option, - /// If the media file has a subtype, we'll report it. - /// This is mostly used for Bevy engine files. - #[deprecated(note="This was for the Bevy engine. Do not use.")] - pub maybe_media_subtype: Option, - /// Extension for the engine to load over remote:// URLs. #[deprecated(note="This was for the Bevy engine. Do not use.")] pub maybe_engine_extension: Option, @@ -289,7 +283,6 @@ pub async fn batch_get_media_files_handler( media_type: result.media_type, maybe_engine_category: result.maybe_engine_category, maybe_animation_type: result.maybe_animation_type, - maybe_media_subtype: result.maybe_media_subtype, maybe_engine_extension, maybe_batch_token: result.maybe_batch_token, media_links: MediaLinksBuilder::from_media_path_and_env( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs index 94bd867e3d..510d8a26f1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs @@ -19,7 +19,6 @@ use chrono::{DateTime, Utc}; use enums::by_table::media_files::media_file_animation_type::MediaFileAnimationType; use enums::by_table::media_files::media_file_class::MediaFileClass; use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory; -use enums::by_table::media_files::media_file_subtype::MediaFileSubtype; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::by_table::model_weights::weights_category::WeightsCategory; use enums::by_table::model_weights::weights_types::WeightsType; @@ -69,11 +68,6 @@ pub struct MediaFileInfo { /// this describes the animation regime used or supported. pub maybe_animation_type: Option, - /// If the media file has a subtype, we'll report it. - /// This is mostly used for Bevy engine files. - #[deprecated(note="This was for the Bevy engine. Do not use.")] - pub maybe_media_subtype: Option, - /// Extension for the engine to load over remote:// URLs. #[deprecated(note="This was for the Bevy engine. Do not use.")] pub maybe_engine_extension: Option, @@ -321,8 +315,6 @@ async fn modern_media_file_lookup( media_type: result.media_type, maybe_engine_category: result.maybe_engine_category, maybe_animation_type: result.maybe_animation_type, - // maybe_media_subtype: result.maybe_media_subtype, - maybe_media_subtype: None, // NB(bt,2024-07-25): Stop populating field for consumers. maybe_engine_extension, maybe_batch_token: result.maybe_batch_token, maybe_scene_source_media_file_token: result.maybe_scene_source_media_file_token, @@ -460,7 +452,6 @@ async fn emulate_media_file_with_legacy_tts_result_lookup( media_type: MediaFileType::Audio, // NB: Always audio maybe_engine_category: None, maybe_animation_type: None, - maybe_media_subtype: None, maybe_engine_extension: None, maybe_batch_token: None, maybe_scene_source_media_file_token: None, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_audio_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_audio_media_file_handler.rs index 816e5e8964..226dc45ddc 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_audio_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_audio_media_file_handler.rs @@ -331,9 +331,13 @@ pub async fn upload_audio_media_file_handler( UploadType::Filesystem }; + let maybe_upload_filename = form.file.file_name.as_deref(); + let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Audio), - media_file_type: MediaFileType::Audio, + media_file_type: MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Audio), // Coarse fallback for unrecognized files maybe_creator_user_token: maybe_user_token, maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs index 18494d46e8..6f15b9499d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs @@ -204,26 +204,11 @@ pub async fn process_upload_media_file( // do not have any open issues filed. They may simply be too old: // - .wma (audio/x-ms-wma) // - .avi (video/x-msvideo) - media_file_type = match mimetype { - // Audio - "audio/aac" /* .aac */ => Some(MediaFileType::Audio), - "audio/m4a" /* .m4a */ => Some(MediaFileType::Audio), - "audio/mpeg" /* .mp3 */ => Some(MediaFileType::Audio), - "audio/ogg" /* .ogg */ => Some(MediaFileType::Audio), - "audio/opus" /* .opus */ => Some(MediaFileType::Audio), - "audio/x-flac" /* .flac */ => Some(MediaFileType::Audio), - "audio/x-wav" /* .wav */ => Some(MediaFileType::Audio), - // Image — `webp` has no dedicated variant yet - "image/gif" /* .gif */ => Some(MediaFileType::Gif), - "image/jpeg" /* .jpg */ => Some(MediaFileType::Jpg), - "image/png" /* .png */ => Some(MediaFileType::Png), - "image/webp" /* .webp */ => Some(MediaFileType::Image), - // Video - "video/mp4" /* .mp4 */ => Some(MediaFileType::Video), - "video/quicktime" /* .mov */ => Some(MediaFileType::Video), - "video/webm" /* .webm */ => Some(MediaFileType::Video), - _ => None, - }; + // NB: mimetypes are gated by the `allowed_mimetypes` check above; this only + // maps the already-permitted set to concrete media types. + let maybe_upload_filename = upload_media_request.file_name.as_deref(); + media_file_type = MediaFileType::try_from_mime_type(mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)); let do_audio_decode = match mimetype { // TODO: Revisit when Safari can send us this metadata consistently @@ -313,29 +298,7 @@ pub async fn process_upload_media_file( }, }; - let media_file_class = match media_file_type { - MediaFileType::Audio => MediaFileClass::Audio, - MediaFileType::Image => MediaFileClass::Image, - MediaFileType::Video => MediaFileClass::Video, - MediaFileType::Bvh => MediaFileClass::Dimensional, - MediaFileType::Fbx => MediaFileClass::Dimensional, - MediaFileType::Obj => MediaFileClass::Dimensional, - MediaFileType::Glb => MediaFileClass::Dimensional, - MediaFileType::Gltf => MediaFileClass::Dimensional, - MediaFileType::Spz => MediaFileClass::Dimensional, - MediaFileType::SceneRon => MediaFileClass::Dimensional, - MediaFileType::SceneJson => MediaFileClass::Dimensional, - MediaFileType::Pmd => MediaFileClass::Dimensional, - MediaFileType::Vmd => MediaFileClass::Dimensional, - MediaFileType::Csv => MediaFileClass::Dimensional, - MediaFileType::Pmx => MediaFileClass::Dimensional, - MediaFileType::Jpg => MediaFileClass::Image, - MediaFileType::Png => MediaFileClass::Image, - MediaFileType::Gif => MediaFileClass::Image, - MediaFileType::Mp4 => MediaFileClass::Video, - MediaFileType::Wav => MediaFileClass::Audio, - MediaFileType::Mp3 => MediaFileClass::Audio, - }; + let media_file_class = media_file_type.to_media_class(); let upload_type = match upload_media_request.media_source { MediaFileUploadSource::Unknown => UploadType::Filesystem, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_image_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_image_media_file_handler.rs index 4cfe0c9c0d..12395c9a87 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_image_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_image_media_file_handler.rs @@ -299,13 +299,11 @@ pub async fn upload_image_media_file_handler( UploadType::Filesystem }; - let media_file_type = match mimetype.as_str() { - "image/jpeg" => MediaFileType::Jpg, - "image/png" => MediaFileType::Png, - "image/gif" => MediaFileType::Gif, - "image/webp" => MediaFileType::Image, // Fallback - _ => MediaFileType::Image, // fallback - }; + let maybe_upload_filename = form.file.file_name.as_deref(); + + let media_file_type = MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Image); // Coarse fallback for unrecognized files let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Image), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_engine_asset_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_engine_asset_media_file_handler.rs index e92e285187..040e2099a1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_engine_asset_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_engine_asset_media_file_handler.rs @@ -389,11 +389,7 @@ fn validate_and_process_form( } }; - let media_class = match media_type { - MediaFileType::Jpg | MediaFileType::Png | MediaFileType::Gif => MediaFileClass::Image, - MediaFileType::Mp4 => MediaFileClass::Video, - _ => MediaFileClass::Dimensional, - }; + let media_class = media_type.to_media_class(); Ok(FileInfo { media_class, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_new/upload_new_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_new/upload_new_video_media_file_handler.rs index 75e5161195..1578e4d888 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_new/upload_new_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_new/upload_new_video_media_file_handler.rs @@ -504,9 +504,13 @@ pub async fn upload_new_video_media_file_handler( UploadType::Filesystem }; + let maybe_upload_filename = form.file.file_name.as_deref(); + let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Video), - media_file_type: MediaFileType::Video, + media_file_type: MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Video), // Coarse fallback for unrecognized files maybe_creator_user_token: maybe_user_token, maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_old/upload_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_old/upload_video_media_file_handler.rs index f6a9d9fb9d..1588e83b00 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_old/upload_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video_old/upload_video_media_file_handler.rs @@ -221,7 +221,8 @@ pub async fn upload_video_media_file_handler( // TODO(bt, 2024-02-22): This should be a transaction. let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Video), - media_file_type: MediaFileType::Video, + media_file_type: MediaFileType::try_from_mime_type(mimetype) + .unwrap_or(MediaFileType::Video), // Coarse fallback for unrecognized mimes maybe_creator_user_token: maybe_user_token, maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_engine_asset/write_engine_asset_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_engine_asset/write_engine_asset_media_file_handler.rs index 084dd703a4..45641071a0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_engine_asset/write_engine_asset_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_engine_asset/write_engine_asset_media_file_handler.rs @@ -231,7 +231,6 @@ pub async fn write_engine_asset_media_file_handler( media_file_type, maybe_engine_category: upload_media_request.maybe_engine_category, maybe_animation_type: upload_media_request.maybe_animation_type, - maybe_media_subtype: None, maybe_creator_user_token: maybe_user_token, maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_scene_file/write_scene_file_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_scene_file/write_scene_file_media_file_handler.rs index b87af3810c..3ee05ec4a5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_scene_file/write_scene_file_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upsert_upload/write_scene_file/write_scene_file_media_file_handler.rs @@ -219,7 +219,6 @@ pub async fn write_scene_file_media_file_handler( media_file_type: MediaFileType::SceneJson, maybe_engine_category: Some(MediaFileEngineCategory::Scene), maybe_animation_type: None, - maybe_media_subtype: None, maybe_creator_user_token: maybe_user_token, maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/media_uploads/upload_url_to_media_file.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/media_uploads/upload_url_to_media_file.rs index 3578bfa7c2..895d71ac70 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/media_uploads/upload_url_to_media_file.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/media_uploads/upload_url_to_media_file.rs @@ -202,15 +202,12 @@ impl MediaUploadKind { } fn media_file_type(&self, mimetype: &str) -> MediaFileType { - match self { - MediaUploadKind::Image => match mimetype { - "image/jpeg" => MediaFileType::Jpg, - "image/png" => MediaFileType::Png, - "image/gif" => MediaFileType::Gif, - _ => MediaFileType::Image, - }, - MediaUploadKind::Video => MediaFileType::Video, - MediaUploadKind::Audio => MediaFileType::Audio, - } + MediaFileType::try_from_mime_type(mimetype) + .unwrap_or(match self { + // Coarse fallbacks for unrecognized mimes + MediaUploadKind::Image => MediaFileType::Image, + MediaUploadKind::Video => MediaFileType::Video, + MediaUploadKind::Audio => MediaFileType::Audio, + }) } } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs index d2055f62b7..69ad357347 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_audio_media_file_handler.rs @@ -275,9 +275,13 @@ pub async fn omni_upload_audio_media_file_handler( UploadType::Filesystem }; + let maybe_upload_filename = form.file.file_name.as_deref(); + let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Audio), - media_file_type: MediaFileType::Audio, + media_file_type: MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Audio), // Coarse fallback for unrecognized files maybe_creator_user_token: maybe_user_token, // NB: AVT (anonymous visitor) tokens are a web-session concept; API-key callers have none. maybe_creator_anonymous_visitor_token: None, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs index a7efced045..0c4b1a5ed6 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_image_media_file_handler.rs @@ -259,13 +259,11 @@ pub async fn omni_upload_image_media_file_handler( UploadType::Filesystem }; - let media_file_type = match mimetype.as_str() { - "image/jpeg" => MediaFileType::Jpg, - "image/png" => MediaFileType::Png, - "image/gif" => MediaFileType::Gif, - "image/webp" => MediaFileType::Image, // Fallback - _ => MediaFileType::Image, // fallback - }; + let maybe_upload_filename = form.file.file_name.as_deref(); + + let media_file_type = MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Image); // Coarse fallback for unrecognized files let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Image), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs index 340a7f9010..6605bd1fa5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/upload/omni_upload_video_media_file_handler.rs @@ -456,9 +456,13 @@ pub async fn omni_upload_video_media_file_handler( UploadType::Filesystem }; + let maybe_upload_filename = form.file.file_name.as_deref(); + let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs { maybe_media_class: Some(MediaFileClass::Video), - media_file_type: MediaFileType::Video, + media_file_type: MediaFileType::try_from_mime_type(&mimetype) + .or_else(|| maybe_upload_filename.and_then(MediaFileType::try_from_filename_or_extension)) + .unwrap_or(MediaFileType::Video), // Coarse fallback for unrecognized files maybe_creator_user_token: maybe_user_token, // NB: AVT (anonymous visitor) tokens are a web-session concept; API-key callers have none. maybe_creator_anonymous_visitor_token: None, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/set_model_weight_cover_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/set_model_weight_cover_image_handler.rs index e0a8e18d38..964a5a5072 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/set_model_weight_cover_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/set_model_weight_cover_image_handler.rs @@ -134,9 +134,9 @@ pub async fn set_model_weight_cover_image_handler( //let can_use_image = media_file.creator_set_visibility == Visibility::Public // && media_file.media_type == MediaFileType::Image; - let can_use_image = media_file.media_type == MediaFileType::Image; + let can_use_image = media_file.media_type.is_image(); - if !can_use_image { + if !can_use_image { return Err(CommonWebError::BadInputWithSimpleMessage("Invalid media file token.".to_string())); } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs index 90a1c89e7b..549a91bbd0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs @@ -158,7 +158,7 @@ pub async fn update_weight_handler( let maybe_media_file_type = maybe_media_file.map(|media_file| media_file.media_type); match maybe_media_file_type { - Some(MediaFileType::Image) => cover_image = Some(CoverImageOption::SetCoverImage(media_file_token)), + Some(media_file_type) if media_file_type.is_image() => cover_image = Some(CoverImageOption::SetCoverImage(media_file_token)), None => return Err(CommonWebError::BadInputWithSimpleMessage("Media file does not exist".to_string())), _ => return Err(CommonWebError::BadInputWithSimpleMessage("Media file is the wrong type".to_string())), } diff --git a/frontend/apps/artcraft/test/app/Classes/ApiManager/MediaFileApi.test.ts b/frontend/apps/artcraft/test/app/Classes/ApiManager/MediaFileApi.test.ts index 71009add01..090ad63478 100644 --- a/frontend/apps/artcraft/test/app/Classes/ApiManager/MediaFileApi.test.ts +++ b/frontend/apps/artcraft/test/app/Classes/ApiManager/MediaFileApi.test.ts @@ -43,7 +43,6 @@ describe("MediaFilesApi", () => { }, maybe_duration_millis: 0, maybe_engine_category: "scene", - maybe_media_subtype: "mixamo", maybe_model_weight_info: { maybe_cover_image_public_bucket_path: "string", maybe_weight_creator: { diff --git a/frontend/libs/api/src/lib/enums/MediaFileType.ts b/frontend/libs/api/src/lib/enums/MediaFileType.ts index 4d26c3e62c..1496a22d18 100644 --- a/frontend/libs/api/src/lib/enums/MediaFileType.ts +++ b/frontend/libs/api/src/lib/enums/MediaFileType.ts @@ -31,28 +31,3 @@ export enum MediaFileType { None = "none", } -export enum MediaFileSubtype { - /// Animation file from Mixamo - /// Primarily used for FBX and GLB. - Mixamo = "mixamo", - - /// Animation file from MocapNet - /// Primarily used for BVH. - MocapNet = "mocap_net", - - /// Generic animation case - /// Used for BVH files, but can also pertain to animation-only files of other types. - AnimationOnly = "animation_only", - - // TODO(bt,2024-03-08): Migrate records and code, then remove - /// DEPRECATED: Use `SceneImport` instead. - Scene = "scene", - - /// Generic 3D scene file. - /// Can pertain to glTF, glB, FBX, etc. - SceneImport = "scene_import", - - /// Native Storyteller scene format. - /// Typically stored in a `.scn.ron` file. - StorytellerScene = "storyteller_scene", -} diff --git a/frontend/libs/api/src/lib/models/MediaFile.ts b/frontend/libs/api/src/lib/models/MediaFile.ts index 2c57e7ba3e..5fbdee793a 100644 --- a/frontend/libs/api/src/lib/models/MediaFile.ts +++ b/frontend/libs/api/src/lib/models/MediaFile.ts @@ -1,5 +1,5 @@ import { MediaFileClass } from "../enums/MediaFileClass"; -import { MediaFileType, MediaFileSubtype } from "../enums/MediaFileType"; +import { MediaFileType } from "../enums/MediaFileType"; import { WeightCategory } from "../enums/WeightCategory"; import { WeightType } from "../enums/WeightType"; import { UserInfo } from "./Users"; @@ -9,7 +9,6 @@ export interface MediaFile { media_type: MediaFileType; media_class: MediaFileClass | null; maybe_animation_type: string | null; - maybe_media_subtype: MediaFileSubtype | null; maybe_engine_extension: string | null; maybe_batch_token: string; maybe_original_filename: string | null; diff --git a/frontend/libs/components/pagescene/src/index.ts b/frontend/libs/components/pagescene/src/index.ts index 3efaa87a52..9d5affea12 100644 --- a/frontend/libs/components/pagescene/src/index.ts +++ b/frontend/libs/components/pagescene/src/index.ts @@ -50,7 +50,6 @@ export { FilterMediaClasses, FilterMediaType, MediaFileType, - MediaFileSubtype, MediaFileClass, ToastTypes, WeightCategory, diff --git a/frontend/libs/components/pagescene/src/lib/enums/MediaFileType.ts b/frontend/libs/components/pagescene/src/lib/enums/MediaFileType.ts index 12f5261c2f..9939e1d7b0 100644 --- a/frontend/libs/components/pagescene/src/lib/enums/MediaFileType.ts +++ b/frontend/libs/components/pagescene/src/lib/enums/MediaFileType.ts @@ -34,28 +34,3 @@ export enum MediaFileType { None = "none", } -export enum MediaFileSubtype { - /// Animation file from Mixamo - /// Primarily used for FBX and GLB. - Mixamo = "mixamo", - - /// Animation file from MocapNet - /// Primarily used for BVH. - MocapNet = "mocap_net", - - /// Generic animation case - /// Used for BVH files, but can also pertain to animation-only files of other types. - AnimationOnly = "animation_only", - - // TODO(bt,2024-03-08): Migrate records and code, then remove - /// DEPRECATED: Use `SceneImport` instead. - Scene = "scene", - - /// Generic 3D scene file. - /// Can pertain to glTF, glB, FBX, etc. - SceneImport = "scene_import", - - /// Native Storyteller scene format. - /// Typically stored in a `.scn.ron` file. - StorytellerScene = "storyteller_scene", -} diff --git a/frontend/libs/components/pagescene/src/lib/models/mediaInfo.ts b/frontend/libs/components/pagescene/src/lib/models/mediaInfo.ts index 860d375e9a..b43cddfe64 100644 --- a/frontend/libs/components/pagescene/src/lib/models/mediaInfo.ts +++ b/frontend/libs/components/pagescene/src/lib/models/mediaInfo.ts @@ -2,7 +2,6 @@ import { UserDetailsLight } from "./types"; import { MediaFileClass, - MediaFileSubtype, MediaFileType, WeightCategory, WeightType, @@ -13,7 +12,6 @@ export interface MediaInfo { media_type: MediaFileType; media_class: MediaFileClass | null; maybe_animation_type: string | null; - maybe_media_subtype: MediaFileSubtype | null; maybe_engine_extension: string | null; maybe_batch_token: string; maybe_original_filename: string | null; diff --git a/frontend/libs/components/pagescene/src/lib/models/types.tsx b/frontend/libs/components/pagescene/src/lib/models/types.tsx index 1729deecfe..e97ee488e8 100644 --- a/frontend/libs/components/pagescene/src/lib/models/types.tsx +++ b/frontend/libs/components/pagescene/src/lib/models/types.tsx @@ -2,7 +2,6 @@ /// Basic information to display a user and their avatar. import { MediaFileClass, - MediaFileSubtype, MediaFileType, WeightCategory, WeightType, @@ -29,7 +28,6 @@ export interface MediaFile { token: string; media_type: MediaFileType; media_class: MediaFileClass | null; - maybe_media_subtype: MediaFileSubtype | null; public_bucket_path: string; maybe_engine_extension: string | null; maybe_batch_token: string;