fix: survive an album with two monitored releases
Build and publish container / build (pull_request) Successful in 8m11s
Build and publish container / build (pull_request) Successful in 8m11s
Fetching every album in one unfiltered request avoided Lidarr's unguarded per-artist path, but not the exception underneath it. Every album endpoint maps through AlbumResource.ToResource, which selects the release with SingleOrDefault(x => x.Monitored). An album with two monitored releases makes that throw -- "Sequence contains more than one element" -- and the bulk call loses the entire library to one bad row. Keep the unfiltered call as the first attempt, since it is a single request and is still the only path that skips albums whose artist metadata is missing. When it fails, fall back to one request per artist. That cannot dodge the exception either, but it confines the loss to whichever artist owns the offending album and names them, which is the only practical way to find it in a large library. Album failures are counted separately from artist failures because they do not mean the same thing. Tracks come from a different endpoint with a different mapper, so an artist whose albums cannot be fetched still gets indexed and still matches; it is the cull that cannot run. The report distinguishes the two rather than lumping them into one warning that overstates the damage.
This commit is contained in:
@@ -44,12 +44,28 @@ deletes music.
|
||||
|
||||
### Indexing quirks
|
||||
|
||||
Albums are fetched from the **unfiltered** `GET /api/v1/album`, not one call per
|
||||
artist. `?artistId=` is Lidarr's unguarded path: it dereferences the album's
|
||||
artist metadata with no null check and picks the monitored release with
|
||||
`SingleOrDefault`, so it returns a 500 for an album with broken metadata or two
|
||||
monitored releases. The unfiltered endpoint skips such albums instead, and costs
|
||||
N fewer requests.
|
||||
Albums are fetched from the **unfiltered** `GET /api/v1/album` first: one
|
||||
request, and the only path that skips albums whose artist metadata is missing
|
||||
rather than dereferencing it.
|
||||
|
||||
That is not enough on its own. Every album endpoint maps through a resource
|
||||
that picks the release with `SingleOrDefault(x => x.Monitored)`, which throws
|
||||
for an album with **two monitored releases** and takes the whole response with
|
||||
it:
|
||||
|
||||
```
|
||||
HTTP 500: Sequence contains more than one element
|
||||
```
|
||||
|
||||
When the bulk call dies that way, the indexer falls back to one request per
|
||||
artist. It cannot avoid the exception, but it confines it to whichever artist
|
||||
owns the offending album and names them in the log — which is the only
|
||||
practical way to find it in a large library. Open that artist in Lidarr and
|
||||
check the Releases tab of each album: exactly one release may be monitored.
|
||||
|
||||
Losing an artist's albums does not cost their tracks, which come from a
|
||||
different endpoint with a different mapper, so matching is unaffected. A cull
|
||||
would not be, and the report says so.
|
||||
|
||||
Tracks and files have no unfiltered endpoint — Lidarr rejects a call with no
|
||||
filter — so they stay per artist. If one artist cannot be served, that artist is
|
||||
|
||||
Reference in New Issue
Block a user