arr-meta: title detail with credits, videos and external ids #143

Closed
opened 2026-08-23 19:40:25 +01:00 by naps62-yolo · 0 comments
Owner

Depends on: #142

arr-meta reads the slice of TMDB the policy engine needs: language, release
dates, seasons, external ids. It has no access to the things a person wants to
look at — artwork beyond poster_path, cast, videos, genres, runtime, rating.
Everything else in this milestone reads through this crate, so it comes first.

Add a detail call per media kind:

  • TmdbClient::movie_detail(tmdb_id) → MovieDetail
  • TmdbClient::series_detail(tmdb_id) → SeriesDetail

Both use append_to_response=credits,videos,external_ids, so a whole detail
page costs one upstream request. Both go through the existing cache in
arr-meta/src/cache.rs unchanged — see §9.6 on why nothing here is persisted.

The new types carry what §9.6 lists and nothing more: overview, tagline,
genres, backdrop_path, poster_path, vote_average, vote_count,
homepage, status, runtime (runtime for a movie, episode_run_time for a
series), the external ids, the cast, and the chosen trailer.

CastMember { tmdb_id, name, character, profile_path, order }
Video       { key, site, kind, name, official }

Cast is truncated to the first 10 by TMDB's order, in the crate, so no caller
has to remember to. Paths stay path fragments — §9.6 hotlinks images and the
browser composes URLs.

Trailer selection is a rule, not a guess, and it is the part worth testing:
prefer an official YouTube video of type Trailer, then any YouTube Trailer,
then a YouTube Teaser, then nothing. Ties break on TMDB's own ordering so the
result is deterministic for a given response.

Also add movie_videos(tmdb_id) / series_videos(tmdb_id), which fetch only
videos and apply the same selection. #144 serves the search-row trailer chip
from these, where a full detail response would be waste.

Do not change movie() or series(). The metadata refresh and the §6.2
release-date gate read those, and widening their return types drags this
milestone into the daemon.

Tests are fixture-driven against wiremock, matching crates/arr-meta/tests/.
Never live TMDB, per CLAUDE.md.

Depends on: #142 `arr-meta` reads the slice of TMDB the policy engine needs: language, release dates, seasons, external ids. It has no access to the things a person wants to look at — artwork beyond `poster_path`, cast, videos, genres, runtime, rating. Everything else in this milestone reads through this crate, so it comes first. Add a detail call per media kind: - `TmdbClient::movie_detail(tmdb_id)` → `MovieDetail` - `TmdbClient::series_detail(tmdb_id)` → `SeriesDetail` Both use `append_to_response=credits,videos,external_ids`, so a whole detail page costs **one** upstream request. Both go through the existing cache in `arr-meta/src/cache.rs` unchanged — see §9.6 on why nothing here is persisted. The new types carry what §9.6 lists and nothing more: `overview`, `tagline`, `genres`, `backdrop_path`, `poster_path`, `vote_average`, `vote_count`, `homepage`, `status`, runtime (`runtime` for a movie, `episode_run_time` for a series), the external ids, the cast, and the chosen trailer. ``` CastMember { tmdb_id, name, character, profile_path, order } Video { key, site, kind, name, official } ``` Cast is truncated to the first 10 by TMDB's `order`, in the crate, so no caller has to remember to. Paths stay path fragments — §9.6 hotlinks images and the browser composes URLs. **Trailer selection is a rule, not a guess**, and it is the part worth testing: prefer an official YouTube video of type `Trailer`, then any YouTube `Trailer`, then a YouTube `Teaser`, then nothing. Ties break on TMDB's own ordering so the result is deterministic for a given response. Also add `movie_videos(tmdb_id)` / `series_videos(tmdb_id)`, which fetch only `videos` and apply the same selection. #144 serves the search-row trailer chip from these, where a full detail response would be waste. **Do not change `movie()` or `series()`.** The metadata refresh and the §6.2 release-date gate read those, and widening their return types drags this milestone into the daemon. Tests are fixture-driven against `wiremock`, matching `crates/arr-meta/tests/`. Never live TMDB, per CLAUDE.md.
naps62-yolo added this to the Rich metadata milestone 2026-08-23 19:40:25 +01:00
naps62-yolo added the area/metadifficulty/moderatephase/6-tvtype/feature labels 2026-08-23 19:40:25 +01:00
naps62-yolo added a new dependency 2026-08-23 19:42:42 +01:00
naps62-yolo added a new dependency 2026-08-23 19:42:42 +01:00
naps62-yolo added a new dependency 2026-08-23 19:42:42 +01:00
naps62-yolo added phase/5-ui and removed phase/6-tv labels 2026-08-23 19:42:55 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: yolo/arr#143