New controller/retry.js wraps async calls with infinite retries, capped
at 30s with jitter. Applied to: TPB search, TMDB, Emby, Ollama chat,
Transmission RPC, and the status/status interval calls inherit it via
a Proxy around the Transmission client.
Also handles ollama package returning pre-parsed JSON objects.
Signed-off-by: William Mantly <wmantly@gmail.com>
When a complete-season pack cannot be found for a missing/partial season,
fillMissing now searches each missing SxxExx individually and queues the
best episode torrent per gap. Also exposes episode-level detail in the
/fill response and season plan.
Signed-off-by: William Mantly <wmantly@gmail.com>
New controller/library.js queries Emby by TMDB provider id (resilient: an
unreachable Emby degrades to "unknown" so search still works).
Movies — quality-aware dedup:
- findReleases checks movieInLibrary(tmdbId) and flags each option alreadyOwned
when its resolution is <= what you already own, so only genuine upgrades are
offered; the release picker greys owned qualities and shows a library banner.
TV — library-driven "fill the gaps":
- GET /__api/search/seasons compares Emby's episode inventory against TMDB's
per-season episode counts to mark each season complete/partial/missing.
- POST /__api/search/fill picks the best complete-season pack (LLM) for every
missing/incomplete season and queues them. Front-end routes TV titles to a
season plan + "Fill all gaps" instead of the movie release list.
Adds tmdb.tmdbSeasons; shared tmdb module import in search.js.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>