Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_subtraction():
''' Test FrameTimecode subtraction (-/-=, __sub__) operator. '''
x = FrameTimecode(timecode=1.0, fps=10.0)
assert (x - 1) == FrameTimecode(timecode=0.9, fps=10.0)
assert x - 2 == FrameTimecode(0.8, x)
assert x - 10 == FrameTimecode(0.0, x)
assert x - 11 == FrameTimecode(0.0, x)
assert x - 100 == FrameTimecode(0.0, x)
assert x - 1.0 == FrameTimecode(0.0, x)
assert x - 100.0 == FrameTimecode(0.0, x)
assert x - 1 == FrameTimecode(timecode=0.9, fps=10.0)
with pytest.raises(TypeError): FrameTimecode('00:00:02.000', fps=20.0) == x - 10
def test_equality():
''' Test FrameTimecode equality (==, __eq__) operator. '''
x = FrameTimecode(timecode=1.0, fps=10.0)
assert x == x
assert x == FrameTimecode(timecode=1.0, fps=10.0)
assert not x != FrameTimecode(timecode=1.0, fps=10.0)
assert x != FrameTimecode(timecode=10.0, fps=10.0)
assert not x == FrameTimecode(timecode=10.0, fps=10.0)
# Comparing FrameTimecodes with different framerates raises a TypeError.
with pytest.raises(TypeError): x == FrameTimecode(timecode=1.0, fps=100.0)
with pytest.raises(TypeError): x == FrameTimecode(timecode=1.0, fps=10.1)
assert x == FrameTimecode(x)
assert x == FrameTimecode(1.0, x)
assert x == FrameTimecode(10, x)
assert x == '00:00:01'
assert x == '00:00:01.0'
assert x == '00:00:01.00'
assert x == '00:00:01.000'
assert x == '00:00:01.0000'
assert x == '00:00:01.00000'
assert x == 10
assert x == 1.0
with pytest.raises(ValueError): x == '0x'
with pytest.raises(ValueError): x == 'x00:00:00.000'
with pytest.raises(TypeError): x == [0]
with pytest.raises(TypeError): x == (0,)
with pytest.raises(TypeError): x == [0, 1, 2, 3]
def test_addition():
''' Test FrameTimecode addition (+/+=, __add__/__iadd__) operator. '''
x = FrameTimecode(timecode=1.0, fps=10.0)
assert x + 1 == FrameTimecode(timecode=1.1, fps=10.0)
assert x + 1 == FrameTimecode(1.1, x)
assert x + 10 == 20
assert x + 10 == 2.0
assert x + 10 == '00:00:02.000'
with pytest.raises(TypeError): FrameTimecode('00:00:02.000', fps=20.0) == x + 10
def test_equality():
''' Test FrameTimecode equality (==, __eq__) operator. '''
x = FrameTimecode(timecode=1.0, fps=10.0)
assert x == x
assert x == FrameTimecode(timecode=1.0, fps=10.0)
assert not x != FrameTimecode(timecode=1.0, fps=10.0)
assert x != FrameTimecode(timecode=10.0, fps=10.0)
assert not x == FrameTimecode(timecode=10.0, fps=10.0)
# Comparing FrameTimecodes with different framerates raises a TypeError.
with pytest.raises(TypeError): x == FrameTimecode(timecode=1.0, fps=100.0)
with pytest.raises(TypeError): x == FrameTimecode(timecode=1.0, fps=10.1)
assert x == FrameTimecode(x)
assert x == FrameTimecode(1.0, x)
assert x == FrameTimecode(10, x)
assert x == '00:00:01'
assert x == '00:00:01.0'
assert x == '00:00:01.00'
assert x == '00:00:01.000'
assert x == '00:00:01.0000'
assert x == '00:00:01.00000'
assert x == 10
assert x == 1.0
with pytest.raises(ValueError): x == '0x'
with pytest.raises(ValueError): x == 'x00:00:00.000'
with pytest.raises(TypeError): x == [0]
with pytest.raises(TypeError): x == (0,)
with pytest.raises(TypeError): x == [0, 1, 2, 3]
with pytest.raises(TypeError): x == {0:0}
def test_framerate():
''' Test FrameTimecode constructor argument "fps". '''
# Not passing fps results in TypeError.
with pytest.raises(TypeError): FrameTimecode()
with pytest.raises(TypeError): FrameTimecode(timecode=0, fps=None)
with pytest.raises(TypeError):
FrameTimecode(timecode=None, fps=FrameTimecode(timecode=0, fps=None))
# Test zero FPS/negative.
with pytest.raises(ValueError): FrameTimecode(timecode=0, fps=0)
with pytest.raises(ValueError): FrameTimecode(timecode=0, fps=-1)
with pytest.raises(ValueError): FrameTimecode(timecode=0, fps=-100)
with pytest.raises(ValueError): FrameTimecode(timecode=0, fps=0.0)
with pytest.raises(ValueError): FrameTimecode(timecode=0, fps=-1.0)
with pytest.raises(ValueError): FrameTimecode(timecode=0, fps=-1000.0)
with pytest.raises(ValueError):
FrameTimecode(timecode=0, fps=MINIMUM_FRAMES_PER_SECOND_FLOAT / 2)
# Test positive framerates.
assert FrameTimecode(timecode=0, fps=1).frame_num == 0
assert FrameTimecode(timecode=0, fps=MINIMUM_FRAMES_PER_SECOND_FLOAT).frame_num == 0
assert FrameTimecode(timecode=0, fps=10).frame_num == 0
assert FrameTimecode(timecode='10s', fps=1.0).frame_num == 10
assert FrameTimecode(timecode='10.0s', fps=1.0).frame_num == 10
assert FrameTimecode(timecode='10.0000000000s', fps=1.0).frame_num == 10
assert FrameTimecode(timecode='10.100s', fps=1.0).frame_num == 10
assert FrameTimecode(timecode='1.100s', fps=10.0).frame_num == 11
# Standard timecode format [timecode->str] ('HH:MM:SS[.nnn]', where [.nnn] is optional)
assert FrameTimecode(timecode='00:00:01', fps=1).frame_num == 1
assert FrameTimecode(timecode='00:00:01.9999', fps=1).frame_num == 1
assert FrameTimecode(timecode='00:00:02.0000', fps=1).frame_num == 2
assert FrameTimecode(timecode='00:00:02.0001', fps=1).frame_num == 2
assert FrameTimecode(timecode='00:00:01', fps=10).frame_num == 10
assert FrameTimecode(timecode='00:00:00.5', fps=10).frame_num == 5
assert FrameTimecode(timecode='00:00:00.100', fps=10).frame_num == 1
assert FrameTimecode(timecode='00:00:00.001', fps=1000).frame_num == 1
assert FrameTimecode(timecode='00:00:59.999', fps=1).frame_num == 59
assert FrameTimecode(timecode='00:01:00.000', fps=1).frame_num == 60
assert FrameTimecode(timecode='00:01:00.001', fps=1).frame_num == 60
assert FrameTimecode(timecode='00:59:59.999', fps=1).frame_num == 3599
assert FrameTimecode(timecode='01:00:00.000', fps=1).frame_num == 3600
assert FrameTimecode(timecode='01:00:00.001', fps=1).frame_num == 3600
def test_subtraction():
''' Test FrameTimecode subtraction (-/-=, __sub__) operator. '''
x = FrameTimecode(timecode=1.0, fps=10.0)
assert (x - 1) == FrameTimecode(timecode=0.9, fps=10.0)
assert x - 2 == FrameTimecode(0.8, x)
assert x - 10 == FrameTimecode(0.0, x)
assert x - 11 == FrameTimecode(0.0, x)
assert x - 100 == FrameTimecode(0.0, x)
assert x - 1.0 == FrameTimecode(0.0, x)
assert x - 100.0 == FrameTimecode(0.0, x)
assert x - 1 == FrameTimecode(timecode=0.9, fps=10.0)
with pytest.raises(TypeError): FrameTimecode('00:00:02.000', fps=20.0) == x - 10
def test_scene_list(test_video_file):
""" Test SceneManager get_scene_list method with VideoManager/ContentDetector. """
vm = VideoManager([test_video_file])
sm = SceneManager()
sm.add_detector(ContentDetector())
try:
base_timecode = vm.get_base_timecode()
video_fps = vm.get_framerate()
start_time = FrameTimecode('00:00:05', video_fps)
end_time = FrameTimecode('00:00:15', video_fps)
assert end_time.get_frames() > start_time.get_frames()
vm.set_duration(start_time=start_time, end_time=end_time)
vm.set_downscale_factor()
vm.start()
num_frames = sm.detect_scenes(frame_source=vm)
assert num_frames == (1 + end_time.get_frames() - start_time.get_frames())
scene_list = sm.get_scene_list(base_timecode)
assert scene_list
# Each scene is in the format (Start Timecode, End Timecode)
assert len(scene_list[0]) == 2
def test_addition():
''' Test FrameTimecode addition (+/+=, __add__/__iadd__) operator. '''
x = FrameTimecode(timecode=1.0, fps=10.0)
assert x + 1 == FrameTimecode(timecode=1.1, fps=10.0)
assert x + 1 == FrameTimecode(1.1, x)
assert x + 10 == 20
assert x + 10 == 2.0
assert x + 10 == '00:00:02.000'
with pytest.raises(TypeError): FrameTimecode('00:00:02.000', fps=20.0) == x + 10
def parse_timecode(cli_ctx, value):
# type: (CliContext, str) -> Union[FrameTimecode, None]
""" Parses a user input string expected to be a timecode, given a CLI context.
Returns:
(FrameTimecode) Timecode set to value with the CliContext VideoManager framerate.
If value is None, skips processing and returns None.
Raises:
click.BadParameter
"""
cli_ctx.check_input_open()
if value is None:
return value
try:
timecode = FrameTimecode(
timecode=value, fps=cli_ctx.video_manager.get_framerate())
return timecode
except (ValueError, TypeError):
raise click.BadParameter(
'timecode must be in frames (1234), seconds (123.4s), or HH:MM:SS (00:02:03.400)')