From c1975ef3b1b74e721cecd4273d878af76b20687a Mon Sep 17 00:00:00 2001 From: bradautomates Date: Fri, 25 Sep 2026 09:14:15 +1000 Subject: [PATCH] fix: detect -fps_mode in FFmpeg 9 help output FFmpeg 9 lists the option as "-fps_mode[:]", so the whitespace-anchored probe missed it and every local run lost its frames. Co-Authored-By: Claude Opus 5.5 (1M context) --- skills/watch/scripts/frames.py | 5 +++-- tests/test_runtime.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/skills/watch/scripts/frames.py b/skills/watch/scripts/frames.py index 18f0aa9..d8194e7 100755 --- a/skills/watch/scripts/frames.py +++ b/skills/watch/scripts/frames.py @@ -117,9 +117,10 @@ def _sync_option(executable: str) -> tuple[str, str]: result = run_text([executable, "-hide_banner", "-h", "full"], timeout=30) if result.returncode == 0: help_text = result.stdout + result.stderr - if re.search(r"(?m)^\s*-fps_mode\s", help_text): + # FFmpeg 9 lists options with stream specifiers, e.g. "-fps_mode[:]". + if re.search(r"(?m)^\s*-fps_mode\b", help_text): return "-fps_mode", "vfr" - if re.search(r"(?m)^\s*-vsync\s", help_text): + if re.search(r"(?m)^\s*-vsync\b", help_text): return "-vsync", "vfr" raise SystemExit(f"{executable} did not advertise -fps_mode or -vsync; check the FFmpeg installation. {diagnostic(result.stderr)}") diff --git a/tests/test_runtime.py b/tests/test_runtime.py index 0f5d8c8..9feba73 100644 --- a/tests/test_runtime.py +++ b/tests/test_runtime.py @@ -53,7 +53,7 @@ def test_invalid_probe_metadata(monkeypatch, data): frames.get_metadata('test.mp4') -@pytest.mark.parametrize('help_text,expected', [('-vsync set video sync', '-vsync'), ('-fps_mode set fps\n-vsync set sync', '-fps_mode'), ('-fps_mode set fps', '-fps_mode'), ('unknown option: fps_mode', None)]) +@pytest.mark.parametrize('help_text,expected', [('-vsync set video sync', '-vsync'), ('-fps_mode set fps\n-vsync set sync', '-fps_mode'), ('-fps_mode set fps', '-fps_mode'), ('-fps_mode[:] set framerate mode for matching video streams', '-fps_mode'), ('unknown option: fps_mode', None)]) def test_sync_capability_probe(monkeypatch, help_text, expected): calls = [] def help_run(cmd, **kw):