diff --git a/DESIGN.md b/DESIGN.md index 3079579..4187cd3 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -130,7 +130,11 @@ anything. Here, intent is `Episode.wanted` and `Movie.wanted` only. `Series.auto_track` is not intent — it is a rule one level up: when metadata -reveals a new season, that season becomes tracked. An untracked series where you +reveals a new season, that season becomes tracked. The rule applies from the +second refresh onward: seasons revealed by a series' first refresh — the whole +back catalogue present at add time — are never tracked by it. Only seasons that +appear after the series was added are covered; back-catalogue seasons are picked +by hand. An untracked series where you manually marked S02 needs no special case: three wanted episodes, nothing else. `Season.tracked` is also a rule, not intent. Turning tracking on marks every @@ -160,6 +164,12 @@ behind one toggle. A one-off season grab therefore disappears from the default view by itself once satisfied, and a tracked show reappears by itself when a new season is announced. Nothing to remember to flip. +Status chips carry state colour, not a single informational hue: green +(`--signal-ok`) for on disk or complete, amber (`--signal-warn`) for wanted but +not yet found, violet (`--status-airing`) for downloading, neutral for +untracked. The word stays present in every chip, so state survives with colour +removed. + Season 0 is invisible to all of it: derived status ignores season 0 episodes entirely, so a manually wanted special cannot pin a series at `incomplete` or hold back `ended`. The accepted consequence is that specials are visible and @@ -477,7 +487,10 @@ lower-priority crate** (§9.4), not the primary shape. One box. Two grouped result sets: **in library** first (title match, and for TV also episode title, so `bluey hospital` finds the episode), **on TMDB** below. -Enter on a TMDB result opens the add flow with root and policy pre-filled. +An episode row surfaces only when the query matches something beyond the series +title: a query satisfied by the series title alone returns the series row and +nothing below it. Enter on a TMDB result opens the add flow with root and +policy pre-filled. The same box accepts a raw TMDB or IMDb ID, and a pasted magnet or `.torrent`, which skips to the manual-grab flow. @@ -549,12 +562,16 @@ Not notified: grabs, searches, downloads starting or finishing, soft fails. One detail surface per kind: `/movies/{id}` and `/series/{id}` (#129). For a movie the release deck becomes a section of the page, and `/movies/{id}/releases` -keeps resolving; series keeps its season-and-episode shape. +keeps resolving; series keeps its season-and-episode shape, seasons ordered +newest-first within the series and episodes newest-first within each season — +the seasons you are deciding about now are at the top, not after nine rows of +back catalogue. **TMDB is the only metadata source.** The rating shown anywhere is TMDB's -`vote_average` with its `vote_count`. No OMDb, no IMDb or Rotten Tomatoes -scores — each would need a second upstream, a second key and a second thing -that can be down. +`vote_average` with its `vote_count`, rendered as amber stars (`--signal-warn` +— the same state colour a wanted chip carries). No OMDb, no IMDb or Rotten +Tomatoes scores — each would need a second upstream, a second key and a second +thing that can be down. **Images are hotlinked** from `image.tmdb.org`. The API returns TMDB path fragments, never URLs; the browser composes the URL and chooses the size. No @@ -565,11 +582,6 @@ image proxy and no image cache in the service. and `vote_average`, stored on `movies` and `series` and written by the daily metadata refresh (§8), so library views render without a TMDB call. -**Cast** is the top 10 billed — profile photo, actor name, character name — -linking out to that person's TMDB page. This does not contradict §2: nothing -about a person is stored, tracked or searched on. The non-goal is following -people, not naming them. - **External links** are TMDB always, IMDb for movies, TVDB for series — all from ids the app already holds — plus a Rotten Tomatoes *search* link, which is a query URL, not a resolved title page.