测试极速成片
This commit is contained in:
@@ -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(其余字段由存模板端点从脚本抽)。"""
|
||||
|
||||
Reference in New Issue
Block a user