from videodb.editor import (
Timeline, Track, Clip,
VideoAsset, ImageAsset, AudioAsset, TextAsset,
Font, Background, Alignment, HorizontalAlignment, VerticalAlignment, Position
)
# Initialize Timeline
timeline = Timeline(conn)
# Calculate total duration
total_duration = sum(item['duration'] for item in storyboard_assets)
# Create main track loop
main_track = Track()
video_asset = VideoAsset(id=base_vid.id)
video_clip = Clip(asset=video_asset, duration=total_duration)
main_track.add_clip(0, video_clip)
timeline.add_track(main_track)
# Setup Overlay Tracks
image_track = Track()
audio_track = Track()
text_track = Track()
current_time = 0
# Assemble the Sequence
for asset in storyboard_assets:
duration = asset['duration']
# A. Visual: The AI Sketch (Centered)
image_clip = Clip(
asset=ImageAsset(id=asset['image_id']),
duration=duration,
position=Position.center,
)
image_track.add_clip(current_time, image_clip)
# B. Audio: The Voiceover
audio_clip = Clip(
asset=AudioAsset(id=asset['audio_id']),
duration=duration
)
audio_track.add_clip(current_time, audio_clip)
# C. Text: The Step Name Label
text_clip = Clip(
asset=TextAsset(
text=asset['step_name'],
font=Font(family="League Spartan", size=36, color="#FFFAFA"),
background=Background(color="#FF4500", border_width=10, opacity=1.0),
alignment=Alignment(horizontal=HorizontalAlignment.center, vertical=VerticalAlignment.bottom),
),
duration=duration,
position=Position.bottom
)
text_track.add_clip(current_time, text_clip)
# Advance the seeker
current_time += duration
# Add all tracks to timeline
timeline.add_track(image_track)
timeline.add_track(audio_track)
timeline.add_track(text_track)