music-assistant-machine [Tue, 27 Jan 2026 14:14:17 +0000 (15:14 +0100)]
⬆️ Update music-assistant-frontend to 2.17.75 (#3033)
Co-authored-by: MarvinSchenkel <17671719+MarvinSchenkel@users.noreply.github.com>
Marcel van der Veldt [Tue, 27 Jan 2026 11:50:29 +0000 (12:50 +0100)]
Don't filter unavailable player configs by default (#3031)
* Don't filter unavailable player configs by default
* Add additional param to filter out disabled players
Marvin Schenkel [Tue, 27 Jan 2026 10:24:03 +0000 (11:24 +0100)]
Fix player sources in Sonos S1 (#3030)
* Set active source to Line in source when selected.
* Add PlayerSources for S1.
* Add PlayerSources for S1.
* Disable media when linein is active. Switch back to MA on stop.
dependabot[bot] [Tue, 27 Jan 2026 08:17:29 +0000 (08:17 +0000)]
Chore(deps): Bump alexapy from 1.29.14 to 1.29.15 (#3022)
* Chore(deps): Bump alexapy from 1.29.14 to 1.29.15
Bumps [alexapy](https://gitlab.com/keatontaylor/alexapy) from 1.29.14 to 1.29.15.
- [Release notes](https://gitlab.com/keatontaylor/alexapy/tags)
- [Changelog](https://gitlab.com/keatontaylor/alexapy/blob/dev/CHANGELOG.md)
- [Commits](https://gitlab.com/keatontaylor/alexapy/compare/v1.29.14...v1.29.15)
---
updated-dependencies:
- dependency-name: alexapy
dependency-version: 1.29.15
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* Also bump the provider manifest.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
dependabot[bot] [Tue, 27 Jan 2026 08:16:46 +0000 (08:16 +0000)]
Chore(deps): Bump py-opensonic from 8.0.1 to 8.1.1 (#3023)
* Chore(deps): Bump py-opensonic from 8.0.1 to 8.1.1
Bumps [py-opensonic](https://github.com/khers/py-opensonic) from 8.0.1 to 8.1.1.
- [Release notes](https://github.com/khers/py-opensonic/releases)
- [Changelog](https://github.com/khers/py-opensonic/blob/master/CHANGELOG.md)
- [Commits](https://github.com/khers/py-opensonic/compare/v8.0.1...v8.1.1)
---
updated-dependencies:
- dependency-name: py-opensonic
dependency-version: 8.1.1
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
* Also bump the provider manifest.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
Marvin Schenkel [Tue, 27 Jan 2026 08:04:06 +0000 (09:04 +0100)]
YTMusic: Implement more aggressive caching (#3029)
* Implement more aggresive caching for YTM.
* Cleanup.
music-assistant-machine [Tue, 27 Jan 2026 00:31:02 +0000 (01:31 +0100)]
⬆️ Update music-assistant-frontend to 2.17.74 (#3028)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Marcel van der Veldt [Mon, 26 Jan 2026 23:23:19 +0000 (00:23 +0100)]
Fix players unavailable of cast and bluesound provider (#3027)
Marcel van der Veldt [Mon, 26 Jan 2026 23:04:10 +0000 (00:04 +0100)]
Auto whitelist sendspin webplayer (jnstead of modifying player fiter) (#3026)
Marcel van der Veldt [Mon, 26 Jan 2026 21:55:10 +0000 (22:55 +0100)]
cleanup redundant requires_flow_mode
Marcel van der Veldt [Mon, 26 Jan 2026 21:47:40 +0000 (22:47 +0100)]
Fix player lifecycle (enabling/disabling and config updates) (#3024)
Marcel van der Veldt [Mon, 26 Jan 2026 19:32:34 +0000 (20:32 +0100)]
Add fallback player config
Marcel van der Veldt [Mon, 26 Jan 2026 19:23:03 +0000 (20:23 +0100)]
Config handling improvements (#3021)
music-assistant-machine [Mon, 26 Jan 2026 16:37:01 +0000 (17:37 +0100)]
⬆️ Update music-assistant-models to 1.1.92 (#3019)
* ⬆️ Update music-assistant-models to 1.1.92
* tweak
---------
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Marvin Schenkel [Mon, 26 Jan 2026 14:09:40 +0000 (15:09 +0100)]
Sqeezelite: Only use low latency threshold values when a plugin is active (#3018)
Only use low latency threshold values when a plugin is active.
OzGav [Mon, 26 Jan 2026 11:39:22 +0000 (22:39 +1100)]
Add AAC/M4A support to tag parsing (#3004)
Fix AAC/M4A tag parsing in parse_tags_mutagen
Add comprehensive MP4/AAC tag parsing support to the mutagen fallback parser.
Previously only ID3 tags were handled, leaving M4A/AAC files with missing metadata.
Changes:
- Add _parse_mp4_tags() function to handle MP4Tags format
- Support basic tags: title, artist, album, albumartist, genre
- Support sort tags: titlesort, artistsort, albumsort, albumartistsort
- Support MusicBrainz IDs via freeform tags (----:com.apple.iTunes:*)
- Support track/disc numbers with totals stored separately
- Support date, lyrics, compilation flag, album type, and ReplayGain tags
- Add helper functions for decoding MP4 freeform tags (bytes to strings)
- Add M4A test fixture and test_parse_metadata_from_mp4tags test
Co-authored-by: Claude <noreply@anthropic.com>
Marvin Schenkel [Mon, 26 Jan 2026 10:20:00 +0000 (11:20 +0100)]
Increase cache for local playlist tracks (#3007)
* Increase cache for local playlist tracks + invalidate during sync.
* Deserialize Track data from cache
* Also handle memory cache
Marvin Schenkel [Mon, 26 Jan 2026 08:19:43 +0000 (09:19 +0100)]
Fix linter for new models
OzGav [Mon, 26 Jan 2026 06:59:56 +0000 (17:59 +1100)]
Fix Pandora authentication failures (#2949)
* fix: Pandora auth token expiry during long listening sessions
Implemented automatic re-authentication mechanism for Pandora provider
to prevent auth token expiry during extended listening sessions.
- Added token expiration tracking with AUTH_TOKEN_LIFETIME (50 minutes)
- Added ensure_valid_auth() method to proactively re-authenticate before
token expiration (with 5 minute buffer)
- Updated _api_request() to call ensure_valid_auth() before all API calls
- Added retry logic for 401 errors to handle reactive re-authentication
This follows the same pattern used by the Tidal provider for maintaining
valid authentication tokens during long-running sessions.
Fixes issue where users reported authentication expiring while listening
to Pandora stations.
* improvement: Check for explicit token expiry from Pandora API
Updated authentication to check if Pandora returns expiry information
(expiresIn or expires_in fields) and use it if available, rather than
always assuming a hardcoded lifetime.
- Checks for expiry fields in authentication response
- Uses actual expiry if provided by API
- Falls back to conservative 50-minute estimate if not
- Added logging to show which approach is being used
This makes the implementation more robust and will automatically adapt
if Pandora provides expiry information in their response.
* refactor: Switch to reactive-only auth handling for Pandora
Changed from proactive time-based re-authentication to reactive
401-error handling only. This is a better approach because:
1. User reports show auth failures occurring anywhere from 5 minutes
to several hours, indicating it's NOT a simple token timeout
2. Proactive re-auth would mask the real issue and prevent diagnosis
3. Reactive handling will log actual failure patterns to help identify
the root cause (concurrent logins, IP changes, rate limiting, etc.)
Changes:
- Removed AUTH_TOKEN_LIFETIME and AUTH_REFRESH_BUFFER constants
- Removed ensure_valid_auth() proactive check method
- Removed _auth_expires_at expiry tracking
- Added _auth_time to track when authentication occurred
- Enhanced 401 error handling to log how long tokens lasted
- Simplified to reactive-only approach: retry on 401 with fresh auth
This will help diagnose the actual cause of auth expiry issues while
still preventing playback interruption by automatically re-authenticating
when needed.
* chore: Change Pandora auth log messages to debug level
Changed authentication success and token expiry messages from info/warning
to debug level to reduce log noise for routine operations.
* chore: Remove diagnostic timing code from Pandora auth
Removed _auth_time tracking and associated debug logging that calculated
token lifetime. Fix is confirmed working, diagnostic code no longer needed.
* chore: Change authentication success log back to info level
* fix: Remove duplicate type annotation to fix mypy error
* fix: Handle network errors gracefully in Pandora stream handler
Added ProviderUnavailableError handling to _handle_stream_request to
prevent crashes when network errors (DNS timeouts, connection failures)
occur during fragment fetching.
- Wrapped all _get_fragment_data calls in try-except block
- Added ProviderUnavailableError exception handler
- Returns 503 Service Unavailable instead of crashing
- Logs error for diagnostics
* refactor: Use recursive retry pattern for Pandora auth failures
Refactored _api_request to use recursive call instead of duplicating
error handling code in retry block.
- Added 'retry: bool = True' parameter to _api_request
- On 401 error, re-authenticate and recursively call with retry=False
- Eliminates ~20 lines of duplicate error handling code
- Cleaner and more maintainable
Credit: @MarvinSchenkel for the suggestion
* fix: Add type annotation to satisfy mypy no-any-return check
* style: Remove superfluous else after return (RET505)
Fixed ruff linting error - removed unnecessary else clause after
return statement in retry logic.
---------
Co-authored-by: Claude <noreply@anthropic.com>
Tom Matheussen [Mon, 26 Jan 2026 06:51:09 +0000 (07:51 +0100)]
Add HEOS Player provider (#2986)
* Initial commit, ability to connect to a HEOS system and play URL
* Added more function handling
* Some code improvements, fix disconnection done too late
* Map music sources to inputs
* Make sure players are registered, even when they are marked as unavailable
* Build proper source list
* Keep internal heos reference in player
* Set dynamic attributes after player setup
* Implement grouping
* Grab group information when players are set up
* Handle group change events
* Build source list in provider
* Minor rearrangement
* Make sure player update event is cleaned up
* Some cleanup
* Remove some leftover logging
* Handle controller event in provider
* Split player updating into dedicated events
* Populate current_media when we're not playing
* Set sample rate configs
* Handle connection errors
* Temp troubleshooting commit
* Clean up some code and comments, adjusted some minor things
* Use fallbacks on mappings
* Disable player re-enabling for now
* Handle AUX inputs
* Handle player change event from HEOS
* address PR review comments
* Reduce safe max sample rate and bit depth for older devices
* Don't need to set credentials, unused right now
music-assistant-machine [Sun, 25 Jan 2026 15:05:01 +0000 (16:05 +0100)]
⬆️ Update music-assistant-models to 1.1.91 (#3016)
* ⬆️ Update music-assistant-models to 1.1.91
* Adjustments for models change
---------
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Marcel van der Veldt [Sat, 24 Jan 2026 00:46:43 +0000 (01:46 +0100)]
Remove lock from regular player commands
Marvin Schenkel [Sat, 24 Jan 2026 00:27:28 +0000 (01:27 +0100)]
Fix chime validation for player groups (#3013)
Marcel van der Veldt [Sat, 24 Jan 2026 00:26:40 +0000 (01:26 +0100)]
Fixes for the AirPlay provider (#3014)
dependabot[bot] [Fri, 23 Jan 2026 12:48:50 +0000 (13:48 +0100)]
Chore(deps): Bump actions/setup-python from 6.1.0 to 6.2.0 (#3010)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6.1.0...v6.2.0)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: 6.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
music-assistant-machine [Fri, 23 Jan 2026 09:27:50 +0000 (10:27 +0100)]
⬆️ Update music-assistant-frontend to 2.17.73 (#3012)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
music-assistant-machine [Fri, 23 Jan 2026 03:09:18 +0000 (04:09 +0100)]
⬆️ Update music-assistant-models to 1.1.90 (#3011)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Marvin Schenkel [Thu, 22 Jan 2026 19:25:58 +0000 (20:25 +0100)]
Fix announcement for Sonos Play:1's (#3009)
Andrew Pryde [Thu, 22 Jan 2026 11:37:21 +0000 (11:37 +0000)]
fix(spotify_connect): ignore trailing sink event to prevent playback thrashing (#2976)
* fix(spotify_connect): ignore trailing sink event to prevent playback thrashing
The librespot daemon emits a trailing 'sink' event after disconnect.
MA was misinterpreting this as a new playback request, causing the
disconnecting player to immediately re-activate and steal the session back.
This adds a check to ignore 'sink' events if the session is not connected.
* Fix backport pipeline
---------
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
Mischa Siekmann [Thu, 22 Jan 2026 08:31:21 +0000 (09:31 +0100)]
SyncGroupPlayer: Inherit MULTI_DEVICE_DSP feature from group members (#2999)
* SyncGroupPlayer: Inherit MULTI_DEVICE_DSP feature from group members
* SyncGroupPlayer: use reference_player as variable name for the player to inherit the supported features from
Rob Coleman [Thu, 22 Jan 2026 08:30:16 +0000 (00:30 -0800)]
fix: Add support for AAC streaming route for universal groups (#2990)
* Add support for AAC streaming route
* Add support for AAC audio format
Add a case to properly set to the audio format to AAC if the original format is AAC and the target format can't be determined from the player.
* Remove unnecessary special case for AAC
Jozef Kruszynski [Thu, 22 Jan 2026 07:31:02 +0000 (08:31 +0100)]
fix(Tidal): Remove unnecessary deduping of recomendation rows (#3006)
Sameer Alam [Thu, 22 Jan 2026 07:07:05 +0000 (01:07 -0600)]
Add Spanish and Italian to Alexa language commands (#3005)
Update language commands
Co-authored-by: Sameer Alam <alams154@users.noreply.github.com>
music-assistant-machine [Wed, 21 Jan 2026 03:08:40 +0000 (04:08 +0100)]
⬆️ Update music-assistant-models to 1.1.89 (#3003)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
music-assistant-machine [Tue, 20 Jan 2026 18:05:42 +0000 (19:05 +0100)]
⬆️ Update music-assistant-frontend to 2.17.72 (#3001)
Co-authored-by: MarvinSchenkel <17671719+MarvinSchenkel@users.noreply.github.com>
Maxim Raznatovski [Tue, 20 Jan 2026 18:01:06 +0000 (19:01 +0100)]
Add 24 and 32-bit audio support for Sendspin (#2977)
* feat: add 32-bit audio and mono output support for sendspin
* refactor: remove mono output conversion for per-player streams
The mono rendering with aiosendspin upmixing added complexity
without clear benefit. Reverting to direct output format usage.
Anatosun [Tue, 20 Jan 2026 17:09:14 +0000 (18:09 +0100)]
Plex connect: Improve queue loading performance (#2735)
* Plex connect: Improve queue loading performance
Start playback immediately with first track while loading remaining tracks
in background. This reduces perceived latency when playing queues from Plex.
Changes:
- Load and play first track immediately when queue is requested
- Fetch remaining tracks concurrently in background task
- Broadcast timeline update after first track starts
* Plex connect: applied copilot suggestion
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Plex connect: fixed task creation
* Plex Connect: added await clause on line 715
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
Marvin Schenkel [Tue, 20 Jan 2026 17:03:59 +0000 (18:03 +0100)]
Fix linter
OzGav [Tue, 20 Jan 2026 15:34:46 +0000 (00:34 +0900)]
Add RET505 mypy rule (#2962)
Marvin Schenkel [Tue, 20 Jan 2026 14:51:48 +0000 (15:51 +0100)]
Revert "use instance_id instead of domain on provider level logging" (#3000)
Revert "use instance_id instead of domain on provider level logging (#2943)"
This reverts commit
7af16a90d8640bb4c0409a73237b9c64b7c2817c.
Paulus Schoutsen [Tue, 20 Jan 2026 13:27:41 +0000 (08:27 -0500)]
Bump aiosendspin to 3.0 (#2924)
* Bump aiosendspin to 2.0
Adapt to breaking changes in aiosendspin:
- Change event listener callbacks from async to synchronous
- Change start_server advertise_host to advertise_addresses
* fix: handle client disconnect during pending unregister wait
Check if client still exists after waiting for pending unregister,
preventing player registration attempts for disconnected clients.
* chore(deps): bump aiosendspin to 3.0.0
---------
Co-authored-by: Maxim Raznatovski <nda.mr43@gmail.com>
Artur Pragacz [Tue, 20 Jan 2026 13:19:21 +0000 (14:19 +0100)]
Fix pre announce typing (#2998)
Marvin Schenkel [Tue, 20 Jan 2026 11:00:17 +0000 (12:00 +0100)]
Also ignore ASYNC110 and N818
Marvin Schenkel [Tue, 20 Jan 2026 10:43:12 +0000 (11:43 +0100)]
Add comment about ASYNC109 to project file
dependabot[bot] [Tue, 20 Jan 2026 08:29:51 +0000 (09:29 +0100)]
Chore(deps-dev): Bump ruff from 0.14.9 to 0.14.13 (#2995)
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.9 to 0.14.13.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.14.9...0.14.13)
---
updated-dependencies:
- dependency-name: ruff
dependency-version: 0.14.13
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Marvin Schenkel [Mon, 19 Jan 2026 15:28:31 +0000 (16:28 +0100)]
Fix linter
DButter [Mon, 19 Jan 2026 15:27:30 +0000 (16:27 +0100)]
orf radiothek provider (#2968)
* orf radiothek: Initial Commit
* orf radiothek: fixed duplicate super call
* orf radiothek: moved some config value to advanced category
* orf radiothek: renamed classes to helper, removed catchup day conf entry set it to 30 days flat
* orf radiothek: set stage to beta and corrected version
* orf radiothek: some more cleanup
* orf radiothek: fixed some code smells
* orf radiothek: move stream quality type to advanced
* Update music_assistant/providers/orf_radiothek/__init__.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: DButter <private@david-butter.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
music-assistant-machine [Mon, 19 Jan 2026 14:06:13 +0000 (15:06 +0100)]
⬆️ Update music-assistant-frontend to 2.17.71 (#2991)
Co-authored-by: MarvinSchenkel <17671719+MarvinSchenkel@users.noreply.github.com>
Fabian Munkes [Mon, 19 Jan 2026 13:59:08 +0000 (14:59 +0100)]
Audiobookshelf: Use a direct stream if configured with an API token. (#2989)
* do not take internal web server detour for API key users
* add debugging messages
Marvin Schenkel [Mon, 19 Jan 2026 10:42:02 +0000 (11:42 +0100)]
Merge branch 'dev' of https://github.com/music-assistant/server into dev
Marvin Schenkel [Mon, 19 Jan 2026 10:41:57 +0000 (11:41 +0100)]
Apply explicit permissions to pr-labels workflow
Valentin Lacour [Mon, 19 Jan 2026 10:35:31 +0000 (11:35 +0100)]
fix(alexa): Fix issue with language on alexa skills for french and germany (#2982)
Co-authored-by: Valentin Lacour <vlacour@sweeek.com>
David McClosky [Mon, 19 Jan 2026 08:21:59 +0000 (03:21 -0500)]
Update old template references + other cleanups (#2928)
* Update old template references + other cleanups
(also some reformatting and a note about how to run a separate development server)
* Update instructions around setting server port
* Remove notes on setting a custom port
Garrett Mace [Mon, 19 Jan 2026 08:07:52 +0000 (00:07 -0800)]
Add SomaFM Radio provider (#2981)
* SomaFM provider initial release
* Polish playlist parsing per PR points (and remove MP3 format config)
Marvin Schenkel [Mon, 19 Jan 2026 06:46:37 +0000 (07:46 +0100)]
Use bind ip of the stream server for Sendspin url (#2930)
kdkavanagh [Sat, 17 Jan 2026 16:17:11 +0000 (10:17 -0600)]
Prevent duplicate airplay player creation leaving player in invalid state (#2955)
Marvin Schenkel [Sat, 17 Jan 2026 16:04:21 +0000 (17:04 +0100)]
Maintenance for security related fixes (#2983)
music-assistant-machine [Sat, 17 Jan 2026 03:00:42 +0000 (04:00 +0100)]
⬆️ Update music-assistant-frontend to 2.17.70 (#2987)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Fabian Munkes [Fri, 16 Jan 2026 14:35:01 +0000 (15:35 +0100)]
use instance_id instead of domain on provider level logging (#2943)
* use instance id instead of domain in logging
* feedback
Fabian Munkes [Fri, 16 Jan 2026 11:38:09 +0000 (12:38 +0100)]
Do not report progress on ffmpeg streaming error (#2973)
* do not report progress if there was a streaming error
* Update music_assistant/controllers/player_queues.py
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
---------
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Marvin Schenkel [Thu, 15 Jan 2026 12:33:40 +0000 (13:33 +0100)]
Fix backport pipeline
Marvin Schenkel [Thu, 15 Jan 2026 12:15:54 +0000 (13:15 +0100)]
Add SECURITY.MD
Alexey ALERT Rubashёff [Thu, 15 Jan 2026 08:03:13 +0000 (10:03 +0200)]
Make pre-commit configuration cross-platform compatible using uv (#2971)
chore: update pre-commit hooks and enforce LF line endings
- Add configuration to enforce LF line endings for all text files.
- Update pre-commit hooks to use `uv run` instead of `scripts/run-in-env.sh` and reorder `gen_requirements_all` to run first.
- Uses LF line endings in gen_requirements_all.
Alexey ALERT Rubashёff [Thu, 15 Jan 2026 07:55:06 +0000 (09:55 +0200)]
Add Bandcamp Music Provider (#2871)
* bandcamp
* mypy, ruff
* fix provider stream details tests
* fix eol for icons
* final touch
* bump bandcamp-async-api to 0.0.3
* add BandcampMustBeLoggedInError support
- bump bandcamp-async-api to 0.0.4
* fix: PR review
- is_streaming_provider is now True
- catching and raising exceptions revamp
- remove redundant stream content type
* requirements_all.txt line endings
* fix: Add error handling for missing streaming links in BandcampProvider.
- Add error handling for missing streaming links in BandcampProvider.
- Enhance error handling and update test assertions for Bandcamp provider.
* fix: typing
* minor: specify the exact cookie name
* PR review fixes
- Remove search limit configuration.
- CONF_TOP_TRACKS_LIMIT moved to advanced config category
- Update test to use `DEFAULT_TOP_TRACKS_LIMIT` constant.
* PR review: reintroduced search limit, set it to 50
Marvin Schenkel [Thu, 15 Jan 2026 06:53:43 +0000 (07:53 +0100)]
Fallback to stream.url if url_resolved is missing (#2972)
Updated the RadioBrowserProvider to use stream.url as a fallback for the path if stream.url_resolved is not available. This ensures that a valid stream path is always provided.
music-assistant-machine [Thu, 15 Jan 2026 03:07:58 +0000 (04:07 +0100)]
⬆️ Update music-assistant-frontend to 2.17.69 (#2975)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
OzGav [Wed, 14 Jan 2026 12:54:43 +0000 (21:54 +0900)]
Add RET507 mypy rule (#2961)
OzGav [Wed, 14 Jan 2026 12:06:47 +0000 (21:06 +0900)]
Add metadata support to HLS streams (#2867)
* Add metadata support to HLS streams
* Use callback
* Remove unnecessary parameter
Ztripez [Wed, 14 Jan 2026 08:25:14 +0000 (09:25 +0100)]
Audible: Add podcast support and browse by author/series/narrator (#2881)
* Fix Audible authentication for new API token format
- Add compatible token refresh handling for new actor_access_token format
- Validate signing auth availability (preferred, stable auth method)
- Accept multiple authorization code parameter names in callback URL
- Improve error handling and diagnostic messages
* Add podcast support to Audible provider
Implement podcast library sync and playback for Audible Plus content:
- Add LIBRARY_PODCASTS to supported features
- Implement get_library_podcasts() to fetch podcast series
- Implement get_podcast() for full podcast details
- Implement get_podcast_episodes() and get_podcast_episode()
- Add podcast and episode parsing functions
- Update get_stream() to handle podcast episodes (Mpeg drm_type)
Podcasts in Audible use "PodcastParent" content_delivery_type for series.
Episodes are fetched via the parent_asin relationship.
Podcast episodes use non-DRM MP3 streaming (drm_type: "Mpeg").
* Add browse support for authors, series, narrators, genres, publishers
Implement custom browse functionality to navigate audiobooks by:
- Authors: Browse all authors, see audiobooks sorted by release date (newest first)
- Series: Browse all series, see books in order (by sequence number)
- Narrators: Browse all narrators, see audiobooks sorted by release date
- Genres: Browse all genres, see audiobooks sorted by release date
- Publishers: Browse all publishers, see audiobooks sorted by release date
The base audiobooks/podcasts paths fall back to the parent implementation.
Data is extracted from the library API response.
* Clean up Audible helper comments and docstrings
* Address review comments for Audible PR #2881
- Refactor pagination into _fetch_library_items
- Implement ACR caching to optimize position reporting
- Fix podcast parent fallback
- Handle special characters in browse paths
- Add unit tests for new logic
---------
Co-authored-by: Ztripez von Matérn <ztripez@bobby.se>
dependabot[bot] [Wed, 14 Jan 2026 07:28:36 +0000 (08:28 +0100)]
Chore(deps): Bump pillow from 12.0.0 to 12.1.0 (#2937)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 12.0.0 to 12.1.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/12.0.0...12.1.0)
---
updated-dependencies:
- dependency-name: pillow
dependency-version: 12.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
music-assistant-machine [Wed, 14 Jan 2026 03:13:51 +0000 (04:13 +0100)]
⬆️ Update music-assistant-frontend to 2.17.68 (#2970)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Marvin Schenkel [Tue, 13 Jan 2026 18:22:19 +0000 (19:22 +0100)]
Fix content type for Sqeezelite multiclient streams (#2967)
dependabot[bot] [Tue, 13 Jan 2026 14:58:16 +0000 (14:58 +0000)]
Chore(deps): Bump alexapy from 1.29.10 to 1.29.14 (#2938)
* Chore(deps): Bump alexapy from 1.29.10 to 1.29.14
Bumps [alexapy](https://gitlab.com/keatontaylor/alexapy) from 1.29.10 to 1.29.14.
- [Release notes](https://gitlab.com/keatontaylor/alexapy/tags)
- [Changelog](https://gitlab.com/keatontaylor/alexapy/blob/dev/CHANGELOG.md)
- [Commits](https://gitlab.com/keatontaylor/alexapy/compare/v1.29.10...v1.29.14)
---
updated-dependencies:
- dependency-name: alexapy
dependency-version: 1.29.14
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* Also bump provider manfiest
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
dependabot[bot] [Tue, 13 Jan 2026 14:34:00 +0000 (14:34 +0000)]
Chore(deps): Bump async-upnp-client from 0.46.0 to 0.46.2 (#2960)
* Chore(deps): Bump async-upnp-client from 0.46.0 to 0.46.2
Bumps [async-upnp-client](https://github.com/StevenLooman/async_upnp_client) from 0.46.0 to 0.46.2.
- [Release notes](https://github.com/StevenLooman/async_upnp_client/releases)
- [Changelog](https://github.com/StevenLooman/async_upnp_client/blob/development/CHANGES.rst)
- [Commits](https://github.com/StevenLooman/async_upnp_client/compare/0.46.0...0.46.2)
---
updated-dependencies:
- dependency-name: async-upnp-client
dependency-version: 0.46.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* Also bump provider manifests
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
Marvin Schenkel [Tue, 13 Jan 2026 14:18:31 +0000 (15:18 +0100)]
Fix issues with progress bar jumps and time overflow (#2959)
* Progress
* Progress
* Fix duplicate playlog entries on stream restart
* Use model for queuetimeupdate
* Cleanup
* Update music_assistant/controllers/streams/streams_controller.py
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
* Feedback
* Feedback
---------
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Marvin Schenkel [Tue, 13 Jan 2026 09:40:44 +0000 (10:40 +0100)]
Bump base image for beta and stable
Maxim Raznatovski [Tue, 13 Jan 2026 09:34:57 +0000 (10:34 +0100)]
Pin `av` to 16.1.0 for sendspin provider (#2966)
chore(deps): pin `av` to 16.1.0 for sendspin provider
Marvin Schenkel [Tue, 13 Jan 2026 08:02:11 +0000 (09:02 +0100)]
Bump base image for nightly
music-assistant-machine [Tue, 13 Jan 2026 03:06:39 +0000 (04:06 +0100)]
⬆️ Update music-assistant-frontend to 2.17.67 (#2964)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
Bart [Mon, 12 Jan 2026 16:25:43 +0000 (17:25 +0100)]
Add method to move item to end of queue (#2929)
Marvin Schenkel [Mon, 12 Jan 2026 15:01:57 +0000 (16:01 +0100)]
Add option to add backport label after the PR has been merged
Eric Munson [Mon, 12 Jan 2026 14:25:23 +0000 (09:25 -0500)]
Subsonic Scrobble: Fix Subsonic interactions after the async change (#2953)
The Subsonic provider is now using aiohttp making it unnecessary for us
to wrap calls to is in a new thread. Fix the scrobble plugin to use the
async library as well.
Signed-off-by: Eric B Munson <eric@munsonfam.org>
OzGav [Mon, 12 Jan 2026 13:39:28 +0000 (23:39 +1000)]
Add PTH202 mypy rule (#2932)
OzGav [Mon, 12 Jan 2026 13:37:04 +0000 (23:37 +1000)]
Add PTH107 mypy rule (#2933)
Maxim Raznatovski [Mon, 12 Jan 2026 12:22:42 +0000 (13:22 +0100)]
Sendspin web player race condition losing `client/hello` (#2946)
fix: Sendspin DataChannel race condition losing `client/hello`
Register message/close handlers before ws_connect() to ensure early
messages are queued. Change condition to also queue when task is None
(during setup), not just when running.
OzGav [Mon, 12 Jan 2026 12:13:22 +0000 (22:13 +1000)]
Fix Pandora only showing five stations (#2956)
Rob Sonke [Mon, 12 Jan 2026 12:04:04 +0000 (13:04 +0100)]
fix: Ensure playlist ID is a string in Soundcloud provider (#2957)
Convert playlist ID to string to prevent an error on startsWith
OzGav [Thu, 8 Jan 2026 16:09:08 +0000 (02:09 +1000)]
Add and update provider icons (#2950)
* Add updated cast icon
* Switch to AirPlay audio icons
* Add local filesystem icon
* Add smb provider icon
* Add universal group icon
* Clean up icon_monochrome.svg by removing comments
Removed unused comments and metadata from SVG.
* Add colour version
* Add colour version
* Add colour version
* Add monochrome universal group icon
* Add monochrome smb icon
* Add monochrome local provider icon
music-assistant-machine [Thu, 8 Jan 2026 03:06:27 +0000 (04:06 +0100)]
⬆️ Update music-assistant-frontend to 2.17.66 (#2952)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
music-assistant-machine [Wed, 7 Jan 2026 03:06:48 +0000 (04:06 +0100)]
⬆️ Update music-assistant-frontend to 2.17.65 (#2948)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
OzGav [Tue, 6 Jan 2026 13:43:56 +0000 (23:43 +1000)]
Add ISC001 PYI036 SIM113 mypy rules (#2936)
* Add ISC001 PYI036 SIM113 mypy rules
* Add multiple mypy rules
* revert one line
Fabian Munkes [Tue, 6 Jan 2026 11:55:00 +0000 (12:55 +0100)]
fix: MusicCast: Handle a failed poll more gracefully (#2944)
* be more generic in musiccast update
* generic exception at all polling places
dependabot[bot] [Tue, 6 Jan 2026 08:21:27 +0000 (09:21 +0100)]
Chore(deps-dev): Bump pytest from 8.4.2 to 9.0.2 (#2939)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.4.2 to 9.0.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.4.2...9.0.2)
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.2
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
OzGav [Tue, 6 Jan 2026 08:10:23 +0000 (18:10 +1000)]
Fix Music Assistant playlist not being removed (#2931)
* Fix playlist recreation issue after removal
When a Music Assistant playlist was removed from the library, the config entry
was correctly removed but the physical playlist file in the playlists/ directory
was not deleted. This orphaned file could cause the playlist to be recreated
during synchronization.
This fix ensures that when a playlist is removed via library_remove(), both the
config entry and the physical playlist file are deleted.
Fixes the issue where playlists would reappear after sync with a new ID.
* Add LIBRARY_PLAYLISTS_EDIT feature to builtin provider
The builtin provider was missing ProviderFeature.LIBRARY_PLAYLISTS_EDIT,
which prevented library_remove() from being called when playlists were
removed from the library. This meant the playlist file cleanup code was
never executed.
Adding this feature ensures that:
1. library_edit_supported() returns True for playlists
2. library_remove() is called during playlist removal
3. The playlist file is properly deleted
* Use playlist lock for file deletion to prevent race conditions
When deleting a playlist file, we now acquire the _playlist_lock to prevent
race conditions with concurrent read/write operations, consistent with
_read_playlist_file_items() and _write_playlist_file_items().
---------
Co-authored-by: Claude <noreply@anthropic.com>
music-assistant-machine [Tue, 6 Jan 2026 03:06:44 +0000 (04:06 +0100)]
⬆️ Update music-assistant-frontend to 2.17.64 (#2942)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
dependabot[bot] [Mon, 5 Jan 2026 17:31:24 +0000 (18:31 +0100)]
Chore(deps): Bump aiohttp from 3.13.2 to 3.13.3 (#2940)
---
updated-dependencies:
- dependency-name: aiohttp
dependency-version: 3.13.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Marvin Schenkel [Mon, 5 Jan 2026 17:31:09 +0000 (18:31 +0100)]
Fix webserver base url not persisting (#2935)
* Fix webserver base url not persisting
* Cleanup
Anatosun [Mon, 5 Jan 2026 12:02:43 +0000 (13:02 +0100)]
Plex Connect: Ungroup player before starting playback (#2877)
* Plex Connect: Ungroup player before starting playback
When a user selects a specific player for playback in Plex, automatically
remove it from any sync groups or permanent groups. This improves UX by
ensuring playback only happens on the selected player, not all grouped players.
- Added _ungroup_player_if_needed() helper method
- Calls set_members directly to bypass static member restrictions
- Applied to handle_play_media (new playback) and handle_play (resume)
- Works with temporary syncs, permanent groups, and dynamic groups
* Plex Connect: Add error handling and feature checks to player ungrouping
* Plex Connect: implemented corrections
Paulus Schoutsen [Mon, 5 Jan 2026 08:33:36 +0000 (03:33 -0500)]
Bump aiosendspin to 2.0.0 (#2925)
## Summary
- Bump aiosendspin from 1.1.4 to 2.0.0
- Fix compatibility with sendspin-cli 2.0.0+ by accepting spec-compliant field names in the client/hello support object
- Update `start_server()` API call: `advertise_host` → `advertise_addresses` (breaking change from Sendspin/aiosendspin#117)
music-assistant-machine [Mon, 5 Jan 2026 03:19:06 +0000 (04:19 +0100)]
⬆️ Update music-assistant-models to 1.1.88 (#2927)
Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>