A person has no biography, and a box set takes nothing from TMDb #107

Closed
opened 2026-08-13 22:59:42 +02:00 by Claude · 1 comment
Collaborator

Two TMDb providers that are not the TV set and not the movie one.

TmdbPersonProvider + TmdbPersonImageProvider. M11 filed the shape of this already: PeopleValidationTask runs, names everyone who wants a biography, and then asks nobody, because no provider here answers about a person. A person page therefore renders a name and a photograph and no text. The portraits we do have come off the film's own credits response rather than from a person lookup, so a person nothing has filmed under our fixture has no picture either.

TmdbBoxSetProvider + TmdbBoxSetImageProvider. A collection created through /Collections gets its name and nothing else. Upstream looks the set up — a film's belongs_to_collection is already parsed and stored here since M10 — and fills the overview and the artwork.

Both are small once the TV work has generalized the client past movie().


Where to start

Person. MediaBrowser.Providers/Plugins/Tmdb/People/{TmdbPersonProvider,TmdbPersonImageProvider}.cs.
The consumer already exists and is idle: M11 built PeopleValidationTask, which
refuses to run beside a pass, names everyone missing a Primary or an
Overview, and then asks nobody. Wiring a person provider into it is the whole
feature. Note what portraits we have today come off a film's own credits
response rather than from a person lookup, so a person nobody has filmed with
has no picture either.

Box set. MediaBrowser.Providers/Plugins/Tmdb/BoxSets/. A film's
belongs_to_collection is already parsed and stored here since M10, so the id
is in hand; what is missing is the lookup that turns it into an overview and
artwork on the collection row.

Both are small once #106 has generalized the client past movie() — do them
after it, not before.

How to know it is done

A person in the enriched fixture carries the biography upstream stored, and a
box set carries the overview and the pictures upstream stored, both measured
against the answer key rows and both compared on bytes for the artwork.

House rules

CLAUDE.md is the short version and these are the parts that bite: tests run
under cargo nextest; upstream's source is the checkout in upstream/ at the
pin
(v12.0-rc5, 6d501ba4) and not the clone beside the repository;
generated files are regenerated rather than edited; a comment says what the code
does, not how it got there; and Dn references stay out of code and comments.
ARCHITECTURE.md decides which crate a thing goes in and which dependency edges
are illegal, DECISIONS.md says why a rule exists.

The reference pair is cargo xtask reference up (and reference provision,
which is idempotent); a run is
cargo run -p jellyfin-harness -- replay --upstream URL --ours URL --scenario FILE --out DIR,
with diff-db for the two databases. crates/jellyfin-harness/README.md says
what a diff means and what an ignore entry has to carry — every entry needs a
reason and an expiry milestone, and an adds-only history is the smell the risk
table names.

Two TMDb providers that are not the TV set and not the movie one. **`TmdbPersonProvider` + `TmdbPersonImageProvider`.** M11 filed the shape of this already: `PeopleValidationTask` runs, names everyone who wants a biography, and then asks nobody, because no provider here answers about a person. A person page therefore renders a name and a photograph and no text. The portraits we do have come off the film's own credits response rather than from a person lookup, so a person nothing has filmed under our fixture has no picture either. **`TmdbBoxSetProvider` + `TmdbBoxSetImageProvider`.** A collection created through `/Collections` gets its name and nothing else. Upstream looks the set up — a film's `belongs_to_collection` is already parsed and stored here since M10 — and fills the overview and the artwork. Both are small once the TV work has generalized the client past `movie()`. --- ## Where to start **Person.** `MediaBrowser.Providers/Plugins/Tmdb/People/{TmdbPersonProvider,TmdbPersonImageProvider}.cs`. The consumer already exists and is idle: M11 built `PeopleValidationTask`, which refuses to run beside a pass, names everyone missing a `Primary` or an `Overview`, and then asks nobody. Wiring a person provider into it is the whole feature. Note what portraits we have today come off a film's own credits response rather than from a person lookup, so a person nobody has filmed with has no picture either. **Box set.** `MediaBrowser.Providers/Plugins/Tmdb/BoxSets/`. A film's `belongs_to_collection` is already parsed and stored here since M10, so the id is in hand; what is missing is the lookup that turns it into an overview and artwork on the collection row. Both are small once #106 has generalized the client past `movie()` — do them after it, not before. ## How to know it is done A person in the enriched fixture carries the biography upstream stored, and a box set carries the overview and the pictures upstream stored, both measured against the answer key rows and both compared on bytes for the artwork. ### House rules `CLAUDE.md` is the short version and these are the parts that bite: tests run under `cargo nextest`; upstream's source is the checkout in `upstream/` **at the pin** (`v12.0-rc5`, `6d501ba4`) and not the clone beside the repository; generated files are regenerated rather than edited; a comment says what the code does, not how it got there; and `Dn` references stay out of code and comments. `ARCHITECTURE.md` decides which crate a thing goes in and which dependency edges are illegal, `DECISIONS.md` says why a rule exists. The reference pair is `cargo xtask reference up` (and `reference provision`, which is idempotent); a run is `cargo run -p jellyfin-harness -- replay --upstream URL --ours URL --scenario FILE --out DIR`, with `diff-db` for the two databases. `crates/jellyfin-harness/README.md` says what a diff means and what an ignore entry has to carry — every entry needs a reason and an expiry milestone, and an adds-only history is the smell the risk table names.
Author
Collaborator

Landed on main with batch E (6c9c399..d83f1ca).

Measured the three ways this issue asks for: the cassette regenerated beside
the answer key, an offline chain test against the rows upstream wrote, and
artwork compared on the digest rather than on dimensions. The recording is now
crates/jellyfin-app/corpus/fetched.json — one file for all four databases,
argued in D35.

A review round ran over the batch. Seven findings were fixed in d83f1ca; what
survived is filed as #154, #155 and #156.

Landed on `main` with batch E (`6c9c399..d83f1ca`). Measured the three ways this issue asks for: the cassette regenerated beside the answer key, an offline chain test against the rows upstream wrote, and artwork compared on the digest rather than on dimensions. The recording is now `crates/jellyfin-app/corpus/fetched.json` — one file for all four databases, argued in D35. A review round ran over the batch. Seven findings were fixed in `d83f1ca`; what survived is filed as #154, #155 and #156.
alex closed this issue 2026-08-16 21:49:39 +02:00
Sign in to join this conversation.
No description provided.