Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 6s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 4m35s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 5m22s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Docs update reminder (push) Has been skipped
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 4m2s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 6m50s
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m13s
Last SPA pre-work before deleting Blazor Libraries.razor (#91 phase b): wire the shipped scanLibrary(id, deep) + scanCollections(family, id, deep) clients (F9 API, #235) into LibrariesScreen so the SPA reaches parity with Libraries.razor's four scan actions. - Deep Scan Library button on each remote (Plex/Jellyfin/Emby) library row, threading `deep` through the existing optimistic-pending/poll hook (quick + deep share the per-library lock). - External Collections section (quick + deep per remote source). Rows derive client-side from getMediaSources(): the media-sources API handler already filters each source's `libraries` to sync-enabled entries, so a remote source with a non-empty libraries list is exactly GetExternalCollections's Libraries.Any(ShouldSyncItems) filter — no new endpoint. - useCollectionsScan hook: collections scans have no scan-status poll surface (the endpoint is library-keyed; Blazor observed collections locks via in-process IEntityLocker events), so pending is optimistic + timeout-bounded (409 benign, 404/network surfaces the error). Follow-up #271 for a proper collections status surface. Pure SPA change (no backend/OpenAPI). Docs: blazor-route-parity.md §5 (SPA affordance DONE), decisions.md (derive-vs-endpoint + optimistic-timeout). Refs #91 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>