Skip to content

Bridge 2d-1: podcasts in the player - #119

Merged
KodeStar merged 13 commits into
mainfrom
feat/bridge-2d-1
Oct 23, 2026
Merged

KodeStar merged 13 commits into
mainfrom
feat/bridge-2d-1

Conversation

@KodeStar

@KodeStar KodeStar commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Bridge Phase 2d-1: podcasts in the player. App version 2.2.0.

What

  • Wire mirror (additive, optional): Library.kind, the podcast types, Book.episode, id3_chap; client methods for shows, episodes, follow/unfollow, fetch status and Retry; PodcastFetchPendingError keeps fetch and Retry-After from a stream 503.
  • Library: a Shows mode for podcast libraries (All / Following), the /podcast show page (serial oldest first, episodic newest first, ?order= toggle, paged list), and the episode page in place of the book page.
  • Follow / Unfollow, only while capabilities.podcasts is true and for adults (not kids or demo); private-feed unfollow asks first.
  • Home: a New episodes rail from followed shows. Episodes stay out of the book shelves.
  • On-demand episodes (src/playback/episode-fetch.ts): a Range: bytes=0-0 probe, then status polling every max(2, Retry-After) s, paused in the background, cancelled on a newer start, a profile switch or a removed connection. At ready it refreshes the item and chapters, then starts once. It never POSTs on its own; Try again does. A full-player panel plus a dock/mini-player strip, with localized reasons.
  • Episodes are excluded from downloads, keep-ahead, cast and end credits, and from kids mode (including shared collections).
  • Dev-only EXPO_PUBLIC_IDENTIFY_CROSS_ORIGIN=1 sends the client header cross-origin, so the npm run web loop can see podcasts.
  • All 6 locales.

Tests and gate

npx tsc --noEmit, lint, prettier, npm test (418 suites, 5138 tests), npx expo export -p web. New client, controller, start-book, player-route, model, component, home, kids and locale tests; the wire goldens are copied from the server's phase2c2/wire-2b.json.

Verification (live, Chromium 1440/390 and WebKit for the fetch flow)

  • Status polling every 2.004-2.011 s; one probe and one audio /stream per fetch; 503 after 1.97 s; ready to audio in 164-294 ms.
  • Library, show page, follow, Home rail, ready play with id3_chap chapters, background pause, abort, failed and Try again, unavailable, fetch_limit, the timeline-changed notice, books regression, kids (API and UI, including a failed library list), admin console: all PASS.
  • Not covered live: native fetch state, background audio and the iOS 26 accessory (needs a device run), and real Safari autoplay expiry.

Pairs with KodeStar/audiosilo-server#169, KodeStar/audiosilo-docs#160 and KodeStar/audiosilo#82.

App version 2.2.0 so the server shows podcast libraries to this player.
Library.kind, Book.episode, the podcasts and podcast_fetch flags, the
id3_chap chapters source, the podcast routes in ApiClient with the 503
fetch-pending decode, query hooks, a dev-only cross-origin identify
override, the listener strings in all six locales, and the server's
wire-2b golden as a test fixture.
An episode not on its server yet goes through the new episode fetch
controller: one stream probe, then the fetch status every Retry-After
seconds, then a start in place once it is ready. Retry is the only
POST. The full player shows a fetch panel in its place; the docked bar
and the mini player carry a strip. Episodes never open the end credits
(Up next only, with auto-play), never cast, and are never downloaded,
auto-downloaded or kept ahead.
…bs for an episode, picker icon beside its label
@KodeStar
KodeStar merged commit 8742933 into main Oct 23, 2026
1 check passed
@KodeStar
KodeStar deleted the feat/bridge-2d-1 branch October 23, 2026 07:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant