Skip to content

Radio fixes and sources - #552

Open
banamine wants to merge 19 commits into
serversideup:masterfrom
banamine:radio-fixes-and-sources
Open

banamine wants to merge 19 commits into
serversideup:masterfrom
banamine:radio-fixes-and-sources

Conversation

@banamine

@banamine banamine commented Oct 2, 2026

Copy link
Copy Markdown

No description provided.

banamine and others added 19 commits October 1, 2026 17:04
This workflow runs tests and publishes a Node.js package to GitHub Packages upon release creation.
This workflow automates the build and deployment of a Jekyll site to GitHub Pages, including setup and artifact upload.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
…nnect

- TCP keepalive and connectionTimeoutMillis on the LISTEN client.
- Periodic SELECT 1 with timeout detects half-open connections that never
  emit 'error' or 'end'; dead sockets are destroyed so they cannot leak.
- After every successful reconnect, re-broadcast current state for each
  subscribed channel, since NOTIFY is not queued for a disconnected listener.
- Tests: update made while LISTEN is down reaches SSE clients after
  reconnect; a silently hung connection is detected and recovered.
- Make the schedule test create its 4 s cycle right before use and close
  open connections in cleanup so a failed assertion cannot hang the run.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
… (A2-A4)

A2: ingest replaces the whole now-playing record; omitted artist/album are
    written as null instead of keeping the previous track's values.
A3: every new SSE client receives its own initial frame independent of the
    fan-out fingerprint; the 15 s age cache is replaced by a short TTL.
A4: unknown or inactive channels return 404 before any stream opens; add a
    process-wide SSE connection cap (503 + Retry-After) and distinguish
    missing channels, misconfigured channels, and database failures.

Each fix has a test that fails when the fix is removed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
…sets, remove fake UI (A5, B1-B4)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
…aceful shutdown

npm start used 'node -e import(...)', which left process.argv[1] empty so the
entrypoint guard never ran start(): the process exited 0 silently. Run the file
directly and default to production unless --dev/NODE_ENV=development. Adds a
regression test that boots the server, checks robots/noindex and clean SIGTERM exit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
…aging, DEPLOY.md (T3/T4)

Adds .github/workflows/radio-platform.yml (the one allowed file outside radio-platform/).
Docker build and smoke test verified locally; Google Cloud steps are UNVERIFIED (see DEPLOY.md).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
…API, UI filters

- server/sources/ajn.ts: RSS parser + filename/title classifier (air date, show, type, hour, variant), never guesses (weekday mismatch -> null + needsReview)
- additive migration 20261002000000_content_sources (podcast_episodes columns, content_sources)
- server/sources/sync.ts + npm run sources:sync: https/host allowlists, ETag, size/time caps, one transaction per feed, missingSince
- API: episodes filters (show/type), facets, /api/sources; UI filter chips, dated clean titles
- tests against real feed samples; integration tests on PGlite; entrypoint SYNC_SOURCES_ON_START
- verified on the real feeds: 280 episodes imported, 0 needing review; real MP3 plays in headless Chromium

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JioC3eCpQMqUFXMyTb1DHU
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.

2 participants