测试极速成片

This commit is contained in:
Azmat@qq.com
2026-08-26 15:18:18 +08:00
parent 245525ec53
commit 0ee498d807
30 changed files with 1963 additions and 367 deletions
+50 -2
View File
@@ -1,5 +1,6 @@
import uuid
from django.core.exceptions import ObjectDoesNotExist
from rest_framework import serializers
from apps.assets.serializers import AssetFileSerializer
@@ -341,6 +342,7 @@ class QuickCreateJobSerializer(serializers.ModelSerializer):
phase_index = serializers.SerializerMethodField()
settings = serializers.SerializerMethodField()
result = serializers.SerializerMethodField()
error_message = serializers.SerializerMethodField()
class Meta:
model = QuickCreateJob
@@ -365,6 +367,15 @@ class QuickCreateJobSerializer(serializers.ModelSerializer):
]
read_only_fields = fields
def get_error_message(self, obj) -> str:
from apps.projects.services.quick_create import _public_error
stored = obj.error_message or ""
if obj.status != QuickCreateJob.Status.FAILED:
return stored
hidden = str((obj.metadata or {}).get("internal_error") or "")
return _public_error(" ".join(part for part in (stored, hidden) if part)) or stored
def get_product_images(self, obj) -> list[dict]:
product = getattr(obj.project, "product", None)
if product is None:
@@ -403,7 +414,8 @@ class QuickCreateJobSerializer(serializers.ModelSerializer):
def get_result(self, obj) -> dict | None:
project = obj.project
settings = self.get_settings(obj)
video_url = _final_video_url(project)
final_video_url = _final_video_url(project)
video_url = final_video_url
segments = list(project.video_segments.all())
if not video_url:
for segment in sorted(segments, key=lambda item: item.sort_order):
@@ -446,6 +458,7 @@ class QuickCreateJobSerializer(serializers.ModelSerializer):
)
return {
"video_url": video_url,
"final_video_url": final_video_url,
"poster_url": poster_url,
"duration_seconds": duration or 15,
"aspect_ratio": settings["aspect_ratio"],
@@ -479,6 +492,23 @@ class ScriptVersionSerializer(serializers.ModelSerializer):
read_only_fields = fields
def _quick_create_job(obj: Project):
try:
return obj.quick_create_job
except ObjectDoesNotExist:
return None
def _quick_create_status(obj: Project) -> str:
job = _quick_create_job(obj)
return job.status if job else ""
def _quick_create_job_id(obj: Project) -> str:
job = _quick_create_job(obj)
return str(job.id) if job else ""
class ProjectListSerializer(serializers.ModelSerializer):
"""列表/仪表盘/侧栏用的轻量项目序列化:不嵌套 阶段/片段/故事板/时间线(那些只详情页要)。
脚本数/镜数走 annotate 计数(见 ProjectViewSet.get_queryset),避免逐项目拉全套关联(原列表 2-3s)。"""
@@ -490,13 +520,15 @@ class ProjectListSerializer(serializers.ModelSerializer):
# 合成成片地址:项目列表的播放按钮据此直接播成片(没合成过为空 → 退回进流水线)
final_video_url = serializers.SerializerMethodField()
quick_create = serializers.SerializerMethodField()
quick_create_status = serializers.SerializerMethodField()
quick_create_job_id = serializers.SerializerMethodField()
class Meta:
model = Project
fields = [
"id", "name", "product", "product_title", "cover_preview_url",
"status", "current_stage", "script_version_count", "video_segment_count",
"final_video_url", "quick_create",
"final_video_url", "quick_create", "quick_create_status", "quick_create_job_id",
"is_deleted", "purged_at", "created_at", "updated_at",
]
@@ -509,6 +541,12 @@ class ProjectListSerializer(serializers.ModelSerializer):
def get_quick_create(self, obj) -> bool:
return bool((obj.metadata or {}).get("quick_create"))
def get_quick_create_status(self, obj) -> str:
return _quick_create_status(obj)
def get_quick_create_job_id(self, obj) -> str:
return _quick_create_job_id(obj)
class ProjectSerializer(serializers.ModelSerializer):
stages = ProjectStageSerializer(many=True, read_only=True)
@@ -520,6 +558,8 @@ class ProjectSerializer(serializers.ModelSerializer):
timeline = TimelineSerializer(read_only=True)
# 合成成片地址(最新一次成功拼接):视频阶段的「播放成片 / 下载成片」直接用它
final_video_url = serializers.SerializerMethodField()
quick_create_status = serializers.SerializerMethodField()
quick_create_job_id = serializers.SerializerMethodField()
class Meta:
model = Project
@@ -542,6 +582,8 @@ class ProjectSerializer(serializers.ModelSerializer):
"video_segments",
"timeline",
"final_video_url",
"quick_create_status",
"quick_create_job_id",
"created_at",
"updated_at",
]
@@ -550,6 +592,12 @@ class ProjectSerializer(serializers.ModelSerializer):
def get_final_video_url(self, obj) -> str:
return _final_video_url(obj)
def get_quick_create_status(self, obj) -> str:
return _quick_create_status(obj)
def get_quick_create_job_id(self, obj) -> str:
return _quick_create_job_id(obj)
class ScriptTemplateSerializer(serializers.ModelSerializer):
"""套路模板 · 列表与详情共用。写入只开放 name(其余字段由存模板端点从脚本抽)。"""