Skip to content

feat(renderer): add Chromecast backend with protocol-neutral orchestration#162

Merged
darious merged 4 commits intomainfrom
feature/provider-backend
May 1, 2026
Merged

feat(renderer): add Chromecast backend with protocol-neutral orchestration#162
darious merged 4 commits intomainfrom
feature/provider-backend

Conversation

@darious
Copy link
Copy Markdown
Owner

@darious darious commented May 1, 2026

Summary

  • New CastRendererBackend with pychromecast integration — discovery, playback, status listeners, volume/mute control
  • Protocol-neutral RendererOrchestrator that routes operations to any backend (UPnP, Cast, local) without callers branching on renderer type
  • RendererRegistry with backend registration/discovery/persistence, shared RendererDevice/RendererStatus contracts, and LAN-aware stream token TTL policy
  • Track advancement driven by position-vs-duration detection + IDLE polling, with targeted DB writes to prevent lost-update races on current_index
  • In-memory history dedup via should_log_history tracker
  • Volume: null slate on remote renderer select resets slider to 50% until device volume is polled
  • Frontend: renderer picker with Cast/UPnP/Local badges and icons, Cast-specific status display
  • 38 files, ~4500 insertions. Test suite: 347 passed, 1 skipped.

Open items

  • Volume initialization for Cast devices needs user verification
  • Custom receiver app for branded Cast UI (deferred to v2)
  • AirPlay 2 backend (sibling issue)

@darious darious mentioned this pull request May 1, 2026
…ume init

- New CastRendererBackend with pychromecast integration, status listeners,
  and event-driven state sync
- Protocol-neutral orchestration layer with _apply_status using targeted
  DB writes (update_playback_progress_db) to prevent lost-update races
  on current_index during concurrent status callbacks
- Position-based track ended detection; trust_idle flag so polling path
  can distinguish real IDLE from transient startup states
- In-memory history dedup via should_log_history tracker
- Volume: null slate on remote renderer select, slider defaults to 50%
  until device volume is polled, polling loop syncs volume from server
- Frontend: renderer picker UI with Cast/UPnP/Local badges and icons
@darious darious force-pushed the feature/provider-backend branch from 1175f07 to af03556 Compare May 1, 2026 12:43
@darious darious merged commit 94c0b4f into main May 1, 2026
7 checks passed
@darious darious deleted the feature/provider-backend branch May 1, 2026 12:47
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