import uuid from django.core.exceptions import ObjectDoesNotExist from rest_framework import serializers from apps.assets.serializers import AssetFileSerializer from .models import ( BaseAssetGroup, BgmTrack, ExportJob, Project, ProjectStage, QuickCreateJob, ScriptSegment, ScriptTemplate, ScriptVersion, StoryboardFrame, StoryboardShot, StoryboardShotVersion, StoryboardVersion, SubtitleTrack, Timeline, TimelineClip, VideoSegment, VideoSegmentVersion, ) def _asset_preview_url(asset) -> str: """资产主文件的可播放/可显示 URL(主图优先,其次首张),内嵌进各阶段序列化, 让前端缩略图不再依赖(分页 20 条的)团队 assets 列表解析——团队资产 >20 时新生成的图本会丢。""" if asset is None: return "" files = list(asset.files.all()) primary = next((f for f in files if f.is_primary), files[0] if files else None) return AssetFileSerializer().get_preview_url(primary) if primary else "" _VIDEO_SUFFIXES = (".mp4", ".mov", ".webm", ".m4v") def is_playable_video(asset) -> bool: """主文件是不是真能塞进