* feat(collections): back collections with user-authored Trakt lists
Collections could sync only Trakt's built-in trending/popular/recommended
feeds; a server admin could not populate a collection from a specific
user's Trakt list (e.g. a curated 'Saw in timeline order' list) (#214).
- trakt.Client.GetUserList fetches /users/{user}/lists/{slug}/items in
list order, mixing movies and shows and skipping non-title entries.
- New 'trakt_list' collection source mode: catalog.ParseTraktListURL
accepts a trakt.tv list URL (or bare user/slug), and
syncTraktListCollection reuses the preset pipeline's matching/ordering
via an extracted completeTraktEntrySync helper. Public lists need no
access token.
- Trakt import handler accepts list_url as an alternative to preset;
the admin collection editor's Trakt form gains a Source toggle
(discovery feed vs user list) with a list-URL input.
Additive-only: new source mode + optional request field; preset path
unchanged.
Fixes#214
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(collections): round-trip trakt_list through the edit form, unlock mixed libraries, validate list host
Three review fixes for user-list-backed collections:
- The admin edit form now detects mode "trakt_list", shows an editable
list URL (mirroring the create form) and saves the source back as
trakt_list with list_url preserved — previously any edit silently
rewrote the collection into a trakt_preset Trending Movies feed.
- Library eligibility in list mode is mixed (movies + shows) instead of
inheriting the hidden media-type default of movie, since Trakt lists
mix both and entries match by their own type.
- ParseTraktListURL only accepts trakt.tv / www.trakt.tv hosts, so a
list-shaped URL on another domain fails fast with the format error
instead of a confusing later sync failure.
source_config now carries list_url alongside the legacy url key
(additive); sync reads list_url, then url, then source_url.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Quick <31828688+Quick104@users.noreply.github.com>
- Interleave Trakt movies/shows by rank so the mixed row shows both types
instead of burying all series past the display limit.
- Treat any Trakt sub-fetch failure as fatal (errors.Join) so a partial
result never overwrites the last-good snapshot with a media type missing.
- Skip non-title entries (TMDB trending/all returns media_type "person") in
both ID batching and ordering so they can't match an unrelated library title.
- Guard the refresh task against a nil refresher.
- Tests: person skip, Trakt interleave, Trakt partial-failure preserves
last-good, snapshot read error propagation.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>