优化替换角色添加音频

This commit is contained in:
Azmat@qq.com
2026-09-01 17:55:57 +08:00
parent a520b230c5
commit 0603a85d83
10 changed files with 322 additions and 111 deletions
+32 -1
View File
@@ -1048,6 +1048,37 @@ def finalize_free_video(*, task: AITask) -> AITask:
return locked
def rehydrate_ref_urls(references) -> list:
"""参考素材快照里的 URL 是提交当时签的 TOS 预签名链(1 小时过期),历史记录隔天再点开就播不了。
凡是带 asset_id 的,按当前资产重新取长期直链(顺带补上视频封面),老任务也一起救回来。
素材库引用(source=library)的 asset_id 指向 FreeAsset 不是 Asset,查不到就原样保留快照。"""
refs = [item for item in (references or [])]
ids = set()
for item in refs:
if not isinstance(item, dict) or item.get("source") == "library":
continue
if item.get("asset_id"):
try:
ids.add(uuid.UUID(str(item["asset_id"])))
except (ValueError, TypeError, AttributeError):
continue
if not ids:
return refs
from .services import asset_stable_url
assets = {str(a.id): a for a in Asset.objects.filter(id__in=ids).prefetch_related("files")}
fresh = []
for item in refs:
asset = assets.get(str(item.get("asset_id") or "")) if isinstance(item, dict) else None
url, thumb = asset_stable_url(asset) if asset is not None else ("", "")
if not url:
fresh.append(item)
continue
fresh.append({**item, "url": url, **({"thumb_url": thumb} if thumb else {})})
return fresh
def serialize_free_video_task(task: AITask, *, include_deleted_assets: bool = False) -> dict:
"""任务 → 前端契约。视频/封面直链从 generated_assets 取(TOS 公读),转存失败回落火山临时 URL。"""
payload = task.request_payload or {}
@@ -1097,7 +1128,7 @@ def serialize_free_video_task(task: AITask, *, include_deleted_assets: bool = Fa
"seed": payload.get("seed", -1),
"seed_used": payload.get("seed_used"),
"generate_audio": payload.get("generate_audio", True),
"references": payload.get("references") or [],
"references": rehydrate_ref_urls(payload.get("references")),
"estimated_tokens": payload.get("estimated_tokens") or 0,
"actual_tokens": payload.get("actual_tokens") or 0,
"estimated_cost": str(task.estimated_cost),