v3.3.1 — Apple Music, Reset Button & Recovery Paths
v3.3.1 — Apple Music, Reset Button & Recovery Paths
Apple Music plays cleanly on Music Assistant setups again. The wizard tells you up front when your speaker can't play your service. And when a game does get stuck, you have a one-click way out — plus an admin session that survives a dropped connection.
✨ What's New
Apple Music via Music Assistant
Beatify now emits MA's native apple_music://track/<id> URI instead of the short music.apple.com/song/<id> URL that MA's parser silently rejected. Apple-Music-only setups had been seeing No playable items found on every fallback. Closes #772 and the remaining failure from @Levtos's #768 follow-up.
Wizard Knows What Your Speaker Can Play
Each speaker in Step 1 wears a capability badge — "All services" for MA, "Spotify only" for Sonos direct, "Spotify, Apple Music" for Alexa. In Step 2, providers your speaker can't play render dimmed with a lock icon; clicking one opens a card explaining how to set up MA. Continue is blocked until you pick something that actually works. Locale word order respected across en/de/es/fr/nl ("nur Spotify" in German).
Emergency Reset Button
A small ⟲ icon in the admin header. One click ends any active game, clears localStorage, unregisters the service worker, and reloads — same effective state as a fresh install. Backed by a new rate-limited endpoint that doesn't require an admin token, since the situation that needs this button is one where your token may be unreachable.
Recovery When Playback Fails
Beatify no longer advances the question + countdown when MA fails to actually start a track — strict-detection compares speaker state before and after the wait, treats "neither media_title nor position_updated_at moved" as a hard failure that falls through to the next URI candidate. MA timeout extended 8s → 15s for AirPlay. Closes #777.
Admin Session Survives a Dropped WebSocket
If your admin WS drops mid-game, reconnecting with the same name returns you to your admin role regardless of phase. Previously got bounced to name-entry → reload loop during REVEAL. pause_game also captures the admin name on every reason now, not just admin_disconnected. Closes #790.
🔧 Under the Hood
Service worker actually activates now (closes #780, all CACHE_VERSION bumps now do what they say) · admin footer reads version from manifest.json instead of a constant that drifted to v3.2.0-rc29 since April (#784) · CI restored after two months untracked (#786, #787) · 6 stale unit tests fixed properly (#788) · 17 new tests · 12 new i18n keys across en/de/es/fr/nl
🙏 Contributors
@Levtos — Almost every fix in this release traces back to his patient stress-testing on AirPlay + HomePod + Denon + Apple Music + MA. Surfaced #777, #790, the German word-order bug, and asked for the "großen roten Button" that became the reset feature.
24 playlists · 2,481 songs · 5 music platforms · 5 languages