Migration Guide — PySceneDetect 0.6.5-dev1 documentation

# Migration Guide

This page details how to transition a program written using PySceneDetect 0.5 to the new 0.6 API. It is recommended to review the new Example section first, as it covers the majority of use cases. Also see tests/test_api.py for a set of demonstrations covering many high level use cases.

PySceneDetect v0.6 is a major step towards a more stable and simplified API. The biggest change to existing workflows is how video input is handled, and that Python 3.6 or above is now required.

This page covers commonly used APIs which require updates to work with v0.6. Note that this page is not an exhaustive set of changes. For a complete list of breaking API changes, see the changelog.

In some places, a backwards compatibility layer has been added to avoid breaking most applications upon release. This should not be relied upon, and will be removed in the future. You can call `scenedetect.platform.init_logger(show_stdout=True)` or attach a custom log handler to the `'pyscenedetect'` logger to help find these cases.

## VideoManager Class

VideoManager has been deprecated and replaced with `scenedetect.backends`. For most applications, the `open_video` function should be used instead:

    from scenedetect import open_video
    video = open_video(video.mp4')

The resulting object can then be passed to a `SceneManager` when calling `detect_scenes`, or any other function/method that used to take a VideoManager, e.g.:

    from scenedetect import open_video, SceneManager, ContentDetector
    video = open_video('video.mp4')
    scene_manager = SceneManager()
    scene_manager.add_detector(ContentDetector(threshold=threshold))
    scene_manager.detect_scenes(video)
    print(scene_manager.get_scene_list())

See `scenedetect.backends` for examples of how to create specific backends. Where previously a list of paths was accepted, now only a single string should be provided.

### Seeking and Start/End Times

Instead of setting the start time via the VideoManager, now `seek` to the starting time on the `VideoStream` object.

Instead of setting the duration or end time via the VideoManager, now set the duration or end_time parameters when calling `detect_scenes`.

    from scenedetect import open_video, SceneManager, ContentDetector
    video = open_video('video.mp4')
    # Can be seconds (float), frame # (int), or FrameTimecode
    start_time, end_time = 2.5, 5.0
    scene_manager = SceneManager()
    scene_manager.add_detector(ContentDetector(threshold=threshold))
    video.seek(start_time)
    # Note there is also a `duration` parameter that can also be set.
    # If neither `duration` nor `end_time` is provided, the video will
    # be processed from its current position until the end.
    scene_manager.detect_scenes(video, end_time=end_time)
    print(scene_manager.get_scene_list())

## SceneManager Class

The first argument of the `detect_scenes` method has been renamed to video and should now be a `VideoStream` object (see above).

## save_images Function

The second argument of `save_images` in `scenedetect.scene_manager` has been renamed from video_manager to video.

The downscale_factor parameter has been removed from `save_images` (use the scale parameter instead). To achieve the same result as the previous version, set scale to 1.0 / downscale_factor.

## split_video_* Functions

The the `scenedetect.video_splitter` functions `split_video_ffmpeg` and `split_video_mkvmerge` now only accept a single path as the input (first) argument.

The suppress_output and hide_progress arguments to the `split_video_ffmpeg` and `split_video_mkvmerge` have been removed, and two new options have been added:

> - suppress_output is now show_output, default is False

> - hide_progress is now show_progress, default is False

This makes the API consistent with that of `SceneManager`.

## StatsManager Class

The `save_to_csv` and `load_from_csv` methods now accept either a path or an open file handle.

The base_timecode argument has been removed from `save_to_csv`. It is no longer required.

## AdaptiveDetector Class

The video_manager parameter has been removed and is no longer required when constructing an `AdaptiveDetector` object.

## Other

### ThresholdDetector Class

The block_size argument has been removed from the `ThresholdDetector` constructor. It is no longer required.

### ContentDetector Class

The calculate_frame_score method of `ContentDetector` has been renamed to `_calculate_frame_score`. Use new global function `calculate_frame_score` to achieve the same result.

### MINIMUM_FRAMES_PER_SECOND_* Constants

In `scenedetect.frame_timecode` the constants MINIMUM_FRAMES_PER_SECOND_FLOAT and MINIMUM_FRAMES_PER_SECOND_DELTA_FLOAT have been replaced with `MAX_FPS_DELTA`.

### get_aspect_ratio Function

> The get_aspect_ratio function has been removed from scenedetect.platform. Use the `aspect_ratio` property from the `VideoStream` object instead.