You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Parse __version__ directly so we don't have to install scenedetect
25
+
# (importing it triggers a cv2-availability guard).
26
+
VERSION=$(python -c "import ast,pathlib; print(next(n.value.value for n in ast.parse(pathlib.Path('scenedetect/__init__.py').read_text()).body if isinstance(n, ast.Assign) and any(getattr(t,'id',None)=='__version__' for t in n.targets)))")
25
27
echo "scenedetect.__version__ = $VERSION"
26
28
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
27
29
TAG_VERSION=${GITHUB_REF#refs/tags/v}
@@ -37,10 +39,16 @@ jobs:
37
39
fi
38
40
- name: Build and Check
39
41
run: |
40
-
python -m build
41
-
twine check dist/*
42
+
# Build to a clean output dir - `dist/` already holds tracked installer
43
+
# scripts and config (e.g. dist/generate_assets.py, dist/installer/),
44
+
# so `twine check dist/*` would try to validate non-distribution files.
45
+
python -m build --outdir build-dist
46
+
twine check build-dist/*
42
47
- name: pip-audit
43
-
run: pip-audit
48
+
# CVE-2026-3219 in pip 26.0.1 has no fix version available upstream
49
+
# and pip ships pre-installed on the runner (not controlled by this
Copy file name to clipboardExpand all lines: RELEASE-PLAN.md
+7-7Lines changed: 7 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
# PySceneDetect Release Checklist
2
2
3
3
Use one copy per release (e.g. tick the boxes in a tracking issue or draft PR).
4
-
Version referenced below as `X.Y[.Z]`— replace with the real version throughout.
4
+
Version referenced below as `X.Y[.Z]`- replace with the real version throughout.
5
5
6
6
## 0. Branch setup
7
7
@@ -11,7 +11,7 @@ Version referenced below as `X.Y[.Z]` — replace with the real version througho
11
11
## 1. Code & version
12
12
13
13
-[ ] Bump `__version__` in `scenedetect/__init__.py`.
14
-
-[ ] Bump `ProductVersion` in `dist/installer/PySceneDetect.aip` (must match `__version__`—`dist/pre_release.py --release` asserts this).
14
+
-[ ] Bump `ProductVersion` in `dist/installer/PySceneDetect.aip` (must match `__version__`-`dist/pre_release.py --release` asserts this).
15
15
-[ ] No `-dev` / pre-release suffix on the version string for a final release.
16
16
17
17
> **Note:**`setup.cfg` reads the package version dynamically via `version = attr: scenedetect.__version__`, and `pyproject.toml` does not declare a `version` field. The single source of truth is `scenedetect/__init__.py`; the `.aip` is the only other place to keep in sync.
@@ -33,22 +33,22 @@ Version referenced below as `X.Y[.Z]` — replace with the real version througho
33
33
34
34
-[ ] Unit tests green locally and in CI: `pytest -vv` (should collect `-m 'not release'` by default).
35
35
-[ ]`ruff check scenedetect/ tests/` and `ruff format --check scenedetect/ tests/` pass.
36
-
-[ ] Release test suite green: tag a disposable `vX.Y.Z-release-rc` or use `workflow_dispatch` on `.github/workflows/release-test.yml`— all 4 jobs (`static`, `release-tests`, `install-matrix`, `long-stress`) green across the 3-OS × 2-Python matrix. See `RELEASE-TEST-PLAN.md` for what the suite covers.
36
+
-[ ] Release test suite green: tag a disposable `vX.Y.Z-release-rc` or use `workflow_dispatch` on `.github/workflows/release-test.yml`- all 4 jobs (`static`, `release-tests`, `install-matrix`, `long-stress`) green across the 3-OS × 2-Python matrix. See `RELEASE-TEST-PLAN.md` for what the suite covers.
37
37
-[ ]`resources` branch has the artifacts the release tests need (goldens under `tests/resources/goldens/`, `tests/resources/stress_15min.mp4`). Re-push if any golden was regenerated.
38
38
-[ ] Manual smoke: fresh venv, `pip install .` then `pip install .[opencv]` then `pip install .[pyav]`; run `scenedetect -i <video> detect-content list-scenes save-images` and eyeball the output.
39
39
-[ ]`pip-audit` clean (or exceptions documented in the changelog).
-[ ]`pyinstaller dist/scenedetect.spec` produces a working `scenedetect.exe`— run it against a sample video.
44
+
-[ ]`pyinstaller dist/scenedetect.spec` produces a working `scenedetect.exe`- run it against a sample video.
45
45
-[ ] Build the MSI via Advanced Installer (`dist/installer/PySceneDetect.aip`); install into a clean Windows VM and run the CLI.
46
46
47
47
## 6. Cut the release
48
48
49
49
-[ ] Final commit on `releases/X.Y`: "Release vX.Y[.Z]".
50
-
-[ ] Tag `vX.Y[.Z]-release` on that commit and push — this fires `release-test.yml`. Wait for all jobs green.
51
-
-[ ] Merge `releases/X.Y` into `main` (fast-forward or merge commit — keep history clean).
50
+
-[ ] Tag `vX.Y[.Z]-release` on that commit and push - this fires `release-test.yml`. Wait for all jobs green.
51
+
-[ ] Merge `releases/X.Y` into `main` (fast-forward or merge commit - keep history clean).
52
52
-[ ] Tag the final release `vX.Y[.Z]` on the merged commit and push.
53
53
54
54
## 7. Publish
@@ -72,4 +72,4 @@ Version referenced below as `X.Y[.Z]` — replace with the real version througho
72
72
73
73
-**Branching model**: work spans multiple commits on `releases/X.Y`; the final one gets the `vX.Y[.Z]-release` tag which gates the release-test workflow. A passing release-test is a hard prerequisite for publishing.
74
74
-**Version consistency** is enforced in two places (`__init__.py`, `PySceneDetect.aip`). The `static` job of `release-test.yml` checks `__init__.py` against the tag and verifies the changelog has a matching `## PySceneDetect X.Y` heading; the installer parity is checked by `dist/pre_release.py --release`.
75
-
-**Changelog convention**: the in-development section lives at the *bottom* of `website/pages/changelog.md` under the "Development" heading — don't move it to the top.
75
+
-**Changelog convention**: the in-development section lives at the *bottom* of `website/pages/changelog.md` under the "Development" heading - don't move it to the top.
``SceneDetector.post_process()`` now declares its parameter as ``timecode: FrameTimecode`` (previously typed as ``int``). The method already received a ``FrameTimecode`` at runtime and concrete detectors (e.g. ``ThresholdDetector``, ``ContentDetector``) already used the ``FrameTimecode`` type — only the abstract-base-class annotation was inconsistent. No call-site changes are needed; this just brings the signature into agreement with the documented and actual behavior.
172
+
``SceneDetector.post_process()`` now declares its parameter as ``timecode: FrameTimecode`` (previously typed as ``int``). The method already received a ``FrameTimecode`` at runtime and concrete detectors (e.g. ``ThresholdDetector``, ``ContentDetector``) already used the ``FrameTimecode`` type - only the abstract-base-class annotation was inconsistent. No call-site changes are needed; this just brings the signature into agreement with the documented and actual behavior.
0 commit comments