From 603584b46b1890f42728261e2e4c2e3813a6e648 Mon Sep 17 00:00:00 2001 From: seaislee1209 Date: Fri, 5 Jun 2026 16:01:00 +0800 Subject: [PATCH] feat(core/backend): expose video segment adopted_asset + timeline subtitle/bgm tracks for pipeline rendering Co-Authored-By: Claude Opus 4.8 (1M context) --- core/backend/apps/projects/serializers.py | 33 ++++++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/core/backend/apps/projects/serializers.py b/core/backend/apps/projects/serializers.py index d6b06ca..0164bd4 100644 --- a/core/backend/apps/projects/serializers.py +++ b/core/backend/apps/projects/serializers.py @@ -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):