From 2e4e1e75478c5eb73c0c3d2bb79de35d82dea2eb Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Sun, 23 Aug 2026 21:22:50 +0100 Subject: [PATCH] docs(design): title detail and enriched search rows --- DESIGN.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/DESIGN.md b/DESIGN.md index 68f28a9..3079579 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -485,6 +485,11 @@ which skips to the manual-grab flow. There is never a moment where the user has to know whether they are searching or adding. +Result rows are enriched: a poster thumbnail and a rating, under the same rules +as title detail (§9.6) — images hotlinked from path fragments, the rating being +TMDB's `vote_average` with its `vote_count`. A trailer chip renders per row and +resolves only when clicked (§9.6). + ### 9.3 Manual search results Radarr's manual search is unusable because the raw release name is the dominant @@ -540,6 +545,46 @@ notifying on everything and being muted within a week. Not notified: grabs, searches, downloads starting or finishing, soft fails. +### 9.6 Title detail + +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. + +**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. + +**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 +image proxy and no image cache in the service. + +**Rich detail is not persisted.** It is served through arr-meta's existing +24-hour response cache. The single exception is `poster_path`, `backdrop_path` +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. + +**Trailers resolve on click.** TMDB's search responses carry no videos, so a +trailer key costs a detail call. Rendering one chip per title and resolving the +one clicked keeps that cost at one call, and the 24h cache makes a repeat free. + +**Library view.** A poster grid by default with a list toggle; the list keeps +the derived-status columns §4.2 built it around. + +Out of scope here, because they are the adjacent scope most likely to creep: +watch providers, recommendations or similar titles, collections, person pages +inside the app, review text. + ## 10. Persistence SQLite via `sqlx`, compile-time-checked queries, migrations in `arr-db`.