/
/
/
# What does this implement/fix? Radio stations can now be "dynamic": instead of one live stream, the provider hands out a fresh batch of tracks on demand and Music Assistant keeps the queue topped up. Playlists could already do this, radio could not. Services like Pandora and Apple Music call their content "stations", but the way it plays matches a dynamic playlist, not radio. Until now the only way to ship such a provider was to list the stations under Playlists, which is not where users look for them. With this, a provider can pick the media type that matches what users expect and still get the dynamic playback behaviour. Nothing changes for existing radio stations, and nothing changes for users until a provider starts using the flag. **Related issue (if applicable):** - related issue <link to issue> ## Types of changes <!-- Tick exactly one box. CI (.github/workflows/pr-labels.yaml) derives the label from the ticked box and applies it automatically; the release-notes generator uses that same label to slot this change into the next release notes. --> - [ ] Bugfix (non-breaking change which fixes an issue) — `bugfix` - [ ] New feature (non-breaking change which adds functionality) — `new-feature` - [x] Enhancement to an existing feature — `enhancement` - [ ] New music/player/metadata/plugin provider — `new-provider` - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — `breaking-change` - [ ] Refactor (no behaviour change) — `refactor` - [ ] Documentation only — `documentation` - [ ] Maintenance / chore — `maintenance` - [ ] CI / workflow change — `ci` - [ ] Dependencies bump — `dependencies` ## Checklist - [x] The code change is tested and works locally. - [x] `pre-commit run --all-files` passes. - [x] `pytest` passes, and tests have been added/updated under `tests/` where applicable. - [x] For changes to shared models, the companion PR in `music-assistant/models` is linked. - [x] For changes affecting the UI, the companion PR in `music-assistant/frontend` is linked. - [x] I have read and complied with the project's [AI Policy](https://github.com/music-assistant/.github/blob/main/AI_POLICY.md) for any AI-assisted contributions. - [ ] I have [raised a PR against the documentation repository](https://github.com/music-assistant/music-assistant.io/blob/main/CONTRIBUTING.md) targeting the main or beta branch as appropriate. ## Changes - A radio station can be flagged as dynamic; the queue then treats it exactly like a dynamic playlist, as a self-managing source that keeps refilling rather than a single queue item. - New provider method `get_dynamic_radio_tracks` plus a `music/radios/radio_tracks` API command so the UI can show a sample of what a station would play. - A single `is_dynamic_source()` check replaces the playlist-only checks that were spread across the queue loader and the managed pool. - A dynamic station is no longer matched against other providers by name, which would otherwise link it to an unrelated internet radio stream. - The provider now owns a dynamic station's name and artwork, so a renamed station no longer stays stale in the library. - Database schema 57 -> 58 for the new `is_dynamic` column on radio stations. ## Companion PRs - models: https://github.com/music-assistant/models/pull/360 - frontend: https://github.com/music-assistant/frontend/pull/2478 Depends on the models PR: CI stays red until `music-assistant-models` 1.1.188 is released. --------- Co-authored-by: Claude Opus 5 <[email protected]>