From 02ae3d81e5f65fef9c19ea6d19d0d77a9b7f05f2 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 7 Apr 2024 11:59:23 -0400 Subject: [PATCH] add meda file default covers to responses --- .../web/storyteller_web/src/api_doc.rs | 4 ++- .../media_file_default_cover.rs | 30 ++++++++++++++----- .../batch_get_media_files_handler.rs | 7 ++++- .../endpoints/media_files/get_media_file.rs | 8 ++++- .../list/list_featured_media_files.rs | 7 ++++- .../media_files/list/list_media_files.rs | 5 ++++ .../list/list_media_files_by_batch_token.rs | 7 ++++- .../list/list_media_files_for_user.rs | 7 ++++- 8 files changed, 62 insertions(+), 13 deletions(-) diff --git a/crates/service/web/storyteller_web/src/api_doc.rs b/crates/service/web/storyteller_web/src/api_doc.rs index b2cb45185e..194a5cd9a0 100644 --- a/crates/service/web/storyteller_web/src/api_doc.rs +++ b/crates/service/web/storyteller_web/src/api_doc.rs @@ -28,6 +28,7 @@ use users_component::endpoints::logout_handler::*; use users_component::endpoints::session_info_handler::*; use crate::http_server::common_responses::cover_image_details::*; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::media_file_origin_details::*; use crate::http_server::common_responses::media_file_social_meta_lite::MediaFileSocialMetaLight; use crate::http_server::common_responses::pagination_cursors::PaginationCursors; @@ -39,7 +40,6 @@ use crate::http_server::endpoints::inference_job::get_inference_job_status::*; use crate::http_server::endpoints::inference_job::terminate_inference_job_handler::*; use crate::http_server::endpoints::media_files::batch_get_media_files_handler::*; use crate::http_server::endpoints::media_files::change_media_file_visibility_handler::*; -use crate::http_server::endpoints::tts::enqueue_infer_tts_handler::enqueue_infer_tts_handler::*; use crate::http_server::endpoints::media_files::delete_media_file::*; use crate::http_server::endpoints::media_files::get_media_file::*; use crate::http_server::endpoints::media_files::list::list_featured_media_files::*; @@ -50,6 +50,7 @@ use crate::http_server::endpoints::media_files::rename_media_file_handler::*; use crate::http_server::endpoints::media_files::upload::upload_engine_asset::upload_engine_asset_media_file_handler::*; use crate::http_server::endpoints::media_files::upload::upload_error::MediaFileUploadError; use crate::http_server::endpoints::media_files::upload::upload_generic::upload_media_file_handler::*; +use crate::http_server::endpoints::tts::enqueue_infer_tts_handler::enqueue_infer_tts_handler::*; use crate::http_server::endpoints::media_files::upload::upload_video::upload_video_media_file_handler::*; use crate::http_server::endpoints::media_files::upsert_write::write_engine_asset::write_engine_asset_media_file_handler::*; use crate::http_server::endpoints::media_files::upsert_write::write_error::MediaFileWriteError; @@ -150,6 +151,7 @@ use crate::http_server::web_utils::response_success_helpers::*; CoverImageDetails, DefaultAvatarInfo, DefaultCoverInfo, + MediaFileDefaultCover, MediaFileModelDetails, MediaFileOriginDetails, MediaFileSocialMetaLight, diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/media_file_default_cover.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/media_file_default_cover.rs index f2f2afbdd1..14ee5b0cb0 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/media_file_default_cover.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/media_file_default_cover.rs @@ -4,10 +4,11 @@ use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::users::UserToken; -const NUMBER_OF_IMAGES : u64 = 10; +// TODO: Check the model cover number of images +const NUMBER_OF_IMAGES : u64 = 8; const NUMBER_OF_IMAGES_SALT_OFFSET : u8 = 5; -const NUMBER_OF_COLORS : u64 = 5; +const NUMBER_OF_COLORS : u64 = 8; const NUMBER_OF_COLORS_SALT_OFFSET : u8 = 1; #[derive(Clone, Serialize,ToSchema)] @@ -17,10 +18,16 @@ pub struct MediaFileDefaultCover { } impl MediaFileDefaultCover { + /// Typical constructor pub fn from_token(token: &MediaFileToken) -> Self { + Self::from_token_str(token.as_str()) + } + + /// For non-media file tokens (eg. emulated TTS results) + pub fn from_token_str(token: &str) -> Self { Self { - image_index: hash(token.as_str(), NUMBER_OF_IMAGES, NUMBER_OF_IMAGES_SALT_OFFSET), - color_index: hash(token.as_str(), NUMBER_OF_COLORS, NUMBER_OF_COLORS_SALT_OFFSET), + image_index: hash(token, NUMBER_OF_IMAGES, NUMBER_OF_IMAGES_SALT_OFFSET), + color_index: hash(token, NUMBER_OF_COLORS, NUMBER_OF_COLORS_SALT_OFFSET), } } } @@ -44,10 +51,19 @@ mod tests { #[test] fn test() { + let token = MediaFileToken::new_from_str("foo"); + let cover = MediaFileDefaultCover::from_token(&token); + assert_eq!(cover.color_index, 5); + assert_eq!(cover.image_index, 4); + + let token = MediaFileToken::new_from_str("bar"); + let cover = MediaFileDefaultCover::from_token(&token); + assert_eq!(cover.color_index, 5); + assert_eq!(cover.image_index, 2); + let token = MediaFileToken::new_from_str("asdf"); let cover = MediaFileDefaultCover::from_token(&token); - - assert_eq!(cover.color_index, 3); - assert_eq!(cover.image_index, 16); + assert_eq!(cover.color_index, 0); + assert_eq!(cover.image_index, 0); } } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/batch_get_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/batch_get_media_files_handler.rs index 423ed01603..f97dd15059 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/batch_get_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/batch_get_media_files_handler.rs @@ -26,6 +26,7 @@ use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::model_weights::ModelWeightToken; use tokens::tokens::prompts::PromptToken; use users_component::common_responses::user_details_lite::UserDetailsLight; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::simple_entity_stats::SimpleEntityStats; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; @@ -78,6 +79,9 @@ pub struct BatchMediaFileInfo { /// URL to the media file pub public_bucket_path: String, + // Default cover image if there is nothing else we can use as a cover and thumbnail. + pub default_cover: MediaFileDefaultCover, + //// Provenance Data //pub origin_product: MediaFileOriginProductCategory, //pub origin_category: MediaFileOriginCategory, @@ -271,13 +275,14 @@ pub async fn batch_get_media_files_handler( }; BatchMediaFileInfo { - token: result.token, + token: result.token.clone(), media_type: result.media_type, media_class: result.media_class, maybe_media_subtype: result.maybe_media_subtype, maybe_engine_extension, maybe_batch_token: result.maybe_batch_token, public_bucket_path, + default_cover: MediaFileDefaultCover::from_token(&result.token), maybe_title: result.maybe_title, maybe_text_transcript: result.maybe_text_transcript, maybe_model_weight_info: match result.maybe_model_weights_token { diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get_media_file.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get_media_file.rs index b1cbf01d50..b562ca2228 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get_media_file.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get_media_file.rs @@ -23,6 +23,7 @@ use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::model_weights::ModelWeightToken; use tokens::tokens::prompts::PromptToken; use users_component::common_responses::user_details_lite::UserDetailsLight; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::simple_entity_stats::SimpleEntityStats; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; @@ -64,6 +65,9 @@ pub struct MediaFileInfo { /// URL to the media file pub public_bucket_path: String, + // Default cover image if there is nothing else we can use as a cover and thumbnail. + pub default_cover: MediaFileDefaultCover, + //// Provenance Data //pub origin_product: MediaFileOriginProductCategory, //pub origin_category: MediaFileOriginCategory, @@ -287,13 +291,14 @@ async fn modern_media_file_lookup( Ok(GetMediaFileSuccessResponse { success: true, media_file: MediaFileInfo { - token: result.token, + token: result.token.clone(), media_type: result.media_type, media_class: result.media_class, maybe_media_subtype: result.maybe_media_subtype, maybe_engine_extension, maybe_batch_token: result.maybe_batch_token, public_bucket_path, + default_cover: MediaFileDefaultCover::from_token(&result.token), maybe_title: result.maybe_title, maybe_text_transcript: result.maybe_text_transcript, maybe_model_weight_info: match result.maybe_model_weights_token { @@ -385,6 +390,7 @@ async fn emulate_media_file_with_legacy_tts_result_lookup( maybe_engine_extension: None, maybe_batch_token: None, public_bucket_path, + default_cover: MediaFileDefaultCover::from_token_str(&result.tts_result_token), maybe_model_weight_info: Some(GetMediaFileModelInfo { // NB: These should be reasonable synthetic defaults for emulated TT2 results, even the "ModelWeightToken". weight_token: ModelWeightToken::new_from_str(&result.tts_model_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files.rs index 57a54ac42a..274e919f0a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files.rs @@ -16,6 +16,7 @@ use enums::by_table::media_files::media_file_type::MediaFileType; use mysql_queries::queries::media_files::list::list_media_files_by_tokens::list_media_files_by_tokens; use tokens::tokens::media_files::MediaFileToken; use users_component::common_responses::user_details_lite::UserDetailsLight; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::media_file_origin_details::MediaFileOriginDetails; use crate::http_server::common_responses::simple_entity_stats::SimpleEntityStats; @@ -38,6 +39,9 @@ pub struct MediaFile { /// URL to the media file pub public_bucket_path: String, + // Default cover image if there is nothing else we can use as a cover and thumbnail. + pub default_cover: MediaFileDefaultCover, + #[deprecated(note="Use MediaFileOriginDetails instead")] pub origin_category: MediaFileOriginCategory, @@ -157,9 +161,10 @@ pub async fn list_featured_media_files_handler( .to_string(); MediaFile { - token: m.token, + token: m.token.clone(), media_type: m.media_type, public_bucket_path, + default_cover: MediaFileDefaultCover::from_token(&m.token), origin: MediaFileOriginDetails::from_db_fields_str( m.origin_category, m.origin_product_category, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files.rs index ad17dba9ca..0b4dbd5f3f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files.rs @@ -18,6 +18,7 @@ use enums::common::visibility::Visibility; use mysql_queries::queries::media_files::list::list_media_files::{list_media_files, ListMediaFilesArgs}; use tokens::tokens::media_files::MediaFileToken; use users_component::common_responses::user_details_lite::UserDetailsLight; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::media_file_origin_details::MediaFileOriginDetails; use crate::http_server::common_responses::pagination_cursors::PaginationCursors; @@ -67,6 +68,9 @@ pub struct MediaFileListItem { /// URL to the media file. pub public_bucket_path: String, + // Default cover image if there is nothing else we can use as a cover and thumbnail. + pub default_cover: MediaFileDefaultCover, + pub maybe_creator: Option, /// Statistics about the media file @@ -239,6 +243,7 @@ pub async fn list_media_files_handler( record.maybe_public_bucket_extension.as_deref()) .get_full_object_path_str() .to_string(), + default_cover: MediaFileDefaultCover::from_token(&record.token), maybe_creator: UserDetailsLight::from_optional_db_fields_owned( record.maybe_creator_user_token, record.maybe_creator_username, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token.rs index b043b94d0a..8663cf79a9 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token.rs @@ -19,6 +19,7 @@ use mysql_queries::queries::media_files::list::list_media_files_by_batch_token:: use mysql_queries::queries::media_files::list::list_media_files_for_user::{list_media_files_for_user, ListMediaFileForUserArgs}; use tokens::tokens::batch_generations::BatchGenerationToken; use tokens::tokens::media_files::MediaFileToken; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::media_file_origin_details::MediaFileOriginDetails; use crate::http_server::common_responses::pagination_page::PaginationPage; @@ -71,6 +72,9 @@ pub struct MediaFilesByBatchListItem { /// URL to the media file. pub public_bucket_path: String, + // Default cover image if there is nothing else we can use as a cover and thumbnail. + pub default_cover: MediaFileDefaultCover, + pub creator_set_visibility: Visibility, /// The name or title of the media file (optional) @@ -196,7 +200,7 @@ pub async fn list_media_files_by_batch_token_handler( true }) .map(|record| MediaFilesByBatchListItem { - token: record.token, + token: record.token.clone(), media_type: record.media_type, origin: MediaFileOriginDetails::from_db_fields_str( record.origin_category, @@ -214,6 +218,7 @@ pub async fn list_media_files_by_batch_token_handler( record.maybe_public_bucket_extension.as_deref()) .get_full_object_path_str() .to_string(), + default_cover: MediaFileDefaultCover::from_token(&record.token), creator_set_visibility: record.creator_set_visibility, maybe_title: record.maybe_title, maybe_text_transcript: record.maybe_text_transcript, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user.rs index 69847d7c17..a63c450736 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user.rs @@ -19,6 +19,7 @@ use enums::common::view_as::ViewAs; use enums::common::visibility::Visibility; use mysql_queries::queries::media_files::list::list_media_files_for_user::{list_media_files_for_user, ListMediaFileForUserArgs}; use tokens::tokens::media_files::MediaFileToken; +use crate::http_server::common_responses::media_file_default_cover::MediaFileDefaultCover; use crate::http_server::common_responses::media_file_origin_details::MediaFileOriginDetails; use crate::http_server::common_responses::pagination_page::PaginationPage; @@ -81,6 +82,9 @@ pub struct MediaFileForUserListItem { /// URL to the media file. pub public_bucket_path: String, + // Default cover image if there is nothing else we can use as a cover and thumbnail. + pub default_cover: MediaFileDefaultCover, + pub creator_set_visibility: Visibility, /// The name or title of the media file (optional) @@ -230,7 +234,7 @@ pub async fn list_media_files_for_user_handler( true }) .map(|record| MediaFileForUserListItem { - token: record.token, + token: record.token.clone(), media_type: record.media_type, media_class: record.media_class, origin: MediaFileOriginDetails::from_db_fields_str( @@ -249,6 +253,7 @@ pub async fn list_media_files_for_user_handler( record.maybe_public_bucket_extension.as_deref()) .get_full_object_path_str() .to_string(), + default_cover: MediaFileDefaultCover::from_token(&record.token), creator_set_visibility: record.creator_set_visibility, maybe_title: record.maybe_title, maybe_text_transcript: record.maybe_text_transcript,