feat: refine wooden fish runtime generation
This commit is contained in:
@@ -529,6 +529,9 @@ fn merge_action_into_draft(
|
||||
if let Some(asset) = payload.hit_object_asset.clone() {
|
||||
draft.hit_object_asset = Some(asset);
|
||||
}
|
||||
if let Some(asset) = payload.background_asset.clone() {
|
||||
draft.background_asset = Some(asset);
|
||||
}
|
||||
}
|
||||
if matches!(
|
||||
scope,
|
||||
@@ -573,6 +576,7 @@ fn merge_action_into_draft(
|
||||
&& payload.hit_object_asset.is_none()
|
||||
{
|
||||
draft.hit_object_asset = None;
|
||||
draft.background_asset = None;
|
||||
}
|
||||
if draft.floating_words.is_empty() {
|
||||
draft.floating_words = default_floating_words();
|
||||
@@ -606,6 +610,9 @@ fn build_compile_input(
|
||||
let hit_sound_asset = draft.hit_sound_asset.clone().ok_or_else(|| {
|
||||
SpacetimeClientError::validation_failed("wooden fish hit sound asset 缺少真实生成资产")
|
||||
})?;
|
||||
let background_asset = draft.background_asset.clone().ok_or_else(|| {
|
||||
SpacetimeClientError::validation_failed("wooden fish background asset 缺少真实生成资产")
|
||||
})?;
|
||||
|
||||
Ok(WoodenFishDraftCompileInput {
|
||||
session_id: current.session_id.clone(),
|
||||
@@ -619,6 +626,7 @@ fn build_compile_input(
|
||||
hit_object_reference_image_src: draft.hit_object_reference_image_src.clone(),
|
||||
hit_sound_prompt: draft.hit_sound_prompt.clone(),
|
||||
hit_object_asset_json: Some(json_string(&hit_object_asset)?),
|
||||
background_asset_json: Some(json_string(&background_asset)?),
|
||||
hit_sound_asset_json: Some(json_string(&hit_sound_asset)?),
|
||||
floating_words_json: Some(json_string(&draft.floating_words)?),
|
||||
cover_image_src: draft.cover_image_src.clone(),
|
||||
@@ -644,6 +652,7 @@ fn build_update_input(
|
||||
hit_object_reference_image_src: draft.hit_object_reference_image_src.clone(),
|
||||
hit_sound_prompt: draft.hit_sound_prompt.clone(),
|
||||
hit_object_asset_json: None,
|
||||
background_asset_json: None,
|
||||
hit_sound_asset_json: if include_hit_sound_asset {
|
||||
draft
|
||||
.hit_sound_asset
|
||||
@@ -710,6 +719,7 @@ fn default_draft() -> WoodenFishDraftResponse {
|
||||
hit_sound_prompt: Some(DEFAULT_HIT_SOUND_PROMPT.to_string()),
|
||||
floating_words: default_floating_words(),
|
||||
hit_object_asset: None,
|
||||
background_asset: None,
|
||||
hit_sound_asset: None,
|
||||
cover_image_src: None,
|
||||
generation_status: WoodenFishGenerationStatus::Draft,
|
||||
@@ -796,6 +806,7 @@ mod tests {
|
||||
let session = session_with_draft(draft_without_assets());
|
||||
let mut payload = action(WoodenFishActionType::CompileDraft);
|
||||
payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object"));
|
||||
payload.background_asset = Some(generated_background_asset("generated-compile-background"));
|
||||
payload.hit_sound_asset = Some(generated_hit_sound_asset("generated-compile-sound"));
|
||||
|
||||
let (plan, draft) =
|
||||
@@ -822,6 +833,13 @@ mod tests {
|
||||
.unwrap_or("")
|
||||
.contains("generated-compile-sound")
|
||||
);
|
||||
assert!(
|
||||
input
|
||||
.background_asset_json
|
||||
.as_deref()
|
||||
.unwrap_or("")
|
||||
.contains("generated-compile-background")
|
||||
);
|
||||
assert_eq!(draft.generation_status, WoodenFishGenerationStatus::Ready);
|
||||
}
|
||||
|
||||
@@ -830,6 +848,7 @@ mod tests {
|
||||
let session = session_with_draft(draft_without_assets());
|
||||
let mut payload = action(WoodenFishActionType::CompileDraft);
|
||||
payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object"));
|
||||
payload.background_asset = Some(generated_background_asset("generated-compile-background"));
|
||||
|
||||
let error =
|
||||
match build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS) {
|
||||
@@ -844,12 +863,33 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn wooden_fish_compile_requires_real_background_asset_from_api_server() {
|
||||
let session = session_with_draft(draft_without_assets());
|
||||
let mut payload = action(WoodenFishActionType::CompileDraft);
|
||||
payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object"));
|
||||
payload.hit_sound_asset = Some(generated_hit_sound_asset("generated-compile-sound"));
|
||||
|
||||
let error =
|
||||
match build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS) {
|
||||
Ok(_) => panic!("compile-draft should not publish without background asset"),
|
||||
Err(error) => error,
|
||||
};
|
||||
|
||||
assert!(
|
||||
error
|
||||
.to_string()
|
||||
.contains("background asset 缺少真实生成资产")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn wooden_fish_action_regenerate_hit_object_replaces_only_object_asset() {
|
||||
let session = session_with_draft(draft_with_assets());
|
||||
let mut payload = action(WoodenFishActionType::RegenerateHitObject);
|
||||
payload.hit_object_prompt = Some("新的敲击物".to_string());
|
||||
payload.hit_object_asset = Some(generated_hit_object_asset("generated-object"));
|
||||
payload.background_asset = Some(generated_background_asset("generated-background"));
|
||||
|
||||
let (plan, _draft) =
|
||||
build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS)
|
||||
@@ -886,6 +926,13 @@ mod tests {
|
||||
.unwrap_or("")
|
||||
.contains("old-sound")
|
||||
);
|
||||
assert!(
|
||||
input
|
||||
.background_asset_json
|
||||
.as_deref()
|
||||
.unwrap_or("")
|
||||
.contains("generated-background")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -930,6 +977,7 @@ mod tests {
|
||||
hit_object_prompt: None,
|
||||
hit_object_reference_image_src: None,
|
||||
hit_object_asset: None,
|
||||
background_asset: None,
|
||||
hit_sound_prompt: None,
|
||||
hit_sound_asset: None,
|
||||
floating_words: None,
|
||||
@@ -969,6 +1017,21 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
fn generated_background_asset(asset_id: &str) -> WoodenFishImageAsset {
|
||||
WoodenFishImageAsset {
|
||||
asset_id: asset_id.to_string(),
|
||||
image_src: "/generated-wooden-fish-assets/real-profile/background/image.png"
|
||||
.to_string(),
|
||||
image_object_key: "generated-wooden-fish-assets/real-profile/background/image.png"
|
||||
.to_string(),
|
||||
asset_object_id: format!("{asset_id}-asset"),
|
||||
generation_provider: "image2".to_string(),
|
||||
prompt: "新的敲击背景".to_string(),
|
||||
width: 1024,
|
||||
height: 1536,
|
||||
}
|
||||
}
|
||||
|
||||
fn generated_hit_sound_asset(asset_id: &str) -> WoodenFishAudioAsset {
|
||||
WoodenFishAudioAsset {
|
||||
asset_id: asset_id.to_string(),
|
||||
@@ -995,6 +1058,16 @@ mod tests {
|
||||
width: 1024,
|
||||
height: 1024,
|
||||
}),
|
||||
background_asset: Some(WoodenFishImageAsset {
|
||||
asset_id: "old-background".to_string(),
|
||||
image_src: "/generated-wooden-fish-assets/old-background.png".to_string(),
|
||||
image_object_key: "generated-wooden-fish-assets/old-background.png".to_string(),
|
||||
asset_object_id: "old-background-asset".to_string(),
|
||||
generation_provider: "image2".to_string(),
|
||||
prompt: "旧背景".to_string(),
|
||||
width: 1024,
|
||||
height: 1536,
|
||||
}),
|
||||
hit_sound_asset: Some(WoodenFishAudioAsset {
|
||||
asset_id: "old-sound".to_string(),
|
||||
audio_src: "/generated-wooden-fish-assets/old-sound.mp3".to_string(),
|
||||
@@ -1023,6 +1096,7 @@ mod tests {
|
||||
hit_sound_prompt: Some("旧音效".to_string()),
|
||||
floating_words: default_floating_words(),
|
||||
hit_object_asset: None,
|
||||
background_asset: None,
|
||||
hit_sound_asset: None,
|
||||
cover_image_src: None,
|
||||
generation_status: WoodenFishGenerationStatus::Draft,
|
||||
|
||||
Reference in New Issue
Block a user