Source code for camtasia.operations.batch
"""Batch operations — apply the same transformation to multiple clips at once."""
from __future__ import annotations
from typing import TYPE_CHECKING, Any, Callable, Iterable
if TYPE_CHECKING:
from camtasia.timeline.clips.base import BaseClip
from camtasia.timeline.track import Track
from camtasia.timeline.timeline import Timeline
[docs]
def apply_to_clips(
clips: Iterable[BaseClip],
fn: Callable[[BaseClip], Any],
) -> int:
"""Apply a function to each clip. Returns count of clips processed."""
count = 0
for clip in clips:
fn(clip)
count += 1
return count
[docs]
def apply_to_track(
track: Track,
fn: Callable[[BaseClip], Any],
) -> int:
"""Apply a function to every clip on a track."""
return apply_to_clips(track.clips, fn)
[docs]
def apply_to_all_tracks(
timeline: Timeline,
fn: Callable[[BaseClip], Any],
) -> int:
"""Apply a function to every clip on every track."""
count = 0
for track in timeline.tracks:
count += apply_to_track(track, fn)
return count
[docs]
def set_opacity_all(clips: Iterable[BaseClip], opacity: float) -> int:
"""Set opacity on all clips."""
return apply_to_clips(clips, lambda c: c.set_opacity(opacity))
[docs]
def fade_all(
clips: Iterable[BaseClip],
fade_in: float = 0.5,
fade_out: float = 0.5,
) -> int:
"""Apply fade-in and fade-out to all clips."""
return apply_to_clips(clips, lambda c: c.fade(fade_in, fade_out))
[docs]
def scale_all(clips: Iterable[BaseClip], factor: float) -> int:
"""Set uniform scale on all clips."""
return apply_to_clips(clips, lambda c: c.scale_to(factor))
[docs]
def move_all(
clips: Iterable[BaseClip],
dx: float = 0.0,
dy: float = 0.0,
) -> int:
"""Offset all clips by (dx, dy) from their current position."""
def _offset(clip: BaseClip) -> None:
x, y = clip.translation
clip.move_to(x + dx, y + dy)
return apply_to_clips(clips, _offset)