video_duration = min(300, int(video.length)) # First 5 minutes only
audio_offset = 1 # Delay audio/text update by 1 second for better sync
# Create timeline and tracks
timeline = Timeline(conn)
video_track = Track()
text_track = Track()
audio_track = Track()
# Add video clip (first 5 minutes)
video_clip = Clip(
asset=VideoAsset(id=video.id, start=0),
duration=video_duration
)
video_track.add_clip(0, video_clip)
# Filter shots within our duration
shots_in_range = [s for s in result.shots if int(s.start) + audio_offset < video_duration]
# Add text overlays that update at each word occurrence
for i, shot in enumerate(shots_in_range):
trigger_time = int(shot.start) + audio_offset
# Initial "Count-0" from start until first word
if i == 0 and trigger_time > 0:
text_asset = TextAsset(
text="Count-0",
font=Font(family="Do Hyeon", size=72, color="#000100"),
background=Background(color="#F702A4", opacity=1.0),
alignment=Alignment(horizontal=HorizontalAlignment.right, vertical=VerticalAlignment.top),
)
text_clip = Clip(asset=text_asset, duration=trigger_time,
position=Position.top_right, offset=Offset(x=-0.05, y=0.05))
text_track.add_clip(0, text_clip)
# Duration until next word or end of video
if i + 1 < len(shots_in_range):
next_trigger = int(shots_in_range[i + 1].start) + audio_offset
else:
next_trigger = video_duration
text_dur = next_trigger - trigger_time
# Text overlay with updated count
text_asset = TextAsset(
text=f"Count-{i + 1}",
font=Font(family="Do Hyeon", size=72, color="#000100"),
background=Background(color="#F702A4", opacity=1.0),
alignment=Alignment(horizontal=HorizontalAlignment.right, vertical=VerticalAlignment.top),
)
text_clip = Clip(asset=text_asset, duration=text_dur, position=Position.top_right, offset=Offset(x=-0.05, y=0.05))
text_track.add_clip(trigger_time, text_clip)
# Audio cue at same trigger time
if trigger_time < video_duration - 2:
audio_clip = Clip(asset=AudioAsset(id=audio.id), duration=2)
audio_track.add_clip(trigger_time, audio_clip)
# Add all tracks to timeline
timeline.add_track(video_track)
timeline.add_track(text_track)
timeline.add_track(audio_track)