SPA parity: Trakt lists (#91 blocker) #142

Closed
opened 2026-07-07 10:45:06 +02:00 by timothy · 2 comments
Owner

Blocking sub-issue for #91 (Blazor retirement, phase b). Recon (2026-07-07) found this functionality exists only in the legacy Blazor UI — deleting Blazor before the SPA covers it would remove the feature. Part of epic #59.

Blazor routes covered: /media/trakt/lists, /media/trakt/lists/{id}. Add/refresh/delete Trakt lists and match monitoring.

Blocking sub-issue for #91 (Blazor retirement, phase b). Recon (2026-07-07) found this functionality exists only in the legacy Blazor UI — deleting Blazor before the SPA covers it would remove the feature. Part of epic #59. Blazor routes covered: `/media/trakt/lists`, `/media/trakt/lists/{id}`. Add/refresh/delete Trakt lists and match monitoring.
Author
Owner

API recon done (2026-07-07): gap issue #160 filed. Simpler than feared: NO OAuth/device flow exists in ErsatzTV — public lists via static TRAKT__CLIENTID, so the SPA needs no auth dialogs. All handlers exist; needs a thin TraktController + a design decision on background dispatch vs sync (Blazor uses worker channel + in-process IEntityLocker — not HTTP-observable). Matched-items view reuses search (trakt_list:{id}), which depends on #161's search endpoint.

API recon done (2026-07-07): gap issue #160 filed. Simpler than feared: NO OAuth/device flow exists in ErsatzTV — public lists via static `TRAKT__CLIENTID`, so the SPA needs no auth dialogs. All handlers exist; needs a thin `TraktController` + a design decision on background dispatch vs sync (Blazor uses worker channel + in-process IEntityLocker — not HTTP-observable). Matched-items view reuses search (`trakt_list:{id}`), which depends on #161's search endpoint.
Author
Owner

PR #167 MERGED (2026-07-07): Trakt Lists screen live at /app/trakt-lists (Media nav) — add-by-URL, edit (autoRefresh/generatePlaylist), match/refresh, delete, busy-aware polling via GET /api/trakt/status. Backend #160 fully implemented: TraktController with paged list/get/add(202)/match(202)/delete(202)/update, background-dispatch + IEntityLocker semantics identical to Blazor, sync URL validation (422), 409 on locked. Review fix applied: lock released if enqueue fails (client disconnect no longer wedges Trakt busy state).

Interim: "View matched items" deep-links to classic /search?query=trakt_list:{id} until the SPA search screen (#161/#141) lands — swap the link then. Closing as parity-complete; #160 closes with it.

PR #167 MERGED (2026-07-07): Trakt Lists screen live at `/app/trakt-lists` (Media nav) — add-by-URL, edit (autoRefresh/generatePlaylist), match/refresh, delete, busy-aware polling via `GET /api/trakt/status`. Backend #160 fully implemented: `TraktController` with paged list/get/add(202)/match(202)/delete(202)/update, background-dispatch + IEntityLocker semantics identical to Blazor, sync URL validation (422), 409 on locked. Review fix applied: lock released if enqueue fails (client disconnect no longer wedges Trakt busy state). Interim: "View matched items" deep-links to classic `/search?query=trakt_list:{id}` until the SPA search screen (#161/#141) lands — swap the link then. Closing as parity-complete; #160 closes with it.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: timothy/ersatztv#142