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>` fully populated — order is not enablement — and the populated `<MetadataFetchers>`
built next to it makes the library look healthy. built next to it makes the library look healthy.
**Live posture, measured 2026-11-02** from `GET /Library/VirtualFolders`. The DTO is **Live posture, measured 2026-11-02** from `GET /Library/VirtualFolders`, cross-checked
PascalCase — `Name`, `CollectionType`, `Locations`, `ItemId`, `RefreshStatus` — and a against each library's `config/root/default/<Library>/options.xml`. The per-library switches
census written against the 10.x camelCase keys reads `None` for everything, which are NOT top-level DTO keys: the folder carries `Name`, `CollectionType`, `Locations`,
looks exactly like an unconfigured library. `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` | | Library | `CollectionType` | `EnableInternetProviders` | `EnableRealtimeMonitor` |
|---|---|---|---| |---|---|---|---|
| `Movies` | movies | true (fixed 2026-11-02) | **false** | | `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 | | `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 `Music` is still a silent file index in the sense above: a refresh answers `204`, stores
`204`, stores nothing, logs nothing. Any metadata or artwork work on either one nothing, logs nothing, and any metadata or artwork work on it starts by flipping the switch,
starts by flipping the switch, never by firing a scan. 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`** **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 — `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 the items a campaign returns nothing for are the unidentified ones, and no image
retry will change that. retry will change that.
**API shape on 12.x:** `/Items` and `/Items/{id}` need `UserId` when **Never pin `Providers=` on a TV art loop.** The pinned form reports `none` for exactly the
authenticated by API key — without it the answer is `400 Error processing items the unpinned `RemoteImages` query answers for: the TVShows arm's 16 fillable seasons
request`, which reads exactly like an authentication failure. `MetadataRefreshMode` 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 accepts `Default` (and `Realtime`) only; `Full` and `ValidationFailure` are
rejected outright, and what forces the providers to re-run is rejected outright, and what forces the providers to re-run is
`ReplaceAllMetadata=true`. `ReplaceAllMetadata=true`.