- Fix keyframe 6-tuple → 4-tuple mismatch crashing ExportRunner
- Fix ws.broadcast() using wrong event loop from background threads
- Fix export counter hardcoded to 1, now auto-increments
- Add path traversal protection to file/stream/delete endpoints
- Use proper HTTP error codes (was returning 200 for errors)
- Add thread safety to WebSocket connection list
- Record exports to DB so markers appear
- Move WS endpoint to /ws/export (was /api/ws/export)
- Prune dead threads from cache job tracker
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix line range 38→36 for _frozen_path extraction
- Clarify line ranges for ffmpeg vs annotation functions
- Remove unused imports (_frozen_path, build_annotation_json_path) from main.py import list
- Add step to clean up dead stdlib imports (re, json, sqlite3, tempfile, datetime)
- Add explicit stub router code for stream, markers, export, hidden
- Add server/__init__.py and server/routes/__init__.py content
- Add _DBWorker and FrameGrabber to "keep in main.py" list
- Note optional tracking deps in Dockerfile
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Autoclip (A): adjusts clip count to fit current pause position
- Pause no longer resets playback position — stays where paused
- Play resumes from pause point instead of restarting
- Spread/clips changes update loop end without restarting playback
- Number keys 1-9 export to subprofiles
- Click-away clears focus from spinboxes so hotkeys work again
- Lock mode: double-click marker jumps cursor to end of clip span
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Subprofiles: lightweight export variants that append a suffix to the
export folder (e.g. _soft, _intense). Each gets its own export button
in the transport row. Managed via "+" menu, persisted in QSettings.
- Play loop now updates immediately when spread/clips spinboxes change.
- Lock mode: ignore stale mpv position updates while user is dragging
to prevent the play position from jumping back.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- setup-windows.ps1: downloads libmpv DLL and ffmpeg, installs pip deps
- 8cut.bat: double-click launcher
- main.py: add_dll_directory for libmpv next to script (not just frozen)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
UPX can corrupt Python bytecode in PyInstaller bundles, causing
"PYZ archive entry not found in the TOC" on Windows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Asset filenames include a git hash that can't be predicted from the tag
alone. Use the API assets list to find the correct download URL.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Release is created if at least one platform succeeds, so a failure
on one doesn't block the other.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enables cross-platform builds for Windows and macOS. Adds _bin() helper
to resolve bundled ffmpeg in frozen builds, and configures ctypes library
path for bundled libmpv.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the bottom status bar with a right-aligned label on the
settings row, saving vertical space. Add "Export complete" message
when a batch finishes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a pure function that returns the latest keyframe at or before a
given time (with tolerance), replacing the inline lookup pattern that
appears multiple times in main.py. Includes 6 tests covering empty
list, before-first, exact match, between, after-last, and tolerance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>