Repository navigation
Add native installers and independent arena annotation workflow - #1
Merged
Merged
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved annotation-state, installation-recovery, and platform-compatibility issues affect reliable use.
7 open issues
Support publishing recordings on filesystems without hard links · New Persist empty annotations after deleting the last labels · New Suppress held gamepad controls across arena switches · New Mark arenas edited after undo restores annotations · New Write Windows VBS launcher as BOM-marked UTF-16 · New Clean up newly created install paths after activation failure · New Rollback activation when stable launcher update fails · New
What changed in this PR
Adds native installation and updates, plus independent arena annotation sessions within the existing video editor.
Changes:
- Adds cross-platform installers, release packaging, and native smoke checks.
- Introduces arena detection, crop export, isolated annotations, and progress tracking.
- Improves frame caching and atomic saves, with regression tests and preview tools.
| File | Description |
|---|---|
| tools/preview_arena_workflow.py | Generates synthetic UI previews. |
| tools/plot_export_benchmark.py | Plots paired export timings. |
| tests/test_video_frame_integrity.py | Checks frame identity and cache bounds. |
| tests/test_arena_workflow.py | Tests arena isolation and failure handling. |
| tests/test_arena_backend.py | Tests export integrity and benchmarks. |
| requirements.txt | Adds FFmpeg and headless OpenCV dependencies. |
| README.md | Documents installation and arena workflows. |
| installer/test_backend.py | Tests installation transactions and safeguards. |
| installer/setup.spec | Packages graphical Setup. |
| installer/native_smoke.py | Verifies packaged installation and application. |
| installer/INSTALLATION.md | Documents native builds and updates. |
| installer/gui.py | Adds installation and update interface. |
| installer/entry.py | Provides packaged Setup entry point. |
| installer/build.py | Builds native release artifacts. |
| installer/backend.py | Implements installation, downloads, and shortcuts. |
| installer/application.spec | Packages application resources and dependencies. |
| installer/app_entry.py | Sets writable storage and runs smoke checks. |
| installer/__main__.py | Enables source-based Setup launch. |
| installer/__init__.py | Defines installer package. |
| ethoscore.py | Integrates arena sessions and save guards. |
| annotator_libs/video_handling.py | Isolates decoders and bounds frame caching. |
| annotator_libs/arena_workflow.py | Manages arena selection and persistence. |
| annotator_libs/arena_ui.py | Adds crop editing and export controls. |
| annotator_libs/arena_model.py | Defines geometry, detection, and manifests. |
| annotator_libs/arena_export.py | Exports and validates cropped videos. |
| annotator_libs/annotation_logic.py | Saves annotations atomically. |
| .gitignore | Excludes build and validation artifacts. |
| .github/workflows/publish.yml | Builds, validates, and publishes native packages. |
Review effort: Balanced
| if os.name == "nt": | ||
| os.rename(staged, destination) | ||
| else: | ||
| os.link(staged, destination) |
| def prepare_video_change(self): | ||
| """Save the current arena before switching; failed saves cancel the switch.""" | ||
| self._settle_arena_input() | ||
| if self.video_path and not self.view_only_mode and (self.active_arena() is not None or self.annotations): |
Comment on lines
+404
to
+405
| 'range_labeling_start', 'gamepad_button_states'): | ||
| getattr(self, name).clear() |
| if self.view_only_mode: | ||
| return | ||
|
|
||
| self.mark_arena_edited() |
| def atomic_text(path: Path, text: str) -> None: | ||
| """Replace a small control file atomically, keeping partial writes invisible.""" | ||
| temporary = path.with_name(path.name + "." + uuid.uuid4().hex + ".tmp") | ||
| temporary.write_text(text, encoding="utf-8") |
Comment on lines
+183
to
+186
| stage.rename(final) | ||
| stage = None | ||
| user_data = destination / "user-data" | ||
| user_data.mkdir(exist_ok=True) |
Comment on lines
+190
to
+191
| atomic_text(destination / MARKER, json.dumps(state, indent=2)) | ||
| _write_launcher(destination, state) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

No description provided.