The providers upstream ships in the box: TMDb is a third of one of them, and eight others are not written at all #105
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The goal is the providers a stock upstream has — no plugins. That set is larger than it looks, because upstream's
MediaBrowser.Providers/Plugins/directory is compiled into the server rather than loaded as a plugin: TMDb, OMDb, MusicBrainz, AudioDb and StudioImages are all in-box.What upstream registers at the pinned ref, and what exists here:
Remote metadata
TmdbMovieProvider+TmdbMovieImageProvidercrates/jellyfin-app/src/metadata/tmdb/mod.rsTmdbSeriesProvider,TmdbSeasonProvider,TmdbEpisodeProvider+ their three image providersTmdbPersonProvider+TmdbPersonImageProviderTmdbBoxSetProvider+TmdbBoxSetImageProviderTmdbMissingEpisodeProviderOmdbItemProvider,OmdbEpisodeProvider,OmdbImageProviderMusicBrainzAlbumProvider,MusicBrainzArtistProviderAudioDbAlbumProvider,AudioDbArtistProvider+ two image providersStudiosImageProviderLocal metadata
scan/nfo.rsreads the fields a scan can act onBoxSetXmlProvider,PlaylistXmlProviderPlaylistItemsProvider(reads m3u/pls contents)MediaBrowser.LocalMetadata/Images/)scan/images.rsGenerated images
GenreImageProvider,MusicGenreImageProviderArtistImageProvider,CollectionFolderImageProvider,DynamicImageProvider(user view),PlaylistImageProvider,CollectionImageProvider(box set)AudioImageProvider,EmbeddedImageProvider,VideoImageProviderTrickplayProviderProbeProviderThis is the umbrella. The substantive ones are filed separately: TMDb TV #106,
person and box set #107, OMDb #108, music #109, and the generated images #110. Two notes that belong here:
MILESTONES.md(M11, "Studio images are not on this list") callsStudiosImageProvidera plugin. It isMediaBrowser.Providers/Plugins/StudioImages/StudiosImageProvider.cs, compiled in-tree, and the reasoning there should be corrected.Where to start
M10 built the whole machine for exactly this, and a new provider is a caller of
it rather than a new mechanism. Read, in this order:
crates/jellyfin-app/src/metadata/mod.rs—Fields,merge,apply, andthe rank order a source is merged at. The lock set is honoured here.
crates/jellyfin-app/src/metadata/tmdb/mod.rs— the one provider that exists, andthe shape a second one copies: it talks to the
MetadataHttpport and nothingelse, so what it asks and what it answers can both be held still.
crates/jellyfin-fetch/—live.rsandcassette.rs. D27 is the rule: thenetwork is recorded once from upstream's own traffic and replayed to both, and
a recording nothing answers fails rather than falling through to the live
one.
enrichedsnapshot — the rows upstream fetched, committed as theanswer key. A provider is measured against those rows, not against what looks
right.
Upstream's are all in-tree under
MediaBrowser.Providers/Plugins/despite thedirectory name, plus the local ones in
MediaBrowser.XbmcMetadata/andMediaBrowser.LocalMetadata/.How to know it is done
Each provider filed under this umbrella lands with: a cassette recording
regenerated beside the answer key, an offline chain test (what a scan resolved →
the provider → the merge → the row) measured against the row upstream wrote, and
the pictures compared on bytes rather than on dimensions.
One correction belongs with this issue:
MILESTONES.md(M11, "Studio images arenot on this list") calls
StudiosImageProvidera plugin. It is in-tree atMediaBrowser.Providers/Plugins/StudioImages/StudiosImageProvider.cs, and theparagraph should say what is actually true about it.
House rules
CLAUDE.mdis the short version and these are the parts that bite: tests rununder
cargo nextest; upstream's source is the checkout inupstream/at thepin (
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
Dnreferences stay out of code and comments.ARCHITECTURE.mddecides which crate a thing goes in and which dependency edgesare illegal,
DECISIONS.mdsays why a rule exists.The reference pair is
cargo xtask reference up(andreference provision,which is idempotent); a run is
cargo run -p jellyfin-harness -- replay --upstream URL --ours URL --scenario FILE --out DIR,with
diff-dbfor the two databases.crates/jellyfin-harness/README.mdsayswhat 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.