Atomic station switching
Selecting a station replaces the live item and its ordered fallback as one operation. Two stations cannot play simultaneously.
Product experience
The player combines five distinct station experiences in one native Android application without flattening their differences or replacing them with a WebView.
01 · Listening
A single Media3 player and MediaSession own the live stream beyond the Activity lifecycle. The UI connects through a domain-facing controller, so playback survives navigation and backgrounding without coupling Compose to ExoPlayer.
Selecting a station replaces the live item and its ordered fallback as one operation. Two stations cannot play simultaneously.
Notification, lock-screen, headset, Bluetooth, audio-focus, and play/pause controls stay synchronized through MediaSession.
An offline terminal failure becomes an explicit waiting state. One automatic prepare occurs after validated connectivity returns; pause, stop, or switching cancels it.
Presets or a custom 1–720 minute duration run inside the playback service, publish a live countdown, survive service recreation, and stop the existing player at expiry.
02 · Discovery
Station responses are treated as evidence. The app displays fields the station actually provides, enriches artwork only from the selected station, and leaves unavailable values unavailable.
03 · Accounts and requests
Each station has a separately visible session. Credentials remain transient during sign-in, returned cookies are encrypted with Android Keystore, and sign-out clears only the selected station.
Search, album browsing, least-played and random suggestions lead to a separate confirmation step. State-changing requests are one-shot and never automatically retried.
Verified stations can expose memory-only recent request summaries, cooldown/readiness, and explicit membership evidence. Generic page wording never implies VIP or RIP status.
04 · Community and safety
Public community content is hidden until the adult age screen, current Terms, and a separate mature-content reveal are satisfied. Reporting and blocking are native actions, not buried browser destinations.
Station certification
Every station uses the same domain contracts and UI. Capability flags expose only behavior supported by evidence from that station.
| Station | Shared certified surface | Notable verified boundary |
|---|---|---|
| StreamingSoundtracks.com | Playback, metadata, Queue/History, account, Chat, Favorites, requests, pages | Request messages, last-ten request activity, VIP evidence |
| 1980s.FM | Playback, metadata, Queue/History, account, Chat, Favorites, requests, pages | Independent session and verified Games/Awards pages |
| Adagio.FM | Playback, classical metadata, Queue/History, account, Chat, Favorites, requests, pages | Classical field presentation without guessed values |
| Death.FM | Playback, sparse metadata, compact Queue/History, account, Chat, Favorites, requests, pages | RIP membership route instead of VIP wording |
| Entranced.FM | Playback, metadata, extended Queue/History, account, Chat, Favorites, requests, pages | Narrowly scoped legacy ICY punctuation normalization |
Honest Alpha boundaries
Deferred after Inbox/Sent discovery and a reproduced profile-originated message that appeared to submit but was not delivered. It remains excluded until the legacy server path is repaired and verified.
M25's dedicated Android output chooser and current-route state are complete without a relay or new endpoint. M26 adds a user-reviewed, fixed-allowlist support snapshot with explicit Android copy/share and no automatic transfer. Google Cast remains capability-gated.
M27.1's station controls and local Chat-mention detector are complete for actively observed Chat. Reliable closed-app push remains gated on an authorized event source; the same architecture will notify new Private Messages once M17 delivery is repaired and verified.
The app depends on independently operated public station interfaces. Protocol or content changes can require renewed research and certification.