generated from thinkode/modelRepository
44 lines
1.0 KiB
Python
44 lines
1.0 KiB
Python
from dataclasses import dataclass
|
|
|
|
from moviepy.Clip import Clip
|
|
from moviepy.Effect import Effect
|
|
|
|
|
|
@dataclass
|
|
class Loop(Effect):
|
|
"""
|
|
Returns a clip that plays the current clip in an infinite loop.
|
|
Ideal for clips coming from GIFs.
|
|
|
|
Parameters
|
|
----------
|
|
|
|
n
|
|
Number of times the clip should be played. If `None` the
|
|
the clip will loop indefinitely (i.e. with no set duration).
|
|
|
|
duration
|
|
Total duration of the clip. Can be specified instead of n.
|
|
"""
|
|
|
|
n: int = None
|
|
duration: float = None
|
|
|
|
def apply(self, clip: Clip) -> Clip:
|
|
"""Apply the effect to the clip."""
|
|
if clip.duration is None:
|
|
raise ValueError("Attribute 'duration' not set")
|
|
|
|
previous_duration = clip.duration
|
|
clip = clip.time_transform(
|
|
lambda t: t % previous_duration, apply_to=["mask", "audio"]
|
|
)
|
|
|
|
if self.n:
|
|
self.duration = self.n * previous_duration
|
|
|
|
if self.duration:
|
|
clip = clip.with_duration(self.duration)
|
|
|
|
return clip
|