📦 Beta Release
Changes since 2.11.0b4
⚠ Breaking Changes
- Update MSX Bridge provider from v1.4.9 to v1.6.2 (by @trudenboy in #5868)
🚀 New Providers
- Add Yandex Disk provider (by @trudenboy in #4828)
- Add Telmore musik provider (by @math625f in #5502)
- Add NetEase Cloud Music scrobbler plugin (by @Kiranwin in #6759)
🚀 Features and enhancements
- Typed sorting for library listings with discoverable sort options (by @dmoo500 in #5498)
- Play AI Radio shows as Radio stations (by @MarvinSchenkel in #6372)
- Move audio analysis storage into its own database file (by @chrisuthe in #6377)
- Promote audio analysis arrays to typed fields (by @chrisuthe in #6378)
- Store audio analysis records in a packed format (by @chrisuthe in #6379)
- Add a stream quality setting to the nugs.net provider (by @igray in #6480)
- Add a payload version to invalidate persisted recommendation payloads (by @fmunkes in #6618)
- Use native items in Audiobookshelf browse and recommendations (by @fmunkes in #6619)
- Link system settings to their documentation (by @marcelveldt in #6626)
- Make skipping back in podcasts and audiobooks fast (by @OzGav in #6682)
- Add an order setting for playing an artist (by @szsolt in #6690)
- Name the Profiler section in diagnostics like other providers (by @marcelveldt in #6700)
- Add NetEase Personal Recommend section with daily and radar playlists (by @Kiranwin in #6742)
- Show the provider type in diagnostics sections (by @marcelveldt in #6754)
- Add issuer and audience claims to access tokens (by @MarvinSchenkel in #6758)
- Storytel - Add explicit cache durations for cache calls. (by @jonasbp2011 in #6763)
- Run manually triggered tasks next in the background task queue (by @OzGav in #6764)
- Stop network share actions from hanging when the share does not respond (by @marcelveldt in #6766)
- Don't show "0 MB used" for the data folder on a fresh install (by @marcelveldt in #6777)
- Added episode_number property to PodcastEpisode media item in Storytel Provider (by @jonasbp2011 in #6784)
- Separate play history from media progress (by @dmoo500 in #6792)
- Adding music to a large shuffled queue no longer takes a minute (by @marcelveldt in #6813)
- Album tracks sort, search and page on the server (by @marcelveldt in #6848)
- Keep the tracks of a share that was already down when the server started (by @marcelveldt in #6855)
- Warn when another Local files source already reads the picked folder (by @marcelveldt in #6856)
- Sign in with Home Assistant from the remote app without an External URL (by @marcelveldt in #6859)
- Let the AI DJ talk over the intro of the next song (by @marcelveldt in #6866)
- Remember where each queue item was played from and play that copy first (by @marcelveldt in #6872)
- Show the OpenSubsonic playlist comment as the playlist description (by @theomega in #6892)
- Add search support to the Nugs provider (by @jonesy827 in #6902)
- Let the AI DJ talk over the intro on Sonos and other gapless players (by @marcelveldt in #6924)
- Send Home Assistant text-to-speech engines a language they support (by @marcelveldt in #6925)
- Pause the AI DJ when its speech engine keeps failing (by @marcelveldt in #6927)
- Storytel: Dynamically present available languages from account context (by @jonasbp2011 in #6929)
- Apply the different-sample-rates crossfade option to the AI DJ's talk-over (by @marcelveldt in #6933)
- Add power control and per-room mute to the Raumfeld provider (by @Simanias in #6939)
- Show the real model name of Raumfeld players (by @Simanias in #6946)
- Expose the Camelot key of a track (by @MarvinSchenkel in #6952)
- Add an option to keep remastered versions apart (by @marcelveldt in #6956)
- Play every track of an album from the same source (by @marcelveldt in #6958)
- Add BPM and key to playlist tracks (by @stvncode in #6960)
- Sharpen the bundled AI Radio host prompts (by @MarvinSchenkel in #6961)
🐛 Bugfixes
- Update KION Music provider to v3.0.12 (by @trudenboy in #5585)
- Fix Yandex Station credential borrowing and audio playback (by @trudenboy in #5605)
- Add a Cast player option to apply a volume set while idle at playback start (by @distante in #5800)
- Faster start and seek for remote MP3s with large ID3 tags (by @chrisuthe in #6374)
- Fix album track deduplication for repeated movement titles (by @teancom in #6425)
- Release the queue when another app casts to a Chromecast via the Default Media Receiver (by @MarvinSchenkel in #6528)
- Fix DLNA player showing up twice when the device advertises a relative presentation URL (by @MarvinSchenkel in #6597)
- Fix Spotify playlists missing from large libraries (by @MarvinSchenkel in #6613)
- Stop Plex Connect from logging unrelated items in the Plex history (by @MarvinSchenkel in #6705)
- Qobuz: report playback start when the track actually starts playing (by @marcelveldt in #6711)
- Speed up the gPodder provider and fix its progress sync (by @fmunkes in #6718)
- Drop thumbnails from YouTube Music less frequently (by @NasaGeek in #6721)
- Keep favorite tracks of multiple Tidal accounts apart in the library (by @MarvinSchenkel in #6726)
- Fix audiobooks not starting when resuming deep into a long mp3 (by @MarvinSchenkel in #6727)
- Fix personalized NetEase endpoints returning wrong data on some NCM API backends (by @Kiranwin in #6730)
- Deezer: Fix Family profiles showing the admin's library (by @jdaberkow in #6738)
- Update Zvuk Music provider to v1.8.11 (by @trudenboy in #6744)
- Limit the Home Assistant image proxy to entity pictures (by @MarvinSchenkel in #6746)
- Revoke guest access when the party or music quiz plugin is disabled (by @MarvinSchenkel in #6747)
- Return an error when sending commands to an unavailable player (by @MarvinSchenkel in #6748)
- Bind the playlog lookup parameters (by @MarvinSchenkel in #6751)
- Update FastMCP Server provider to v2.1.24 (by @trudenboy in #6755)
- Refuse CIFS usernames and shares that would add mount options (by @MarvinSchenkel in #6756)
- Skip the DSP restart when the player is not playing the queue it would resume (by @mnestrud in #6760)
- Move non-classical aliases out of the classical genre (by @OzGav in #6761)
- Hide Sendspin token pairing when a pairing code is available (by @maximmaxim345 in #6768)
- Fix Sendspin players not marking items played when playback starts near the end (by @maximmaxim345 in #6770)
- Restrict what the image loader hands to ffmpeg (by @MarvinSchenkel in #6771)
- Require the Supervisor as peer for Home Assistant Ingress requests (by @MarvinSchenkel in #6772)
- Write playlist files only to regular files inside the library root (by @MarvinSchenkel in #6773)
- Show Apple Music names in the user's language (by @MarvinSchenkel in #6775)
- Only accept http(s) URLs and data URIs as builtin item artwork (by @MarvinSchenkel in #6780)
- Keep hi-res quality for sources that don't report their audio format (by @marcelveldt in #6781)
- Stop a Sonos from playing music again after the queue has finished (by @marcelveldt in #6782)
- Fix album covers not loading when archive.org is slow or down (by @OzGav in #6787)
- Establish default behaviour when playing an artist not in library (by @OzGav in #6795)
- Fix play doing nothing after the queue's current track was replaced (by @marcelveldt in #6796)
- Keep a Sonos group playing after the speaker reports a failed track (by @marcelveldt in #6797)
- Stop play requests from running at the same time on one queue (by @marcelveldt in #6798)
- Fix play reporting an empty queue when its position is past the last track (by @marcelveldt in #6800)
- Keep the next track in sync with quick queue edits (by @marcelveldt in #6807)
- Stop counting a track as played when it never started (by @marcelveldt in #6808)
- Use the External URL for party and quiz QR codes (by @marcelveldt in #6812)
- Fix speaker discovery breaking after changing the discovery interfaces setting (by @marcelveldt in #6815)
- Stop instead of pause while Music Assistant streams to a Bose SoundTouch speaker (by @fmunkes in #6821)
- Make Bose SoundTouch survive flaky speaker responses (by @fmunkes in #6822)
- Give Local files sources with the same folder name a unique name (by @marcelveldt in #6823)
- Fix Home Assistant sign-in through the External URL or Remote Access (by @marcelveldt in #6826)
- Sonos: allow 24-bit playback on Play:1 and Connect (Gen 2) (by @orb9 in #6828)
- Keep Local files sources inside their own folder (by @marcelveldt in #6831)
- Show which setting is wrong when saving settings fails (by @marcelveldt in #6834)
- Show the podcast name as the artist for podcast episodes (by @OzGav in #6838)
- Stop Last.fm recommendations from re-searching music providers (by @Bazooper-blip in #6843)
- Stop Apple Music from sending item names to the API as ids (by @Bazooper-blip in #6844)
- Cut the Apple Music requests made per lookup and per Discover refresh (by @Bazooper-blip in #6845)
- Stop Apple Music from fetching the album again for its album tracks (by @Bazooper-blip in #6846)
- Fix Home Assistant sign-in from the mobile app through the External URL or Remote Access (by @marcelveldt in #6849)
- Fix MSX Bridge TVs going silent after the first track (by @marcelveldt in #6858)
- Release AirPlay speakers when a stream finishes instead of two minutes later (by @thatcoleyouknow in #6868)
- Keep tracks of a disconnected share when syncing the folder above it (by @marcelveldt in #6869)
- Fix possible crashes when a lookup comes back empty (by @marcelveldt in #6876)
- Allow slashes and dots in playlist names (by @OzGav in #6885)
- Push Sendspin progress when playback restarts on the same item (by @chrisuthe in #6900)
- Match play_media sort_by to the frontend's track sort (by @OzGav in #6906)
- Keep downloaded models in the Music Assistant cache dir (by @MarvinSchenkel in #6910)
- Show the custom Plex poster of a playlist instead of the generated grid (by @MarvinSchenkel in #6911)
- Report expired YouTube Music cookies instead of missing Premium (by @MarvinSchenkel in #6915)
- Fix the server running out of memory on large album covers (by @marcelveldt in #6919)
- Serve original-size JPEG artwork without re-encoding it (by @marcelveldt in #6920)
- Fix Sendspin players with DSP joining a group out of sync (by @maximmaxim345 in #6921)
- Fix Patreon podcast feeds blocked by a Cloudflare challenge (by @OzGav in #6922)
- Bump
aiosendspinto 10.0.1 to fix audio gaps and sync drift (by @maximmaxim345 in #6923) - Fix a track's source being opened for a request the player already gave up on (by @marcelveldt in #6926)
- Fix updated ESPHome Sendspin speakers reappearing as new players (by @maximmaxim345 in #6928)
- Fix a Spotify track stalling the queue when Soloist's sign-in fails (by @marcelveldt in #6930)
- Fail Raumfeld playback clearly when a room gets no zone (by @Simanias in #6947)
- Keep the queue going after an AI DJ clip (by @MarvinSchenkel in #6950)
- Make OpenAI text-to-speech setup work with more self-hosted servers (by @marcelveldt in #6951)
- Keep playlist edits and provider mappings to real playlists (by @MarvinSchenkel in #6954)
- Fix a short dropout when a Sendspin player with DSP joins a group (by @maximmaxim345 in #6962)
- Fix more out-of-sync cases for Sendspin players with DSP (by @maximmaxim345 in #6965)
- Bump
aiosendspinto 10.0.2 to fix slow reconnects of updated ESPHome speakers (by @maximmaxim345 in #6969) - Optimize the Audiobookshelf progress sync and keep its token on the server (by @fmunkes in #6977)
🎨 Frontend Changes
- Don't repeat the album year on every track of an album page (by @MarvinSchenkel in #2924)
- Remember the web player volume between sessions (by @OzGav in #2900)
- Bump release-drafter/release-drafter from 7.7.0 to 7.9.0 (by @dependabot[bot] in #2912)
- Bump @vueuse/core from 14.3.0 to 15.0.0 (by @dependabot[bot] in #2916)
- Bump vitest from 4.1.11 to 5.0.3 (by @dependabot[bot] in #2914)
- Bump @tabler/icons-vue from 3.46.0 to 3.48.0 (by @dependabot[bot] in #2915)
- Bump @lucide/vue from 1.48.0 to 1.51.0 (by @dependabot[bot] in #2918)
- Bump lint-staged from 17.5.1 to 17.6.0 (by @dependabot[bot] in #2919)
- Bump oxlint and eslint-plugin-oxlint (by @dependabot[bot] in #2920)
- Bump typescript-eslint from 8.70.1 to 8.71.0 (by @dependabot[bot] in #2921)
- Bump vite from 8.3.0 to 8.3.2 (by @dependabot[bot] in #2917)
- Say on the Storage page why a location can not be removed (by @marcelveldt in #2922)
- Manage a music source from its own page (by @marcelveldt in #2887)
- Show podcast season and episode numbers (by @OzGav in #2925)
- Let party guests re-request tracks when duplicates are allowed (by @MarvinSchenkel in #2872)
- Show album and track versions in search results (by @MarvinSchenkel in #2923)
- Show the source name in the Reconfigure dialog when the source is not loaded (by @marcelveldt in #2908)
- ⬆️ Sync shared-icons to 0.4.0 (by @musicassistant-bot[bot] in #2931)
- Show read-only locations in the folder picker (by @marcelveldt in #2910)
- Remove unused shortcut helpers that compare pins by their text (by @marcelveldt in #2927)
- Remove unused fallback from remote album art loading (by @marcelveldt in #2935)
- Show where a Local files source reads its music from (by @marcelveldt in #2948)
- Let a DJ segment talk over the intro of the next song (by @jpittelkow in #2828)
- Show settings save errors only once (by @marcelveldt in #2958)
- Add seek back and forward buttons for audiobooks and podcasts (by @OzGav in #2901)
- Show where the playing track was played from (by @marcelveldt in #2975)
- Stop the listing search from flickering while it opens (by @stvncode in #2983)
🧰 Maintenance and dependency bumps
82 changes
- Clarify the Sendspin automatic audio format option (by @marcelveldt in #6720)
- Teach the review how data migrations are handled here (by @chrisuthe in #6733)
- Fix the critical-review gate never converting a PR to draft (by @chrisuthe in #6734)
- Stop asking for an API schema bump where no client can gate on it (by @chrisuthe in #6735)
- Widen the critical-review gate's window to two hours (by @chrisuthe in #6736)
- Upgrade QQ Music provider to API 0.8.2 (by @xiasi0 in #6737)
- Bump ya-passport-auth to 2.2.0 (by @trudenboy in #6741)
- Verify the FFmpeg and Snapcast downloads in the base image (by @MarvinSchenkel in #6750)
- Bump Yandex Music and KION Music API dependency to 3.2.1 (by @trudenboy in #6774)
- Keep audio flowing while a crossfade waits for the next track's source (by @marcelveldt in #6783)
- Remove duplicate mixer stand-ins from the realtime source tests (by @marcelveldt in #6785)
- Bring the webserver auth README in line with the code (by @marcelveldt in #6786)
- Clean up unused code in the login callback page (by @marcelveldt in #6793)
- Stop saving the album cover into a track's own images (by @marcelveldt in #6794)
- Choose a track's stream source with one deterministic ranking (by @marcelveldt in #6804)
- Keep GITHUB_TOKEN out of the PyPI download step in auto-merge (by @chrisuthe in #6811)
- Run CI tests in our own base image and split them over parallel jobs (by @marcelveldt in #6814)
- Tell the settings page which storage location a Local files source uses (by @marcelveldt in #6816)
- Stop re-reading every podcast episode on each Local files sync (by @marcelveldt in #6817)
- Remove an unused package from the base image (by @marcelveldt in #6820)
- Speed up CI test runs by using all runner CPUs (by @marcelveldt in #6824)
- Use the server External URL for the MCP Connect Wizard link (by @marcelveldt in #6827)
- Hide passwords and tokens in the API message log (by @marcelveldt in #6829)
- Stop album covers from being saved as a track's own image (by @marcelveldt in #6830)
- Speed up test server boots (by @marcelveldt in #6832)
- Smart fades: 2 bar fades between tracks in different time signatures, clearer logging (by @marcelveldt in #6833)
- Fix unawaited coroutine warnings in library sync tests (by @marcelveldt in #6836)
- Speed up test server boots by waiting for startup work instead of a fixed delay (by @marcelveldt in #6837)
- Speed up library tests with the light test fixture (by @marcelveldt in #6839)
- Keep bundled service credentials out of the source tarball and clarify their license (by @marcelveldt in #6840)
- Smart fades: replay tool and one log line per transition (by @marcelveldt in #6841)
- Expire abandoned Home Assistant sign-ins (by @marcelveldt in #6842)
- Document ffmpeg 7.0 as the minimum version (by @marcelveldt in #6850)
- Flag installations that do not run from the official image (by @marcelveldt in #6851)
- Make several tests check real behaviour (by @marcelveldt in #6852)
- Speed up the Bandcamp integration tests (by @marcelveldt in #6853)
- Clearer help text for the Internal URL setting (by @marcelveldt in #6854)
- Use PKCE when signing in with Home Assistant (by @marcelveldt in #6857)
- Clean up the Bandcamp provider tests (by @marcelveldt in #6860)
- Smart fades: longer, smoother transitions between tracks that can't be beatmatched (by @marcelveldt in #6861)
- Ask Last.fm for artist top tracks and similar artists only when the music services have none (by @marcelveldt in #6862)
- Search music services one at a time when resolving Last.fm recommendations (by @marcelveldt in #6863)
- Smart fades: only stretch the tempo where both tracks have a beat (by @marcelveldt in #6864)
- Smart fades: filter out and echo out when two beats don't match (by @marcelveldt in #6867)
- Reuse nugs.net account details between track starts (by @marcelveldt in #6870)
- Resolve Last.fm recommendations through MusicBrainz links before searching music services (by @marcelveldt in #6871)
- Time the AI DJ's talk-over to the version of the song that actually plays (by @marcelveldt in #6874)
- Give the audio overlay one home in the streams controller (by @marcelveldt in #6875)
- Describe smart fades as they work today in the README and settings (by @marcelveldt in #6877)
- Stop re-reading audiobook chapter files on each Local files sync (by @marcelveldt in #6878)
- Read the web interface files without blocking the server at startup (by @marcelveldt in #6879)
- Check that a release image is recognized as official before it is published (by @marcelveldt in #6880)
- Keep Local files tag, artwork and folder reads inside the source folder (by @marcelveldt in #6881)
- Keep Local files playback inside the source folder (by @marcelveldt in #6884)
- Turn on the lint check for listening on all network interfaces (by @marcelveldt in #6886)
- Turn on the lint check for non-secure random numbers (by @marcelveldt in #6887)
- Bump aioaudiobookshelf to 0.2.0 (by @fmunkes in #6888)
- Use lazy log formatting in the core helpers (by @marcelveldt in #6889)
- Turn on the lint checks for overly complex functions (by @marcelveldt in #6890)
- Use PKCE when linking Home Assistant during provider setup (by @marcelveldt in #6894)
- Tidy up method order in the player and music provider models (by @marcelveldt in #6895)
- Bump getmac from 0.9.5 to 0.9.6 (by @dependabot[bot] in #6896)
- Bump pycryptodome from 3.23.0 to 3.24.0 (by @dependabot[bot] in #6897)
- Bump yoto-api from 4.5.0 to 4.5.1 (by @dependabot[bot] in #6898)
- Shrink oversized provider icons (by @marcelveldt in #6903)
- Turn on the lint check for hardcoded passwords (by @marcelveldt in #6904)
- Turn on the lint check for commented-out code (by @marcelveldt in #6905)
- Turn on the last two non-strict type checker settings (by @marcelveldt in #6909)
- Turn on the lint check for raising inside a try block (by @marcelveldt in #6914)
- Use one shared PKCE helper for all sign-in flows (by @marcelveldt in #6916)
- Update FastMCP Server provider to v2.2.2 (by @trudenboy in #6917)
- Fix a child process not being stopped while its output is still being read (by @marcelveldt in #6931)
- Name the speech engine that actually failed in the AI DJ pause warning (by @marcelveldt in #6936)
- Fix two tests that fail on a slow CI runner (by @szsolt in #6943)
- Ask for an API schema bump only when a client gets something new to gate on (by @chrisuthe in #6963)
- Update the comment on when to bump the API schema version (by @chrisuthe in #6964)
- Flag a failure in review only when a code path reaches it (by @chrisuthe in #6967)
- Drop the reachability rule from the review instructions (by @chrisuthe in #6970)
- Stop the review questioning which type-of-change box is ticked (by @chrisuthe in #6971)
- Bump actions/upload-artifact from 7.0.1 to 7.0.2 (by @dependabot[bot] in #6980)
- Bump CodSpeedHQ/action from 5.4.0 to 5.4.2 (by @dependabot[bot] in #6981)
- Update airplay-cli to v0.5.8 (by @musicassistant-bot[bot] in #6984)
🙇 Thanks to our contributors
Special thanks to the following contributors who helped with this release:
@Bazooper-blip, @Kiranwin, @MarvinSchenkel, @NasaGeek, @OzGav, @Simanias, @chrisuthe, @distante, @dmoo500, @fmunkes, @igray, @jdaberkow, @jonasbp2011, @jonesy827, @jpittelkow, @Lucide, @marcelveldt, @math625f, @maximmaxim345, @mnestrud, @orb9, @stvncode, @szsolt, @tabler, @teancom, @thatcoleyouknow, @theomega, @trudenboy, @vueuse, @xiasi0