feat(core/backend): expose video segment adopted_asset + timeline subtitle/bgm tracks for pipeline rendering

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209 2026-06-05 16:01:00 +08:00
parent a8f4608d10
commit 603584b46b

View File

@ -2,6 +2,7 @@ from rest_framework import serializers
from .models import (
BaseAssetGroup,
BgmTrack,
ExportJob,
Project,
ProjectStage,
@ -9,6 +10,7 @@ from .models import (
ScriptVersion,
StoryboardFrame,
StoryboardVersion,
SubtitleTrack,
Timeline,
TimelineClip,
VideoSegment,
@ -24,10 +26,17 @@ class ProjectStageSerializer(serializers.ModelSerializer):
class VideoSegmentSerializer(serializers.ModelSerializer):
adopted_asset = serializers.SerializerMethodField()
class Meta:
model = VideoSegment
fields = ["id", "sort_order", "target_duration_seconds", "status", "error_message", "adopted_version"]
read_only_fields = fields
fields = ["id", "sort_order", "target_duration_seconds", "status", "error_message", "adopted_version", "adopted_asset"]
read_only_fields = ["id", "sort_order", "target_duration_seconds", "status", "error_message", "adopted_version"]
def get_adopted_asset(self, obj):
# pipeline stage4 缩略图:暴露已采用版本对应的资产 id(供前端在 assets 里解析 preview_url)
version = obj.adopted_version
return str(version.asset_id) if version and version.asset_id else None
class BaseAssetGroupSerializer(serializers.ModelSerializer):
@ -76,14 +85,30 @@ class TimelineExportJobSerializer(serializers.ModelSerializer):
read_only_fields = fields
class SubtitleTrackSerializer(serializers.ModelSerializer):
class Meta:
model = SubtitleTrack
fields = ["id", "content", "style", "enabled"]
read_only_fields = fields
class BgmTrackSerializer(serializers.ModelSerializer):
class Meta:
model = BgmTrack
fields = ["id", "asset", "volume", "start_ms"]
read_only_fields = fields
class TimelineSerializer(serializers.ModelSerializer):
clips = TimelineClipSerializer(many=True, read_only=True)
export_jobs = TimelineExportJobSerializer(many=True, read_only=True)
subtitle_tracks = SubtitleTrackSerializer(many=True, read_only=True)
bgm_tracks = BgmTrackSerializer(many=True, read_only=True)
class Meta:
model = Timeline
fields = ["id", "name", "aspect_ratio", "resolution", "duration_seconds", "metadata", "clips", "export_jobs"]
read_only_fields = ["id", "clips", "export_jobs"]
fields = ["id", "name", "aspect_ratio", "resolution", "duration_seconds", "metadata", "clips", "export_jobs", "subtitle_tracks", "bgm_tracks"]
read_only_fields = ["id", "clips", "export_jobs", "subtitle_tracks", "bgm_tracks"]
class ExportJobSerializer(serializers.ModelSerializer):