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 ( from .models import (
BaseAssetGroup, BaseAssetGroup,
BgmTrack,
ExportJob, ExportJob,
Project, Project,
ProjectStage, ProjectStage,
@ -9,6 +10,7 @@ from .models import (
ScriptVersion, ScriptVersion,
StoryboardFrame, StoryboardFrame,
StoryboardVersion, StoryboardVersion,
SubtitleTrack,
Timeline, Timeline,
TimelineClip, TimelineClip,
VideoSegment, VideoSegment,
@ -24,10 +26,17 @@ class ProjectStageSerializer(serializers.ModelSerializer):
class VideoSegmentSerializer(serializers.ModelSerializer): class VideoSegmentSerializer(serializers.ModelSerializer):
adopted_asset = serializers.SerializerMethodField()
class Meta: class Meta:
model = VideoSegment model = VideoSegment
fields = ["id", "sort_order", "target_duration_seconds", "status", "error_message", "adopted_version"] fields = ["id", "sort_order", "target_duration_seconds", "status", "error_message", "adopted_version", "adopted_asset"]
read_only_fields = fields 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): class BaseAssetGroupSerializer(serializers.ModelSerializer):
@ -76,14 +85,30 @@ class TimelineExportJobSerializer(serializers.ModelSerializer):
read_only_fields = fields 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): class TimelineSerializer(serializers.ModelSerializer):
clips = TimelineClipSerializer(many=True, read_only=True) clips = TimelineClipSerializer(many=True, read_only=True)
export_jobs = TimelineExportJobSerializer(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: class Meta:
model = Timeline model = Timeline
fields = ["id", "name", "aspect_ratio", "resolution", "duration_seconds", "metadata", "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"] read_only_fields = ["id", "clips", "export_jobs", "subtitle_tracks", "bgm_tracks"]
class ExportJobSerializer(serializers.ModelSerializer): class ExportJobSerializer(serializers.ModelSerializer):