OMDb is not written: no ratings, no critic scores, no episode fallback #108

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

MediaBrowser.Providers/Plugins/Omdb/ is in the box: OmdbItemProvider (films and series), OmdbEpisodeProvider, and OmdbImageProvider.

What it contributes that TMDb does not: the IMDb rating and vote count, Metacritic and Rotten Tomatoes scores, and the official rating in several cases — the numbers a client shows on a detail page under the poster. It also fills episodes for series TMDb answers thinly.

Ordering matters and is upstream's, not ours to invent: OMDb runs after TMDb and fills rather than replaces, which is the merge rule already built. IHasOrder on each provider is where upstream records the sequence, and the answer key (D28) is where ours has to be measured.

Needs an API key in the same shape the TMDb one is configured, and a cassette entry per request.


Where to start

MediaBrowser.Providers/Plugins/Omdb/ — OmdbItemProvider (films and series),
OmdbEpisodeProvider, OmdbImageProvider.

Two things decide whether this is right, and both are already modelled here:

  • Order. OMDb runs after TMDb and fills rather than replaces. IHasOrder
    on each upstream provider records the sequence; merge in
    crates/jellyfin-app/src/metadata/mod.rs is the rule that implements it, and
    M10 already found that the lists do not all merge alike — a filling source
    joins studios, tags and production locations and leaves genres and a cast
    whole.
  • The key. Configured the way the TMDb one is, and every request recorded in
    the cassette.

What it contributes that TMDb does not: the IMDb rating and vote count,
Metacritic and Rotten Tomatoes, and the official rating in several cases — which
also feeds InheritedParentalRatingValue, so a change here moves what a
rating-limited account sees.

How to know it is done

The enriched answer key with the OMDb fetcher on: the ratings columns agree with
the rows upstream wrote, and nothing TMDb had already filled has moved.

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.

`MediaBrowser.Providers/Plugins/Omdb/` is in the box: `OmdbItemProvider` (films and series), `OmdbEpisodeProvider`, and `OmdbImageProvider`. What it contributes that TMDb does not: the IMDb rating and vote count, Metacritic and Rotten Tomatoes scores, and the official rating in several cases — the numbers a client shows on a detail page under the poster. It also fills episodes for series TMDb answers thinly. Ordering matters and is upstream's, not ours to invent: OMDb runs after TMDb and fills rather than replaces, which is the `merge` rule already built. `IHasOrder` on each provider is where upstream records the sequence, and the answer key (D28) is where ours has to be measured. Needs an API key in the same shape the TMDb one is configured, and a cassette entry per request. --- ## Where to start `MediaBrowser.Providers/Plugins/Omdb/` — `OmdbItemProvider` (films and series), `OmdbEpisodeProvider`, `OmdbImageProvider`. Two things decide whether this is right, and both are already modelled here: - **Order.** OMDb runs after TMDb and *fills* rather than replaces. `IHasOrder` on each upstream provider records the sequence; `merge` in `crates/jellyfin-app/src/metadata/mod.rs` is the rule that implements it, and M10 already found that the lists do not all merge alike — a filling source joins studios, tags and production locations and leaves genres and a cast whole. - **The key.** Configured the way the TMDb one is, and every request recorded in the cassette. What it contributes that TMDb does not: the IMDb rating and vote count, Metacritic and Rotten Tomatoes, and the official rating in several cases — which also feeds `InheritedParentalRatingValue`, so a change here moves what a rating-limited account sees. ## How to know it is done The enriched answer key with the OMDb fetcher on: the ratings columns agree with the rows upstream wrote, and nothing TMDb had already filled has moved. ### 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:50 +02:00
Sign in to join this conversation.
No description provided.