refactor: extract platform media crates

This commit is contained in:
kdletters
2026-05-26 13:18:13 +08:00
parent 50f44489cd
commit 44c65df5c9
92 changed files with 7381 additions and 5848 deletions

View File

@@ -0,0 +1,84 @@
use platform_audio::{
AudioTaskKind, BackgroundMusicTaskRequest, SUNO_DEFAULT_MODEL, VIDU_PROMPT_MAX_CHARS,
audio_mime_to_extension, build_background_music_task_body, build_sound_effect_task_body,
extract_audio_urls, is_failed_task_status, is_pending_task_status, normalize_audio_mime_type,
normalize_task_status,
};
use serde_json::json;
#[test]
fn normalizes_audio_mime_type_from_content_type_and_url() {
assert_eq!(
normalize_audio_mime_type("audio/x-wav; charset=utf-8", "https://x/a.bin"),
"audio/wav"
);
assert_eq!(
normalize_audio_mime_type("application/octet-stream", "https://x/a.m4a?token=1"),
"audio/mp4"
);
assert_eq!(audio_mime_to_extension("audio/mp4"), "m4a");
}
#[test]
fn extracts_nested_audio_urls() {
let payload = json!({
"Response": {
"Status": "FINISH",
"Task": {
"Output": {
"FileInfos": [
{ "FileUrl": "https://cdn.example.test/audio.wav" }
]
}
}
}
});
assert_eq!(
extract_audio_urls(&payload),
vec!["https://cdn.example.test/audio.wav".to_string()]
);
}
#[test]
fn vector_engine_task_status_is_stable() {
assert_eq!(normalize_task_status("FINISH"), "completed");
assert!(is_pending_task_status("processing"));
assert!(is_failed_task_status("failed"));
}
#[test]
fn background_music_request_body_uses_default_model_and_optional_instrumental_flag() {
let body = build_background_music_task_body(BackgroundMusicTaskRequest {
prompt: " 风里的木琴 ".to_string(),
title: " 林间 ".to_string(),
tags: Some(" warm, wood ".to_string()),
model: None,
instrumental: true,
})
.expect("request body should be valid");
assert_eq!(body["prompt"], "风里的木琴");
assert_eq!(body["title"], "林间");
assert_eq!(body["tags"], "warm, wood");
assert_eq!(body["mv"], SUNO_DEFAULT_MODEL);
assert_eq!(body["task"], "generate");
assert_eq!(body["make_instrumental"], true);
assert_eq!(
AudioTaskKind::BackgroundMusic.provider(),
"vector-engine-suno"
);
}
#[test]
fn sound_effect_request_rejects_overlong_prompt() {
let prompt = "".repeat(VIDU_PROMPT_MAX_CHARS + 1);
let error = build_sound_effect_task_body(platform_audio::SoundEffectTaskRequest {
prompt,
duration: 5,
seed: None,
})
.expect_err("long prompt should fail");
assert!(error.message().contains("prompt 超过"));
}