feat(web): search titles and pick a release #3

Merged
thibault merged 1 commit from feat/search-screen into 0.2 2026-10-08 18:32:21 +02:00
Owner

Phase 7, step 4: the Search screen of the mockup.

What it does

  • Search tab, first in the nav and the screen shown after login. Its state lives in search.svelte.ts, like the Magnet screen's, so it survives a trip to another tab.
  • GET /api/catalog/search results, one group per catalog title: title, year · Movie|Show|Anime, original title (muted) when different, release count once loaded (3 of 5 releases when filters hide some). No posters, as in the mockup. The first group opens after a search.
  • Opening a movie or anime group loads GET /api/releases. Opening a show loads its details first and shows season chips (S1, S2…, specials hidden); season 1 is picked by default (the start of the show), and picking another loads that season.
  • Releases are kept per kind:id:season in the browser until the next search (a new search asks the indexers again, seeders change). A failed load is asked again on reopen.
  • Table per mockup: name + quality badges from the server's quality/pack (resolution, DV, HDR, x265/AV1, languages, S02 / S01–S03 / Batch for anime, Complete for shows), SRC (indexer ids from the answer), SIZE, SEED (accent ≥ 100, warning below, – when unknown), LEECH, Select. Skeleton rows while loading, empty states.
  • Indexers with status failed are listed in one discreet line under the table, the error on hover. Catalog errors (a source down) show as a small warning alert.
  • Sidebar filters, in the browser over the loaded releases: SOURCES (ids with counts, unchecked ones dimmed), SIZE buckets, MIN SEEDS, QUALITY (480p/720p/1080p/2160p). Unknown size / seeders / resolution only drop out when a filter asks for them. Sort seeds ↓ / size ↓, header N titles · M releases.
  • Select switches to Magnet, fills the magnet, shows a from search badge and fetches the metadata. The releases answer's target replaces the proposal guessed from the name (still editable). Pasting a magnet works as before (no badge, guessed target); typing in the field drops the badge.

No Rust change.

Checks

  • npm ci && npm run check && npm run build: 0 errors, 0 warnings.
  • Checked in a headless browser against a mocked API (made-up titles and indexer ids): search, show seasons, filters, loading skeleton, Select → Magnet with the target from the search.

🤖 Generated with Claude Code

Phase 7, step 4: the Search screen of the mockup. ## What it does - **Search** tab, first in the nav and the screen shown after login. Its state lives in `search.svelte.ts`, like the Magnet screen's, so it survives a trip to another tab. - `GET /api/catalog/search` results, one group per catalog title: title, `year · Movie|Show|Anime`, original title (muted) when different, release count once loaded (`3 of 5 releases` when filters hide some). No posters, as in the mockup. The first group opens after a search. - Opening a movie or anime group loads `GET /api/releases`. Opening a show loads its details first and shows season chips (`S1`, `S2`…, specials hidden); **season 1 is picked by default** (the start of the show), and picking another loads that season. - Releases are kept per `kind:id:season` in the browser until the next search (a new search asks the indexers again, seeders change). A failed load is asked again on reopen. - Table per mockup: name + quality badges from the server's `quality`/`pack` (resolution, DV, HDR, x265/AV1, languages, `S02` / `S01–S03` / `Batch` for anime, `Complete` for shows), SRC (indexer ids from the answer), SIZE, SEED (accent ≥ 100, warning below, `–` when unknown), LEECH, Select. Skeleton rows while loading, empty states. - Indexers with status `failed` are listed in one discreet line under the table, the error on hover. Catalog `errors` (a source down) show as a small warning alert. - Sidebar filters, in the browser over the loaded releases: SOURCES (ids with counts, unchecked ones dimmed), SIZE buckets, MIN SEEDS, QUALITY (480p/720p/1080p/2160p). Unknown size / seeders / resolution only drop out when a filter asks for them. Sort seeds ↓ / size ↓, header `N titles · M releases`. - **Select** switches to Magnet, fills the magnet, shows a `from search` badge and fetches the metadata. The releases answer's `target` replaces the `proposal` guessed from the name (still editable). Pasting a magnet works as before (no badge, guessed target); typing in the field drops the badge. No Rust change. ## Checks - `npm ci && npm run check && npm run build`: 0 errors, 0 warnings. - Checked in a headless browser against a mocked API (made-up titles and indexer ids): search, show seasons, filters, loading skeleton, Select → Magnet with the target from the search. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(web): search titles and pick a release
Some checks failed
CI / test (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
0b8e06872b
A Search screen, first in the nav and shown after login: catalog titles
grouped as in the mockup, each group loading its releases when opened (a
season first for shows), with client-side filters on sources, size,
seeders and resolution. Select opens the release in Magnet with the
search's library target instead of the guess from the name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01947SGTYxD1CJLsk2PcULRA
thibault force-pushed feat/search-screen from 0b8e06872b
Some checks failed
CI / test (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
to 1a98790449
All checks were successful
CI / web (pull_request) Successful in 7s
CI / test (pull_request) Successful in 24s
2026-10-08 18:31:51 +02:00
Compare
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
thibault/plankton!3
No description provided.