:movie_camera: Python and OpenCV-based scene cut/transition detection program & library.
This report summarizes scanner evidence for Breakthrough/PySceneDetect, a Python project with 5,227 GitHub stars. SynthScan examined 29,470 lines of code across 134 source files, recording 525 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 29.2 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 335 finding(s).
Are imports declared and package/API names verified? 65 finding(s).
Are wrappers, guards, and repeated structures necessary? 314 finding(s).
Which changes need focused human review? 525 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 525 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 3 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/report_sweep.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/_common.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/dataset.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/analyze_sweep.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/sweep.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/evaluator.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmark/__main__.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | packaging/build_all.py | 3 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | packaging/variants/pyproject-scenedetect-headless.toml | 3 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | packaging/variants/pyproject-scenedetect.toml | 3 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | packaging/windows/pyi_rth_scenedetect.py | 3 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_stats_manager.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_backend_pyav.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_detectors.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_scene_manager.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_benchmark_evaluator.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_video_stream.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_backend_opencv.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_timecode.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/__init__.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_output.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_concat.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_threshold_detector.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_fan_out.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_platform.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_api.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli.py | 225 | # ------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_cli.py | 227 | # ------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_cli.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_cli.py | 239 | # ------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/helpers.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_vfr.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_vfr.py | 279 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | tests/test_vfr.py | 281 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | tests/release/synthetic.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/conftest.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_validation.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_cli_permutations.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_long_video.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_backends.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_input_matrix.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_golden.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/release/test_vfr.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/detector.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/scene_manager.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/stats_manager.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/__init__.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/platform.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/frame_timecode.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/common.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/scene_detector.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/video_splitter.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/video_stream.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/__main__.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/_fan_out.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/backends/moviepy.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/backends/pyav.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | scenedetect/backends/concat.py | 3 | # ------------------------------------------------------------------- | COMMENT |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmark/evaluator.py | 182 | def mean_abs_offset_hard_cuts(self) -> float: | CODE |
| LOW | tests/test_stats_manager.py | 101 | def test_save_no_detect_scenes(tmp_path: Path): | CODE |
| LOW | tests/test_stats_manager.py | 137 | def test_save_load_from_video(test_video_file, tmp_path: Path): | CODE |
| LOW | tests/test_backend_pyav.py | 29 | def test_video_stream_pyav_bytesio(test_video_file: str, auto_close): | CODE |
| LOW | tests/test_backend_pyav.py | 63 | def test_read_tolerates_corrupt_frame(test_video_file: str, auto_close): | CODE |
| LOW | tests/test_backend_pyav.py | 83 | def test_read_gives_up_after_consecutive_failures(test_video_file: str, caplog, auto_close): | CODE |
| LOW | tests/test_backend_pyav.py | 100 | def test_rationals_are_fractions(test_video_file: str, auto_close): | CODE |
| LOW | tests/test_backend_pyav.py | 122 | def test_to_fraction_from_stub_rational(): | CODE |
| LOW | tests/test_backend_pyav.py | 142 | def test_duration_fallback_from_stream_duration( | CODE |
| LOW | tests/test_backend_pyav.py | 160 | def test_aspect_ratio_unset_dar( | CODE |
| LOW | tests/test_backend_pyav.py | 177 | def test_rate_normalizes_stream_rational( | CODE |
| LOW | tests/test_backend_pyav.py | 190 | def test_duration_fallback_unset_time_base( | CODE |
| LOW | tests/test_detectors.py | 141 | def get_fade_in_out_test_cases(): | CODE |
| LOW | tests/test_detectors.py | 216 | def test_detectors_with_stats(test_video_file): | CODE |
| LOW | tests/test_detectors.py | 247 | def test_min_scene_len_accepts_time_values(detector_type, min_scene_len): | CODE |
| LOW | tests/test_detectors.py | 267 | def test_adaptive_detector_min_scene_len_uses_target_frame(): | CODE |
| LOW | tests/conftest.py | 70 | def pytest_assertrepr_compare(op, left, right): | STRING |
| LOW | tests/test_scene_manager.py | 64 | def test_get_scene_list_start_in_scene(test_video_file): | CODE |
| LOW | tests/test_scene_manager.py | 109 | def test_detect_scenes_callback(test_video_file): | CODE |
| LOW | tests/test_scene_manager.py | 145 | def test_detect_scenes_callback_adaptive(test_video_file): | CODE |
| LOW | tests/test_scene_manager.py | 215 | def test_expand_scenes_to_bounds_two_scenes(): | CODE |
| LOW | tests/test_scene_manager.py | 230 | def test_expand_scenes_to_bounds_empty(): | CODE |
| LOW | tests/test_scene_manager.py | 236 | def test_expand_scenes_to_bounds_single_scene(): | CODE |
| LOW | tests/test_scene_manager.py | 250 | def test_expand_scenes_to_bounds_does_not_mutate_input(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 49 | def test_hard_tolerance_one_admits_one_frame_offset(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 55 | def test_hard_tolerance_one_rejects_two_frame_offset(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 60 | def test_hard_greedy_picks_closer_match(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 68 | def test_hard_equidistant_tie_resolves_deterministically(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 77 | def test_hard_one_to_one_no_double_assignment(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 114 | def test_fade_pred_inside_interval_is_match(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 120 | def test_fade_pred_outside_interval_not_consumed(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 126 | def test_fade_multiple_preds_in_same_interval(): | CODE |
| LOW⚡ | tests/test_benchmark_evaluator.py | 136 | def test_fade_interval_endpoints_inclusive(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 38 | def test_hard_exact_match_tolerance_zero(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 93 | def test_hard_empty_preds_with_nonempty_gt(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 101 | def test_hard_empty_gt_with_nonempty_preds(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 147 | def test_score_video_fade_consumes_pred_before_hard(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 159 | def test_score_video_pred_outside_fade_falls_to_hard(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 172 | def test_mean_abs_offset_only_hard_matches_tolerance_zero(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 184 | def test_mean_abs_offset_only_hard_matches_tolerance_one(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 196 | def test_mean_abs_offset_nan_when_no_matches(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 202 | def test_benchmark_result_mean_abs_offset_nan_when_no_matches_across_videos(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 227 | def test_benchmark_result_aggregate_matches_sum_of_counts(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 256 | def test_benchmark_result_by_category_buckets_videos(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 281 | def test_benchmark_result_by_category_buckets_untagged_videos_as_unknown(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 307 | def test_event_metrics_addition(): | CODE |
| LOW | tests/test_benchmark_evaluator.py | 314 | def test_event_metrics_to_dict_round_trip(): | CODE |
| LOW | tests/test_video_stream.py | 44 | def get_moviepy_major_version() -> int: | CODE |
| LOW | tests/test_video_stream.py | 361 | def test_framerate_legacy_alias(vs_type: ty.Callable[..., VideoStream], auto_close): | CODE |
| LOW | tests/test_video_stream.py | 397 | def test_decode_failures_clean_video(vs_type: ty.Callable[..., VideoStream], auto_close): | CODE |
| LOW | tests/test_video_stream.py | 406 | def test_delayed_start_normalized( | CODE |
| LOW | tests/test_backend_opencv.py | 45 | def test_open_png_sequence_skips_ffmpeg_probe(test_image_sequence: str, monkeypatch): | CODE |
| LOW | tests/test_backend_opencv.py | 80 | def test_capture_adapter_framerate_legacy_alias(test_movie_clip: str): | CODE |
| LOW | tests/test_backend_opencv.py | 99 | def test_decode_failures_exposed(corrupt_video_file: str): | CODE |
| LOW⚡ | tests/test_timecode.py | 412 | def test_ntsc_framerate_detection_arbitrary_base(): | CODE |
| LOW⚡ | tests/test_timecode.py | 419 | def test_ntsc_framerate_detection_low_precision(): | CODE |
| LOW⚡ | tests/test_timecode.py | 426 | def test_framerate_to_fraction_non_ntsc_fallback(): | CODE |
| LOW⚡ | tests/test_timecode.py | 456 | def test_frame_timecode_accepts_rational_fps(): | CODE |
| LOW⚡ | tests/test_timecode.py | 462 | def test_frame_timecode_rejects_integral_fps(): | CODE |
| LOW⚡ | tests/test_timecode.py | 471 | def test_timecode_normalizes_rational_time_base(): | CODE |
| 124 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | appveyor.yml | 61 | # moviepy.config reads FFMPEG_BINARY (which routes through imageio_ffmpeg) at import time. | COMMENT |
| LOW | appveyor.yml | 101 | # Re-sync APPDIR from CI's dist/scenedetect (handles drift between local and | COMMENT |
| LOW | scenedetect.cfg | 1 | COMMENT | |
| LOW | scenedetect.cfg | 21 | # GLOBAL OPTIONS | COMMENT |
| LOW | scenedetect.cfg | 41 | # Video backend interface, must be one of: opencv, pyav, moviepy. | COMMENT |
| LOW | scenedetect.cfg | 61 | # Amount of frames to skip between performing scene detection. Not recommended. | COMMENT |
| LOW | scenedetect.cfg | 81 | COMMENT | |
| LOW | scenedetect.cfg | 101 | # Weight to place on each component when calculating frame score (the value | COMMENT |
| LOW | scenedetect.cfg | 121 | # merge: Consecutive scenes shorter than min-scene-len are combined. | COMMENT |
| LOW | scenedetect.cfg | 141 | #min-scene-len = 0.6s | COMMENT |
| LOW | scenedetect.cfg | 161 | # Percent from -100.0 to 100.0 of timecode skew for where cuts should be placed. | COMMENT |
| LOW | scenedetect.cfg | 181 | # | COMMENT |
| LOW | scenedetect.cfg | 201 | # Use mkvmerge for copying instead of encoding. Has the same drawbacks as copy = yes. | COMMENT |
| LOW | scenedetect.cfg | 221 | # Folder to output videos. Overrides [global] output option. | COMMENT |
| LOW | scenedetect.cfg | 241 | # seconds with `s` suffix (0.1s), or timecode (00:00:00.100). | COMMENT |
| LOW | scenedetect.cfg | 261 | COMMENT | |
| LOW | scenedetect.cfg | 281 | # Filename format to use when saving scene list. $VIDEO_NAME can be used to | COMMENT |
| LOW | scenedetect.cfg | 321 | # Folder to output EDL file to. Overrides [global] output option. | COMMENT |
| LOW | scenedetect.cfg | 361 | #filename = $VIDEO_NAME-keyframes.txt | COMMENT |
| LOW | scenedetect.cfg | 381 | # | COMMENT |
| LOW | benchmark/report_sweep.py | 1 | # | COMMENT |
| LOW | benchmark/_common.py | 1 | # | COMMENT |
| LOW | benchmark/dataset.py | 1 | # | COMMENT |
| LOW | benchmark/analyze_sweep.py | 1 | # | COMMENT |
| LOW | benchmark/sweep.py | 1 | # | COMMENT |
| LOW | benchmark/evaluator.py | 1 | # | COMMENT |
| LOW | benchmark/__main__.py | 1 | # | COMMENT |
| LOW | packaging/variants/pyproject-scenedetect-headless.toml | 1 | # | COMMENT |
| LOW | packaging/variants/pyproject-scenedetect.toml | 1 | # | COMMENT |
| LOW | packaging/windows/pyi_rth_scenedetect.py | 1 | # | COMMENT |
| LOW | tests/test_stats_manager.py | 1 | # | COMMENT |
| LOW | tests/test_backend_pyav.py | 1 | # | COMMENT |
| LOW | tests/test_detectors.py | 1 | # | COMMENT |
| LOW | tests/conftest.py | 1 | # | COMMENT |
| LOW | tests/test_scene_manager.py | 1 | # | COMMENT |
| LOW | tests/test_benchmark_evaluator.py | 1 | # | COMMENT |
| LOW | tests/test_video_stream.py | 1 | # | COMMENT |
| LOW | tests/test_backend_opencv.py | 1 | # | COMMENT |
| LOW | tests/test_timecode.py | 1 | # | COMMENT |
| LOW | tests/__init__.py | 1 | # | COMMENT |
| LOW | tests/test_output.py | 1 | # | COMMENT |
| LOW | tests/test_concat.py | 1 | # | COMMENT |
| LOW | tests/test_threshold_detector.py | 1 | # | COMMENT |
| LOW | tests/test_fan_out.py | 1 | # | COMMENT |
| LOW | tests/test_platform.py | 1 | # | COMMENT |
| LOW | tests/test_api.py | 1 | # | COMMENT |
| LOW | tests/test_cli.py | 1 | # | COMMENT |
| LOW | tests/test_cli.py | 221 | COMMENT | |
| LOW | tests/helpers.py | 1 | # | COMMENT |
| LOW | tests/test_vfr.py | 1 | # | COMMENT |
| LOW | tests/release/synthetic.py | 1 | # | COMMENT |
| LOW | tests/release/conftest.py | 1 | # | COMMENT |
| LOW | tests/release/test_validation.py | 1 | # | COMMENT |
| LOW | tests/release/test_cli_permutations.py | 1 | # | COMMENT |
| LOW | tests/release/test_long_video.py | 1 | # | COMMENT |
| LOW | tests/release/test_backends.py | 1 | # | COMMENT |
| LOW | tests/release/test_input_matrix.py | 1 | # | COMMENT |
| LOW | tests/release/test_golden.py | 1 | # | COMMENT |
| LOW | tests/release/test_vfr.py | 1 | # | COMMENT |
| LOW | scenedetect/detector.py | 1 | # | COMMENT |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_detectors.py | 0 | returns the absolute path to a (relative) path of a file that should exist within the tests/ directory. throws filenotfo | STRING |
| HIGH | tests/conftest.py | 0 | returns the absolute path to a (relative) path of a file that should exist within the tests/ directory. throws filenotfo | STRING |
| HIGH | tests/test_video_stream.py | 0 | returns the absolute path to a (relative) path of a file that should exist within the tests/ directory. throws filenotfo | STRING |
| HIGH | tests/test_detectors.py | 0 | test video file ({path}) must be present to run test case. this file can be obtained by running the following commands f | STRING |
| HIGH | tests/test_video_stream.py | 0 | test video file ({path}) must be present to run test case. this file can be obtained by running the following commands f | STRING |
| HIGH | tests/conftest.py | 0 | test video file ({path}) must be present to run test case. this file can be obtained by running the following commands f | STRING |
| HIGH | scenedetect/video_stream.py | 0 | duration of the stream as a frametimecode, or none if non terminating. | STRING |
| HIGH | scenedetect/backends/moviepy.py | 0 | duration of the stream as a frametimecode, or none if non terminating. | STRING |
| HIGH | scenedetect/backends/opencv.py | 0 | duration of the stream as a frametimecode, or none if non terminating. | STRING |
| HIGH | scenedetect/video_stream.py | 0 | reported size of each video frame in pixels as a tuple of (width, height). | STRING |
| HIGH | scenedetect/backends/moviepy.py | 0 | reported size of each video frame in pixels as a tuple of (width, height). | STRING |
| HIGH | scenedetect/backends/pyav.py | 0 | reported size of each video frame in pixels as a tuple of (width, height). | STRING |
| HIGH | scenedetect/backends/opencv.py | 0 | reported size of each video frame in pixels as a tuple of (width, height). | STRING |
| HIGH | scenedetect/backends/moviepy.py | 0 | close and re-open the videostream (should be equivalent to calling `seek(0)`). | STRING |
| HIGH | scenedetect/backends/pyav.py | 0 | close and re-open the videostream (should be equivalent to calling `seek(0)`). | STRING |
| HIGH | scenedetect/backends/opencv.py | 0 | close and re-open the videostream (should be equivalent to calling `seek(0)`). | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmark/report_sweep.py | 25 | CODE | |
| LOW | benchmark/_common.py | 20 | CODE | |
| LOW | benchmark/analyze_sweep.py | 40 | CODE | |
| LOW | benchmark/sweep.py | 38 | CODE | |
| LOW | benchmark/evaluator.py | 29 | CODE | |
| LOW | benchmark/__main__.py | 20 | CODE | |
| LOW | tests/test_benchmark_evaluator.py | 17 | CODE | |
| LOW | tests/test_fan_out.py | 14 | CODE | |
| LOW | scenedetect/scene_manager.py | 100 | CODE | |
| LOW | scenedetect/__init__.py | 35 | CODE | |
| LOW | scenedetect/__init__.py | 35 | CODE | |
| LOW | scenedetect/__init__.py | 35 | CODE | |
| LOW | scenedetect/__init__.py | 35 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 48 | CODE | |
| LOW | scenedetect/__init__.py | 61 | CODE | |
| LOW | scenedetect/__init__.py | 61 | CODE | |
| LOW | scenedetect/__init__.py | 61 | CODE | |
| LOW | scenedetect/__init__.py | 61 | CODE | |
| LOW | scenedetect/__init__.py | 61 | CODE | |
| LOW | scenedetect/__init__.py | 68 | CODE | |
| LOW | scenedetect/__init__.py | 68 | CODE | |
| LOW | scenedetect/__init__.py | 68 | CODE | |
| LOW | scenedetect/__init__.py | 68 | CODE | |
| LOW | scenedetect/__init__.py | 78 | CODE | |
| LOW | scenedetect/__init__.py | 25 | CODE | |
| LOW | scenedetect/frame_timecode.py | 22 | CODE | |
| LOW | scenedetect/scene_detector.py | 22 | CODE | |
| LOW | scenedetect/video_splitter.py | 22 | CODE | |
| LOW | scenedetect/_fan_out.py | 23 | CODE | |
| LOW | scenedetect/backends/__init__.py | 95 | CODE | |
| LOW | scenedetect/backends/__init__.py | 96 | CODE | |
| LOW | scenedetect/backends/__init__.py | 97 | CODE | |
| LOW | scenedetect/output/__init__.py | 46 | CODE | |
| LOW | scenedetect/output/__init__.py | 47 | CODE | |
| LOW | scenedetect/output/__init__.py | 50 | CODE | |
| LOW | scenedetect/output/__init__.py | 53 | CODE | |
| LOW | scenedetect/output/__init__.py | 56 | CODE | |
| LOW | scenedetect/output/__init__.py | 59 | CODE | |
| LOW | scenedetect/output/__init__.py | 62 | CODE | |
| LOW | scenedetect/output/__init__.py | 65 | CODE | |
| LOW | scenedetect/output/__init__.py | 68 | CODE | |
| LOW | scenedetect/detectors/__init__.py | 38 | CODE | |
| LOW | scenedetect/detectors/__init__.py | 39 | CODE | |
| LOW | scenedetect/detectors/__init__.py | 40 | CODE | |
| LOW | scenedetect/detectors/__init__.py | 41 | CODE | |
| LOW | scenedetect/detectors/__init__.py | 42 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | benchmark/sweep.py | 77 | except ValueError: | CODE |
| HIGH | benchmark/sweep.py | 81 | except ValueError: | CODE |
| HIGH | benchmark/evaluator.py | 209 | except ValueError: | CODE |
| HIGH | scenedetect/platform.py | 261 | except OSError: | CODE |
| HIGH | scenedetect/platform.py | 271 | except ModuleNotFoundError: | CODE |
| HIGH | scenedetect/platform.py | 274 | except OSError: | CODE |
| HIGH | scenedetect/platform.py | 277 | except RuntimeError: | CODE |
| HIGH | scenedetect/platform.py | 332 | except importlib.metadata.PackageNotFoundError: | CODE |
| HIGH | scenedetect/backends/pyav.py | 184 | except Exception: | CODE |
| HIGH | scenedetect/output/image.py | 222 | except queue.Empty: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_cli.py | 1117 | "available_image_bounds": null, | CODE |
| HIGH | tests/test_cli.py | 1157 | "available_image_bounds": null, | CODE |
| HIGH | tests/test_cli.py | 1205 | "available_image_bounds": null, | CODE |
| HIGH | tests/test_cli.py | 1245 | "available_image_bounds": null, | CODE |
| HIGH | tests/test_cli.py | 1335 | "available_image_bounds": null, | CODE |
| HIGH | tests/test_cli.py | 1375 | "available_image_bounds": null, | CODE |
| HIGH | scenedetect/detectors/transnet_v2.py | 79 | cuts.extend(self.det.push(pred[i, 25:75, 0], time[i, 25:75])) | CODE |
| HIGH | scenedetect/detectors/transnet_v2.py | 178 | cuts = self.predictor.push(self.px[self.j], self.time[self.j]) | CODE |
| HIGH | scenedetect/detectors/transnet_v2.py | 199 | cuts.extend(self.predictor.push(self.px[self.j], self.time[self.j])) | CODE |
| HIGH | scenedetect/detectors/transnet_v2.py | 205 | cuts.extend(self.predictor.push(self.px[self.j], self.time[self.j])) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmark/dataset.py | 173 | CODE | |
| LOW | benchmark/evaluator.py | 269 | CODE | |
| LOW | tests/helpers.py | 24 | CODE | |
| LOW | scenedetect/scene_manager.py | 410 | CODE | |
| LOW | scenedetect/scene_manager.py | 446 | CODE | |
| LOW | scenedetect/scene_manager.py | 625 | CODE | |
| LOW | scenedetect/stats_manager.py | 221 | CODE | |
| LOW | scenedetect/common.py | 505 | CODE | |
| LOW | scenedetect/_fan_out.py | 123 | CODE | |
| LOW | scenedetect/backends/opencv.py | 262 | CODE | |
| LOW | scenedetect/backends/opencv.py | 306 | CODE | |
| LOW | scenedetect/output/video.py | 255 | CODE | |
| LOW | scenedetect/output/image.py | 38 | CODE | |
| LOW | scenedetect/output/image.py | 352 | CODE | |
| LOW | scenedetect/_cli/config.py | 585 | CODE | |
| LOW | scenedetect/_cli/config.py | 156 | CODE | |
| LOW | scenedetect/_cli/context.py | 176 | CODE | |
| LOW | scenedetect/detectors/threshold_detector.py | 111 | CODE | |
| LOW | scripts/validate_release.py | 209 | CODE | |
| LOW | scripts/generate_goldens.py | 59 | CODE | |
| LOW | scripts/_release_common.py | 67 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | benchmark/sweep.py | 98 | # Small epsilon to keep an inclusive upper bound robust against float drift. | COMMENT |
| LOW⚡ | tests/test_timecode.py | 496 | # Should not raise or warn - just return the approximate frame number. | COMMENT |
| LOW | scenedetect/backends/opencv.py | 324 | # We didn't manage to grab a frame even after retrying, so just return. | COMMENT |
| LOW | scenedetect/backends/opencv.py | 561 | # We didn't manage to grab a frame even after retrying, so just return. | COMMENT |
| MEDIUM | scenedetect/detectors/histogram_detector.py | 94 | # TODO: We can have EMA of histograms to make it more robust | COMMENT |
| MEDIUM | scenedetect/detectors/content_detector.py | 42 | # Create a more comprehensive test suite to optimize against. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/release/test_validation.py | 137 | except Exception as exc: | CODE |
| LOW | tests/release/test_backends.py | 71 | except Exception as exc: | CODE |
| LOW | tests/release/test_backends.py | 122 | except Exception as exc: | CODE |
| LOW | scenedetect/backends/pyav.py | 149 | except Exception as ex: | CODE |
| LOW | scenedetect/backends/pyav.py | 184 | except Exception: | CODE |
| LOW | scenedetect/backends/pyav.py | 324 | except Exception as ex: | CODE |
| LOW | scripts/generate_goldens.py | 82 | except Exception as e: | CODE |
| MEDIUM | scripts/stage_windows_dist.py | 42 | print("Error: stage_windows_dist.py must be run on Windows.", file=sys.stderr) | CODE |
| MEDIUM | scripts/generate_assets.py | 165 | print("Error: Inkscape not found. Please install it or add it to PATH.", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scenedetect/__init__.py | 96 | Open a video at the given path. If `backend` is specified but not available on the current system, OpenCV (`VideoStr | STRING |
| HIGH | scenedetect/platform.py | 225 | Same as calling Python's subprocess.call() method, but explicitly raises a different exception when the command leng | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scenedetect.cfg | 3 | # This file contains every possible PySceneDetect config option. | COMMENT |
| MEDIUM | scenedetect/detectors/histogram_detector.py | 158 | # Create the histogram with a bin for every rgb value | COMMENT |
| MEDIUM | scenedetect/detectors/content_detector.py | 42 | # Create a more comprehensive test suite to optimize against. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/release/test_cli_permutations.py | 31 | CODE | |
| LOW | scenedetect/output/video.py | 255 | CODE | |
| LOW | scenedetect/output/image.py | 352 | CODE | |
| LOW | scenedetect/output/image.py | 109 | CODE | |
| LOW | scenedetect/_cli/__init__.py | 1523 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_backend_pyav.py | 89 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/release.yml | 33 | actions: write # `gh workflow run` on the workflows this one orchestrates | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_output.py | 99 | # TODO: Add tests for `split_video_mkvmerge`. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scenedetect/detectors/histogram_detector.py | 100 | # Check if a new scene should be triggered | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scenedetect/stats_manager.py | 137 | def set_metrics(self, timecode: int | FrameTimecode, metric_kv_dict: dict[str, ty.Any]) -> None: | CODE |