docs(jellyfin): the switches live under LibraryOptions; a pinned art pass is not a provider census #124

Merged
dank merged 4 commits from feat/jellyfin-provider-keys into main 2026-11-02 17:39:21 -08:00
Showing only changes of commit 93725f42b3 - Show all commits
+24 -12
View File
@@ -81,21 +81,25 @@ so an empty `<ImageFetchers />` switches art off while `ImageFetcherOrder` stays
fully populated — order is not enablement — and the populated `<MetadataFetchers>`
built next to it makes the library look healthy.
**Live posture, measured 2026-11-02** from `GET /Library/VirtualFolders`. The DTO is
PascalCase — `Name`, `CollectionType`, `Locations`, `ItemId`, `RefreshStatus` — and a
census written against the 10.x camelCase keys reads `None` for everything, which
looks exactly like an unconfigured library.
**Live posture, measured 2026-11-02** from `GET /Library/VirtualFolders`, cross-checked
against each library's `config/root/default/<Library>/options.xml`. The per-library switches
are NOT top-level DTO keys: the folder carries `Name`, `CollectionType`, `Locations`,
`ItemId`, `PrimaryImageItemId`, `RefreshStatus` and `LibraryOptions`, and the switches live
inside `LibraryOptions`. Reading `EnableInternetProviders` off the folder itself returns
`None` for every library, which looks exactly like an unconfigured library — that is the
10.x camelCase trap one level deeper.
| Library | `CollectionType` | `EnableInternetProviders` | `EnableRealtimeMonitor` |
|---|---|---|---|
| `Movies` | movies | true (fixed 2026-11-02) | **false** |
| `Shows` | tvshows | **false** | true |
| `Shows` | tvshows | true (flipped 2026-11-02, before the TV arm ran) | true |
| `Music` | music | **false** | true |
| `Collections` | boxsets | **false** | false |
| `Collections` | boxsets | no element — false by default | false |
`Shows` and `Music` are silent file indexes in the sense above: a refresh answers
`204`, stores nothing, logs nothing. Any metadata or artwork work on either one
starts by flipping the switch, never by firing a scan.
`Music` is still a silent file index in the sense above: a refresh answers `204`, stores
nothing, logs nothing, and any metadata or artwork work on it starts by flipping the switch,
never by firing a scan. `Shows` was flipped on 2026-11-02 and the flip is at rest in the
server's own `options.xml`: scan #7 resolved provider ids for 731 of 733 series.
**The per-library option door on 12.x is `POST /Library/VirtualFolders/LibraryOptions`**
— `GET` there answers `405`, which is how the route announces itself. The 10.x doors
@@ -130,9 +134,17 @@ nothing to look up. Art coverage is capped by identification, not by the image d
the items a campaign returns nothing for are the unidentified ones, and no image
retry will change that.
**API shape on 12.x:** `/Items` and `/Items/{id}` need `UserId` when
authenticated by API key — without it the answer is `400 Error processing
request`, which reads exactly like an authentication failure. `MetadataRefreshMode`
**Never pin `Providers=` on a TV art loop.** The pinned form reports `none` for exactly the
items the unpinned `RemoteImages` query answers for: the TVShows arm's 16 fillable seasons
all offered `TheTVDB` posters, and a `Providers=TheMovieDb` pass — correct for movies, wrong
here — logged `none` for every one of them and called the gap closed. The unpinned answer is
the provider census; the pinned one only proves one provider is empty.
**API shape on 12.x:** `/Items/{id}` needs `UserId` when authenticated by API key — without
it the answer is `400 Error processing request`, which reads exactly like an authentication
failure, and it is easy to hit as a *verification* read right after a write that succeeded.
The `/Items` list route, `?Ids=<id>` included, does not need it, so verify a write through
the list route. `MetadataRefreshMode`
accepts `Default` (and `Realtime`) only; `Full` and `ValidationFailure` are
rejected outright, and what forces the providers to re-run is
`ReplaceAllMetadata=true`.