diff --git a/README.md b/README.md index 00a1153..08e4f6a 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,16 @@ TMDB-backed metadata enrichment requires `TMDB_API_KEY` to be set in the environ ## Version History +### 0.2.5 + +- show-level quality and notes fields +- pattern-over-show-over-default season-shift resolution with dynamic DB migration loading +- migration prompt now reports the upgrade path and creates an in-place DB backup before applying schema changes +- `upgrade --branch ` now fetches remote-only branches before switching +- `unmux` now applies season shifting to subtitle output filenames +- convert now keeps DB-defined target subtitle dispositions authoritative over sidecar filename disposition flags when a pattern definition exists +- focused modern tests added around migrations, unmux, upgrade, and subtitle-disposition import precedence + ### 0.2.4 - lightweight CLI commands now stay import-light via lazy runtime loading diff --git a/SCRATCHPAD.md b/SCRATCHPAD.md index 39564dd..e2c8e57 100644 --- a/SCRATCHPAD.md +++ b/SCRATCHPAD.md @@ -4,18 +4,6 @@ - Capture a compact, project-wide list of optimization candidates after a broad scan of the current FFX codebase, tooling, and requirements. -## Settled - -- The biggest near-term wins are in startup cost, repeated subprocess work, repeated database query patterns, and general repo hygiene. -- This list is intentionally optimization-oriented rather than bug-oriented. Some items below also improve correctness or maintainability, but they were selected because they can reduce runtime cost, operator friction, or iteration overhead. -- A first modern integration slice now exists under [`tests/integration/subtrack_mapping`](/home/osgw/.local/src/codex/ffx/tests/integration/subtrack_mapping). Remaining test-suite cleanup is now mostly about migrating and shrinking the legacy harness surface under [`tests/legacy`](/home/osgw/.local/src/codex/ffx/tests/legacy). -- Shared CLI defaults for container/output tokens now live outside [`src/ffx/ffx_controller.py`](/home/osgw/.local/src/codex/ffx/src/ffx/ffx_controller.py), and a focused unit test locks in the lazy-import contract. -- Helper filename and rich-text utilities now use compiled raw regexes plus translate-based filename filtering, with unit coverage for TMDB suffix rewriting and Rich color stripping. -- Process resource limiting now has explicit disabled/default states in the CLI and requirements, and combined CPU-plus-niceness wrapping now executes as `cpulimit -- nice -n ... ` instead of a less explicit prefix chain. -- FFX logger setup now reuses named handlers, and fallback logger access no longer mutates handlers in ordinary constructors and helpers. -- The process wrapper now uses `subprocess.run(...)` with centralized command formatting plus stable timeout and missing-command error mapping. -- Pattern matching now uses cached compiled regexes plus explicit duplicate-match errors, and pattern creation flows no longer persist zero-track patterns. - ## Focused Snapshot - Highest-leverage application optimizations: @@ -59,6 +47,7 @@ ## Open +- Durable shipped items have been moved into [`README.md`](/home/osgw/.local/src/codex/ffx/README.md) version history through `0.2.5`. - Should optimization work focus first on operator-perceived latency, internal maintainability, or correctness-risk cleanup that also has performance upside? - Is the long-term supported model still “local Linux workstation plus Textual UI,” or should optimization decisions bias toward a more scriptable/headless CLI? @@ -77,52 +66,6 @@ 3. Continue replacing oversized legacy test matrices with focused modern integration and unit coverage. 4. Triage the legacy `Scenario 4` pattern/track failure and decide whether to fix the harness, adapt it to the zero-track guard, or retire that path during the ongoing test-suite migration. -## Shifted Season Status (2026-04-12) - -- Current assessment: - - The shifted-season subsystem is present end to end and looks feature-complete in shape, but it is not yet hardened. - - The storage, TUI CRUD surface, and CLI/TMDB filename application path all exist, so this is no longer a stubbed or half-started area. - - The main gap is correctness and direct verification rather than missing surface area. - -- Implemented surface confirmed: - - Requirements still treat shifted seasons as part of the accepted product surface in [`requirements/project.md`](/home/osgw/.local/src/codex/ffx/requirements/project.md) and [`requirements/architecture.md`](/home/osgw/.local/src/codex/ffx/requirements/architecture.md). - - Persistence exists via [`src/ffx/model/shifted_season.py`](/home/osgw/.local/src/codex/ffx/src/ffx/model/shifted_season.py) plus the `Show.shifted_seasons` relationship in [`src/ffx/model/show.py`](/home/osgw/.local/src/codex/ffx/src/ffx/model/show.py). - - CRUD logic exists in [`src/ffx/shifted_season_controller.py`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_controller.py). - - Textual add/edit/delete flows are wired through [`src/ffx/shifted_season_details_screen.py`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_details_screen.py), [`src/ffx/shifted_season_delete_screen.py`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_delete_screen.py), and the show details table in [`src/ffx/show_details_screen.py`](/home/osgw/.local/src/codex/ffx/src/ffx/show_details_screen.py). - - CLI conversion applies season shifts before TMDB lookup and output suffix generation in [`src/ffx/cli.py`](/home/osgw/.local/src/codex/ffx/src/ffx/cli.py). - -- Verified current behavior: - - `~/.local/share/ffx.venv/bin/python -m unittest discover -s tests/unit -p 'test_*.py'` passed on 2026-04-12: `75` tests in `0.795s`. - - That run emitted `ResourceWarning` messages for unclosed SQLite connections, so the suite is green but not perfectly clean. - - There is almost no direct shifted-season coverage in the modern tests: - - [`tests/unit/test_cli_rename_only.py`](/home/osgw/.local/src/codex/ffx/tests/unit/test_cli_rename_only.py) stubs `ShiftedSeasonController` rather than exercising it. - - [`tests/unit/test_screen_support.py`](/home/osgw/.local/src/codex/ffx/tests/unit/test_screen_support.py) only verifies controller bootstrap wiring. - - Net effect: the subsystem is integrated, but its core rules are effectively untested by the current modern suite. - -- Reproduced correctness gaps: - - Overlap validation is broken in [`src/ffx/shifted_season_controller.py:41`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_controller.py:41) because `getOriginalSeason` is compared as a method object instead of being called. - - Reproduction on 2026-04-12 with a temp SQLite DB: - - Added `S1 E1-E10`. - - `checkShiftedSeason(...)` incorrectly returned `True` for overlapping `S1 E5-E15`. - - `addShiftedSeason(...)` then stored the overlapping row successfully. - - `updateShiftedSeason(...)` in [`src/ffx/shifted_season_controller.py:93`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_controller.py:93) does not enforce episode ordering, so an invalid range like `first_episode=20`, `last_episode=10` was accepted in the same reproduction. - - Because [`src/ffx/shifted_season_controller.py:213`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_controller.py:213) returns the first matching sibling and [`src/ffx/shifted_season_controller.py:163`](/home/osgw/.local/src/codex/ffx/src/ffx/shifted_season_controller.py:163) applies no explicit ordering, overlapping rows would also make runtime shifting ambiguous. - -- Progress summary: - - Good progress: - - The subsystem exists across requirements, schema, UI, and conversion flow. - - It appears fully integrated into the show-editing workflow rather than parked as dead code. - - Incomplete progress: - - Validation logic is not trustworthy yet. - - Modern tests do not currently protect the subsystem's real behavior. - - User-facing error feedback in the shifted-season screens still has placeholder `#TODO: Meldung` branches. - -- Recommended next slice: - 1. Add direct controller tests for overlap rejection, episode-order validation, and `shiftSeason(...)` selection behavior. - 2. Fix `checkShiftedSeason(...)` and add the same range/order validation to `updateShiftedSeason(...)`. - 3. Make sibling selection deterministic or enforce non-overlap strongly enough that ordering no longer matters in practice. - 4. Add at least one focused integration test that proves a stored shifted season changes TMDB lookup and/or generated filename numbering during conversion. - ## Delete When - Delete this scratchpad once the optimization backlog is either converted into issues/work items or distilled into durable project guidance. diff --git a/pyproject.toml b/pyproject.toml index 9ea7e52..2685f1a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "ffx" description = "FFX recoding and metadata managing tool" -version = "0.2.4" +version = "0.2.5" license = {file = "LICENSE.md"} dependencies = [ "requests", diff --git a/requirements/project.md b/requirements/project.md index 616bbe3..1e81e40 100644 --- a/requirements/project.md +++ b/requirements/project.md @@ -98,7 +98,7 @@ - Intended for local execution, not server deployment. - Stores default state in `~/.local/etc/ffx.json`, `~/.local/var/ffx/ffx.db`, and `~/.local/var/log/ffx.log`. - Timeline constraints: - - The current implemented scope reflects a compact alpha release stream up to version `0.2.4`. + - The current implemented scope reflects a compact alpha release stream up to version `0.2.5`. - Team capacity assumptions: - Maintained as a small codebase where simple patterns and direct controller logic are preferred over framework-heavy abstractions. - Third-party dependencies: diff --git a/src/ffx/constants.py b/src/ffx/constants.py index e7f7b59..30bcc8e 100644 --- a/src/ffx/constants.py +++ b/src/ffx/constants.py @@ -1,4 +1,4 @@ -VERSION='0.2.4' +VERSION='0.2.5' DATABASE_VERSION = 3 DEFAULT_QUALITY = 32