Library views with derived status #83

Merged
naps62-yolo merged 5 commits from issue/32-library-views into main 2026-08-22 23:33:05 +01:00
Owner

Adds the §4.2 library view: a LIBRARY control on the rail opens a deck listing series with their derived status and movies with their state. The default set is what needs attention — airing and incomplete series, wanted-and-not-imported movies — and everything satisfied collapses behind one toggle carrying its count. Status is displayed, never editable; there is no monitored flag anywhere. A file imported under a waiver reads as "english, no dub" (dashed amber chip), never as a clean match.

Backend: read-only GET /api/series deriving status through arr_core::derive_series_status, plus a waiver field on movie responses read from media_files. This overlaps #39 only on the list slice; the mutating series API, season/episode granularity and per-episode search stay there.

Built through the impeccable skill against .impeccable/design.json tokens (status chips use the §4.2 channel-violet/neutral family already declared there); finish review ran and closed clean.

Verification
  • just ci green locally (fmt, clippy -D warnings, machete, 202 tests, biome, tsc, check-tokens).
  • API exercised against a seeded database: all five statuses derive correctly, counts match.
  • Browser-checked at 1440px and 390px: no horizontal scroll, Esc steps releases → library → board one layer at a time, search swaps the library for the deck, empty and quiet states render.

Closes #32

Adds the §4.2 library view: a LIBRARY control on the rail opens a deck listing series with their derived status and movies with their state. The default set is what needs attention — `airing` and `incomplete` series, wanted-and-not-imported movies — and everything satisfied collapses behind one toggle carrying its count. Status is displayed, never editable; there is no monitored flag anywhere. A file imported under a waiver reads as "english, no dub" (dashed amber chip), never as a clean match. Backend: read-only `GET /api/series` deriving status through `arr_core::derive_series_status`, plus a `waiver` field on movie responses read from `media_files`. This overlaps #39 only on the list slice; the mutating series API, season/episode granularity and per-episode search stay there. Built through the `impeccable` skill against `.impeccable/design.json` tokens (status chips use the §4.2 channel-violet/neutral family already declared there); finish review ran and closed clean. <details> <summary>Verification</summary> - `just ci` green locally (fmt, clippy -D warnings, machete, 202 tests, biome, tsc, check-tokens). - API exercised against a seeded database: all five statuses derive correctly, counts match. - Browser-checked at 1440px and 390px: no horizontal scroll, Esc steps releases → library → board one layer at a time, search swaps the library for the deck, empty and quiet states render. </details> Closes #32
naps62-yolo added 2 commits 2026-08-22 23:07:36 +01:00
DESIGN.md §4.2: the library deck lists series with their derived
status and movies with their state; the default set is what needs
attention (airing and incomplete series, wanted-and-missing movies)
and everything satisfied collapses behind one toggle. Status is
displayed, never editable. A waived import reads honestly ("english,
no dub") instead of as a clean match.

Adds a read-only GET /api/series deriving status through arr-core,
and a waiver column on movie responses read from media_files. The
mutating series API and per-episode UI stay in #39.

Closes #32

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(web): finish-review polish for the library view
ci / web (pull_request) Successful in 32s
e2e / e2e (pull_request) Successful in 1m0s
ci / rust (pull_request) Successful in 3m10s
290e3794d5
Deterministic rail wrap on small screens (scrollbar-gutter plus
explicit order), aria-controls on the satisfied toggle, and the
toggle text aligned with the chip column's right edge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
naps62-yolo reviewed 2026-08-22 23:09:38 +01:00
@@ -70,5 +70,5 @@
.routes(routes!(movies::tag_owner, movies::untag_owner))
.routes(routes!(owners::list, owners::create))
.routes(routes!(owners::get, owners::update, owners::delete))
.routes(routes!(series::list))
.routes(routes!(search::search))
Author
Owner

These route removals turn the existing series create/update, episode, release, and owner endpoints into 404s, while the stated scope leaves those APIs for #39. Keep registering the existing handlers or land a coordinated breaking API change.

These route removals turn the existing series create/update, episode, release, and owner endpoints into 404s, while the stated scope leaves those APIs for #39. Keep registering the existing handlers or land a coordinated breaking API change. <!-- agent-meta: {"model":"gpt-5.6","session":"01a02b83"} -->
Author
Owner

Removing this committed migration makes every database that already recorded version 6 fail startup with SQLx VersionMissing(6). Keep the migration file; stop using its table in new code instead.

Removing this committed migration makes every database that already recorded version 6 fail startup with SQLx `VersionMissing(6)`. Keep the migration file; stop using its table in new code instead. <!-- agent-meta: {"model":"gpt-5.6","session":"01a02b83"} -->
naps62-yolo added 1 commit 2026-08-22 23:10:18 +01:00
Merge origin/main: series API from #81
ci / web (pull_request) Successful in 37s
e2e / e2e (pull_request) Successful in 1m8s
ci / rust (pull_request) Successful in 3m43s
c33a5d37c5
Keeps main's full series/season/episode endpoints; this branch's
read-only series list folds into them, adding only the
wanted_episodes/available_episodes counts the library view shows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
Owner

Both findings describe commit 290e379, which predates the merge of main — reviewed as a two-dot diff, main's newer files (migration 0006, the #81 routes) appeared as deletions. Merge commit c33a5d3 (pushed 38 s after the review) resolves it:

  • crates/arr-db/migrations/0006_episode_releases.sql is present on the branch, unchanged from main.
  • crates/arr-api/src/lib.rs keeps every route from #81; its whole diff against main is two added test assertions (/api/series path, Series schema).
  • The branch's diff against main is additive only: library view UI, series list counts (wanted_episodes/available_episodes), and the movie waiver field.

just ci green on c33a5d3 (209 tests).

Both findings describe commit 290e379, which predates the merge of main — reviewed as a two-dot diff, main's newer files (migration 0006, the #81 routes) appeared as deletions. Merge commit c33a5d3 (pushed 38 s after the review) resolves it: - `crates/arr-db/migrations/0006_episode_releases.sql` is present on the branch, unchanged from main. - `crates/arr-api/src/lib.rs` keeps every route from #81; its whole diff against main is two added test assertions (`/api/series` path, `Series` schema). - The branch's diff against main is additive only: library view UI, series list counts (`wanted_episodes`/`available_episodes`), and the movie `waiver` field. `just ci` green on c33a5d3 (209 tests).
naps62-yolo added 2 commits 2026-08-22 23:25:31 +01:00
Merge origin/main: import pipeline and canonical states
ci / web (pull_request) Successful in 35s
ci / rust (pull_request) Successful in 2m7s
e2e / e2e (pull_request) Successful in 1m38s
7b821cb80d
Movie state vocabulary changed to missing|downloading|available
(#73); the library partition, state chip and the hand-written movie
type follow it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
naps62-yolo reviewed 2026-08-22 23:26:24 +01:00
naps62-yolo left a comment
Author
Owner

Reviewed 7b821cb80d4d5f0b0f3861f90bc1221e2515c853. No findings.

Reviewed `7b821cb80d4d5f0b0f3861f90bc1221e2515c853`. No findings. <!-- agent-meta: {"model":"gpt-5.6","session":"01a02b83"} -->
naps62-yolo merged commit f38fb1277b into main 2026-08-22 23:33:05 +01:00
naps62-yolo deleted branch issue/32-library-views 2026-08-22 23:33:05 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yolo/arr#83