Skip to content

2.10.0

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Aug 00:53
Immutable release. Only release title and notes can be modified.
33cfa01

πŸ“¦ Stable Release

Changes since 2.9.13

⚠ Breaking Changes

  • Retire the local audio provider in favor of the Sendspin add-on (by @chrisuthe in #5965)

πŸš€ New Providers

πŸš€ Features and enhancements

πŸ› Bugfixes

  • Surface Bandcamp label-released performers as their own artists (by @teancom in #3824)
  • Mark players unavailable on controller disconnection for HEOS (by @MarvinSchenkel in #4068)
  • Apple Music: Intelligent fallback for deprecated catalog tracks (by @dmoo500 in #4109)
  • Smart Playlist: Enrich library tracks with database genres for filtering (by @dmoo500 in #4175)
  • Plex: fix bugs, remove dead code and reduce repetition (by @anatosun in #4179)
  • Fix translations in Audiobookshelf and iTunes podcasts (by @fmunkes in #4210)
  • Translate RadioBrowser browse folder names (by @marcelveldt in #4223)
  • Fix Sonos abrupt track switches when reordering an active queue (by @marcelveldt in #4237)
  • Trim Provider.to_dict() to match the ProviderInstance schema (by @marcelveldt in #4239)
  • Localize MusicMe browse and recommendation section labels (by @marcelveldt in #4278)
  • Translate Zvuk Music browse/recommendation labels (by @marcelveldt in #4280)
  • Localize hardcoded provider browse and recommendation labels (by @marcelveldt in #4290)
  • Admit genuine 4GB hosts via a shared RAM reporting tolerance (by @marcelveldt in #4301)
  • Remove stale Cast players that are actually passive multichannel endpoints (by @marcelveldt in #4302)
  • Fix live metadata not refreshing for grouped AirPlay players (by @marcelveldt in #4303)
  • Pace audio analysis and cap it to half the CPU cores (by @marcelveldt in #4311)
  • fastMCP Server: Connect Wizard fixes for reverse-proxy deployments (by @Sawtaytoes in #4313)
  • Localize injected protocol output config entries (by @marcelveldt in #4322)
  • Fix WebDAV auth deprecation warning (by @OzGav in #4330)
  • Fix next-track preload crash for fractional track durations (by @marcelveldt in #4380)
  • Handle deleted image files with a typed not-found error (by @OzGav in #4400)
  • Pause external sources instead of stopping them (by @marcelveldt in #4401)
  • Don't switch a playing group's output protocol when joining a player (by @marcelveldt in #4419)
  • Keep AirPlay sync group playing when the leader's stream process crashes (by @marcelveldt in #4424)
  • Pre-import numpy in scoped-coverage CI to avoid py3.14 reduction break (by @chrisuthe in #4445)
  • Give playback priority over realtime audio analysis (by @marcelveldt in #4449)
  • Cap concurrent realtime audio analysis sessions (by @marcelveldt in #4451)
  • Fix Local Audio pulse audio syncing, silence, and volume on intial playback (by @iVolt1 in #4453)
  • Unsync a player when its power is turned off externally (by @marcelveldt in #4463)
  • Fix discover page not loading due to MusicBrainz recommendation scan (by @marcelveldt in #4470)
  • Prevent providers picking the same port when starting concurrently (by @marcelveldt in #4472)
  • iBroadcast mapping issue with album id's and possible other id's (by @robsonke in #4482)
  • Fix QUIC/HTTP-3 debug log spam caused by urllib3-future override (by @MarvinSchenkel in #4485)
  • Fix lrclib plain lyrics written to the synced-LRC field (by @chrisuthe in #4489)
  • Fix audiobook release_date parsed but never stored (by @chrisuthe in #4490)
  • Fix deezer parse_streamable returning Any from a bool function (by @chrisuthe in #4491)
  • Handle Spotify's refresh-token changes (by @OzGav in #4494)
  • Catch only MusicAssistantError in playlist metadata enrichment (by @dmoo500 in #4499)
  • Fix Squeezelite progress bar showing previous track position after track change (by @MarvinSchenkel in #4504)
  • Detect stalled source streams when the connection drops mid-playback (by @MarvinSchenkel in #4505)
  • Subsonic: Convert provider to StreamType.HTTP (by @khers in #4508)
  • Fix first queued item being skipped when playing onto an idle queue (by @marcelveldt in #4514)
  • Revert squeezelite-local media_position workaround (#4504) (by @MarvinSchenkel in #4517)
  • Honour play-next under shuffle and set the current item when enqueuing onto an empty queue (by @marcelveldt in #4519)
  • Don't auto-start playback when an ADD/NEXT onto an idle queue enters dynamic mode (by @marcelveldt in #4521)
  • Keep the dynamic queue bounded when adding more sources (by @marcelveldt in #4522)
  • Dedupe the queue's sources list so a repeated source shows once (by @marcelveldt in #4524)
  • Preserve player queues and their settings across restarts (by @marcelveldt in #4529)
  • Fix Spotify connect playback on some Sendspin players (by @maximmaxim345 in #4530)
  • Fix smart fades falling back to a hard cut when the incoming track is short (by @MarvinSchenkel in #4535)
  • Allow smart playlists through metadata enrichment (by @dmoo500 in #4545)
  • Restrict the image palette API to an opaque image id (by @marcelveldt in #4550)
  • Prevent path traversal outside the filesystem provider base directory (by @MarvinSchenkel in #4559)
  • Stop exposing internal error details in Plex Connect responses (by @MarvinSchenkel in #4563)
  • Match NetEase image CDN hostname exactly when upgrading to https (by @MarvinSchenkel in #4564)
  • Fix smart playlist artwork not displaying in recommendations (by @dmoo500 in #4571)
  • Don't reinstall provider requirements with extras on every startup (by @marcelveldt in #4577)
  • Sanitize all control characters in icy-name stream header (by @OzGav in #4595)
  • Improve error presentation for folder playback resolution (by @OzGav in #4598)
  • Prevent duplicate versions of the same song in dynamic playlist queues (by @marcelveldt in #4603)
  • Sample smart playlist seeds evenly in discover mode (by @MarvinSchenkel in #4621)
  • Fix media position exceeding duration on squeezelite players (by @MarvinSchenkel in #4623)
  • Shuffle smart playlist seed tracks before sampling (by @MarvinSchenkel in #4625)
  • Prevent universal player settings loss on startup restore (by @marcelveldt in #4643)
  • Advertise both IP families via mDNS and respect a specific bind IP when publishing (by @OzGav in #4646)
  • Fix broken album artists filtering (by @OzGav in #4648)
  • Fix stale active output protocol on sync group leader after group stop (by @MarvinSchenkel in #4650)
  • Fix several bugs in the Jellyfin provider (by @OzGav in #4654)
  • Block long-lived token creation for guest accounts (by @MarvinSchenkel in #4661)
  • Don't crash DLNA player update on malformed device metadata XML (by @MarvinSchenkel in #4682)
  • Fix Spotify authentication failing after recent token changes (by @marcelveldt in #4688)
  • Fix guest listen-in race conditions in the party and quiz plugins (by @marcelveldt in #4700)
  • Fix Spotify authentication failing until server restart (by @marcelveldt in #4711)
  • Show re-authentication prompt when a provider's login fails (by @marcelveldt in #4717)
  • Prevent Music Quiz errors with no active game (by @marcelveldt in #4720)
  • Recover from corrupt audio analysis cache (by @marcelveldt in #4721)
  • Keep provider config values current (by @marcelveldt in #4725)
  • Prevent lost Podcast Index library changes (by @marcelveldt in #4726)
  • Fix Music Quiz progress for late joiners (by @marcelveldt in #4728)
  • Restrict Music Quiz guest queue access (by @marcelveldt in #4729)
  • Hide Music Quiz answers until reveal (by @marcelveldt in #4733)
  • Remove Music Quiz core privacy changes (by @marcelveldt in #4735)
  • Let guests use the active experience (by @marcelveldt in #4737)
  • Fix Hitster edge placement (by @marcelveldt in #4741)
  • Fix album version parsing and album_versions for filesystem_local provider (by @allmazz in #4746)
  • Fix Home Assistant AI and TTS defaults (by @marcelveldt in #4747)
  • Fix Hitster answer and reveal flow (by @marcelveldt in #4748)
  • Fix Home Assistant startup deadlock (by @marcelveldt in #4749)
  • Speed up Music Timeline startup (by @marcelveldt in #4754)
  • Reduce Spotify playlist loading requests (by @marcelveldt in #4755)
  • Fix silent audio overlays (by @marcelveldt in #4757)
  • Fix cancelled shared playback sessions (by @marcelveldt in #4762)
  • Unify and simplify deezer flow track fetching (by @jdaberkow in #4766)
  • Fix Guess the Song answer choices (by @marcelveldt in #4767)
  • Improve Trivia question reliability (by @marcelveldt in #4774)
  • Keep Music Quiz listen-in active between songs (by @marcelveldt in #4777)
  • Improved SoundCloud artworks for playlists (by @robsonke in #4778)
  • Speed up Apple Music radio startup (by @marcelveldt in #4780)
  • Fix Plex Connect selecting the wrong track in long queues (by @MarvinSchenkel in #4783)
  • Fix AirPlay Receiver losing startup metadata events (by @MarvinSchenkel in #4787)
  • Prepare Music Quiz before starting (by @marcelveldt in #4788)
  • Decrypt stored Google Drive client secret when re-authorizing (by @OzGav in #4797)
  • Bulk-resolve Sonic Similarity candidates to stop event-loop stalls (by @chrisuthe in #4804)
  • Fix Music Quiz speaker selection for groups (by @marcelveldt in #4809)
  • Fix sync group stopping playback when members are removed mid-regroup (by @MarvinSchenkel in #4815)
  • Fix translations in browse view of Audiobookshelf (by @fmunkes in #4820)
  • Fix smart fades cutting off the outgoing track when vocal analysis data is stale (by @MarvinSchenkel in #4825)
  • Fix squeezelite power control (by @allmazz in #4829)
  • Improve remote connection stability (by @marcelveldt in #4831)
  • Ignore WiiM's false PLAYING report while no media is loaded (by @marcelveldt in #4844)
  • Improve webrtc key file creation (by @arturpragacz in #4847)
  • Don't allow ffmpeg to try range requests when using POST data (by @khers in #4850)
  • Include synchronized players in audio chains (by @marcelveldt in #4856)
  • Report UGP MP3 quality correctly (by @marcelveldt in #4858)
  • Sort filesystem browse results in natural order (by @OzGav in #4869)
  • Fix: regression: cannot pause/play the Ariacast receiver stream on server side #5647 (by @AirPlr in #4871)
  • Make subsonic provider check for extension it uses (by @khers in #4874)
  • Fix flow-stream EOF recovery for universal-player-wrapped Cast devices (by @distante in #4878)
  • Show AirPlay metadata immediately (by @marcelveldt in #4883)
  • Never persist expiring Apple Music artwork URLs (by @teancom in #4884)
  • Apply user provider filter to in-library album tracks (by @OzGav in #4885)
  • Fix slow album art loading over remote connections (by @MarvinSchenkel in #4889)
  • Fix 'Player xy disconnected prematurely...' in MusicCast on pause (by @fmunkes in #4893)
  • Hide flow mode sample rate when disabled (by @marcelveldt in #4894)
  • Enable 24-bit audio on supported Sonos players (by @marcelveldt in #4895)
  • Fix cast group unreachable after leadership handover (by @kiegsgroot in #4896)
  • fix(player_queues): reset elapsed_time with the item switch in play_index (by @teancom in #4898)
  • Recover Sendspin bridge clients stuck in a stale disabled state (by @OzGav in #4899)
  • Fix AirPlay 2 pairing credentials not persisted to live player config (by @Randalix in #4902)
  • Restore Siri Remote playback controls (by @marcelveldt in #4903)
  • Fix container build: pin numkong to 7.7.0 (7.7.1 ships no wheels) (by @MarvinSchenkel in #4904)
  • Fix next-track enqueue after delayed player start (by @MarvinSchenkel in #4906)
  • Fix next-track enqueue after dynamic queue reindex (by @MarvinSchenkel in #4911)
  • Add priority flag to playlist import background task (by @kiwipaulrob in #4913)
  • Fix spontaneous pairing prompts on Apple TVs (by @marcelveldt in #4927)
  • Fix player settings being ignored when audio plays via a linked protocol (by @marcelveldt in #4928)
  • Keep settings and group memberships when universal players merge or get replaced (by @marcelveldt in #4929)
  • Clean up leftover universal player settings after a native player takes over (by @marcelveldt in #4931)
  • Fix ghost players created by the server's own AirPlay receivers (by @marcelveldt in #4935)
  • Release the active output protocol when a wrapped player's session ends (by @marcelveldt in #4937)
  • Fix controls for bridged AirPlay groups (by @marcelveldt in #4950)
  • Stop recurring Apple TV pairing prompts from control-channel flapping (by @marcelveldt in #4954)
  • Setup flow callback: keep params as plain strings (by @marcelveldt in #4955)
  • Drop the AirPlay --ptp-follow clock-follow path (by @marcelveldt in #4956)
  • Keep AirPlay warm playback reliable (by @marcelveldt in #4957)
  • AirPlay companion control follow-ups (by @marcelveldt in #4959)
  • Preserve AirPlay cleanup cancellation (by @marcelveldt in #4960)
  • Keep AirPlay bridge helpers ordered (by @marcelveldt in #4961)
  • Fix missing AirPlay cover art (by @marcelveldt in #4984)
  • Resume synced AirPlay groups after pausing (by @marcelveldt in #4985)
  • Fix draft release lookup (by @marcelveldt in #5000)
  • Add release recovery source SHA (by @marcelveldt in #5003)
  • Fix draft release recovery (by @marcelveldt in #5007)
  • Allow immutable draft discovery (by @marcelveldt in #5009)
  • Allow draft asset recovery (by @marcelveldt in #5011)
  • Ignore removed library artists (by @marcelveldt in #5014)
  • Friendlier setup-flow errors (AirPlay pairing, Spotify dev step) (by @marcelveldt in #5019)
  • Strip trailing NUL from MusicBrainz UFID recording MBID (by @geofffranks in #5020)
  • Harden the setup flow engine (by @marcelveldt in #5022)
  • Complete setup flow translations for late-migrated providers (by @marcelveldt in #5024)
  • Fix AirPlay players being marked off while streaming (by @marcelveldt in #5029)
  • Keep AirPlay protocol selection automatic (by @marcelveldt in #5031)
  • Keep own config entries for control-only players (by @marcelveldt in #5036)
  • Fix server hanging on startup (by @marcelveldt in #5040)
  • Clarify Spotify developer key setup (by @marcelveldt in #5041)
  • Fix bit-perfect AirPlay playback (by @marcelveldt in #5042)
  • Update players immediately after setup (by @marcelveldt in #5043)
  • Remove duplicate setup URL help (by @marcelveldt in #5046)
  • Fix duplicate setup instructions (by @marcelveldt in #5049)
  • Fix outdated Home Assistant token help text (by @marcelveldt in #5050)
  • Fix HomePods muting themselves and ignoring volume changes (by @marcelveldt in #5051)
  • Fix AirPlay speakers drifting out of sync in a group (by @marcelveldt in #5052)
  • Fix providers that could no longer be added (by @marcelveldt in #5053)
  • Fix playback on devices whose AirPlay output still needs pairing (by @marcelveldt in #5065)
  • Don't start playing music after an announcement when nothing was playing (by @marcelveldt in #5068)
  • Fix Spotify Connect multiple instances (by @marcelveldt in #5070)
  • Fix provider setup flows (by @marcelveldt in #5072)
  • Keep playback controls loading until the player really starts (by @marcelveldt in #5075)
  • Handle remote storage going away during a library sync (by @OzGav in #5076)
  • ariacast_receiver: fix tests (by @meiser79 in #5077)
  • Fix pause failing on Cast devices streaming via Sendspin (by @MarvinSchenkel in #5083)
  • Add icon for background tasks core module (by @stvncode in #5084)
  • Fix bit-perfect status for lossy sources (by @marcelveldt in #5087)
  • Fix Audiobookshelf configuration loading (by @marcelveldt in #5088)
  • Play the track you selected when shuffle is on (by @marcelveldt in #5092)
  • Fix AirPlay players joining a playing group out of sync (by @marcelveldt in #5098)
  • Fix volume limit enforcement for players with redirected volume control (by @OzGav in #5102)
  • Show protocol-connected speakers in the Music Quiz speaker picker (by @MarvinSchenkel in #5103)
  • Don't apply volume normalization to sound effects (by @MarvinSchenkel in #5105)
  • Keep AI Radio segments in order and add a shuffle toggle (by @MarvinSchenkel in #5106)
  • Fix Yandex My Wave stopping after initial batch (by @alectogeek in #5107)
  • Automatically re-join AirPlay group members after a brief connection loss (by @marcelveldt in #5112)
  • Don't render announcements twice when a player sends a HEAD request (by @marcelveldt in #5113)
  • Measure true peak during loudness analysis (by @MarvinSchenkel in #5118)
  • Remove stale Audiobookshelf playback sessions to avoid repeated sync failures (by @foobarth in #5120)
  • Reduce deezer-python-gql log verbosity to match provider level (by @foobarth in #5121)
  • Don't start unrelated music when pressing play on an empty queue (by @marcelveldt in #5124)
  • Fix remote access flooding the log with ICE and TURN warnings (by @MarvinSchenkel in #5125)
  • Don't show the dashboard keepalive as active playback on cast players (by @MarvinSchenkel in #5127)
  • Sendspin: freeze playback progress before tearing down the push stream (by @chrisuthe in #5129)
  • Keep an AI Radio show and its queue in sync when either one stops (by @MarvinSchenkel in #5130)
  • Snapshot Sendspin playback progress at natural end of stream (by @chrisuthe in #5131)
  • Support password-protected AirPlay speakers (by @marcelveldt in #5134)
  • Reconfiguring an AirPlay player can now redo or reset its pairing (by @marcelveldt in #5135)
  • Detect password-protected AirPlay devices more reliably (by @marcelveldt in #5147)
  • Use one source of truth for AirPlay password announcements (by @marcelveldt in #5148)
  • Reduce WebRTC and WiiM log noise when debug logging is enabled (by @MarvinSchenkel in #5153)
  • End dashboard sessions with a warning when the receiver dies unexpectedly (by @MarvinSchenkel in #5157)
  • Fix Bose SoundTouch preset search and assignment (by @Odn0 in #5158)
  • Fix startup provider failures and show which provider needs attention (by @marcelveldt in #5162)
  • Fix Recently played dropping explicit track plays and logging empty containers (by @chrisuthe in #5163)
  • Library item counts now respect the user's provider filter (by @chrisuthe in #5165)
  • Mount the NFS export as configured and scan the Subfolder inside it (by @chrisuthe in #5167)
  • Fix AirPlay noise bursts and group sync issues on Apple devices (by @marcelveldt in #5168)
  • Pick a new go-librespot API port when the configured one is unavailable (by @OzGav in #5169)
  • Clear stale library IDs in Audiobookshelf sync and validate cache on startup (by @foobarth in #5172)
  • Stop log flooding and retry storms when artwork fails to download (by @marcelveldt in #5174)
  • Stop re-sending unchanged album art around AirPlay track changes (by @marcelveldt in #5182)
  • Fix late-joining AirPlay players starting out of sync (by @marcelveldt in #5186)
  • Fix editability for owned YouTube Music playlists (by @seppegadeyne in #5187)
  • Fix providers wrongly showing a setup error when they loaded fine (by @marcelveldt in #5190)
  • Fix rejoining AirPlay players that start out of sync when their clock is slow to lock (by @marcelveldt in #5191)
  • Fix SMB and NFS shares failing to reconnect after a reload (by @marcelveldt in #5192)
  • Wait for a running library sync to stop before unloading a provider (by @marcelveldt in #5197)
  • Show the full track length after seeking (by @marcelveldt in #5198)
  • Fix providers that depend on another provider failing to start (by @marcelveldt in #5200)
  • Stop one component's log level from flooding the log with unrelated messages (by @marcelveldt in #5203)
  • Fix playability of plain stream URLs and handle verification of URIs gracefully (by @fmunkes in #5204)
  • Do not update the playback position when we are not playing in MusicCast (by @fmunkes in #5205)
  • Don't let one bad Home Assistant entity break the whole HA integration (by @OzGav in #5206)
  • Fix squeezelite players stuck unavailable after restart (by @gdesmott in #5207)
  • Remove the extra delay when starting a single AirPlay speaker (by @marcelveldt in #5208)
  • Keep the account login dialog in step with the browser (by @marcelveldt in #5209)
  • Fix speakers joining a playing group out of sync (by @marcelveldt in #5210)
  • Fix Music Timeline bonus questions running out of answer options (by @marcelveldt in #5212)
  • Improve Music Timeline song variety and release years (by @marcelveldt in #5213)
  • Show when a Music Quiz game is restarting (by @marcelveldt in #5214)
  • Load the Home Assistant settings much faster on large setups (by @marcelveldt in #5216)
  • Fix AirPlay 2 speakers playing silence on multi-homed hosts (by @marcelveldt in #5219)
  • Fix AirPlay speakers playing behind when grouped with a Sendspin player (by @marcelveldt in #5220)
  • Fix a group start recording an instant it never used (by @marcelveldt in #5223)
  • Keep speakers playing when a group switches output (by @marcelveldt in #5225)
  • Fix Flow Mode progress after abandoned stream probes (by @alectogeek in #5228)
  • Fix seek progress snapback before stream restart (by @alectogeek in #5229)
  • Redact authorization headers from request logs (by @teancom in #5236)
  • Wait for every group member's clock before anchoring playback (by @marcelveldt in #5237)
  • Fix one bad join code locking out all other guests (by @marcelveldt in #5243)
  • Use original release years for Music Timeline songs (by @marcelveldt in #5250)
  • Announce preset changes when an impulse response is removed (by @OzGav in #5256)
  • Use whitelist for MusicBrainz artist types in recommendations (by @dmoo500 in #5260)
  • Keep Music Quiz lyrics in step with the audio (by @marcelveldt in #5263)
  • Fix Home Assistant connection drop on large entity registries (by @marcelveldt in #5270)
  • Allow multiple sessions in Audiobookshelf - fixes autoplay behavior (by @fmunkes in #5275)
  • Fix muting being blocked by the volume control setting (by @marcelveldt in #5285)
  • Fix media details occasionally resolving to the wrong item (by @marcelveldt in #5288)
  • Remove spurious error log entries for shared requests (by @marcelveldt in #5295)
  • Align Spotify app volume with MA player volume on connection (by @OzGav in #5303)
  • Ensure login providers endpoint doesn't crash when HA provider has no config URL (by @OzGav in #5304)
  • Recover a bridged AirPlay speaker when its stream process dies (by @marcelveldt in #5311)
  • Remove phantom concurrent task sliders (by @OzGav in #5317)
  • Fix Sendspin setup flow (by @arturpragacz in #5318)
  • Only show library sync deletions setting for providers with library sync (by @OzGav in #5320)
  • Bring a bridged AirPlay speaker back into its group after a failed start (by @marcelveldt in #5323)
  • Recover a local audio device when its output stream dies (by @marcelveldt in #5325)
  • Fix AirPlay volume changes being lost around stream start (by @marcelveldt in #5328)
  • Make the Mono output channels option work on all players (by @marcelveldt in #5329)
  • Apple Music: recover from throttled requests in ~1s instead of stalling playback (by @MarvinSchenkel in #5333)
  • Use original release years for Trivia questions (by @marcelveldt in #5350)
  • Fail unconfirmed AirPlay starts and wait for every speaker's clock (by @marcelveldt in #5352)
  • Fix bridged AirPlay speakers going silent or double-started (by @marcelveldt in #5354)
  • Resolve OpenSubsonic playlist tracks without per-track album and lyrics fetches (by @GraysonCAdams in #5359)
  • Fix mute command failing on group players (by @marcelveldt in #5364)
  • Better crossfades on tracks with long outros, ambient blends and mastered fade-outs (by @MarvinSchenkel in #5365)
  • Deepen the AirPlay buffer for LinkPlay devices instead of dropping PTP (by @marcelveldt in #5369)
  • Fix missing mute control for universal group players (by @marcelveldt in #5375)
  • Keep a mono sound effect at the same volume as a stereo one (by @marcelveldt in #5376)
  • Fix guests keeping access after party guest access is switched off (by @marcelveldt in #5380)
  • Fix playback stopping after the first track on grouped Sonos speakers (by @marcelveldt in #5385)
  • Change ABC radio monochrome icon from black to white (by @OzGav in #5392)
  • Keep the chosen metadata language when other settings are saved (by @marcelveldt in #5396)
  • Fix Pocket Casts sync failing on episodes without a duration (by @OzGav in #5397)
  • Keep manually set radio name and artwork in playlists (by @OzGav in #5404)
  • Plex: fix artist top tracks always being empty (by @MarvinSchenkel in #5405)
  • Fix Bluesound players cutting off the end of a track (by @marcelveldt in #5408)
  • Fix playback from Home Assistant failing with a permission error (by @MarvinSchenkel in #5410)
  • Fix cast dashboards freezing for players with reserved characters in their id (by @MarvinSchenkel in #5415)
  • Fix playback stopping after an AI Radio announcement (by @MarvinSchenkel in #5416)
  • Impersonate users by auth provider link (by @arturpragacz in #5417)
  • Keep a synced pair of speakers muted when the group volume changes (by @marcelveldt in #5420)
  • Fix Sonos connections lingering after a provider reload (by @marcelveldt in #5433)
  • Say which type failed when JSON serialization fails (by @OzGav in #5439)
  • Show player settings in your own language again (by @marcelveldt in #5447)
  • Keep simulated-mute speakers muted when the group volume changes (by @marcelveldt in #5449)
  • Remove the last spurious error log entries for shared work (by @marcelveldt in #5453)
  • Fix AirPlay software volume attenuating stream when another control owns volume (by @OzGav in #5454)
  • Fix slow Home Assistant logins when a provider fails to finish loading (by @OzGav in #5455)
  • Fix a stray error in the log when a Cast speaker fails to join a group (by @marcelveldt in #5470)
  • Play announcements on muted speakers (by @marcelveldt in #5474)
  • Fix the OpenAI Compatible provider failing to load (by @marcelveldt in #5487)
  • Fix playlists not loading in Home Assistant (by @marcelveldt in #5489)
  • Fix Apple TV now-playing screen losing progress and artwork (by @marcelveldt in #5490)
  • Report a clear error when AI Radio TTS generation fails (by @MarvinSchenkel in #5497)
  • Skip the provider search for an empty search query (by @MarvinSchenkel in #5500)
  • Ignore incoming media update events while starting HEOS playback (by @Tommatheussen in #5503)
  • Fix filesystem sync never converging on changed files (by @MarvinSchenkel in #5506)
  • Fix file shares importing nothing and hiding playlists (#6019) (by @OzGav in #5510)
  • Skip unreachable IPv6 addresses when connecting to Cast devices (by @OzGav in #5513)
  • Fix broken playlists page after upgrading from stable to beta (by @marcelveldt in #5515)
  • Account for deleted metadata in a provider sync of audiobookshelf (by @fmunkes in #5516)
  • Fix MusicCast zone2/main-sync players never refreshing outside UDP push (by @bsny in #5517)
  • Report a failed Cast receiver app launch instead of ignoring it (by @OzGav in #5520)
  • Keep the full duration of an audiobook when resuming mid-book (by @marcelveldt in #5524)
  • Fix player not coming back after disabling and removing it (by @marcelveldt in #5525)
  • Resolve OpenSubsonic search and top tracks without per-track lyrics fetches (by @GraysonCAdams in #5526)
  • Make an author or narrator playable (by @fmunkes in #5532)
  • Open Subsonic: Fix extension name (by @khers in #5536)
  • Don't resolve a filesystem image path that points at a directory (by @chrisuthe in #5543)
  • Play announcements on muted speakers that announce natively (by @marcelveldt in #5549)
  • Enrich matched playlist entries with provider metadata during import (by @OzGav in #5554)
  • Stop Sonos S1 speakers from dropping on a single missed request (by @OzGav in #5556)
  • Fix missing artists on Apple Music playlist tracks (by @MarvinSchenkel in #5558)
  • Universal Players no longer come back as a brand new player (by @OzGav in #5559)
  • Keep events and settings working when a path is not valid UTF-8 (by @OzGav in #5563)
  • Fix Spotify playback (by @marcelveldt in #5568)
  • Fix minor typo in strings.json (by @dovy6 in #5569)
  • Keep bridged AirPlay speakers in sync after a seek or track change (by @marcelveldt in #5570)
  • Update strings for radio stations settings for OpenSubsonic Provider (by @frjol in #5572)
  • Fix a brief audio hiccup on the first playback after starting the server (by @marcelveldt in #5577)
  • Only return the Phish artist when the query matches its name (by @OzGav in #5583)
  • Fix guests seeing another guest's web player (by @maximmaxim345 in #5590)
  • Fix sync group not re-forming after a leader switch (by @marcelveldt in #5595)
  • Fix Spotify pairing authorization (by @marcelveldt in #5599)
  • Improve live source playback compatibility (by @marcelveldt in #5600)
  • Fix sync group breaking up when the leader is removed during playback (by @marcelveldt in #5606)
  • Restore OpenSubsonic track artwork in playlist listings (by @MarvinSchenkel in #5607)
  • Fix music not resuming on WiiM speakers after a group change (by @MarvinSchenkel in #5609)
  • Fix the new gPodder config flow (by @fmunkes in #5614)
  • Fix the Audible provider's setup flow (by @fmunkes in #5616)
  • Fix Edifier and other older LinkPlay speakers playing silently over AirPlay (by @marcelveldt in #5618)
  • Fix Cast players ignoring media errors and the receiver app setting (by @OzGav in #5622)
  • Report an expired YouTube Music cookie instead of a raw parse error (by @MarvinSchenkel in #5629)
  • Fix smart playlist removal from recommendations and add auto-refresh (by @dmoo500 in #5641)
  • Announcements no longer restart the Cast session (by @marcelveldt in #5644)
  • Cast devices are freed up again when playback ends (by @marcelveldt in #5654)
  • Fix AirPlay speaker joining a group at full volume (by @marcelveldt in #5668)
  • Album art keeps showing when its provider has a hiccup (by @marcelveldt in #5671)
  • Show why AI Radio speech generation failed (by @marcelveldt in #5680)
  • Failed tracks are no longer requested twice from the same provider (by @marcelveldt in #5682)
  • Music from a NAS comes back on its own after a short outage (by @marcelveldt in #5683)
  • Sonos no longer restarts Spotify instead of your queue (by @marcelveldt in #5688)
  • Restricted users no longer end up with an empty library (by @OzGav in #5690)
  • Player settings that need a stream restart now apply right away (by @marcelveldt in #5691)
  • Hue lights sync no longer restarts when you change brightness or colour mode (by @marcelveldt in #5698)
  • Fix Spotify playlists failing to load (by @marcelveldt in #5703)
  • AirPlay speakers no longer stay loud after an announcement (by @marcelveldt in #5704)
  • Prevent WiiM errors with external group members (by @marcelveldt in #5708)
  • Group volume no longer undoes a speaker you turned down yourself (by @marcelveldt in #5710)
  • Fix Home Assistant players showing an external source while Music Assistant is playing (by @marcelveldt in #5713)
  • Fix Cyrillic track and album names showing as question marks (by @marcelveldt in #5718)
  • Stop asking for a password on AirPlay devices that never had one (by @marcelveldt in #5720)
  • Apple TV players no longer get stuck on a paused app after losing their connection (by @marcelveldt in #5722)
  • Read CUE sheets and playlists in legacy codepages more reliably (by @marcelveldt in #5724)
  • Preserve flow source errors (by @teancom in #5725)
  • Fix pause on Sonos S1 speakers stopping playback instead (by @marcelveldt in #5736)
  • Skip DRM protected Soundcloud tracks on import (by @robsonke in #5738)
  • Don't parse error pages as radio playlists (by @marcelveldt in #5739)
  • Recover AirPlay playback after dropouts (by @marcelveldt in #5750)
  • Make the MilkDrop visualizer work on players that reach Sendspin through a linked output (by @jozefKruszynski in #5751)
  • Refresh CUE metadata after encoding fixes (by @marcelveldt in #5754)
  • Prevent skipped tracks from resuming too far ahead (by @marcelveldt in #5757)
  • Radio shuffle resets after queue transfer (by @marcelveldt in #5758)
  • Prevent hidden audio stream failures (by @marcelveldt in #5759)
  • Fix radioparadise metadata flapping (by @teancom in #5762)
  • Prevent track loss when merging duplicates (by @marcelveldt in #5769)
  • Improve library matching across providers (by @marcelveldt in #5770)
  • Improve album edition matching (by @marcelveldt in #5771)
  • Match album editions across providers (by @marcelveldt in #5776)
  • Repair duplicate albums automatically (by @marcelveldt in #5780)
  • Tidal: fix search against the new filter[query] endpoint (spec 1.10.101) (by @jozefKruszynski in #5781)
  • Improve duplicate detection across music providers (by @marcelveldt in #5783)
  • Fix web players losing their queue when they switch role (by @marcelveldt in #5784)
  • Keep player access restrictions intact when a player is replaced (by @marcelveldt in #5785)
  • Fix sporadic stutter when playing live audio sources (by @marcelveldt in #5789)
  • Stop adding the same album twice when providers disagree on the details (by @marcelveldt in #5790)
  • Match artists across providers more reliably (by @marcelveldt in #5791)
  • Repair duplicate tracks that are already in the library (by @marcelveldt in #5792)
  • Keep a player usable when its saved queue cannot be read (by @marcelveldt in #5793)
  • Repair albums that are already duplicated in your library (by @marcelveldt in #5798)
  • Keep a library sync going when one item fails (by @marcelveldt in #5799)
  • Fix white noise when playing DTS 5.1 audio packed inside WAV (by @vintvinst in #5803)
  • Fix marking podcast episodes and audiobooks as played from the Discover rows (by @chrisuthe in #5825)
  • Fix the flow-mode 'next' command item for Cast children of Universal Players (by @OzGav in #5836)
  • Keep line breaks in metadata out of builtin M3U playlist files (by @OzGav in #5837)
  • Fix AI Radio weather segments announcing wrong or invented weather (by @MarvinSchenkel in #5838)
  • Fix AI Radio DJs reporting weather in Celcius when the country uses Fahrenheit (by @MarvinSchenkel in #5841)
  • Fixes an issue where tracks from Niconico Provider cannot be played (by @Shi-553 in #5842)
  • Fix Plex Connect duplicating tracks on play queue refresh (by @chrisuthe in #5852)
  • Stop a track refresh from wiping its album and artist details (by @marcelveldt in #5855)
  • Fix ABC Radio Network documentation URL typo in manifest.json (by @OzGav in #5857)
  • Include genre_aliases in genre summary listings (by @jozefKruszynski in #5858)
  • Fix a resume seeking far past the track end after an output protocol handover (by @MarvinSchenkel in #5860)
  • Fix static on hi-res AirPlay speakers in compatibility mode (by @OzGav in #5862)
  • Fix play count going negative when marking an unfinished item as unplayed (by @chrisuthe in #5865)
  • Keep shuffle on when you play something new (by @marcelveldt in #5867)
  • Ensure gapless playback in MusicCast after security hardening (by @fmunkes in #5871)
  • Signal a position jump when an incomplete anchor becomes complete (by @jozefKruszynski in #5872)
  • Don't empty the queue while loading what you picked next (by @marcelveldt in #5873)
  • Release Spotify Connect when you clear the queue (by @marcelveldt in #5875)
  • Restore setup values that were dropped before they could be migrated (by @OzGav in #5878)
  • Keep autoplay running when a provider fails (by @marcelveldt in #5885)
  • Hide capture-only devices from universal groups (by @marcelveldt in #5886)
  • Keep capture-only Sendspin devices out of groups (by @marcelveldt in #5889)
  • Honor playback speed in the visualizer tap and cancel stale beat hydration (by @jozefKruszynski in #5891)
  • Fix WiiM players not reporting state after a restart (by @MarvinSchenkel in #5893)
  • Fix misleading errors when Home Assistant TTS fails (by @MarvinSchenkel in #5897)
  • Fix nugs.net playback for promo and trial subscriptions (by @OzGav in #5899)
  • Fix Audible podcast sync skipping Periodical series (by @OzGav in #5907)
  • Dissolve sync group when a playback start never materializes (by @OzGav in #5908)
  • Fix Audible querying the old marketplace after a locale change (by @OzGav in #5909)
  • Keep the Spotify session alive when it moves to another player (by @marcelveldt in #5910)
  • Improve Audible sign-in setup (by @marcelveldt in #5915)
  • Don't parse playlist items already in the database (by @OzGav in #5916)
  • Add Symfonisk Table Lamp to Non-Hi Res models (by @OzGav in #5917)
  • Fix missing played status on podcast episode details page (by @OzGav in #5927)
  • Fix podcast episodes showing in the wrong order (by @OzGav in #5929)
  • Fix AirPlay players stuck 'playing' from a stale snapshot (by @teancom in #5938)
  • AI DJ no longer announces the wrong day of the week (by @MarvinSchenkel in #5947)
  • Smart fades no longer discards every plan on tracks with a mastered fade-out (by @MarvinSchenkel in #5949)
  • 'Play next' now really plays the chosen track next on a dynamic queue (by @MarvinSchenkel in #5950)
  • Fix Flow Mode sample rate setting being locked for players with enforced flow mode (by @vintvinst in #5955)
  • Fix Spotify Connect playback not starting (by @marcelveldt in #5957)
  • Fix slow player response after pausing an external source (by @marcelveldt in #5961)
  • Announcements use the speaker's own announcement feature first (by @marcelveldt in #5974)
  • Fix mid-track silence on AirPlay receivers that need an explicit progress anchor (by @MarvinSchenkel in #5976)
  • Fix announcement volume and mute handling on AirPlay speakers (by @marcelveldt in #5977)
  • Use album loudness only when tracks really play as part of an album (by @marcelveldt in #5981)
  • Notice when Spotify playback loses its pairing (by @marcelveldt in #5987)
  • Seeking or resuming a Spotify track no longer cuts it off mid-song (by @marcelveldt in #5992)
  • Add dark theme icon for MilkDrop Visualizer (by @jozefKruszynski in #6007)
  • Spotify Connect no longer disappears when a different account connects (by @marcelveldt in #6019)
  • Selecting a source no longer takes five seconds to start playing (by @marcelveldt in #6021)
  • Cancel in-flight finalizes before freeing analysis models (by @chrisuthe in #6024)
  • Retry Sonic Analysis when a track loses its CLAP windows (by @chrisuthe in #6034)

🎨 Frontend Changes

Other Changes

  • Lokalise translations update (by @github-actions[bot] in #4219)
  • Lokalise translations update (by @github-actions[bot] in #4252)
  • Lokalise translations update (by @github-actions[bot] in #4296)
  • Lokalise translations update (by @github-actions[bot] in #4340)
  • Lokalise translations update (by @github-actions[bot] in #4357)
  • [Backport to stable] 2.9.4 (by @github-actions[bot] in #4399)
  • Lokalise translations update (by @github-actions[bot] in #4411)
  • Lokalise translations update (by @github-actions[bot] in #4454)
  • [Backport to stable] 2.9.5 (by @github-actions[bot] in #4469)
  • Lokalise translations update (by @github-actions[bot] in #4497)
  • Lokalise translations update (by @github-actions[bot] in #4639)
  • Add CodSpeed performance benchmarks and CI integration (by @codspeed-hq[bot] in #4656)
  • Lokalise translations update (by @github-actions[bot] in #4756)
  • Lokalise translations update (by @github-actions[bot] in #4795)
  • Lokalise translations update (by @github-actions[bot] in #4886)
  • Lokalise translations update (by @github-actions[bot] in #5096)
  • Lokalise translations update (by @github-actions[bot] in #5292)
  • Lokalise translations update (by @github-actions[bot] in #5581)
  • Lokalise translations update (by @github-actions[bot] in #5676)
  • Lokalise translations update (by @github-actions[bot] in #5778)
  • Lokalise translations update (by @github-actions[bot] in #5966)

🧰 Maintenance and dependency bumps

455 changes
  • Refactor MusicBrainz provider into multi-file package (by @dmoo500 in #3905)
  • Fix release notes for minor releases skipping most changes (by @MarvinSchenkel in #4171)
  • Remove Dashie Kiosk player provider (by @jwlerch78 in #4192)
  • Use threading.get_ident() instead of asyncio's private _thread_id (by @marcelveldt in #4205)
  • Lokalise translations update (by @github-actions[bot] in #4209)
  • Adapt QQ Music provider to qqmusic-api 0.6 (by @xiasi0 in #4211)
  • Don't lint downloaded translation files for spelling/EOF (by @marcelveldt in #4215)
  • Lokalise translations update (by @github-actions[bot] in #4221)
  • Replace broad except in scrobbler with per-client exceptions (by @OzGav in #4226)
  • Remove stale Deezer disc/track number TODO (by @OzGav in #4229)
  • Target Python 3.14 for lint and type-checking (by @marcelveldt in #4254)
  • Refactor player_queues controller into a package (by @marcelveldt in #4263)
  • Refactor metadata controller into a package (by @marcelveldt in #4265)
  • Refactor music controller into its own package (by @marcelveldt in #4266)
  • Move player_queues config-entry strings into the controller's strings.json (by @marcelveldt in #4267)
  • Revert "Respect container cgroup memory limits" (#4269) (by @marcelveldt in #4274)
  • Avoid loading aiortc/PyAV when remote access is disabled (by @marcelveldt in #4292)
  • Cut repeated reflection on hot cache-hit and event-dispatch paths (by @marcelveldt in #4295)
  • Move core-owned strings out of the common translations (by @marcelveldt in #4299)
  • Use bare keys for all translation_key overrides (ConfigEntry + media) (by @marcelveldt in #4310)
  • Fix unreachable statement in player_queues controller (by @Copilot in #4320)
  • Remove ffmpeg install from lint CI job (by @marcelveldt in #4324)
  • Speed up CI test jobs (split ffmpeg tests + skip on non-code PRs) (by @marcelveldt in #4325)
  • Deduplicate strings via common-string references (by @marcelveldt in #4327)
  • Add Amplipi SVGs (by @OzGav in #4331)
  • Fix test suite hanging without ffmpeg + cap test jobs at 30min (by @marcelveldt in #4334)
  • Run only affected providers' tests on PRs (HA-style), with Codecov (by @marcelveldt in #4335)
  • Clarify the audio-analysis CPU requirement (AVX2 on x86, NEON on ARM) (by @marcelveldt in #4336)
  • Mirror the source tree in tests/ (controller tests β†’ folders, utils β†’ tests/helpers/) (by @marcelveldt in #4337)
  • Smarter CI test selection: scope coverage on partial runs + skip translation-only PRs (by @marcelveldt in #4339)
  • Add provider-focused lint checks to pre-commit and CI (by @marcelveldt in #4343)
  • Enforce multi-line docstring summary on the second line (by @marcelveldt in #4347)
  • Enforce private methods at the bottom of a class (by @marcelveldt in #4350)
  • Validate ConfigEntry.category against strings.json in pre-commit check (by @marcelveldt in #4351)
  • Use the shared datetime helpers instead of calling datetime directly (by @marcelveldt in #4352)
  • Move private methods to the bottom of the class in a few small providers (by @marcelveldt in #4353)
  • Move private methods to the bottom of the class in the music media controllers (by @marcelveldt in #4354)
  • Fix incorrect docstrings and comment in the music media controllers (by @marcelveldt in #4355)
  • Move private methods to the bottom of the class in the webserver controllers (by @marcelveldt in #4356)
  • Move private methods to the bottom of the class in the streams controllers (by @marcelveldt in #4358)
  • Move private methods to the bottom of the class in the music controller (by @marcelveldt in #4359)
  • Move private methods to the bottom of the class in the player queues controller (by @marcelveldt in #4360)
  • Move private methods to the bottom of the class in the players controller (by @marcelveldt in #4361)
  • Move private methods to the bottom of the class in the tasks controller (by @marcelveldt in #4362)
  • Move private methods to the bottom of the class in core misc files (by @marcelveldt in #4363)
  • Move private methods to the bottom of the class in team-maintained providers (by @marcelveldt in #4365)
  • Fix Auto Release workflow failing at startup due to missing PR permission (by @marcelveldt in #4368)
  • Update BASE_IMAGE_VERSION for beta and nightly (by @marcelveldt in #4387)
  • Enable RUF006 and fix unstored asyncio tasks (by @OzGav in #4393)
  • Enable RUF012 (by @OzGav in #4394)
  • Enable PYI034 (return Self from aenter/new) (by @OzGav in #4395)
  • Enable S307 rule - possibly insecure function (by @OzGav in #4397)
  • Extract library-sync config-entry building into a helper (by @zenibako in #4414)
  • Move private methods to the bottom in the PocketCasts provider (by @OzGav in #4418)
  • Dynamically update group leader capability on a zone player in MusicCast (by @fmunkes in #4423)
  • Enhance Audio Analysis Logging (by @chrisuthe in #4440)
  • Share UPnP source-IP resolution across AirPlay and WiiM (by @rwlove in #4443)
  • Document provider_mappings database structure (by @dmoo500 in #4466)
  • Auto-sync provider manifests on Dependabot PRs (by @marcelveldt in #4471)
  • Replace obfuscated app_vars with build-time secret injection (by @marcelveldt in #4473)
  • Clarify supported installation methods in README (by @marcelveldt in #4480)
  • Split config controller into a package (by @MarvinSchenkel in #4484)
  • Refactor player-queues controller (by @marcelveldt in #4509)
  • Fix stale docs in the player-queues package (by @marcelveldt in #4518)
  • Refactor smart fades into a plan/render architecture (by @MarvinSchenkel in #4532)
  • Validate auto-merge dependency PRs via GitHub API instead of checkout (by @MarvinSchenkel in #4566)
  • Isolate the hermetic e2e fixture from host audio devices (by @marcelveldt in #4583)
  • Make Sendspin bridges first-class derived transports (by @marcelveldt in #4596)
  • Fix test-ordering flake caused by a leaked models global cache (by @marcelveldt in #4602)
  • Fix mypy no-any-return error in Plex lyrics fetch (by @marcelveldt in #4604)
  • Add typed get_config_value helper to the config-owning base models (by @marcelveldt in #4606)
  • Local Audio: promote attribution stubs to regular visible players (by @marcelveldt in #4607)
  • Isolate the unit-test mass fixture from host audio and default providers (by @marcelveldt in #4608)
  • Add test coverage for local audio bridge-manager edge cases (by @marcelveldt in #4610)
  • Scope based authorization for API commands and centralized user impersonation (by @marcelveldt in #4613)
  • Cache negative results in @use_cache and avoid the SWR double read (by @marcelveldt in #4616)
  • Slim cache indexes, upsert in place, and clean up stale SWR rows (by @marcelveldt in #4617)
  • Run dependency security checks without an untrusted privileged checkout (by @MarvinSchenkel in #4618)
  • Bump API schema version for scope based authorization (by @marcelveldt in #4622)
  • Auto-approve automated frontend/models bump PRs in dependency security gate (by @MarvinSchenkel in #4638)
  • Use shared port helpers in Plex Connect port allocation (by @MarvinSchenkel in #4647)
  • Add performance benchmark suite (by @marcelveldt in #4651)
  • Improve Sendspin proxy error handling and quieter websocket command logging (by @marcelveldt in #4664)
  • Add shared playback session and guest access helpers for plugins (by @marcelveldt in #4672)
  • Add diagnostics sections for core controllers and common providers (by @marcelveldt in #4675)
  • Add full-text search index for search (by @marcelveldt in #4681)
  • Stabilize CodSpeed benchmark runs (by @marcelveldt in #4689)
  • Remove non-deterministic macro benchmarks from CodSpeed (by @marcelveldt in #4691)
  • Add issue chooser redirecting to the support repo (by @marcelveldt in #4696)
  • Reduce server startup time and memory usage (by @marcelveldt in #4702)
  • Speed up artwork loading and refresh artwork when local files change (by @marcelveldt in #4703)
  • Remove HTTP diagnostics download endpoint (by @marcelveldt in #4709)
  • Make audio overlays audible immediately (by @marcelveldt in #4715)
  • Lock in the provider config store/snapshot consistency guarantee (by @marcelveldt in #4716)
  • Add note about using server ID to validate servers (by @seadowg in #4742)
  • Rename quiz game to Music Timeline (by @marcelveldt in #4750)
  • Bump aioaudiobookshelf and use its typed marker (by @fmunkes in #4763)
  • Remove outdated note that AirPlay 2 can't group (by @Kyzcreig in #4821)
  • Smart Fades: verbose logging for candidate-selection tuning (by @MarvinSchenkel in #4824)
  • Organize metadata controller methods (by @marcelveldt in #4838)
  • Tidal: reliability fixes, API client cleanup and faster tests (by @jozefKruszynski in #4842)
  • Remove redundant client disconnect loop from Sendspin provider unload (by @arturpragacz in #4848)
  • Add Traditional Chinese to locales (by @OzGav in #4870)
  • Deduplicate yandex_music device-code page strings into common (by @OzGav in #4873)
  • Reuse cached AirPlay artwork (by @marcelveldt in #4880)
  • Fetch AirPlay binaries during image builds (by @marcelveldt in #4881)
  • Add descriptive error body to imageproxy 400 rejections (by @OzGav in #4897)
  • Remove the fixed output limiter (by @OzGav in #4901)
  • AirPlay: use one clock identity for multi-room timing (by @marcelveldt in #4915)
  • Remove unused get_device_by_connection from Home Assistant provider (by @marcelveldt in #4920)
  • Move base image to Debian trixie (by @marcelveldt in #4933)
  • Make remote-access ma-api bridge tests deterministic (no real WebRTC handshake) (by @MarvinSchenkel in #4938)
  • Restore provider method ordering (by @marcelveldt in #4948)
  • Install Git for temporary aiolibdatachannel source build (by @MarvinSchenkel in #4962)
  • Chromecast and Sonos: apply verbose logging changes without a restart (by @marcelveldt in #4967)
  • Fix AirPlay provider sometimes failing to reload (by @marcelveldt in #4968)
  • Make CI tests faster and more reliable (by @marcelveldt in #4975)
  • Show clearer errors for invalid media files (by @marcelveldt in #4978)
  • Make server releases immutable-safe (by @marcelveldt in #4988)
  • Fix release startup permissions (by @marcelveldt in #4991)
  • Replace legacy GitHub credentials (by @marcelveldt in #4992)
  • Allow bot dependency updates to auto-merge (by @marcelveldt in #4997)
  • Simplify config options contract after setup flows (by @marcelveldt in #5017)
  • Retire the AUTH_SESSION auth-popup mechanism (by @marcelveldt in #5030)
  • Align core-module config actions with invoke_action (by @marcelveldt in #5035)
  • Clean up a duplicated setting in the built-in provider (by @marcelveldt in #5060)
  • Promote LRC formatted text in the plain lyrics tag to lrc_lyrics (by @OzGav in #5066)
  • Align PR review instructions with current context engineering guidance (by @MarvinSchenkel in #5097)
  • Move announcement handling into its own module (by @marcelveldt in #5133)
  • Catch duplicate keys in translation source files (by @marcelveldt in #5145)
  • Fix failing protocol play/pause tests on dev (by @marcelveldt in #5146)
  • Clean MusicBrainz identifiers from OpenSubsonic and Plex servers (by @OzGav in #5149)
  • Add CI checks for pull request titles and descriptions (by @MarvinSchenkel in #5155)
  • Align minimum ffmpeg version requirements in the codebase (by @OzGav in #5159)
  • Check out the base branch, and never post a bare mention (by @chrisuthe in #5164)
  • Fix noisy 'Task exception was never retrieved' errors in the log (by @marcelveldt in #5177)
  • Add an Automated PR Review bot (manual pilot) (by @chrisuthe in #5185)
  • Keep Apple TV protocol chatter out of AirPlay debug logs (by @marcelveldt in #5199)
  • Remove unused track info lookup from the MSX Bridge player (by @marcelveldt in #5201)
  • Remove unused authentication middleware (by @marcelveldt in #5211)
  • Log the resolved interface and publish IP when starting cliairplay (by @marcelveldt in #5215)
  • Remove an unused, empty helper function (by @marcelveldt in #5218)
  • Reduce unexpected Snapcast debug logging (by @marcelveldt in #5238)
  • Enable Zeroconf discovery logging (by @marcelveldt in #5239)
  • Fail faster when an AirPlay start or flush is rejected (by @marcelveldt in #5240)
  • Improve AirPlay late-join buffering (by @marcelveldt in #5241)
  • Keep the AirPlay track position correct after a timing correction (by @marcelveldt in #5242)
  • Log which AirPlay speaker failed to start (by @marcelveldt in #5244)
  • Correct outdated comments about Sendspin stream buffering (by @marcelveldt in #5245)
  • Skip an AirPlay speaker that would only play silence (by @marcelveldt in #5246)
  • Report AirPlay artwork rejections instead of hiding them (by @marcelveldt in #5247)
  • Report the real AirPlay timing state in diagnostics (by @marcelveldt in #5248)
  • Clarify a comment about how AirPlay playback is anchored (by @marcelveldt in #5249)
  • Migrate the podcast providers to the shared Overcast patterns (by @OzGav in #5254)
  • Point the SiriusXM labels at the common strings (by @OzGav in #5255)
  • Remove dead code from the AirPlay provider (by @marcelveldt in #5257)
  • Name the plugin each AI/TTS engine comes from in the picker (by @marcelveldt in #5258)
  • Test the instant an AirPlay start actually schedules (by @marcelveldt in #5259)
  • Name the speaker on every cliairplay log line (by @marcelveldt in #5265)
  • Fix remote access failing to reach the built-in Sendspin server (by @marcelveldt in #5267)
  • Search Home Assistant entities to use as player controls (by @marcelveldt in #5271)
  • Also test IPv6 when listening on all network interfaces (by @marcelveldt in #5276)
  • Use one shared definition for wildcard bind addresses (by @marcelveldt in #5277)
  • Play AI Radio TTS clips that are rendered to a local file (by @marcelveldt in #5279)
  • Let players fall back when a control is taken away (by @marcelveldt in #5280)
  • Advertise all server addresses for AirPlay remote control (by @marcelveldt in #5281)
  • Stop tests from failing on a port another process took (by @marcelveldt in #5282)
  • Fix AriaCast receiver being unreachable on networks without internet access (by @marcelveldt in #5283)
  • Correct how remote access builds its local websocket address (by @marcelveldt in #5284)
  • Clean up unreachable checks in player control commands (by @marcelveldt in #5286)
  • Split voices pasted into a single value (by @marcelveldt in #5287)
  • Advertise all server addresses for Snapcast and Sendspin discovery (by @marcelveldt in #5293)
  • Fix duplicate requests and tasks outliving shutdown (by @marcelveldt in #5296)
  • Add tests for external player control power and volume commands (by @marcelveldt in #5297)
  • Turn guest access into a normal on/off setting (by @marcelveldt in #5298)
  • Fix remote access failing to reach the Music Assistant API (by @marcelveldt in #5299)
  • Keep bridged AirPlay speakers in sync after an audio dropout (by @marcelveldt in #5300)
  • Run the Test workflow on merge groups (by @MarvinSchenkel in #5305)
  • Remove duplicated config stub from the player controller tests (by @marcelveldt in #5307)
  • Stop logging spurious errors when an artwork request is cancelled (by @marcelveldt in #5308)
  • Notice when AI Radio loses its AI or text-to-speech engine (by @marcelveldt in #5309)
  • Stop AI Radio and Smart Playlist from hanging on a stalled AI engine (by @marcelveldt in #5310)
  • Stop AirPlay speaker starts from logging a false warning (by @marcelveldt in #5312)
  • Keep grouped AirPlay speakers on the same clock (by @marcelveldt in #5313)
  • Update documentation links (by @OzGav in #5314)
  • Add how to contribute documentation link to PR template (by @OzGav in #5315)
  • Follow-up fixes for the AirPlay status contract and solo starts (by @marcelveldt in #5316)
  • Apply a changed stream server address without a restart (by @marcelveldt in #5324)
  • Wait for a full audio pipe to drain instead of erroring out (by @marcelveldt in #5326)
  • Keep AirPlay speakers on the same clock when they start at different times (by @marcelveldt in #5327)
  • Show the right address when the SSL certificate can't be loaded (by @marcelveldt in #5330)
  • Add MSX Bridge regression coverage for seeking and Sendspin URLs (by @trudenboy in #5331)
  • Report the address the webserver actually bound to (by @marcelveldt in #5332)
  • Publish the address the streamserver is actually bound to (by @marcelveldt in #5335)
  • Keep the Character index intact when the server stops during a refresh (by @marcelveldt in #5337)
  • Don't start an AirPlay session that is already outdated (by @marcelveldt in #5338)
  • Run the test suite in parallel (by @MarvinSchenkel in #5341)
  • Update auntie-sounds requirement to version 2.0.3 (by @OzGav in #5342)
  • Remove an unused internal URL from the webserver helper (by @marcelveldt in #5343)
  • Make the discovery tests independent of the host platform (by @marcelveldt in #5344)
  • Only rewrite the settings file on shutdown when something changed (by @marcelveldt in #5345)
  • Only fail the dependency security check on vulnerabilities a PR introduces (by @marcelveldt in #5346)
  • Don't remember a mute that never happened (by @marcelveldt in #5347)
  • Protect the cached Home Assistant entity list and reduce its memory use (by @marcelveldt in #5348)
  • Show the real SSL status in the webserver settings (by @marcelveldt in #5349)
  • Prevent short server freezes when similarity indexes are saved (by @marcelveldt in #5351)
  • Keep the settings file safe when a save is cancelled on shutdown (by @marcelveldt in #5360)
  • Fix mono audio playing too quietly and stalling some players (by @marcelveldt in #5362)
  • Fix surround sound sources being misread as stereo (by @marcelveldt in #5363)
  • Name FFmpeg channel layouts in one place (by @marcelveldt in #5367)
  • Look for a caller's own audio filter graph in every argument list (by @marcelveldt in #5368)
  • Avoid duplicate provider requests for the same uncached data (by @marcelveldt in #5370)
  • Use less memory for the cached Home Assistant entity registry (by @marcelveldt in #5371)
  • Make the group mute command work on any player (by @marcelveldt in #5374)
  • Reattach a player control after it comes back (by @marcelveldt in #5377)
  • Only refetch the Home Assistant entity registry when a change can affect it (by @marcelveldt in #5378)
  • Keep a protocol's own setting dependencies when shown on a player (by @marcelveldt in #5382)
  • Add test coverage for protocol settings shown next to a player's own (by @marcelveldt in #5383)
  • Fix mismatched default when reading the preferred output protocol setting (by @marcelveldt in #5384)
  • Ard sounds rebrand (by @OzGav in #5389)
  • Show the real buffer depth default per device (by @marcelveldt in #5390)
  • Keep group players up to date regardless of who triggers the update (by @marcelveldt in #5393)
  • Avoid redundant Sonos S1 speaker polls after commands (by @marcelveldt in #5394)
  • Accept AI quiz answers that arrive wrapped in a code fence (by @marcelveldt in #5395)
  • De-duplicate the metadata controller test fixture (by @marcelveldt in #5398)
  • Make the Home Assistant registry-race tests wait for the actual fetch (by @marcelveldt in #5399)
  • Bound the Trivia quiz AI response the same way as the distractor parser (by @marcelveldt in #5400)
  • Use one shared rule for trusting album release info in Music Quiz (by @marcelveldt in #5401)
  • Show what a settings action did instead of redrawing the form (by @marcelveldt in #5402)
  • Don't demand a setup setting the user cannot fill in (by @marcelveldt in #5403)
  • Keep ffmpeg's per-input read options with the input they belong to (by @marcelveldt in #5407)
  • Only announce the publish IP for network discovery (by @marcelveldt in #5411)
  • Remove unused extra_args parameter from ffmpeg helpers (by @marcelveldt in #5412)
  • Stop stream options from piling up on repeated plays of the same item (by @marcelveldt in #5414)
  • Fix playback position being dropped from the player state (by @marcelveldt in #5421)
  • Make player test config mocks behave like the real config (by @marcelveldt in #5422)
  • Fix a misleading comment about player output settings (by @marcelveldt in #5423)
  • Catch vulnerabilities a dependency update pulls in indirectly (by @marcelveldt in #5424)
  • Make the streamserver's internal address list private (by @marcelveldt in #5425)
  • Stop tests crashing at random on a shared compile cache (by @marcelveldt in #5426)
  • Tidy up where the Music Quiz AI limits live (by @marcelveldt in #5428)
  • Document the native libraries needed to run the tests locally (by @marcelveldt in #5429)
  • Share playlist track requests again on Yandex Music and KION Music (by @marcelveldt in #5430)
  • Report Sonos S1 grouping failures as proper player errors (by @marcelveldt in #5431)
  • Load the AcoustID fingerprinting library only when it is needed (by @marcelveldt in #5434)
  • Stop providers from reloading twice after a lost connection or settings change (by @marcelveldt in #5435)
  • Keep all members of a cached tuple value intact (by @marcelveldt in #5437)
  • Keep the PR label in sync when the description changes (by @marcelveldt in #5441)
  • Clean up unused leftovers in the Sonos S1 player (by @marcelveldt in #5443)
  • Keep the fake AcoustID fingerprinter in sync with the real one (by @marcelveldt in #5444)
  • Clean up unused code in the Sonos S1 error handling (by @marcelveldt in #5445)
  • Share the Music Quiz AI limit checks between quiz types (by @marcelveldt in #5448)
  • Fix wrong playback position and track length for HEOS players (by @marcelveldt in #5450)
  • Tidy up duplicated fixtures in the controller tests (by @marcelveldt in #5451)
  • Tidy up duplicated fixtures in the provider tests (by @marcelveldt in #5452)
  • Fix failing cache controller test on dev (by @marcelveldt in #5456)
  • Correct the cache docs on what single_flight=False does (by @marcelveldt in #5457)
  • Limit the length of AI-written smart playlist descriptions (by @marcelveldt in #5458)
  • Tidy up the duplicated Tidal test fixtures (by @marcelveldt in #5459)
  • Tidy up the API value parser (by @marcelveldt in #5460)
  • Keep a playback position of zero instead of treating it as unknown (by @marcelveldt in #5461)
  • Stop the dependency check from blaming a PR for a vulnerability it did not introduce (by @marcelveldt in #5462)
  • Remove duplicated code around waiting for shared work (by @marcelveldt in #5463)
  • Share My Wave and My Mix track requests between listeners (by @marcelveldt in #5464)
  • Keep a muted speaker working normally after it leaves a group (by @marcelveldt in #5465)
  • Make the Tidal ISRC lookup test check the real API URL (by @marcelveldt in #5466)
  • Show which vulnerability findings the dependency check set aside (by @marcelveldt in #5467)
  • Tidy up the helper order in the API helpers module (by @marcelveldt in #5468)
  • Stop confusing an unknown DLNA position or volume with zero (by @marcelveldt in #5469)
  • Name the argument in dictionary parse errors (by @marcelveldt in #5471)
  • Fix volume changes when unmuting a speaker (by @marcelveldt in #5473)
  • Make shared-request deduplication reliable for media item arguments (by @marcelveldt in #5475)
  • Fix pre-commit hooks failing when committing from a git worktree (by @marcelveldt in #5476)
  • Fix DLNA players reporting a position that runs ahead of the audio (by @marcelveldt in #5477)
  • Stop Sonos S1 discovery from freezing the server (by @marcelveldt in #5478)
  • Prevent Sonos S1 speakers from reconnecting after a provider reload (by @marcelveldt in #5479)
  • Clean up pending Sonos speaker setups when the provider is removed (by @marcelveldt in #5480)
  • Stop Sonos S1 from scanning for speakers after it is turned off (by @marcelveldt in #5481)
  • Keep speaker grouping correct for every user (by @marcelveldt in #5482)
  • Clean up disabled players when a player provider is unloaded (by @marcelveldt in #5483)
  • Keep unloading a provider when one of its players fails to shut down (by @marcelveldt in #5484)
  • Add test coverage for removing a player provider (by @marcelveldt in #5485)
  • Use consistent line endings in the pre-commit config file (by @marcelveldt in #5488)
  • Tidy up the Sonos S1 error handling helper (by @marcelveldt in #5491)
  • Stop a player registration that was cancelled halfway (by @marcelveldt in #5492)
  • Stop speakers from reappearing while their provider is shutting down (by @marcelveldt in #5493)
  • Adjust Snapcast and Soundcloud code owners (by @OzGav in #5494)
  • Auto-merge dependency bumps without manual conflict resolution (by @MarvinSchenkel in #5499)
  • Use consistent line endings in provider icon files (by @marcelveldt in #5504)
  • Fix dependency auto-merge workflow env contract test (by @MarvinSchenkel in #5507)
  • Stop AirPlay from re-sending unchanged artwork on every seek (by @marcelveldt in #5508)
  • Fix local code checks failing on some numba versions (by @marcelveldt in #5512)
  • Document the database schema-version divergence between dev and stable (by @marcelveldt in #5518)
  • Name the right speaker when Sonos S1 grouping fails (by @marcelveldt in #5519)
  • Clean up library items left behind without a provider (by @marcelveldt in #5522)
  • Remove an unused internal helper from the music controller (by @marcelveldt in #5523)
  • Let dependency bump merges trigger the stale-PR refresh (by @MarvinSchenkel in #5529)
  • Remove leftover unused audio reading code from the streams controller (by @marcelveldt in #5544)
  • Clean up queue settings when a player is removed (by @marcelveldt in #5545)
  • Keep protocol players working when their parent player is removed (by @marcelveldt in #5546)
  • Start playback at the saved position on Media Station X players (by @marcelveldt in #5547)
  • Never leave a library item without a playable source (by @marcelveldt in #5548)
  • Make failing background tasks fail the announcement tests (by @marcelveldt in #5551)
  • Clean up player settings when a player provider is removed (by @marcelveldt in #5552)
  • Change Google Filesystem monochrome icon to white (by @OzGav in #5561)
  • Bump ytmusicapi to 1.12.2 (by @MarvinSchenkel in #5562)
  • Update One Drive icon_monochrome.svg (by @OzGav in #5564)
  • Add mined review precedents as Copilot code-review instructions (by @chrisuthe in #5582)
  • Remove a redundant library from the test setup (by @marcelveldt in #5587)
  • Add Zvuk version metadata, ordering cleanup, and regression coverage (by @trudenboy in #5588)
  • Keep sync group playing when the lead speaker is removed (by @marcelveldt in #5608)
  • Keep sync groups on the right protocol when a speaker can't play natively (by @marcelveldt in #5610)
  • Don't move a sync group onto a speaker's offline protocol (by @marcelveldt in #5613)
  • Only hand a sync group over to a speaker that can still be reached (by @marcelveldt in #5615)
  • Add false-positive guards to the review-instructions shard (by @chrisuthe in #5620)
  • Rebuild the dev add-on when a new nightly is released (by @marcelveldt in #5636)
  • Fix outdated AirPlay late-join timing comments (by @marcelveldt in #5638)
  • Document the AirPlay audio buffer depth setting (by @marcelveldt in #5639)
  • Document the data channels used by remote access (by @marcelveldt in #5642)
  • Correct stale and inaccurate rules in the review-instructions standards (by @chrisuthe in #5645)
  • Remove the superseded bespoke PR-review workflow (by @chrisuthe in #5646)
  • Fix outdated AirPlay comments about how warm playback boundaries work (by @marcelveldt in #5647)
  • Remote connections keep large messages within what the client accepts (by @marcelveldt in #5648)
  • Report a Cast group playback error once instead of once per speaker (by @marcelveldt in #5649)
  • Rename the player media-updated callback for consistency (by @marcelveldt in #5650)
  • Protocol links no longer carry a stale availability flag (by @marcelveldt in #5651)
  • Log the right size when a remote connection drops a message (by @marcelveldt in #5655)
  • Explain why a silent AirPlay speaker is handled differently on the Sendspin bridge (by @marcelveldt in #5656)
  • Move private Sendspin player methods to the bottom of the class (by @marcelveldt in #5657)
  • Fix silent AirPlay playback after breaking up a paused group (by @marcelveldt in #5659)
  • Explain why recovered protocol links are added in place (by @marcelveldt in #5660)
  • Explain why an AirPlay speaker's clock reading is a cycle old at a re-anchor (by @marcelveldt in #5661)
  • Document that an AirPlay pause park outlives the sync group (by @marcelveldt in #5662)
  • Restore saved speaker connections through the normal update path (by @marcelveldt in #5663)
  • Clearer AirPlay debug line when a speaker's clock is already usable (by @marcelveldt in #5664)
  • Ungrouping an AirPlay group leader now releases the whole group (by @marcelveldt in #5665)
  • Keep Cast playback working when a device release is already on its way (by @marcelveldt in #5666)
  • Document how AirPlay group removals are expected to be requested (by @marcelveldt in #5667)
  • Split up the Chromecast media status handler (by @marcelveldt in #5670)
  • Tidy up the protocol grouping code (by @marcelveldt in #5672)
  • Keep AirPlay speakers from starting at full volume or silent when a device has several interfaces (by @marcelveldt in #5674)
  • Tidy up the protocol linking code (by @marcelveldt in #5675)
  • Sendspin-driven AirPlay speakers keep the volume they are playing at across a track change (by @marcelveldt in #5677)
  • Play announcements through the speaker's usual output (by @marcelveldt in #5678)
  • Announcements no longer play at the wrong volume on AirPlay speakers with several interfaces (by @marcelveldt in #5679)
  • Announcements now respect the configured volume on speakers whose volume is handled elsewhere (by @marcelveldt in #5681)
  • Remove unused scandir wrapper from the local filesystem provider (by @marcelveldt in #5684)
  • AirPlay speakers on a Sendspin bridge now report the volume and mute they are really at (by @marcelveldt in #5685)
  • Simplify the Chromecast media-status tests (by @marcelveldt in #5686)
  • Non-UTF-8 filename tests no longer fail on macOS (by @marcelveldt in #5687)
  • Group volume no longer settles on the wrong value after a drag (by @marcelveldt in #5692)
  • Remote access: one stuck client can no longer stall album art for the rest of the session (by @marcelveldt in #5693)
  • AirPlay speakers keep the volume they are set to (by @marcelveldt in #5694)
  • Set C.UTF-8 locale in Docker base image (by @testuser7 in #5695)
  • Test the Chromecast media-status state updates (by @marcelveldt in #5696)
  • Volume and mute always come from the control that owns them (by @marcelveldt in #5697)
  • Repeated volume up/down presses no longer lose steps (by @marcelveldt in #5699)
  • Give up on a streaming app that was left paused, on more speakers (by @marcelveldt in #5701)
  • Explain how volume reaches a Sendspin-bridged AirPlay speaker (by @marcelveldt in #5705)
  • Replace magic strings with constants in smart playlist provider (by @dmoo500 in #5709)
  • Keep WiiM speaker state in sync when updates stop arriving (by @marcelveldt in #5711)
  • Announcements no longer leave older AirPlay speakers at the announcement volume (by @marcelveldt in #5715)
  • Use the WiiM SDK volume command now that the upstream fix has shipped (by @marcelveldt in #5716)
  • Fix the base image build failing to download its client files (by @marcelveldt in #5719)
  • Read the AirPlay password flag the same way on every device (by @marcelveldt in #5726)
  • Playlists from stations with an unusual charset no longer fail to load (by @marcelveldt in #5727)
  • Stop flagging safe dependencies as having no license (by @marcelveldt in #5728)
  • Add test coverage for remote playlist fetching (by @marcelveldt in #5732)
  • Clean up unused source options on Sonos S1 speakers (by @marcelveldt in #5733)
  • Handle servers that declare an unusable character set (by @marcelveldt in #5735)
  • Stop approving dependency licenses on a partial name match (by @marcelveldt in #5741)
  • Hide the volume controls on Sonos speakers with fixed line-out (by @marcelveldt in #5748)
  • Only download a radio station's playlist once (by @marcelveldt in #5749)
  • Volume and mute controls no longer reappear on players that cannot use them (by @marcelveldt in #5752)
  • Add typosquatting safety tests (by @marcelveldt in #5755)
  • Recognize version-less HLS radio streams (by @marcelveldt in #5756)
  • Prevent flaky parallel test failures (by @marcelveldt in #5760)
  • Fix speakers showing twice when they get a native player (by @marcelveldt in #5772)
  • Limit concurrent provider streams (by @marcelveldt in #5773)
  • Bump stages for various providers (by @OzGav in #5775)
  • Switch on the pathlib lint rules and tidy up the remaining os.path calls (by @OzGav in #5777)
  • Use pathlib to get the last part of a path (by @OzGav in #5779)
  • Enable TRY002, PERF402, ANN201 and B007 rules (by @OzGav in #5782)
  • Keep a bridged output with the speaker connection it runs on (by @marcelveldt in #5786)
  • Keep a player's queue when it switches role (by @marcelveldt in #5787)
  • Explain why a player becoming a speaker output is not stopped first (by @marcelveldt in #5788)
  • Let a player recover when its setup fails during registration (by @marcelveldt in #5795)
  • Clean up group memberships when a player is removed (by @marcelveldt in #5796)
  • Add shared groundwork for Spotify Soloist support (by @marcelveldt in #5797)
  • Keep a shared output from showing up on two players at once (by @marcelveldt in #5801)
  • Prepare Spotify Connect for multiple backends (by @marcelveldt in #5804)
  • Close MPD connections when connecting fails partway through (by @marcelveldt in #5805)
  • Fix missing and incorrect album details from TheAudioDB (by @marcelveldt in #5806)
  • Keep a speaker's outputs with the speaker they belong to (by @marcelveldt in #5808)
  • Keep albums that differ only by a symbol from being merged (by @marcelveldt in #5809)
  • Clarify a comment in the speaker output linking code (by @marcelveldt in #5811)
  • Keep the Plex library sync going when one item cannot be read (by @marcelveldt in #5812)
  • Skip empty Spotify saved tracks instead of stopping the sync (by @marcelveldt in #5813)
  • Finish replacing a universal player that lists the speaker itself (by @marcelveldt in #5814)
  • Include search-only providers in cross-provider matching (by @marcelveldt in #5815)
  • Stop test server background work from disturbing other tests (by @marcelveldt in #5816)
  • Match duplicate tracks across a spelled-out EP or single title (by @marcelveldt in #5817)
  • Match an EP or single title however the service writes the format (by @marcelveldt in #5818)
  • Harden the stream server session handling (by @marcelveldt in #5819)
  • Enable rule TRY 401 to stop logging the same error twice (by @OzGav in #5820)
  • Hand out preview clips through a short-lived url (by @marcelveldt in #5821)
  • Write down what Music Assistant is and is not for (by @marcelveldt in #5822)
  • Hand a single track to a player at a listening pace (by @marcelveldt in #5823)
  • Cover the universal player handover with a regression test (by @marcelveldt in #5824)
  • Refresh stale dependency bump PRs after every dev push (by @MarvinSchenkel in #5828)
  • Test single titles the same way as EP titles (by @marcelveldt in #5829)
  • Mark players that are private to one device (by @marcelveldt in #5831)
  • Fix the Docker base image build (pipewire vs pulseaudio conflict) (by @marcelveldt in #5834)
  • Keep a duplicate merge repairable when it is cut short (by @marcelveldt in #5840)
  • Update base image to 1.6.2 (go-librespot 0.9.0) (by @marcelveldt in #5843)
  • Document the pipewire-alsa workaround in the base image (by @marcelveldt in #5844)
  • Never leave a library track without an artist (by @marcelveldt in #5845)
  • Repair library tracks that are missing their artist (by @marcelveldt in #5846)
  • Keep a duplicate stream request from confusing the queue's progress (by @marcelveldt in #5847)
  • Require a token to fetch audio from the MSX Bridge (by @marcelveldt in #5849)
  • Never leave a library album without its artists (by @marcelveldt in #5850)
  • Make future changes to the album title suffix list safer (by @marcelveldt in #5854)
  • Keep the rest of a Tidal list when one item cannot be read (by @marcelveldt in #5859)
  • Stop a library item a provider cannot read from being removed from the library (by @marcelveldt in #5861)
  • Surface Spotify Connect queue and playback options from the Soloist engine (by @marcelveldt in #5874)
  • Keep malformed provider responses from emptying libraries (by @marcelveldt in #5877)
  • Stabilize Yandex login timeout tests (by @marcelveldt in #5879)
  • Keep raw Soundcloud API responses out of the log (by @MarvinSchenkel in #5894)
  • Use the logged-in account for YouTube Music searches (by @MarvinSchenkel in #5896)
  • Make next/previous/seek on live audio sources work the same from every API (by @marcelveldt in #5901)
  • Show episode descriptions for Audiobookshelf and Plex podcasts (by @OzGav in #5912)
  • Track a live external audio source on the player (by @marcelveldt in #5913)
  • Keep the full details of Spotify episodes when fetched (by @OzGav in #5923)
  • Drop the audio format comparison workaround (by @marcelveldt in #5936)
  • Show when a music service handles loudness and crossfade itself (by @marcelveldt in #5937)
  • Skipping a Spotify track no longer starts with a moment of the previous one (by @marcelveldt in #5940)
  • Report what a music service did to the audio per queue and per track boundary (by @marcelveldt in #5941)
  • Report the audio quality Spotify serves, not a conversion Music Assistant did not make (by @marcelveldt in #5942)
  • Stop fighting the Spotify app over a Soloist playback session (by @marcelveldt in #5943)
  • Prevent stale live source releases (by @marcelveldt in #5944)
  • Fix a missing import in the Audible setup flow (by @MarvinSchenkel in #5948)
  • Simplify Spotify Connect setup (by @marcelveldt in #5951)
  • Apply compact backend choice pattern to Spotify music provider (by @marcelveldt in #5952)
  • Fix Spotify Connect quality reporting and a leftover audio process (by @marcelveldt in #5954)
  • Make publish IP tests reliable (by @marcelveldt in #5958)
  • Fix flaky AirPlay announcement timing tests (by @marcelveldt in #5967)
  • Speed up the slowest AirPlay announcement test (by @marcelveldt in #5971)
  • Let audio analysis notice players that are not served over HTTP (by @marcelveldt in #5972)
  • Keep tracks of the same album gapless when crossfade is on (by @marcelveldt in #5973)
  • Tidy up process cleanup code (by @marcelveldt in #5980)
  • Count album plays started from a streaming service's own listings (by @marcelveldt in #5984)
  • Count an album as played once, however its tracks are ordered in the queue (by @marcelveldt in #5991)
  • Keep the position shown for a live source in step with the player (by @marcelveldt in #5995)
  • Document which Spotify Soloist pairing failures are detected (by @marcelveldt in #5996)
  • Show the right bit-perfect badge when two speakers share one live source (by @marcelveldt in #5997)

πŸ™‡ Thanks to our contributors

Special thanks to the following contributors who helped with this release:

@AirPlr, @Bulgus, @Copilot, @GraysonCAdams, @Kyzcreig, @MarvinSchenkel, @Odn0, @OzGav, @R3inoudR, @Randalix, @Sawtaytoes, @Shi-553, @TimoPtr, @Tommatheussen, @ajacobson, @alectogeek, @allmazz, @anatosun, @arturpragacz, @benklop, @bsny, @chrisuthe, @codspeed-hq[bot], @distante, @dmoo500, @dovy6, @florianhorner, @fmunkes, @foobarth, @frjol, @gdesmott, @geofffranks, @hatharry, @iVolt1, @ijc, @jdaberkow, @jlpouffier, @jonasbp2011, @joostlek, @joperafe, @jozefKruszynski, @jwlerch78, @khers, @kiegsgroot, @kieranhogg, @kissu, @kiwipaulrob, @lebdim, @lordhi, @marcelveldt, @maximmaxim345, @mcaulifn, @medusalix, @meiser79, @music-assistant-machine, @quadcom, @rnewman, @robsonke, @romany, @rwjack, @rwlove, @scootaash, @seadowg, @seppegadeyne, @steamEngineer, @stvncode, @swiftbird07, @teancom, @tesmerjg, @testuser7, @trudenboy, @vintvinst, @x-ingo, @xiasi0, @yfhyou, @yoyixms, @zenibako


Some changes were omitted to fit these notes on the release. See the full changelog for the complete list.