Skip to content

Commit 8b71e68

Browse files
authored
Release v0.7.1 (#560)
Release checklist for v0.7.1 (from RELEASE-PLAN.md). Boxes reflect current progress; this PR merges `releases/0.7.1` back into `main` as the final step after the release is verified and published. ## 1. Version Identifiers, Branch Prep - [x] Create release branch `releases/0.7.1` off `main`; fast-forward it to `main` as release work lands. - [x] Bump `__version__` in `scenedetect/__init__.py` (`0.7.1`) - [x] Bump `docs/LATEST_VERSION` (`0.7.1`, matches the branch suffix so `generate-docs.yml` updates `docs/latest`) - [x] Regular release: no `-dev` suffix ## 2. Documentation, Website, Changelog - [x] Docstrings / API docs reflect any signature changes (`sphinx-build` completes clean). - [x] `docs/api/migration_guide.rst` reviewed - 0.7.1 is additive-only (no breaking changes), no update needed. - [x] Docstring examples all run correctly, nothing references removed or deprecated symbols. (Usage examples in `scene_manager.py` / `detect()` executed against a real video; fixed a stale placeholder doctest in `histogram_detector.py`.) - [x] Changelog has release notes: 0.7.1 section with summary, all features/bugfixes documented. - [x] `website/pages/download.md` updated (v0.7.1, July 2026, installer links point at the `v0.7.1` tag). - [x] `website/pages/changelog.md`: 0.7.1 section moved from the Development section to the top (nested under `## PySceneDetect 0.7`); fresh 0.7.2 stub left at the bottom. - [x] `website/pages/index.md`: latest release version and date updated. - [x] `docs/cli.rst` regenerated (had pre-existing drift: `--frame-rate` rename, `save-edl --start-timecode`). ## 3. Tests - [x] Static analysis passing (ruff check + format clean, pyright 0 errors). - [x] Unit tests green locally: 358 passed / 2 skipped in the dev venv, and again in a fresh venv with the exact Windows build pins (OpenCV 5.0.0.93, PyAV 18.0.0, numpy 2.5.1). - [x] Release test suite green in CI: all 4 jobs (`static`, `release-tests`, `install-matrix`, `long-stress`) on the tag. (Local pre-check: 79 passed / 3 skipped; one test needs `ffprobe`, which is unavailable locally - covered by CI.) - [x] `pip-audit` clean or exceptions documented in the changelog. pillow 11.3.0 (transitive via moviepy's `pillow<12.0` cap, [moviepy#2553](Zulko/moviepy#2553)) had 5 CVEs fixed only in 12.3.0: overridden to 12.3.0 in the Windows build (appveyor.yml) and Docker image (Dockerfile), noted in the changelog; full test suite passes against 12.3.0. Remaining `pip` audit findings are build-tooling only (not shipped). PyPI installs still resolve pillow per moviepy's cap - fixable only upstream. - [x] `packaging/build_all.py` produces all 6 artifacts at 0.7.1. ## 4. Prepare Windows Distribution - [x] `packaging/windows/requirements.txt` updated (OpenCV 5, PyAV 18, numpy 2.5.1, click 8.4.2, platformdirs 4.11.0, tqdm 4.69.0) and bundled ffmpeg bumped to 8.1.2 in `appveyor.yml`. - [x] `scripts/update_installer.py` run: `.aip` at ProductVersion 0.7.1, fresh ProductCode, MSI filename `PySceneDetect-0.7.1-win64.msi`; parity with `__version__` verified. - [x] Run AppVeyor build on release branch, ensure resulting portable distribution and MSI installer are correct. ## 5. Tag & Draft Release - [x] Final commit on `releases/0.7.1`: "Release v0.7.1". - [x] Tag `v0.7.1` on that commit and push. Wait for all tests/builds to pass. - [x] Approve code signing request on SignPath, download `scenedetect-signed.zip` - [x] Finalize Windows artifacts locally: drop `scenedetect-signed.zip` into `dist/signed/`, run `python scripts/finalize_windows_dist.py` (rebuilds portable .zip from the signed .msi, writes manifest + SHA256SUMS, runs `scripts/validate_release.py`). - [x] Draft release on Github using the tagged commit: full changelog and release notes, signed portable .ZIP, signed .MSI installer, Python .whl/.tar.gz packages, and checksum manifests (`PySceneDetect-0.7.1-win64.manifest.json` + `SHA256SUMS`) - [x] Verify all artifacts uploaded to Github release are valid and named correctly - [x] Smoke-test all release artifacts ## 6. Publish & Release Checks - [x] Dispatch `release.yml` (Release Orchestrator) with `tag=v0.7.1` while the release is still a **draft**. It runs the verify-then-publish ladder (MSI install/upgrade test -> TestPyPI -> publish Github release -> PyPI -> Docker), verifying each stage before the next. - [x] Verify the Docker image on GHCR: `ghcr.io/breakthrough/pyscenedetect:latest` and the version tag. - [x] Verify all three projects: https://pypi.org/project/scenedetect/, https://pypi.org/project/scenedetect-headless/, and https://pypi.org/project/scenedetect-core/. - [ ] Deploy website: `generate-website.yml` - [ ] Deploy docs: `generate-docs.yml` - [ ] Merge this PR (release branch back into `main`), verify `docs/LATEST_VERSION` is correct - [ ] [Manually dispatch `generate-docs.yml`](https://github.com/Breakthrough/PySceneDetect/actions/workflows/generate-docs.yml) against `releases/0.7.1` to update www.scenedetect.com/docs/latest - [x] Smoke-test PyPI release: in a fresh venv, `pip install scenedetect==0.7.1`; CLI launches and `scenedetect version` looks correct. - [ ] Verify download links on website are correct, PyPI project page is up to date and correct. - [ ] Clear / archive release-scoped tracking files. - [ ] Announce: project site, relevant issues / discussions closed and linked to the release.
2 parents 1a5bdaa + 6ebb723 commit 8b71e68

12 files changed

Lines changed: 127 additions & 60 deletions

File tree

Dockerfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ RUN apt-get update && \
3333
# moviepy provides an alternative video splitting backend
3434
RUN --mount=type=cache,target=/root/.cache/pip \
3535
cp packaging/variants/pyproject-scenedetect-headless.toml pyproject.toml && \
36-
pip install ".[pyav,moviepy]"
36+
pip install ".[pyav,moviepy]" && \
37+
# TODO(https://github.com/Zulko/moviepy/issues/2553): moviepy caps pillow<12.0, but 11.x has
38+
# CVEs only fixed in 12.3.0+. Tests pass against 12.3.0; drop this once moviepy lifts the cap.
39+
pip install "pillow==12.3.0"
3740

3841
# Switch to the non-root user
3942
USER scenedetect

appveyor.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ cache:
1212
- '%LOCALAPPDATA%\uv\cache -> pyproject.toml'
1313
- 'C:\Program Files\Inkscape'
1414

15-
# Branches applies to tags as well. We only build on tagged releases of the form vX.Y.Z-release
15+
# Branches applies to tags as well. We only build on tagged releases of the form
16+
# vX.Y[.Z] (the legacy -release suffix is also accepted, matching the GitHub workflows).
1617
branches:
1718
only:
1819
- main
1920
- /releases\/.+/
20-
- /v.+-release/
21+
- /v.+/
2122

2223
skip_tags: false
2324
skip_non_tags: true
@@ -30,7 +31,7 @@ environment:
3031
secure: QRCPoNYF1nqgXDn7pHgBzg==
3132
ai_license_salt:
3233
secure: +Gy+SRk8JUsaM+5pMEKITiJxdLilrxHpkKlrZzR3C9DPwdgYLGxt5sJn6uXuAJg7e6JsKHcT7tRks/HcSKkHPw==
33-
ffmpeg_version: "8.1"
34+
ffmpeg_version: "8.1.2"
3435

3536
# SignPath Config for Code Signing
3637
deploy:
@@ -50,6 +51,11 @@ install:
5051
- python -m pip install uv
5152
- uv pip install --system .[docs]
5253
- uv pip install --system -r packaging/windows/requirements.txt --no-binary imageio-ffmpeg
54+
# TODO(https://github.com/Zulko/moviepy/issues/2553): moviepy caps pillow<12.0, but 11.x has
55+
# CVEs only fixed in 12.3.0+. Installed as a separate step since a pin in requirements.txt
56+
# would fail strict resolution against moviepy's constraint. Tests pass against 12.3.0;
57+
# drop this once moviepy lifts the cap.
58+
- uv pip install --system pillow==12.3.0
5359
- if not exist ffmpeg-%ffmpeg_version%-full_build.7z appveyor DownloadFile https://github.com/GyanD/codexffmpeg/releases/download/%ffmpeg_version%/ffmpeg-%ffmpeg_version%-full_build.7z
5460
- 7z e ffmpeg-%ffmpeg_version%-full_build.7z -odist/ffmpeg ffmpeg.exe LICENSE -r
5561
# moviepy.config reads FFMPEG_BINARY (which routes through imageio_ffmpeg) at import time.

docs/LATEST_VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.7
1+
0.7.1

docs/cli.rst

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,13 @@ Options
6161

6262
Stats file (.csv) to write frame metrics. Existing files will be overwritten. Used for tuning detection parameters and data analysis.
6363

64-
.. option:: -f FPS, --framerate FPS
64+
.. option:: -f FPS, --frame-rate FPS
6565

66-
Override framerate with value as frames/sec.
66+
Override frame rate with value as frames/sec.
67+
68+
.. option:: --framerate FPS
69+
70+
[DEPRECATED] Use :option:`-f/--frame-rate <-f>` instead.
6771

6872
.. option:: -m TIMECODE, --min-scene-len TIMECODE
6973

@@ -549,6 +553,10 @@ Options
549553

550554
Output directory to save EDL file to. Overrides global option :option:`-o/--output <scenedetect -o>`.
551555

556+
.. option:: -s TIMECODE, --start-timecode TIMECODE
557+
558+
Start timecode added to every event so the EDL aligns with the source media's on-screen timecode. Accepts SMPTE HH:MM:SS:FF or 8 digits (HHMMSSFF, e.g. 01000000).
559+
552560

553561
.. _command-save-fcp:
554562

@@ -859,7 +867,7 @@ Options
859867

860868
.. option:: --expand
861869

862-
Extend the first/last output clips to cover the full input video, even if the :ref:`time <command-time>` command's ``--start``/``--end`` limited the analysis window. Useful for keeping content outside the analyzed region attached to the adjacent split.
870+
Extend the first/last output clips to cover the full input video, even if `time -s/-e` limited the analysis window. Useful for keeping content outside the analyzed region attached to the adjacent split.
863871

864872

865873
.. _command-time:
Lines changed: 41 additions & 0 deletions
Loading

packaging/windows/installer/PySceneDetect.aip

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
<ROW Property="DialogBitmap" Value="dialog.jpg" MultiBuildValue="DefaultBuild:installer_logo.jpg" Type="1" MsiKey="DialogBitmap"/>
2424
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/>
2525
<ROW Property="Manufacturer" Value="Brandon Castellano"/>
26-
<ROW Property="ProductCode" Value="1033:{F7AA154A-21CB-45BA-AF86-174E86A21960} " Type="16"/>
26+
<ROW Property="ProductCode" Value="1033:{61D7DE50-E4E4-456F-9361-413F73DA43FC} " Type="16"/>
2727
<ROW Property="ProductLanguage" Value="1033"/>
2828
<ROW Property="ProductName" Value="PySceneDetect"/>
29-
<ROW Property="ProductVersion" Value="0.7.0" Options="32"/>
29+
<ROW Property="ProductVersion" Value="0.7.1" Options="32"/>
3030
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/>
3131
<ROW Property="UpgradeCode" Value="{D0AF0419-DBD5-455C-A4AC-4518A35DD23E}"/>
3232
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
@@ -159,7 +159,7 @@
159159
<ROW Directory="x86simdsort_Dir" Directory_Parent="npysort_Dir" DefaultDir="X86-SI~1|x86-simd-sort"/>
160160
</COMPONENT>
161161
<COMPONENT cid="caphyon.advinst.msicomp.SideBySideGuidComponent">
162-
<ROW Component="AI_CustomARPName" Value="{C37CA592-883C-4811-AC57-69BF5ABA66D7}"/>
162+
<ROW Component="AI_CustomARPName" Value="{875513D0-8249-4DFA-BE9C-4A2A1B22F171}"/>
163163
<ROW Component="AI_DisableModify" Value="{5AB8A335-BCAB-4C0A-8A69-E2AE7542AB47}"/>
164164
<ROW Component="AI_ExePath" Value="{F7DEDE0C-FDB1-411C-B347-A482CE69721F}"/>
165165
<ROW Component="APPDIR" Value="{6B122BDD-2BF8-41D4-92E0-884DD60467B4}"/>
@@ -291,7 +291,7 @@
291291
</COMPONENT>
292292
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
293293
<ROW Component="ACT" ComponentId="{31CB1D42-690C-4AA9-ABEB-7591D8240C30}" Directory_="Australia_Dir" Attributes="0" KeyPath="ACT" Type="0"/>
294-
<ROW Component="AI_CustomARPName" ComponentId="{C37CA592-883C-4811-AC57-69BF5ABA66D7}" Directory_="APPDIR" Attributes="260" KeyPath="DisplayName" Options="1"/>
294+
<ROW Component="AI_CustomARPName" ComponentId="{875513D0-8249-4DFA-BE9C-4A2A1B22F171}" Directory_="APPDIR" Attributes="260" KeyPath="DisplayName" Options="1"/>
295295
<ROW Component="AI_DisableModify" ComponentId="{5AB8A335-BCAB-4C0A-8A69-E2AE7542AB47}" Directory_="APPDIR" Attributes="260" KeyPath="NoModify" Options="1"/>
296296
<ROW Component="AI_ExePath" ComponentId="{F7DEDE0C-FDB1-411C-B347-A482CE69721F}" Directory_="APPDIR" Attributes="260" KeyPath="AI_ExePath"/>
297297
<ROW Component="APPDIR" ComponentId="{6B122BDD-2BF8-41D4-92E0-884DD60467B4}" Directory_="APPDIR" Attributes="0"/>
@@ -1743,7 +1743,7 @@
17431743
<ROW Action="AI_CleanPrePrereq" Condition="AI_BOOTSTRAPPER AND (NOT AI_PrereqsFulfilled)" Sequence="699"/>
17441744
</COMPONENT>
17451745
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
1746-
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="." PackageFileName="PySceneDetect-0.7.0-win64" Languages="en" InstallationType="4" ExtUI="true" UseLargeSchema="true" MsiPackageType="x64"/>
1746+
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="." PackageFileName="PySceneDetect-0.7.1-win64" Languages="en" InstallationType="4" ExtUI="true" UseLargeSchema="true" MsiPackageType="x64"/>
17471747
</COMPONENT>
17481748
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
17491749
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>

packaging/windows/requirements.txt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# PySceneDetect Requirements for Windows Build
2-
av==17.0.1
3-
click==8.2.1
2+
# NOTE: pillow (transitive, via moviepy) is overridden to 12.3.0 in appveyor.yml for CVE fixes
3+
# (see https://github.com/Zulko/moviepy/issues/2553).
4+
av==18.0.0
5+
click==8.4.2
46
imageio-ffmpeg==0.6.0
57
moviepy==2.2.1
6-
opencv-python-headless==4.13.0.92
7-
numpy==2.4.4
8-
platformdirs==4.9.6
9-
tqdm==4.67.3
8+
opencv-python-headless==5.0.0.93
9+
numpy==2.5.1
10+
platformdirs==4.11.0
11+
tqdm==4.69.0
1012

1113
# Build-only and test-only requirements.
1214
pyinstaller

scenedetect/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979

8080
# Used for module identification and when printing version & about info
8181
# (e.g. calling `scenedetect version` or `scenedetect about`).
82-
__version__ = "0.7.1-dev0"
82+
__version__ = "0.7.1"
8383

8484
init_logger()
8585
logger = getLogger("pyscenedetect")

scenedetect/detectors/histogram_detector.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,12 @@ def calculate_histogram(
145145
relative frequency.
146146
147147
Example:
148-
>>> img = cv2.imread("path_to_image.jpg")
149-
>>> hist = calculate_histogram(img, bins=256, normalize=True)
150-
>>> print(hist.shape)
151-
(256,)
148+
149+
.. code:: python
150+
151+
img = cv2.imread("path_to_image.jpg")
152+
hist = HistogramDetector.calculate_histogram(img, bins=256, normalize=True)
153+
assert hist.shape == (256,)
152154
"""
153155
# Extract Luma channel from the frame image
154156
y, _, _ = cv2.split(cv2.cvtColor(frame_img, cv2.COLOR_BGR2YUV))

website/pages/changelog.md

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,40 @@
33

44
## PySceneDetect 0.7
55

6+
### PySceneDetect 0.7.1 (July 2026)
7+
8+
PySceneDetect 0.7.1 adds a new `scenedetect-core` package and official Docker images to make downstream integration easier, along with support for concatenating multiple videos. It also includes several stability and robustness fixes for the PyAV and OpenCV backends.
9+
10+
#### CLI Changes
11+
12+
- [feature] `split-video` has a new `--expand` flag: when scenes are detected within a time window (`-s`/`-e`), the first output clip is extended back to the start of the video and the last clip is extended forward to the end, so no footage outside the analysis window is dropped [#115](https://github.com/Breakthrough/PySceneDetect/issues/115)
13+
14+
#### API Changes
15+
16+
- [feature] `scenedetect.detect()` now accepts a `backend` keyword argument (`"opencv"`, `"pyav"`, or `"moviepy"`) similar to `open_video`. Defaults to `"opencv"`, matching prior behavior.
17+
- [feature] Add `expand_scenes_to_bounds()` helper in `scenedetect.scene_manager` to extend a scene list so the first scene starts at a given lower bound and the last scene ends at a given upper bound
18+
- [feature] `VideoStream` now provides a public read-only `decode_failures` property reporting the number of frames that failed to decode and were skipped (defaults to 0; populated by the OpenCV and PyAV backends)
19+
- [feature] Add `VideoStreamConcat` (`scenedetect.backends.concat`) which concatenates multiple videos into a single continuous stream with a monotonic PTS timeline; `open_video()` and `detect()` now accept a list of paths. `VideoStreamConcat.map_span()` maps spans of the global timeline back to per-source local times
20+
- [bugfix] The PyAV backend (`VideoStreamAv`) now skips corrupt frames during `read()` and continues decoding instead of failing, giving up only after 8 consecutive decode failures (matching the OpenCV backend's tolerance behavior)
21+
- [bugfix] The PyAV backend now normalizes presentation times by the stream start time, so files with a delayed start (e.g. from edit lists) report the first frame at `position` 0, consistent with other backends and with `seek()`
22+
- [bugfix] Comparisons between two `FrameTimecode` objects that both carry exact presentation times (e.g. positions from VFR videos) and share the same frame rate are now performed exactly using `pts` and `time_base` instead of rounded frame numbers. Previously, distinct frames in VFR sections could compare equal or fail strict ordering when their times rounded to the same approximate frame number. Comparisons involving frame- or seconds-based timecodes, plain values (`int`/`float`/`str`), or differing frame rates are unchanged
23+
- [bugfix] Fix image sequence inputs when using OpenCV 5.0
24+
25+
#### Packaging
26+
27+
- [feature] Add `scenedetect-core`, a new library-only package with minimal dependencies (`numpy` only): it does not depend on any specific OpenCV variant, allowing downstream projects to choose their own (e.g. `opencv-contrib-python`), and does not include the CLI dependencies or the `scenedetect` command [#558](https://github.com/Breakthrough/PySceneDetect/issues/558). Convenience extras `scenedetect-core[opencv]` and `scenedetect-core[opencv-headless]` are provided
28+
- [general] `scenedetect` and `scenedetect-headless` are unchanged: they continue to ship the full program (library + CLI) with `opencv-python` / `opencv-python-headless` respectively. All three packages provide the same `scenedetect` module (install or depend only one)
29+
- [feature] Official Docker images are now published to the GitHub Container Registry with the full CLI, all backends, and external tools (ffmpeg, mkvmerge) included, thanks [@FNGarvin](https://github.com/FNGarvin) [#537](https://github.com/Breakthrough/PySceneDetect/pull/537)
30+
- Example usage (process a video in the current directory):
31+
```bash
32+
docker run --rm -v "$(pwd):/files" ghcr.io/breakthrough/pyscenedetect -i /files/video.mp4 detect-adaptive split-video -o /files
33+
```
34+
- [general] The Windows distribution now bundles OpenCV 5.0, PyAV 18, and FFmpeg 8.1.2. The Windows and Docker builds also override Pillow to 12.3.0 for upstream security fixes ([moviepy#2553](https://github.com/Zulko/moviepy/issues/2553))
35+
36+
#### General
37+
38+
- [general] Benchmark results are now published on the website ([scenedetect.com/benchmarks](https://www.scenedetect.com/benchmarks/)), including accuracy at default settings and parameter sweep curves for each detector
39+
640
### 0.7 (May 3, 2026)
741

842
PySceneDetect 0.7 is a **major breaking release** which overhauls how timestamps are handled. This allows PySceneDetect to properly process variable framerate (VFR) videos. A significant amount of technical debt has been addressed, including removal of deprecated or overly complicated APIs.
@@ -747,33 +781,4 @@ Both the Windows installer and portable distributions now include signed executa
747781
Development
748782
==========================================================
749783

750-
## PySceneDetect 0.7.1 (TDB)
751-
752-
#### CLI Changes
753-
754-
- [feature] `split-video` has a new `--expand` flag: when scenes are detected within a time window (`-s`/`-e`), the first output clip is extended back to the start of the video and the last clip is extended forward to the end, so no footage outside the analysis window is dropped [#115](https://github.com/Breakthrough/PySceneDetect/issues/115)
755-
756-
#### API Changes
757-
758-
- [feature] `scenedetect.detect()` now accepts a `backend` keyword argument (`"opencv"`, `"pyav"`, or `"moviepy"`) similar to `open_video`. Defaults to `"opencv"`, matching prior behavior.
759-
- [feature] Add `expand_scenes_to_bounds()` helper in `scenedetect.scene_manager` to extend a scene list so the first scene starts at a given lower bound and the last scene ends at a given upper bound
760-
- [feature] `VideoStream` now provides a public read-only `decode_failures` property reporting the number of frames that failed to decode and were skipped (defaults to 0; populated by the OpenCV and PyAV backends)
761-
- [feature] Add `VideoStreamConcat` (`scenedetect.backends.concat`) which concatenates multiple videos into a single continuous stream with a monotonic PTS timeline; `open_video()` and `detect()` now accept a list of paths. `VideoStreamConcat.map_span()` maps spans of the global timeline back to per-source local times
762-
- [bugfix] The PyAV backend (`VideoStreamAv`) now skips corrupt frames during `read()` and continues decoding instead of failing, giving up only after 8 consecutive decode failures (matching the OpenCV backend's tolerance behavior)
763-
- [bugfix] The PyAV backend now normalizes presentation times by the stream start time, so files with a delayed start (e.g. from edit lists) report the first frame at `position` 0, consistent with other backends and with `seek()`
764-
- [bugfix] Comparisons between two `FrameTimecode` objects that both carry exact presentation times (e.g. positions from VFR videos) and share the same frame rate are now performed exactly using `pts` and `time_base` instead of rounded frame numbers. Previously, distinct frames in VFR sections could compare equal or fail strict ordering when their times rounded to the same approximate frame number. Comparisons involving frame- or seconds-based timecodes, plain values (`int`/`float`/`str`), or differing frame rates are unchanged
765-
- [bugfix] Fix image sequence inputs when using OpenCV 5.0
766-
767-
#### Packaging
768-
769-
- [feature] Add `scenedetect-core`, a new library-only package with minimal dependencies (`numpy` only): it does not depend on any specific OpenCV variant, allowing downstream projects to choose their own (e.g. `opencv-contrib-python`), and does not include the CLI dependencies or the `scenedetect` command [#558](https://github.com/Breakthrough/PySceneDetect/issues/558). Convenience extras `scenedetect-core[opencv]` and `scenedetect-core[opencv-headless]` are provided
770-
- [general] `scenedetect` and `scenedetect-headless` are unchanged: they continue to ship the full program (library + CLI) with `opencv-python` / `opencv-python-headless` respectively. All three packages provide the same `scenedetect` module (install or depend only one)
771-
- [feature] Official Docker images are now published to the GitHub Container Registry with the full CLI, all backends, and external tools (ffmpeg, mkvmerge) included, thanks [@FNGarvin](https://github.com/FNGarvin) [#537](https://github.com/Breakthrough/PySceneDetect/pull/537)
772-
- Example usage (process a video in the current directory):
773-
```bash
774-
docker run --rm -v "$(pwd):/files" ghcr.io/breakthrough/pyscenedetect -i /files/video.mp4 detect-adaptive split-video -o /files
775-
```
776-
777-
#### General
778-
779-
- [general] Benchmark results are now published on the website ([scenedetect.com/benchmarks](https://www.scenedetect.com/benchmarks/)), including accuracy at default settings and parameter sweep curves for each detector
784+
## PySceneDetect 0.7.2 (TBD)

0 commit comments

Comments
 (0)