📦 Beta Release
Changes since 2.11.0b2
🚀 New Providers
🚀 Features and enhancements
- Register Plex Connect players on plex.tv so mobile Plexamp apps can discover them (by @markjohnson303 in #4570)
- Implement Apple Music external ID lookup (ISRC/UPC) (by @dmoo500 in #5353)
- Implement Spotify external ID lookup (ISRC/UPC) (by @dmoo500 in #5356)
- Show transcripts for Pocket Casts podcast episodes (by @OzGav in #5895)
- Add triple J Hottest to ABC radio provider (by @Kludgy4 in #6140)
- Play podcast episodes and radio stations from a browse folder (by @OzGav in #6232)
- Use album.nfo album artist when the tag is missing (by @OzGav in #6233)
- Tidal: add track and album lookup by ISRC and barcode (by @jozefKruszynski in #6248)
- Music sources get an owner and can be shared with household members (by @marcelveldt in #6255)
- Deezer: External id lookup (by @jdaberkow in #6257)
- Align party and music quiz plugin icons with the frontend menu (by @MarvinSchenkel in #6258)
- Members can add and manage their own music sources (by @marcelveldt in #6267)
- Profiler: tell mapped files from heap growth in memory reports (by @marcelveldt in #6273)
- Diagnostics dump includes the memory split and the full profiler report (by @marcelveldt in #6275)
- Default the global autoplay setting to off (by @MarvinSchenkel in #6276)
- Let members pick who to share a music source with (by @marcelveldt in #6284)
- Personal Music Assistant playlists: private by default, shareable with other members (by @marcelveldt in #6285)
- Shuffle and repeat now work for Spotify Connect and other sources playing on Sonos (by @marcelveldt in #6292)
- Show the Home Assistant system account as a protected system user (by @marcelveldt in #6296)
- Play through your own account of a service, never through someone else's (by @marcelveldt in #6297)
- Let admins create their own user roles (by @marcelveldt in #6299)
- Let everyone play AI Radio stations (by @marcelveldt in #6301)
- Control shuffle and repeat for any service playing on Sonos (by @marcelveldt in #6304)
- Let anyone who may share a playlist pick the members to share it with (by @marcelveldt in #6325)
- Warn once per album folder about a missing ALBUMARTIST tag (by @balloob in #6330)
- Wake sleeping Sonos portable speakers automatically (by @MarvinSchenkel in #6342)
- Load Plex library metadata in batches instead of one item at a time (by @RyanAtTanagra in #6353)
- Sync a Plex library as soon as Plex reports that it changed (by @RyanAtTanagra in #6354)
- Let the sample rates setting apply to Sonos players (by @RyanAtTanagra in #6356)
- Add external id lookup to Qobuz provider (by @teancom in #6357)
- Report the stream server address over the API (by @marcelveldt in #6370)
- Collapse Tidal quality variants in artist listings (by @jozefKruszynski in #6386)
- Add support for authors and narrators to the filesystem providers (by @fmunkes in #6399)
- Add support for audiobook collections to the filesystem providers (by @fmunkes in #6400)
- Serve the app on the first-time setup page (by @marcelveldt in #6403)
- Use the loudness provided by Tidal (by @StollD in #6406)
- Apply the announcement volume consistently on grouped speakers (by @marcelveldt in #6412)
- Nicovideo: show the MFA code as separate digit boxes (by @marcelveldt in #6444)
- Allow playing playlist tracks sorted by date added (by @kees in #6455)
- Record when each Deezer playlist track was added (by @kees in #6457)
- Apple Music: carry the album releaseDate into metadata.release_date (by @sven-debug in #6461)
- Favorites are personal, and you can dislike (by @marcelveldt in #6482)
- Disliked tracks stay out of the music Music Assistant picks for you (by @marcelveldt in #6483)
- Show the publish date on more podcast episodes (by @OzGav in #6486)
- Give podcasts without a category the Spoken Word genre (by @OzGav in #6487)
- Match tracks and albums on other services by ISRC and barcode before searching (by @marcelveldt in #6489)
- Fill in library items and link music services through MusicBrainz (by @marcelveldt in #6490)
- Link existing libraries to MusicBrainz in the background (by @marcelveldt in #6496)
- Keep disliked artists and albums out of generated playback (by @marcelveldt in #6507)
- Send YouTube Music track likes and dislikes to your account (by @marcelveldt in #6508)
- Show an artist's full discography from MusicBrainz (by @marcelveldt in #6509)
- Fill in the audio quality of a linked music source when it is first played (by @marcelveldt in #6516)
- Let library writers refresh a library item from their music services (by @marcelveldt in #6521)
🐛 Bugfixes
- Make the skip command accurate enough for fixed 10 and 30 second buttons (by @OzGav in #5794)
- Record a failed analysis session in the failures overview (by @OzGav in #6138)
- Properly surface "Other versions" of an album from Youtube Music (by @NasaGeek in #6159)
- Fix DSD PCM buffer accounting and bound retention (by @mwd102 in #6177)
- Subsonic scrobbler: credit plays to the playing user's server account (by @pcc0x in #6200)
- Deezer: keep cover art and artist on user-uploaded tracks (by @jdaberkow in #6202)
- Keep provider item lookups scoped to their own media type (by @jdaberkow in #6203)
- Scope favorite and library writes to the sources the acting user may write to (by @pcc0x in #6212)
- Route generic LinkPlay OEM devices to the generic WiiM backend (by @OzGav in #6223)
- Plex provider - incorrectly accepts empty media container as lyrics (by @caraar12345 in #6229)
- Keep local playlist covers in subfolders instead of replacing them with a collage (by @OzGav in #6230)
- Stop TuneIn sync treating non-favourite stations as failed items (by @OzGav in #6231)
- Keep Sonos S1 playback events from blocking the event loop (by @OzGav in #6235)
- Keep the duplicate track walk from freezing the library database (by @OzGav in #6236)
- Cancel the prewarm of the old next track when a queue is replaced (by @MarvinSchenkel in #6238)
- Update Yoto API dependency with Oauth refresh token fixes (by @pantsman0 in #6240)
- Skip corrupt audio files instead of crashing the play request (by @OzGav in #6242)
- Don't mark a track unplayable when a speaker only probes it (by @marcelveldt in #6243)
- Tidal: fix playback of tracks that have a Dolby Atmos version (by @jozefKruszynski in #6244)
- Let repeat take priority over autoplay (by @MarvinSchenkel in #6250)
- Fix Jellyfin 12 playback and artwork (by @MarvinSchenkel in #6251)
- Fix a single-track Endless Mix looping over the same few songs (by @MarvinSchenkel in #6254)
- Show the station logo instead of the previous track's artwork when a radio starts (by @OzGav in #6256)
- Fix preset slot assignment and xml encoding in Bose Soundtouch (by @fmunkes in #6260)
- Fix ariacast sticky active player on second session and beyond (by @arthurbre in #6261)
- Fix the Profiler plugin leaking memory during CPU profiling (by @marcelveldt in #6266)
- Keep the MilkDrop visualizer alive on tracks longer than the audio buffer (by @jozefKruszynski in #6272)
- Fix saving the sharing of a music source when its owner or a shared member is disabled (by @marcelveldt in #6277)
- Stop Sonos speakers cutting out a couple of tracks in (by @marcelveldt in #6278)
- Fix ListenBrainz scrobbler blocking startup while validating its token (by @marcelveldt in #6289)
- Make AmpliPi setup aware of controllers that are already configured (by @mcaulifn in #6293)
- fix issue with forwarded hls substream urls (by @jfeil in #6295)
- Stop Sonos speakers logging an error on every queue change (by @marcelveldt in #6302)
- Ask to re-authenticate Last.fm when its login stops working (by @marcelveldt in #6303)
- Stop a hostname in the Published IP address setting from breaking playback (by @marcelveldt in #6305)
- Fix Pandora album pages failing to open (by @OzGav in #6308)
- Fill in unplayable album tracks from another provider (by @OzGav in #6310)
- Fix Squeezelite players sometimes playing static instead of music (by @marcelveldt in #6311)
- Prevent ListenBrainz scrobbling from hanging when the service is unresponsive (by @marcelveldt in #6312)
- Remove a playlist from the list of users who lose access to it (by @marcelveldt in #6314)
- Fix Squeezelite players going silent when switching tracks quickly (by @marcelveldt in #6316)
- Keep retrying YouTube Music when the PO Token server is not up yet (by @CodeCommander in #6326)
- Close pyatv session when an AirPlay control connect or pairing is cancelled (by @balloob in #6329)
- Hold back every caller while a provider rate limit is active (by @balloob in #6332)
- Import deferred provider modules off the event loop (by @balloob in #6333)
- Retry Wikipedia requests that hit a rate limit or an overloaded backend (by @balloob in #6335)
- Log an unavailable player at debug level while polling (by @balloob in #6336)
- Let users control their own connected client player (by @MarvinSchenkel in #6340)
- Random library mixes now favor your least-played tracks (by @MarvinSchenkel in #6343)
- Show Qobuz tracks played outside the library in Recently played (by @chrisuthe in #6347)
- Keep one music provider from breaking every version lookup (by @stvncode in #6351)
- Drop provider mappings for items the provider no longer has (by @RyanAtTanagra in #6355)
- Fix library artists and albums picking up an invalid provider link (by @marcelveldt in #6362)
- Ensure that the in-library view doesn't "lose" media items during a socket update in Audiobookshelf (by @fmunkes in #6363)
- Return HTTP 400 instead of 500 for a non-JSON login request body (by @MarvinSchenkel in #6371)
- Treat YouTube Music as a realtime source (by @MarvinSchenkel in #6373)
- Fix OpenSubsonic credential preservation during reconfiguration (by @teancom in #6376)
- Preserve localized setup errors across providers and flow aborts (by @teancom in #6382)
- Stop the audio analysis background scan from spawning a task per track (by @balloobbot in #6384)
- Update py-opensonic to 10.4.1 (by @khers in #6388)
- Fix announcements on a speaker group playing out of sync (by @marcelveldt in #6392)
- Remove stale author/narrator links when an audiobook is overwritten (by @fmunkes in #6397)
- Ensure an updated author or narrator reaches the library in a sync (by @fmunkes in #6398)
- Fix shuffle/repeat failing on players playing a dynamic mix (by @marcelveldt in #6404)
- Move the ibroadcast item mapping to strings only (by @robsonke in #6405)
- Fix a crash caused by a broken leftover player setting (by @marcelveldt in #6410)
- Fix false permission error opening an artist page (by @marcelveldt in #6411)
- Log an error when Bandcamp returns invalid JSON (by @teancom in #6417)
- Improved syncing in case it fails halfway on a single item (by @robsonke in #6418)
- Updates token management to allow PlexHome users to import their own libraries (by @romain38 in #6426)
- Keep the stale mapping pass from emptying a library on mismatched ids (by @RyanAtTanagra in #6427)
- Fix resume position after fallback announcements (by @sickkick in #6429)
- Fix Snapcast volume/mute routing to idle native player when Sendspin is active (by @tortfeaser in #6432)
- Fix YTMusic album resolution crash on null audioPlaylistId (by @frosty-geek in #6435)
- Fix AirPlay speaker ignoring stop after a failed playback start (by @marcelveldt in #6439)
- Fix external auth consent banner being hidden by ad-blocker filters (by @lanquarden in #6443)
- Show an error when your ListenBrainz token stops working (by @marcelveldt in #6447)
- Fix missing text on the Sendspin token pairing screen (by @marcelveldt in #6448)
- Attribute synced progress to the reporting provider instance (by @fmunkes in #6450)
- Stop a group's queue when it is powered off outside Music Assistant (by @marcelveldt in #6452)
- Fix Roku players providers failing to unload (by @kees in #6454)
- Keep VBAN receiver open while sender is idle (by @sprocket-9 in #6456)
- Skip CUE sheets with a missing audio file when browsing (by @OzGav in #6463)
- Reconnect radio streams that go silent before playback gives up (by @OzGav in #6466)
- Break up a lead speaker's group when it's powered off from Music Assistant (by @marcelveldt in #6467)
- Allow a speaker to rejoin a group right after the group broke up (by @marcelveldt in #6473)
- Fix a speaker group going silent when one room is powered off while another joins (by @marcelveldt in #6474)
- Share one player-access check across the core (by @marcelveldt in #6475)
- Better mime type handling squeeze sync group (by @Carunga in #6476)
- Fix Spotify dropping out on Sonos after resuming near the end of a track (by @marcelveldt in #6497)
- A dislike no longer adds the track to your streaming library (by @marcelveldt in #6498)
- Keep manually linked genres when a music provider syncs (by @MarvinSchenkel in #6499)
- Only defer the next-track preload for realtime single-stream sources (by @marcelveldt in #6500)
- Fix an idle sync group dissolving in the middle of a member change (by @marcelveldt in #6501)
- Stop Apple Music from adding empty albums whose songs were withdrawn from the catalog (by @MarvinSchenkel in #6502)
- Resume audiobooks and podcast episodes at their saved position when the queue moves on (by @MarvinSchenkel in #6503)
- Acquire the narrators from book metadata in Audiobookshelf (by @fmunkes in #6504)
- Fix an announcement or play command on a grouped speaker locking up during a group change (by @marcelveldt in #6505)
- Fix a play command on a synced speaker locking up during a group change (by @marcelveldt in #6510)
- Fix Nicovideo feed artists not matching library items (by @marcelveldt in #6511)
- Keep the library's housekeeping state when the music settings are saved (by @marcelveldt in #6514)
- Keep task schedules and run history when saving the Tasks settings (by @marcelveldt in #6522)
- Pin the RNG in the smart playlist headroom test (by @balloob in #6524)
- Keep a group playing when the speaker leading it is powered off (by @marcelveldt in #6525)
- Keep the WiiM queue on the right track when an event is missed (by @MarvinSchenkel in #6532)
- Keep filling a seed pool past one unproductive radio batch (by @balloob in #6535)
- Don't flag cleanly finished HTTP audio streams as failed (by @MarvinSchenkel in #6536)
🎨 Frontend Changes
- Show the right release year for tracks in time zones west of UTC (by @OzGav in #2697)
- Bump vue-i18n from 11.4.8 to 11.4.10 (by @dependabot[bot] in #2701)
- Bump pnpm/action-setup from 6.0.9 to 6.1.0 (by @dependabot[bot] in #2699)
- Bump @internationalized/date from 3.12.3 to 3.12.4 (by @dependabot[bot] in #2705)
- Bump swiper from 14.1.0 to 14.2.0 (by @dependabot[bot] in #2700)
- Bump zod from 4.4.3 to 4.5.4 (by @dependabot[bot] in #2704)
- Bump sass from 1.102.0 to 1.104.0 (by @dependabot[bot] in #2707)
- Improve accessible names for icon controls (by @teancom in #2569)
- Link to the audio analysis status page from the providers tab (by @OzGav in #2708)
- Fix item menu not updating position correctly (by @pierosavi in #2715)
- Disable autoplay controls while repeat is on (by @MarvinSchenkel in #2711)
- Bump dompurify from 3.4.11 to 3.4.14 (by @dependabot[bot] in #2702)
- Drop the plugin logo on built-in discover rows (by @marcelveldt in #2719)
- Owner and sharing controls for music sources (by @marcelveldt in #2716)
- Ask before removing a music source from the list (by @marcelveldt in #2738)
- Reset scroll position on route change (by @pierosavi in #2722)
- Share Music Assistant playlists with other members (by @marcelveldt in #2731)
- Guide new admins through setup with an onboarding wizard (by @marcelveldt in #2733)
- Show the Home Assistant system account in user management (by @marcelveldt in #2730)
- Let members pick who to share a music source with (by @marcelveldt in #2727)
- Welcome new household members with their own onboarding (by @marcelveldt in #2750)
- Clearer sources and layout on the artist page (by @stvncode in #2758)
- Gray accents on the now playing screen (by @MarvinSchenkel in #2762)
- Give the add-provider dialog more room (by @marcelveldt in #2788)
- Offer a short tour of the app after onboarding and from the profile menu (by @marcelveldt in #2791)
- Tidy up the background tasks card view (by @marcelveldt in #2795)
- Create the first admin account inside the setup wizard (by @marcelveldt in #2799)
- Improve Player Group UX clarity (by @trisweb in #2695)
- Share the remote access ID grouping (by @marcelveldt in #2806)
- Show listeners a fitting AI Radio empty state (by @marcelveldt in #2810)
- Stop the add-provider dialog fetching while hidden (by @marcelveldt in #2822)
- Finish de-Vuetifying the background tasks card (by @marcelveldt in #2825)
- Fix icon sizes ignored inside buttons (by @marcelveldt in #2826)
- Tidy up the redesigned artist page (by @marcelveldt in #2802)
- Favorites are yours, and you can dislike (by @marcelveldt in #2834)
- Unify and refine Discover shelf scrolling (by @trisweb in #2693)
🧰 Maintenance and dependency bumps
70 changes
- Remove f-strings from logging calls in BBC Sounds provider (by @kieranhogg in #6226)
- Update FFmpeg to 9.0.1 (by @MarvinSchenkel in #6228)
- Pace a stream by what is being served (by @marcelveldt in #6237)
- Encode FLAC in the block size that is cheaper on both ends (by @marcelveldt in #6239)
- BBC Sounds: remove duplicated function (by @kieranhogg in #6245)
- Say so when a Sonos speaker cannot play a track (by @marcelveldt in #6246)
- Keep Sonos playing an album of short tracks (by @marcelveldt in #6247)
- Fix an outdated docstring in the PulseAudio capture helper (by @marcelveldt in #6259)
- Expose the settings save as an awaitable (by @marcelveldt in #6262)
- Remove unused volume curve code from the PulseAudio capture helper (by @marcelveldt in #6263)
- Remove unused PulseAudio server discovery from the capture helper (by @marcelveldt in #6264)
- Enabling debug logging no longer slows the server down (by @marcelveldt in #6265)
- Document how to enable asyncio debug mode when running the server locally (by @marcelveldt in #6274)
- Refuse making a user a guest while it owns music sources (by @marcelveldt in #6282)
- Bring back the VS Code launch configuration (by @marcelveldt in #6283)
- Hand playback reports to scrobbler plugins through a plugin hook (by @marcelveldt in #6286)
- Pace the universal group stream like the flow stream (by @marcelveldt in #6288)
- Show the real reason when a music source action is refused (by @marcelveldt in #6290)
- Log what Sonos speakers ask the cloud queue for at debug level (by @marcelveldt in #6291)
- Refuse music source access that nobody could use (by @marcelveldt in #6300)
- Give the playlist owner refusal its own message and drop 'household' wording (by @marcelveldt in #6315)
- Remove the Squeezelite runtime patch for live stream buffering (by @marcelveldt in #6317)
- Bump modern-colorthief from 0.2.1 to 0.3.0 (by @dependabot[bot] in #6318)
- Bump librosa from 0.11.0 to 1.0.0 (by @dependabot[bot] in #6319)
- Bump pyblu from 2.0.8 to 2.1.0 (by @dependabot[bot] in #6321)
- Test that removing a playlist from the library checks its owner (by @marcelveldt in #6322)
- Let members edit their own playlists (by @marcelveldt in #6323)
- Fetch Music Assistant playlists fresh when adding them to the library (by @marcelveldt in #6328)
- Skip the traceback when a scanned file is unreadable (by @balloob in #6331)
- Name the tasks created by mass.create_task (by @balloob in #6334)
- Validate a builtin playlist id before using it as a file name (by @marcelveldt in #6338)
- Fix auto-merge getting stuck on dependency updates that need a newer Python (by @MarvinSchenkel in #6339)
- Fix memory build-up when a crossfade gets interrupted (by @marcelveldt in #6341)
- Fix streams tests leaking a raised log level into other tests (by @marcelveldt in #6344)
- Show child process counts in the diagnostics dump (by @marcelveldt in #6346)
- Prevent moving a music source owner to a role that can't manage sources (by @marcelveldt in #6349)
- Only allow remote URLs in the built-in provider (by @marcelveldt in #6350)
- Reliably stop the crossfade mixer when a crossfade is interrupted (by @marcelveldt in #6352)
- Add tests for Home Assistant ingress sign-in (by @marcelveldt in #6367)
- Announce a loaded provider only after its commands are registered (by @marcelveldt in #6375)
- Clarify that manual button presses are needed for Spotify setup flow (by @remon1496 in #6383)
- Bump docker/setup-buildx-action from 4.3.0 to 4.4.0 (by @dependabot[bot] in #6389)
- Bump docker/build-push-action from 7.3.0 to 7.4.0 (by @dependabot[bot] in #6390)
- Add support for authors/ narrators as artists and collections to the test provider (by @fmunkes in #6396)
- Update airplay-cli to v0.5.4 (by @musicassistant-bot[bot] in #6409)
- Improve Sonos cloud-queue debug logging (by @marcelveldt in #6414)
- Update the provider manifest table in the developer docs (by @marcelveldt in #6415)
- Bump wiim from 0.1.7 to 0.1.8 (by @dependabot[bot] in #6419)
- Bump mashumaro from 3.20 to 3.22 (by @dependabot[bot] in #6420)
- Bump websocket-client from 1.9.0 to 1.9.2 (by @dependabot[bot] in #6421)
- Tidy up the Spotify Connect soloist backend check (by @marcelveldt in #6428)
- Add test coverage for Ingress username-match sign-in (by @marcelveldt in #6437)
- Deduplicate the streams controller test setup helper (by @marcelveldt in #6442)
- Dedupe virtual-player cleanup retry loops (by @marcelveldt in #6460)
- Deduplicate webserver test scaffolding (by @marcelveldt in #6464)
- Tidy the native AirPlay start path after the spawn lock (by @marcelveldt in #6472)
- Add MusicBrainz identity lookups and provider link helpers (by @marcelveldt in #6481)
- Update various code owners (by @OzGav in #6485)
- Bump aiohttp-socks from 0.11.0 to 0.12.0 (by @dependabot[bot] in #6492)
- Bump python-slugify from 8.0.4 to 9.1.1 (by @dependabot[bot] in #6493)
- Bump syrupy from 6.0.0 to 6.1.1 (by @dependabot[bot] in #6494)
- Split Sonos cloud queue handling into its own module (by @marcelveldt in #6495)
- Keep provider mappings with their library item on multi-account services (by @marcelveldt in #6515)
- Fold Tidal's stream-time quality update into the shared backfill (by @marcelveldt in #6517)
- Keep runtime state of core modules when saving their settings (by @marcelveldt in #6519)
- Mark discography albums that are not in your library as not playable (by @marcelveldt in #6520)
- Tell Copilot the frontend ships in lockstep with the server (by @marcelveldt in #6523)
- Ungroup a powered-off sync leader only once (by @marcelveldt in #6531)
- Build the coroutine before handing it to create_task (by @balloob in #6533)
- Remove a leftover no-op in core settings save (by @marcelveldt in #6534)
🙇 Thanks to our contributors
Special thanks to the following contributors who helped with this release:
@Carunga, @CodeCommander, @Kludgy4, @MarvinSchenkel, @NasaGeek, @OzGav, @RyanAtTanagra, @Simanias, @StollD, @arthurbre, @balloob, @balloobbot, @caraar12345, @chrisuthe, @dmoo500, @fmunkes, @frosty-geek, @internationalized, @jdaberkow, @jfeil, @jozefKruszynski, @kees, @khers, @kieranhogg, @lanquarden, @marcelveldt, @markjohnson303, @mcaulifn, @mwd102, @pantsman0, @pcc0x, @pierosavi, @remon1496, @robsonke, @romain38, @sickkick, @sprocket-9, @stvncode, @sven-debug, @teancom, @tortfeaser, @trisweb