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:
parent
a8f4608d10
commit
603584b46b
@ -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):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user