Bring 323 commits of develop (incl. the Expo SDK 56 / TV-branch work) into
the chromecast refactor. Conflict resolutions:
- chapters: take develop's reviewed version (ChapterList/ChapterTicks/
chapters.ts/test) — adds chapterNameAt, markers API, themed Colors.
- auto-skip: keep chromecast's unified useSegmentSkipper for the phone
player; restore develop's useCreditSkipper/useIntroSkipper (deleted on
chromecast) so develop's Controls.tv.tsx compiles. TV->useSegmentSkipper
migration left as follow-up.
- en.json: union the two player blocks (kept chromecast casting keys +
develop's subtitle/playback keys).
- TechnicalInfoOverlay/PlatformDropdown: take develop's TV-safe versions
(kept chromecast's disabled-prop branch, aliased to avoid shadowing the
@expo/ui disabled modifier).
- SDK 56 fixes: expo-router Router -> ImperativeRouter in cast components;
ChapterTicks markers API in CastPlayerProgressBar.
- restore utils/profiles/chromecast* (deleted on chromecast, still used by
PlayButton).
Typecheck passes; bun.lock regenerated against merged package.json.
Handle the server's LibraryChanged WebSocket message to invalidate
library-dependent React Query caches when items are added/updated/
removed, so newly added episodes/movies appear without a manual
refresh. Debounced to coalesce a scan's burst of events.
Add useRefreshLibraryOnFocus as a fallback that re-checks on screen
focus (throttled, online-only, skips first focus), wired into home
(mobile + TV) and the library pages.
Move reconnectAttempts from local variable to useRef so it persists
across recursive connectWebSocket calls. Previously, each call reset
the counter to 0, causing infinite reconnection attempts instead of
stopping at the max of 5.
Also reset the counter on successful connection (onopen) so fresh
reconnection attempts get full retries.