Rewrite Curator in Rust with an egui GUI

This commit is contained in:
2026-10-17 11:28:17 +02:00
parent 364b515e3c
commit 65b5b74c9f
156 changed files with 24359 additions and 25795 deletions
+18 -18
View File
@@ -39,27 +39,27 @@ Curator manages a personal movie library based on two folders:
## Current state
- Inherited from Tagger: `Tag`, `TagManager`, `File` (sidecar metadata),
`FileManager` (folder scan, filtering, ignore patterns), 3-level config,
`HardlinkManager` (create/sync/cleanup), pytest suite.
- Rename Tagger → Curator done across code, spec, config filenames
(`.Curator.!gtag` / `.Curator.!ftag`) and tests.
- **PySide6 GUI** (`src/ui/qt_app.py`) reframed around the Filmotéka workflow is
the entry point; the old tkinter `src/ui/gui.py` is retained for reference.
- **Pool + Filmotéka wired up:** global config holds `pool_dir` / `filmoteka_dir`;
`FileManager` creates `Filmy`/`Seriály`, imports movies (copy → `Title.ext`),
loads the pool, and the GUI generates the Filmotéka tree via `HardlinkManager`.
- `File` carries `title` + `csfd_link`. **Pool metadata lives in a unified index**
(`<pool>/.Curator.!index`, see `pool_index.py`); `File` writes there when an
index is injected. Without an index a `File` is an in-memory object only — the
old per-file `.!tag` sidecars and the per-folder `.!ftag` config have been
removed.
- **Rust rewrite (branch `rust`).** Curator is a Rust application: the core
(`src/core/`) is a library with the same behaviour and on-disk formats as the
Python version (pool index v2, tag schema, naming, global config keys), and
the GUI is egui/eframe (`src/ui/`). An existing pool opens unchanged. The
Python sources live on in the history of `devel` as the reference.
- `FileManager` is the service layer; `File` is a view on one media entry of an
identity-keyed movie record in `<pool>/.Curator.!index`; series are scanned
live from disk.
- The standalone `tipy-dne` binary replaces `scripts/tipy_dne.py` (which had
stopped finding movies after the index moved to v2). The one-off Python
migration scripts for old ČSFD tag formats were not ported.
- Global config moved from `.Curator.!gtag` next to the script to the platform
config directory (`CURATOR_CONFIG` overrides it); an old `.Curator.!gtag` in
the working directory is picked up on first run.
### GUI decision
The GUI was **reframed around the Filmotéka** (not kept as a generic tagger) and
**rewritten in PySide6**: Pool/Filmotéka setup, Import movie, tag-filter sidebar,
movie table, and one-click Filmotéka generation.
The GUI is **egui** (eframe): pure Rust, one static binary, straightforward
Windows builds. It mirrors the PySide6 layout — menu, tag-filter sidebar, movie
and series table, detail panel, status bar — and every dialog of the Python
version. Long operations run in background tasks with progress and cancel.
## Design decisions