/
/
/
# What does this implement/fix? AI Radio previously required creating a full show (playlist + persona + segment rules) before hearing any AI host. This PR splits that into two entities and adds a way to have a host jump into any queue directly: - **Hosts** hold the personality: instructions, voice (per-host TTS engine), which segments they use and how often. - **Shows** slim down to a playlist, playback settings and a reference to a host. - **AI DJ**: from the player menu you can now pick a host for any queue. The host keeps injecting talk segments between upcoming tracks (also while dynamic mode keeps topping the queue up) until switched off. The setting sticks across server restarts. Existing station configs are migrated automatically on first load (identical personas across stations are merged into one shared host). Changes: - New host entity with storage, validation and CRUD API (`ai_radio/hosts/*`), plus a TTS engine list endpoint for the voice picker - Station format v3 (references a host) with in-place migration from v2, including per-station failure isolation - Show runs now plan from the merged station+host data; clip rendering uses the host's persona and voice - Sticky queue DJ: per-queue watcher that plans and inserts clips just-in-time between upcoming tracks, with repair on queue edits, guard limits over endless sessions, and cleanup on disable/player removal - Fresh installs seed four ready-made hosts (Morning show, Minimal DJ, Music nerd, Party host), matching the personas the old show creator offered - Weather settings moved from per-station to provider config; weather lookups are now cached briefly instead of re-fetched per planning pass **Related issue (if applicable):** - related issue N/A ## Types of changes - [ ] 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. - [ ] 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: music-assistant/frontend#2354. - [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.