music-assistant-server.git
4 months agoPre-build PyAV wheel in base image to speed up release builds (#2682)
Maxim Raznatovski [Wed, 26 Nov 2025 09:37:41 +0000 (10:37 +0100)]
Pre-build PyAV wheel in base image to speed up release builds (#2682)

4 months agoAdd pytz dependency to bbc sounds provider
Marvin Schenkel [Tue, 25 Nov 2025 17:53:26 +0000 (18:53 +0100)]
Add pytz dependency to bbc sounds provider

4 months agoAdd bbc sounds provider (#2567)
Kieran Hogg [Tue, 25 Nov 2025 17:45:29 +0000 (17:45 +0000)]
Add bbc sounds provider (#2567)

* Initial commit of BBC Sounds provider

* Remove unused SUPPORTED_FEATURES

* Remove commented code; tidy stream and provider variables; accept ruff formatting

* Add search

* Initial commit of BBC Sounds provider

* Remove unused SUPPORTED_FEATURES

* Remove commented code; tidy stream and provider variables; accept ruff formatting

* Add search

* Initial commit of BBC Sounds provider

* First version of (almost) the full Sounds functionality

* Remove accidental leading _ in get_podcast_episode()

* Use network logo and not programme image for schedule listing

* Remove commented out code

* Tidy up object titles and update to latest auntie-sounds API

* Remove unused supported features

* Add feature flag for blank image check

* Cancel now playing task and tidy up

* Update icons

* Return SUPPORTED_FEATURES with instance in setup()

* Remove the enable UK content toggle

* Remove boiler comments and tweak wording

* Check image_url is set after library change

* Update library version

* Fix typo in comment

Co-authored-by: OzGav <gavnosp@hotmail.com>
* Remove the check to provide the seekable stream version.

It's not yet used and has the potential to affect international users, so remove it be safe.

* Move fetching the menu to prevent it not being available if accessed by another route

* Add an advanced option to choose a stream format

* Update dependency version

* Remove unnecessary config options

* Remove a couple of incorrectly-set StreamDetails variables on Radio streams

* Tidy up after removing config options

* Add some sensible caching

* Increase cache expiry

* Add cache to get_podcast()

* Disable 'now playing' until supported in core

---------

Co-authored-by: OzGav <gavnosp@hotmail.com>
4 months agoBump ytmusic to 1.11.2 (#2675)
Marvin Schenkel [Tue, 25 Nov 2025 15:29:40 +0000 (16:29 +0100)]
Bump ytmusic to 1.11.2 (#2675)

4 months agoAdd niconico video Provider (#2339)
柴田 [Tue, 25 Nov 2025 13:57:10 +0000 (22:57 +0900)]
Add niconico video Provider (#2339)

* Initial comit of NicoNico provider

* Remove unwanted logout calls

* niconico: Split and organize classes

* Add artist retrieval method and fix Explorer mixin imports in Niconico provider

* Niconico: Enhance artist parsing with metadata and SNS links

* Niconico: Add sensitive content handling and improve recommendations feature

* Niconico: Implement series handling as albums and enhance library retrieval methods

* Niconico: Refactor the structure of the Nikoniko adapter and split the individual adapters into separate files.

* Niconico: Add URLs for playlists, tracks, and artists in parsers; update import in album mixin

* Refactor Niconico provider mixins and add configuration management

- Enhanced NiconicoMusicProviderExplorerMixin to fetch recommendations with filtering based on user history, following activities, and like history.
- Introduced NiconicoConfig class for managing provider-specific configurations, including recommendation counts and tag filtering.
- Implemented TagManager for caching and retrieving video tags asynchronously, with support for deduplication and periodic cleanup.
- Updated library mixin to support adding and removing tracks with auto-like functionality.
- Improved playlist mixin to handle adding and removing tracks from playlists with error handling.
- Added support for fetching and filtering tracks based on required tags in the track mixin.
- Created a new configuration file for Niconico provider settings.

* Niconico: Update workspace configuration to include additional paths and launch settings

* Niconico: Improve descriptions in configuration entries for clarity and consistency

* Niconico: Simplify get_artist_toptracks method to retrieve the newest 50 tracks

* Niconico: Add auto-sync and include library track artists settings; refactor library mixin

* Niconico: Refactor search methods for improved clarity and efficiency; update configuration entries for email and sensitive content handling

* Refactor Niconico search and user adapters; update parsing methods for improved track retrieval and error handling

* Niconico: Add methods for retrieving own videos and series; update configuration entries for improved content management

* Niconico: Enhance search and recommendation features; refactor configuration and constants for improved tag handling

* Refactor video parsing methods to handle None values and skip muted videos for improved track retrieval

* Remove Niconico server workspace configuration file

* Refactor Niconico provider: Enhance error handling, logging

- Replaced call_with_throttler with _call_with_throttler in NiconicoVideoAdapter for consistency.
- Removed handle_niconico_errors context manager and replaced it with direct logging in various mixins.
- Introduced log_verbose and log_verbose_operation functions for improved logging.
- Updated methods across mixins to utilize new logging functions and streamline error handling.
- Refactored tag management to improve caching and fetching logic.

* Niconico: Update icon SVG files for improved styling and add monochrome version

* Niconico: Renamed parsing to conversion functions for playlists, tracks, and series

* Refactor Niconico video adapter and track mixin: Improve type hints, enhance error handling, and streamline stream format processing

* Refactor type hints in adapter

* Renamed the provider from “niconico” to “nicovideo”.

* Nicovideo: Enhance cache management by limiting concurrent operations to reduce database load

* Nicovideo: Include own uploaded videos in library track retrieval

* Remove unused sensitive contents configuration from Nicovideo provider

* Update NicoVideo monochrome icon SVG with new design and filter effects

* Nicovideo: Add icons for various sections in the music provider explorer mixin

* Nicovideo: Improve tag fetching with async task locking to prevent race conditions

* Nicovideo: Refactor provider mixins and enhance core functionality with MixinCaller

* Nicovideo: Adjust low priority throttler period for improved background tag updates

* Refactor Nicovideo provider: enhance video fetching and tag management, remove TagManager

* Refactor logging in Nicovideo provider: Adjusted log levels.

* Nicovideo: Enhance error logging for ValidationError in API calls

* Refactor Nicovideo provider mixins: streamline library item retrieval and enhance caching logic

* Refactor Nicovideo Adapter Structure and Update Mixins

- Introduced a new NicovideoAdapterHub to centralize adapter functionality.
- Updated mixins to use the new adapter hub instead of individual adapters.
- Implemented utility functions for common operations across converters.
- Improved metadata handling and mapping for media items.
- Ensured compatibility with the latest niconico API changes.

* Refactor NicovideoTrackConverter: Move audio format creation logic to a dedicated method and remove unused utility function

* Refactor Nicovideo provider mixins: rename mixin files.

* Renamed from adapter to service.

* Refactor Nicovideo service architecture: rename Hub to Manager

* Add override decorator to get_stream_details method in NicovideoMusicProvider

* Add override decorators to library methods in artist and track mixins

* Refactor Nicovideo converters: replace utility functions with helper methods

* Remove unused logging import from album mixin

* First implementation of Nicovideo testing.

* Refactor track handling in NicovideoMusicProviderTrackMixin to improve stream metadata retrieval

* requirements: add yt-dlp version 2025.6.30 to dependencies

* fix: update artist mapping to return UniqueList for better handling

* feat: add DUMMY_IS_PEAK_TIME constant and update helper functions to use it; update requirements to include yt-dlp

* feat: update yt-dlp version to 2025.8.11 in manifest and requirements

* feat: update workflow and main.py to latest versions from dev and fixture-updates branches

* Refactor fixture data generation and saving process

- Updated JSON fixture files with dummy descriptions for testing purposes.
- Enhanced helper functions for consistent snapshot comparison and dynamic field stabilization.
- Introduced new scripts for generating and saving fixture data with integrated diff tracking.
- Improved logging for fixture generation and changes.

* fix: update schedule comment to reflect daily execution and enhance condition for fixture updates

* fix: update descriptions in test snapshots to use dummy text for consistency

* fix: remove obsolete check-test-session script

* fix: update release dates and dummy data in test fixtures for consistency

* fix: enhance stabilization logic by consolidating dynamic field and count value processing

* fix: streamline provider unload logic and improve error handling

* Refactoring: refactor niconico service methods to unify series and mylist retrieval logic.Made niconico_py_client accessible via properties in the service.

* Update fixtures-update-and-test.yml

* Refactor: streamline audio format handling by introducing create_audio_format function and centralizing constants

* Refactor: improve stream details handling by safely retrieving HTTP headers and simplifying audio format parameters

* update snapshot

* Fix: Add “extra_input_args” from streamdetails to get_preview_stream and adjust additional input arguments.

* Update fixtures-update-and-test.yml

* Refactoring: Added a stream converter to enhance the nicovideo provider and improve stream detail processing. Removed dependency on yt-dlp.

* - add StabilizationInfo
- Add Stream Test
- Called ruff after automatic generation.

* Fix: Update comment to clarify usage of StreamConversionData serialization in import statement

* Fix: Update media type checks in artist and track mixins for consistency

* Fix: Update search_videos_by_tags method to accept a single tag and streamline video search logic

* Refactoring: Remove unused BaseModel serialization strategy and related imports from helpers.py

* Fix: Rename search_videos_by_tags method to search_videos_by_tag for consistency

* Fix: Update error messages in artist mixin for clarity and detail; add note on playlist duplicate entries

* Fix: Enhance logging with safe argument summaries and caller information extraction

* Fix: Update niconico.py requirement to specific commit for stability

* Fix: Remove follow/unfollow artists functionality from Nicovideo configuration and artist mixin

* Fix: Removed logout upon unloading, and prevented attempts to log in again when authentication information is not available.

* Fix: Remove unnecessary login checks in various mixins and services to streamline data retrieval

* Fix: Enhance album mapping creation with optional thumbnail URL and update artist yield logic to handle ItemMapping conversion

* Fix: Changed to directly generate album and artist mappings.

* Fix: Changed to directly generate album and artist mappings.

* Fix: Update label for user session configuration to clarify cookie usage

* Fix: Remove stage from niconico video manifest

* Fix: Update workflow description to clarify NICONICO_SESSION requirement

* Fix: Rename nicovideo provider fixtures update and test workflow

* Fix: Simplify docstring in get_config_entries and add category comments in config entries

* Fix: Refactor get_config_entries_impl to separate config entry categories and simplify parameters

* Move :nicovideo workflows

* Fix: Update conversion function for SeriesData to handle album tracks

* Fix: Update usage instructions for fixture generation script to reflect correct environment variable

* Fix: Remove unused convert_to_netscape function and related imports

* Fix: Refactor configuration constants for nicovideo provider by moving keys to config.py and cleaning up imports

* Fix: Remove unused DUMMY_DESCRIPTION constant and update stabilization rule for description

* Refactor Nicovideo provider configuration system to use category-based structure

- Introduced a new configuration system for the Nicovideo provider, organizing settings into categories: Auth, Content, and Recommendations.
- Updated all relevant code to access configuration values through the new structure, replacing old method calls with direct attribute access.
- Enhanced clarity and maintainability of the configuration management by encapsulating related settings within dedicated classes.

* Fix: Move recommendation_filter_tags configuration to the correct position in RecommendationsConfigCategory

* Fix: Update recommendation configuration keys and labels for clarity and consistency

* Fix: Add integrated loudness to stream conversion output

* update snapshot loudness

* Add: Added dependency on niconico.py for lint testing.

* Fix: Update niconico.py dependency PEP 508 format in manifest and requirements files

* Remove unused get_supported_features_for_mixin methods

- Remove get_supported_features_for_mixin() from all mixins (base, artist, track, album, playlist, explorer)
- Remove unused ProviderFeature imports
- Features are now statically defined in __init__.py's SUPPORTED_FEATURES

* Simplify config: Remove Content and Recommendations categories

This change addresses PR review feedback requesting a simpler configuration.
The complex Content and Recommendations config categories have been removed
and replaced with sensible defaults:

- Content defaults: Include own mylists, exclude followed mylists
- Recommendations defaults: 25/50/30 track counts, no tag filtering
- Auto-like: Enabled by default
- Sensitive content: Mask by default

The removed complex configuration has been preserved in the
`add-nicovideo-advanced-options` branch for potential future enhancement.

This makes the initial provider setup much simpler while maintaining
core functionality.

* Refactor: Add @override, remove unused filtering, use SENSITIVE_CONTENTS constant

- Add missing @override decorator to get_library_playlists
- Remove _fetch_similar_tracks_with_filtering (no longer filters anything)
- Extract SENSITIVE_CONTENTS constant to nicovideo/constants.py
- Replace all hardcoded sensitive_contents with constant reference

These changes improve code clarity and maintainability.

* Update niconico.py dependency to the latest commit

* refactor: Simplify mixin architecture - remove MixinCaller abstraction

- Remove MixinCaller class with complex lambda-based invoke methods
- Replace with explicit for loops in provider methods
- Make class inheritance explicit (list 6 mixin classes directly)
- Convert provider_mixins/__init__.py to static __all__ list
- Move NICOVIDEO_MIXINS constant to provider.py
- Change reversed() to [::-1] for type checker compatibility

This addresses PR feedback about code complexity while maintaining
mixin-based separation of concerns.

* refactor: Remove provider-specific pre-commit hook

Remove check-nicovideo-test-session hook to maintain provider isolation.
Instead, enforce environment variable usage in fixture generation script:

- Require NICONICO_SESSION environment variable (no hardcoded fallback)
- Add clear error message when variable is not set
- Update documentation to reflect environment-only authentication

This prevents accidental credential commits while keeping the provider
isolated from repository-wide configuration.

* test: Update converter snapshots for new model fields

Update test snapshots to include new fields added to Music Assistant models:
- grouping: Album grouping field
- in_library: Library membership flag

* fix: nicovideo fixtures workflow - use pip instead of uv

- Remove dependency on uv and setup.sh
- Use standard pip installation like test.yml
- Remove unnecessary venv caching
- Simplify workflow by using GitHub Actions default Python environment

* fix: update niconico.py commit hash to latest (711729d)

- Align pyproject.toml with requirements_all.txt
- Fix dependency conflict in GitHub Actions

* refactor: remove nicovideo from mypy exclude list

- nicovideo provider is fully mypy strict mode compliant
- Dependencies managed via manifest.json and requirements_all.txt
- Align with other strict-mode compliant providers (spotify, deezer, etc.)

* fix: resolve mypy strict mode errors in nicovideo provider

- Add proper TYPE_CHECKING import for pydantic BaseModel
- Add explicit type casts to resolve no-any-return errors
- Import Any type for type annotations in tests
- Ensure all return statements have explicit types

* fix: add niconico.py to test dependencies for proper mypy type checking

- Add niconico.py to project.optional-dependencies[test]
- Revert manual type cast workarounds
- Ensures pydantic types from niconico.py are properly resolved during CI
- Simpler and more maintainable than type annotation workarounds

* fix: remove deprecated enable_cache parameter from StreamDetails

- Remove enable_cache parameter removed in music-assistant-models v1.1.61
- This fixes mypy errors after merging upstream/dev changes

* nicovideo snapshots update

* refactor(nicovideo): implement fast HLS seeking with StreamType.CUSTOM

Replace StreamType.HTTP with CUSTOM for optimized seeking support.

Key improvements:
- Parse m3u8 once during stream conversion (not per seek)
- Generate dynamic m3u8 starting from seek segment
- Separate responsibilities: fetch → parse → generate → stream
- Use VERBOSE logging for seek operations
- Organize helpers into directory structure

* nicovideo update test,fixture,snapshot

* Remove FFmpeg submodule directory

* refactor: remove get_stream_details_for_mixin pattern, use normal override in TrackMixin

* docs: add detailed comments explaining StreamType.CUSTOM seek optimization

- Add comprehensive explanation in stream.py for why CUSTOM is used
- Document two-stage seek optimization (segment selection + input-side -ss)
- Explain input-side -ss limitation (can't cross segment boundaries)
- Add stage-by-stage comments in get_audio_stream and create_stream_context
- Clarify performance trade-off vs output-side -ss

* refactor(nicovideo): improve HLS streaming code structure and naming

Major changes:
- Rename NicovideoHLSProcessor → HLSSeekOptimizer for clarity
- Extract HLS data models to separate hls_models.py file
- Standardize m3u8 → playlist terminology throughout codebase
- Add HLS prefix to public API names to avoid confusion with track playlists
- Introduce DOMAND_BID_COOKIE_NAME constant for authentication
- Update method names for better semantic clarity:
  * _get_stream_data → _prepare_conversion_data
  * convert_by_stream_data → convert_from_conversion_data
  * _fetch_hls_m3u8_text → _fetch_media_playlist_text
  * _serve_m3u8 → _serve_hls_playlist

File structure:
- hls_processor.py → hls_seek_optimizer.py (renamed)
- hls_models.py (new): ParsedHLSPlaylist, HLSSegment

All tests and fixtures updated accordingly.

* refactor(nicovideo/tests): improve test module architecture

- Simplify TypeToConverterMappingRegistry (remove 3 unused methods)
- Extract all stabilization logic into FieldStabilizer class
- Add helper method to ConverterTestRunner for clarity
- Document FixtureProcessorProtocol design intent

Reduces complexity while maintaining type safety and auto-update features

* refactor(nicovideo/tests): improve naming and separate concerns

Renamed classes for clarity:
- TypeToConverterMapping → APIResponseConverterMapping
- FixtureManager → FixtureLoader
- FixtureDataGenerators → APIFixtureCollector
- FixtureDataSaver → FixtureSaver
- PathToTypeMapper → FixtureTypeMappingCollector + FixtureTypeMappingFileGenerator

Changes:
- Updated method names: generate_* → collect_* in APIFixtureCollector
- Fixed type completion by changing list to tuple for API_RESPONSE_CONVERTER_MAPPINGS
- Removed re-export pattern from fixtures/__init__.py
- Added comprehensive documentation to test_converters.py

Benefits: clearer responsibilities, better type inference, improved maintainability

* fix: update niconico.py dependency to latest commit

* Refactor: Reorganize fixture structure and update documentation

- Move fixture generation to separate repository (music_assistant_nicovideo_fixtures)
- Restructure fixtures: use fixture_data/ for generated data
- Update fixture loading to use new structure with fixture_type_mappings
- Remove embedded fixture generation scripts from tests
- Add comprehensive README for test directory
- Update VS Code tasks for easier fixture updates
- Delete obsolete GitHub workflow for fixture generation

* refactor: apply @use_cache to nicovideo provider methods

- Apply @use_cache decorator to get_* methods for improved performance
- Remove manual cache handling (cache_track helper and complex album info updates)
- Adjust cache durations based on SoundCloud patterns:
  - get_artist: 14 days (was 30 days)
  - get_track: 14 days (was 7 days)
  - get_playlist: 14 days (was 30 days)
  - get_playlist_tracks: 3 hours (unchanged)
  - search: 3 hours (was 1 hour)
  - get_album methods: 7 days (unchanged)
- Simplify code by leveraging Music Assistant's standard caching system
- Fix imports and add proper noqa comments for @use_cache usage

* revert: remove VS Code launch configuration changes

Remove the 'Music Assistant: Snapshot Update' launch configuration that was
added in previous commits. As requested in PR review, this change belongs
in a separate PR focused on development tools rather than the nicovideo
provider implementation.

* refactor: remove inappropriate cross-controller iteration

Address PR feedback by removing methods that iterate other controllers:
- Remove get_library_tracks and get_library_albums methods
- Remove library_add_for_mixin and library_remove_for_mixin methods
- Remove get_library_artists iteration over tracks controller
- Remove corresponding ProviderFeature flags from SUPPORTED_FEATURES
- Fix imports and TYPE_CHECKING blocks

The provider now only handles its native concepts (followed artists,
mylists, series) without inappropriately accessing other controllers.
This aligns with Music Assistant's architecture where providers should
only return in-library or favorited items from their own domain.

* fix: remove unintended cache category from get_track

Remove category=1 parameter from @use_cache decorator in get_track method
to maintain consistency with other cached methods that use default
category 0. This aligns with the pattern used across other providers
and removes unnecessary complexity.

* fix: Move media item types out of TYPE_CHECKING to fix @use_cache runtime errors

- Move Album, Artist, Track imports from TYPE_CHECKING to regular imports in artist.py
- Add noqa: TC002 comments for @use_cache decorator compatibility
- Format media_items imports in track.py consistently
- Fixes NameError: name 'Artist' is not defined when using @use_cache decorator
- Aligns with other Music Assistant provider patterns

* refactor: improve get_following_activities and fix throttler settings

- Call get_track directly instead of get_provider_item for simplicity
- Remove unnecessary semaphore (throttler already handles rate limiting)
- Fix throttler settings: rate_limit=5, period=1 (5 req/sec) for high priority
- Fix low priority throttler: period=1 for consistency

* refactor: optimize get_following_activities to use direct Activity conversion

- Add convert_by_activity() method to track converter for lightweight feed conversion
- Replace get_track() loop with direct Activity-to-Track conversion
- Remove unnecessary asyncio.gather overhead
- Use ItemMapping for artist info instead of creating Owner objects
- Improves performance by reducing API calls from N+1 to 1

* Update test snapshots for upstream StreamDetails changes

* feat: switch from Git to PyPI reference for niconico.py-ma

- Update pyproject.toml to use niconico.py-ma==2.1.0.post1 from PyPI
- Update requirements_all.txt with PyPI package reference
- Update nicovideo provider manifest.json
- Update fixtures project dependency

This addresses PR feedback to use PyPI packages instead of Git references.

* chore: update fixture data docstring from generator

- Minor docstring update from fixture generation process
- No functional changes

* refactor(nicovideo): address Copilot review feedback

- Simplify to_dict_for_snapshot to assert dict return type
- Switch auth service logging to lazy % formatting
- Fix double space in recommendation folder label
- Document 'additionals' in codespell ignore list

* chore: remove niconico.py-ma dependency from test requirements

* Reimplement get_own_followings to fetch followed artists

Restore the ability to retrieve users that the current user is following,
which was removed during config simplification.

* Remove unused user service methods

Remove methods that are no longer used in the current MA architecture:
- get_following_mylists() - empty stub returning []
- get_following_playlists() - only called get_following_mylists
- follow_user() - no MA interface to call this
- unfollow_user() - no MA interface to call this

These were remnants from config simplification that have no callers.

* Remove unused methods from nicovideo implementation

- Remove NicovideoUserService.get_own_videos()
- Remove NicovideoVideoService.like_video()
- Remove NicovideoSeriesService.get_own_series()
- Remove NicovideoSearchService.search_videos_by_tag()
- Remove unused imports (VideoSearchSortKey, VideoSearchSortOrder)

* refactor: simplify throttler implementation in nicovideo provider

- Use existing helpers/throttle_retry.ThrottlerManager instead of custom implementation
- Remove unused priority control (ApiPriority.LOW was never used)
- Remove verbose logging (sanitization, argument summaries, success logs)
- Keep only error logging with caller info for diagnostics
- Align with other providers' logging patterns (Spotify, Qobuz, Tidal)

* docs: Add explanation for 'Domand' spelling in niconico API

Clarify that 'Domand' is the actual spelling used in niconico's API
(not a typo). This naming appears in API endpoints and throughout
their media delivery system classes.

* docs(nicovideo): clarify HLS seeking limitation in stream.py

Improve technical accuracy of comment explaining why input-side -ss
fails with HLS without playlist reconstruction.

Previous comment incorrectly suggested the issue was about 'crossing
segment boundaries', but the actual problem is that FFmpeg cannot
identify target segments before parsing the playlist structure.

This clarification better reflects the implementation constraint.

---------

Co-authored-by: Shi-553 <58556078+Shi-553@users.noreply.github>
4 months agoTyping fixes for the tracks controller (#2635)
OzGav [Tue, 25 Nov 2025 13:34:39 +0000 (23:34 +1000)]
Typing fixes for the tracks controller (#2635)

* Typing fixes for the tracks controller

* Fix logic change

* Fix _set_track_artist to handle ItemMappings without numeric IDs

* Remove db asserts

* Change base class

* Convert itemmapping to artist if needed

* convert itemmapping to artist if necessary #2

4 months agoChore(deps): Bump isort from 6.0.1 to 7.0.0 (#2517)
dependabot[bot] [Tue, 25 Nov 2025 13:32:23 +0000 (13:32 +0000)]
Chore(deps): Bump isort from 6.0.1 to 7.0.0 (#2517)

* Chore(deps): Bump isort from 6.0.1 to 7.0.0

Bumps [isort](https://github.com/PyCQA/isort) from 6.0.1 to 7.0.0.
- [Release notes](https://github.com/PyCQA/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyCQA/isort/compare/6.0.1...7.0.0)

---
updated-dependencies:
- dependency-name: isort
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
* Remove unused isort

---------

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>
4 months agoTyping fixes for the playlists controller (#2628)
OzGav [Tue, 25 Nov 2025 10:46:10 +0000 (20:46 +1000)]
Typing fixes for the playlists controller (#2628)

* Typing fixes for the playlists controller

* Re-add comment

* Fix typos

* Restore comments

* Remove db asserts

* Resolve conflicts

* adjust comment

---------

Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
4 months agoTyping fixes for the base media controller (#2633)
OzGav [Tue, 25 Nov 2025 10:42:29 +0000 (20:42 +1000)]
Typing fixes for the base media controller (#2633)

* Typing fixes for the base media controller

* Remove db asserts

* PR review comments

* remove unused function

---------

Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
4 months agoTyping fixes for the podcasts controller (#2627)
OzGav [Tue, 25 Nov 2025 10:34:03 +0000 (20:34 +1000)]
Typing fixes for the podcasts controller (#2627)

* Typing fixes for the podcasts controller

* Fix overlooked typing issue

* Remove db asserts

* Remove ignore

4 months agoSubsonic: Give user control over pagination size (#2665)
Eric Munson [Tue, 25 Nov 2025 08:32:08 +0000 (03:32 -0500)]
Subsonic: Give user control over pagination size (#2665)

The selected value of 500 entries per invocation may not be ideal for
all users. Given that there isn't a single value that is ideal for all
users, let each configure their own. The default is shrinking to 200 as
a starting point.

Signed-off-by: Eric B Munson <eric@munsonfam.org>
4 months agoChore(deps): Bump alexapy from 1.29.9 to 1.29.10 (#2670)
dependabot[bot] [Tue, 25 Nov 2025 08:27:34 +0000 (08:27 +0000)]
Chore(deps): Bump alexapy from 1.29.9 to 1.29.10 (#2670)

* Chore(deps): Bump alexapy from 1.29.9 to 1.29.10

Bumps [alexapy](https://gitlab.com/keatontaylor/alexapy) from 1.29.9 to 1.29.10.
- [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.9...v1.29.10)

---
updated-dependencies:
- dependency-name: alexapy
  dependency-version: 1.29.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
* Bump alexapy in 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>
4 months agoChore(deps): Bump certifi from 2025.10.5 to 2025.11.12 (#2671)
dependabot[bot] [Tue, 25 Nov 2025 08:24:28 +0000 (09:24 +0100)]
Chore(deps): Bump certifi from 2025.10.5 to 2025.11.12 (#2671)

Bumps [certifi](https://github.com/certifi/python-certifi) from 2025.10.5 to 2025.11.12.
- [Commits](https://github.com/certifi/python-certifi/compare/2025.10.05...2025.11.12)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2025.11.12
  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>
4 months agoChore(deps-dev): Bump ruff from 0.14.4 to 0.14.6 (#2672)
dependabot[bot] [Tue, 25 Nov 2025 08:23:50 +0000 (09:23 +0100)]
Chore(deps-dev): Bump ruff from 0.14.4 to 0.14.6 (#2672)

Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.4 to 0.14.6.
- [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.4...0.14.6)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.14.6
  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>
4 months agoChore(deps): Bump mashumaro from 3.16 to 3.17 (#2673)
dependabot[bot] [Tue, 25 Nov 2025 08:23:10 +0000 (09:23 +0100)]
Chore(deps): Bump mashumaro from 3.16 to 3.17 (#2673)

Bumps [mashumaro](https://github.com/Fatal1ty/mashumaro) from 3.16 to 3.17.
- [Release notes](https://github.com/Fatal1ty/mashumaro/releases)
- [Commits](https://github.com/Fatal1ty/mashumaro/compare/v3.16...v3.17)

---
updated-dependencies:
- dependency-name: mashumaro
  dependency-version: '3.17'
  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>
4 months agoPlex: added remote control feature (#2608)
anatosun [Tue, 25 Nov 2025 08:20:07 +0000 (09:20 +0100)]
Plex: added remote control feature (#2608)

* Plex: moved scrobbling and playback reporting logic to plugin

* Plex connect: introducing new plugin

* Plex Connect: implemented copilot's suggestions

* Plex connect: corrected link to documentation

Co-authored-by: OzGav <gavnosp@hotmail.com>
---------

Co-authored-by: OzGav <gavnosp@hotmail.com>
4 months agoFix handler type of register_api_command
Marvin Schenkel [Tue, 25 Nov 2025 08:10:18 +0000 (09:10 +0100)]
Fix handler type of register_api_command

4 months agoTyping fixes for the player queues controller (#2611)
OzGav [Tue, 25 Nov 2025 07:40:15 +0000 (17:40 +1000)]
Typing fixes for the player queues controller (#2611)

* Initial drafting

* Fix pyproject.toml

* Formatting

* Filter for track items

* Replace assert with error checks

* Fix grammar typo

* Lint

* Lint

* Revert assert

* Revert logic change

* Revert logic change

* add return type hints

* PR review fixes

* Fix play_media

* Remove some asserts

* Apply feedback

---------

Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
4 months ago⬆️ Update music-assistant-frontend to 2.17.9 (#2674)
music-assistant-machine [Tue, 25 Nov 2025 02:49:29 +0000 (03:49 +0100)]
⬆️ Update music-assistant-frontend to 2.17.9 (#2674)

Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
4 months agoSubsonic: Add ProviderFeature for Favorites (#2667)
Eric Munson [Mon, 24 Nov 2025 15:47:04 +0000 (10:47 -0500)]
Subsonic: Add ProviderFeature for Favorites (#2667)

These features were missing from
f2c30347988e5c31799a9ef9efa4f19e5eff1e60
Add the features we now provide.

Signed-off-by: Eric B Munson <eric@munsonfam.org>
4 months ago⬆️ Update music-assistant-models to 1.1.70 (#2666)
music-assistant-machine [Sun, 23 Nov 2025 22:01:04 +0000 (23:01 +0100)]
⬆️ Update music-assistant-models to 1.1.70 (#2666)

Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
4 months agoDisallow malicious playlist updates (#2661)
Marvin Schenkel [Sun, 23 Nov 2025 18:58:30 +0000 (19:58 +0100)]
Disallow malicious playlist updates (#2661)

4 months agoChore(deps): Bump actions/checkout from 5 to 6 (#2659)
dependabot[bot] [Sun, 23 Nov 2025 17:07:49 +0000 (18:07 +0100)]
Chore(deps): Bump actions/checkout from 5 to 6 (#2659)

Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  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>
4 months agoSubsonic: Support syncing favorites to subsonic server (#2663)
Eric Munson [Sun, 23 Nov 2025 16:34:47 +0000 (11:34 -0500)]
Subsonic: Support syncing favorites to subsonic server (#2663)

4 months ago⬆️ Update music-assistant-models to 1.1.69 (#2664)
music-assistant-machine [Sat, 22 Nov 2025 21:11:27 +0000 (22:11 +0100)]
⬆️ Update music-assistant-models to 1.1.69 (#2664)

Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
4 months agoTypes fixes for the Albums Controller (#2632)
OzGav [Fri, 21 Nov 2025 17:35:08 +0000 (03:35 +1000)]
Types fixes for the Albums Controller (#2632)

* Typing fixes for the albums controller

* Revert instance check

* Fix type annotations and mypy compliance

* Remove db asserts

* Switch uniquelist to list

* typo

4 months agoChore(deps): Bump pywidevine from 1.8.0 to 1.9.0 (#2590)
dependabot[bot] [Fri, 21 Nov 2025 15:43:20 +0000 (15:43 +0000)]
Chore(deps): Bump pywidevine from 1.8.0 to 1.9.0 (#2590)

* Chore(deps): Bump pywidevine from 1.8.0 to 1.9.0

Bumps [pywidevine](https://github.com/devine-dl/pywidevine) from 1.8.0 to 1.9.0.
- [Release notes](https://github.com/devine-dl/pywidevine/releases)
- [Changelog](https://github.com/devine-dl/pywidevine/blob/master/CHANGELOG.md)
- [Commits](https://github.com/devine-dl/pywidevine/compare/v1.8.0...v1.9.0)

---
updated-dependencies:
- dependency-name: pywidevine
  dependency-version: 1.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
* Also bump deps in the provider

---------

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>
4 months agoChore(deps): Bump liblistenbrainz from 0.6.0 to 0.6.1 (#2592)
dependabot[bot] [Fri, 21 Nov 2025 15:29:30 +0000 (15:29 +0000)]
Chore(deps): Bump liblistenbrainz from 0.6.0 to 0.6.1 (#2592)

* Chore(deps): Bump liblistenbrainz from 0.6.0 to 0.6.1

Bumps [liblistenbrainz](https://github.com/metabrainz/liblistenbrainz) from 0.6.0 to 0.6.1.
- [Release notes](https://github.com/metabrainz/liblistenbrainz/releases)
- [Commits](https://github.com/metabrainz/liblistenbrainz/compare/v0.6.0...v0.6.1)

---
updated-dependencies:
- dependency-name: liblistenbrainz
  dependency-version: 0.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
* Also bump deps in the provider

---------

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>
4 months agoFix Chromecast volume rounding bug (#2656)
OzGav [Fri, 21 Nov 2025 15:26:29 +0000 (01:26 +1000)]
Fix Chromecast volume rounding bug (#2656)

* Fix Chromecast volume rounding bug for values 8% and below

Changed volume level conversion from int() to round() to fix floating-point
precision issues. Chromecast reports volume as float (0.0-1.0) which can have
slight imprecision (e.g., 4% = 0.03999999910593033). Using int() truncated
these values, causing displayed volume to be 1% less than actual for values
8% and below.

Fixes the issue where setting volume to 5% would display as 4%, etc.

* Fix Chromecast volume rounding bug for values 8% and below

Changed volume level conversion to use round() instead of int() in both
directions to fix floating-point precision issues:

1. When setting volume: round to 2 decimal places before sending to device
2. When reading volume: round to nearest integer when converting to percentage

This fixes the issue where Chromecast reports volume as float (0.0-1.0) with
slight imprecision (e.g., 4% = 0.03999999910593033). Using int() truncated
these values, causing displayed volume to be 1% less than actual for values
8% and below.

Fixes the issue where setting volume to 5% would display as 4%, etc.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
4 months agoChore(deps): Bump aiohttp from 3.13.1 to 3.13.2 (#2620)
dependabot[bot] [Fri, 21 Nov 2025 14:40:08 +0000 (15:40 +0100)]
Chore(deps): Bump aiohttp from 3.13.1 to 3.13.2 (#2620)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.13.2
  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>
4 months agoTyping fixes for the audiobooks controller (#2626)
OzGav [Fri, 21 Nov 2025 14:22:41 +0000 (00:22 +1000)]
Typing fixes for the audiobooks controller (#2626)

* Typing fixes for the audiobooks controller

* Remove duplicate code

* Remove db asserts

4 months agofix(tidal): auth refresh time diff (#2653)
Jozef Kruszynski [Fri, 21 Nov 2025 14:12:30 +0000 (15:12 +0100)]
fix(tidal): auth refresh time diff (#2653)

* fix(tidal): auth refresh time diff

Auth expiration check was using only 60 seconds rather than the intended
60 minutes. Using timedelta to show full intention

Closes #4425

* fix(tidal): invert current logic, and use constant for buffer

4 months agoDisable Zone Handling if needed for MusicCast players (#2650)
Fabian Munkes [Fri, 21 Nov 2025 14:10:51 +0000 (15:10 +0100)]
Disable Zone Handling if needed for MusicCast players (#2650)

* disable zone handling if desired

* bump lib

* wording

---------

Co-authored-by: OzGav <gavnosp@hotmail.com>
4 months agoTyping fixes for artists controller (#2625)
OzGav [Fri, 21 Nov 2025 14:05:56 +0000 (00:05 +1000)]
Typing fixes for artists controller (#2625)

* Typing fixes for artists controller

* Fix circular import

* Minor type change

* Switch tracks method return type to list

* Remove db asserts

* fix albums() return type

4 months agoAdd TLS options with fingerprint support to Fully Kiosk provider (#2649)
Miguel Angel Nubla [Fri, 21 Nov 2025 12:52:52 +0000 (13:52 +0100)]
Add TLS options with fingerprint support to Fully Kiosk provider (#2649)

* feat(fully-kiosk): add TLS options with fingerprint support

* fix(fully_kiosk): satisfy linters

---------

Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
4 months agoSome typing fixes for the music controller (#2629)
OzGav [Fri, 21 Nov 2025 10:38:20 +0000 (20:38 +1000)]
Some typing fixes for the music controller (#2629)

* Some typing fixes for the music controller

* Make self.database a property

* Restore comment

4 months agoUpdate alexapy requirement to version 1.29.9 (#2647)
Michael Ansel [Thu, 20 Nov 2025 18:24:05 +0000 (13:24 -0500)]
Update alexapy requirement to version 1.29.9 (#2647)

* Update alexapy requirement to version 1.29.9

Fix for login issues with Alexa Player Provider.

Changelog: https://gitlab.com/keatontaylor/alexapy/-/blob/dev/CHANGELOG.md#v1299-2025-11-08

Motivating discussion: https://github.com/orgs/music-assistant/discussions/431#discussioncomment-14954976

* Update requirements_all.txt for alexapy 1.29.9

Generated using scripts/gen_requirements_all.py

---------

Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
4 months agoAdd VBAN Receiver plugin provider (#2498)
sprocket-9 [Thu, 20 Nov 2025 13:06:19 +0000 (13:06 +0000)]
Add VBAN Receiver plugin provider (#2498)

4 months agoEnable disabled lint rules (#2658)
OzGav [Thu, 20 Nov 2025 13:04:47 +0000 (23:04 +1000)]
Enable disabled lint rules (#2658)

4 months agoUndo yield to event loop
Marvin Schenkel [Wed, 19 Nov 2025 08:27:01 +0000 (09:27 +0100)]
Undo yield to event loop

4 months ago⬆️ Update music-assistant-frontend to 2.17.8 (#2655)
music-assistant-machine [Wed, 19 Nov 2025 02:46:23 +0000 (03:46 +0100)]
⬆️ Update music-assistant-frontend to 2.17.8 (#2655)

Co-authored-by: marcelveldt <6389780+marcelveldt@users.noreply.github.com>
4 months agoChore(deps-dev): Bump ruff from 0.14.3 to 0.14.4 (#2621)
dependabot[bot] [Tue, 18 Nov 2025 13:48:01 +0000 (14:48 +0100)]
Chore(deps-dev): Bump ruff from 0.14.3 to 0.14.4 (#2621)

Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.3 to 0.14.4.
- [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.3...0.14.4)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.14.4
  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>
4 months agoYTM: Yield control to event loop during stream url resolution to prevent blocking...
Marvin Schenkel [Tue, 18 Nov 2025 13:43:31 +0000 (14:43 +0100)]
YTM: Yield control to event loop during stream url resolution to prevent blocking the main thread.

4 months agoRefactor streams controller + smart fades (#2613)
Marvin Schenkel [Tue, 18 Nov 2025 13:42:01 +0000 (14:42 +0100)]
Refactor streams controller + smart fades  (#2613)

* Refactor streamscontroller + smartfades

* Adjust log levels and add mixer property

* Define separate smart fades logger in the streamcontroller

* Define separate smart fades logger in the streamcontroller

* Remove leftover

* Rewrite loggers as instance attributes

4 months agoFix DLNA player showing external source instead of MA queue (#2648)
OzGav [Tue, 18 Nov 2025 11:54:47 +0000 (21:54 +1000)]
Fix DLNA player showing external source instead of MA queue (#2648)

4 months agoFix Spotify audiobook instance routing (#2502)
OzGav [Tue, 18 Nov 2025 11:27:42 +0000 (21:27 +1000)]
Fix Spotify audiobook instance routing (#2502)

4 months agoTyping fixes for snapcast (#2624)
OzGav [Tue, 18 Nov 2025 11:08:34 +0000 (21:08 +1000)]
Typing fixes for snapcast (#2624)

* Typing fix for SiriusXM

* Typing fixes for snapcast

* fix return types

* Remove erroneous commit

* Revert erroneous commit

* Fix minor errors

4 months agoTyping fixes for the stream controller (#2540)
OzGav [Tue, 18 Nov 2025 09:53:26 +0000 (19:53 +1000)]
Typing fixes for the stream controller (#2540)

* work in progress

* mypy fixes for streams.py

* Fix typos

* Another typo

* PR review changes

* Fixes after merge conflicts

* Revert unnecessary change

* Remove unnecessary comments

* More changes post conflict resolve

* Remove exclude

* organise imports

* Updates post other commits

* Catch possible no stream details

* Updates for new commits

* Fix type error post conflict merge

* Simplify

* Simplify with type hints to config controller

* Typing adjustments

* Fix missing return type

* improve code clarity

* switch to assert for none check

* Fix return type mypy error

* Revert unnecessary bracket

* Use default parameter

4 months agoImprove lyrics lookup failure visibility (#2651)
OzGav [Tue, 18 Nov 2025 08:58:48 +0000 (18:58 +1000)]
Improve lyrics lookup failure visibility (#2651)

4 months agoTyping fix for SiriusXM (#2623)
OzGav [Tue, 18 Nov 2025 08:52:28 +0000 (18:52 +1000)]
Typing fix for SiriusXM (#2623)

4 months agoTyping fixes for the Cache controller (#2569)
OzGav [Tue, 18 Nov 2025 07:37:55 +0000 (17:37 +1000)]
Typing fixes for the Cache controller (#2569)

* mypy fixes for cache.py

* Fix  __init__ signature to match CoreController

* Adjust checksum typing

* Guarantee checksum is a str

* Apply suggestion from @marcelveldt

---------

Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
4 months agoAdd default value argument to get_*_config_value
Marcel van der Veldt [Mon, 17 Nov 2025 22:25:55 +0000 (23:25 +0100)]
Add default value argument to get_*_config_value

4 months agoMinor AirPlay tweaks (#2646)
OzGav [Mon, 17 Nov 2025 14:05:38 +0000 (00:05 +1000)]
Minor AirPlay tweaks (#2646)

4 months agoAdd type hints to config controller functions (#2639)
Marcel van der Veldt [Mon, 17 Nov 2025 11:20:30 +0000 (12:20 +0100)]
Add type hints to config controller functions (#2639)

4 months agoAdd (initial) support for AirPlay 2 (#2571)
Brad Keifer [Sun, 16 Nov 2025 19:26:09 +0000 (06:26 +1100)]
Add (initial) support for AirPlay 2 (#2571)

4 months agoHandle non-UTF8 .lrc files gracefully to prevent playback blocking (#2640)
OzGav [Sun, 16 Nov 2025 19:15:09 +0000 (05:15 +1000)]
Handle non-UTF8 .lrc files gracefully to prevent playback blocking (#2640)

4 months agoFix squeezelite sync group source selection (#2642)
OzGav [Sun, 16 Nov 2025 19:13:40 +0000 (05:13 +1000)]
Fix squeezelite sync group source selection (#2642)

Fix squeezelite group playback

4 months agofix: tracks tab not being populated (#2637)
anatosun [Sun, 16 Nov 2025 09:16:15 +0000 (10:16 +0100)]
fix: tracks tab not being populated (#2637)

4 months agofix: abs progress (again!) (#2641)
Fabian Munkes [Sun, 16 Nov 2025 08:46:28 +0000 (09:46 +0100)]
fix: abs progress (again!) (#2641)

* fix: another progress fix

* fix: forgot a not

4 months agoUpdate Resonate provider with `MULTI_DEVICE_DSP` support and other improvements ...
Maxim Raznatovski [Fri, 14 Nov 2025 15:02:16 +0000 (16:02 +0100)]
Update Resonate provider with `MULTI_DEVICE_DSP` support and other improvements (#2616)

* Update `MediaStream` usage

* Support `MULTI_DEVICE_DSP` for resonate

* Rename `stream` to `channel` in `MediaStream`

* Initial working implementation for per player DSP support

* Refactors, fixes, and comments

* Rename `shared_buffer` to `chunk_buffer`

* Use `UUID` instead of `str`

* Use seconds in `multi_client_stream`

* Move attribute definitions to class level

* Remove dead code

* Refactor `_cleanup_old_chunks`

* Rename `MultiClientStream` to `TimedClientStream`

* Refactor `_read_chunk_from`

* Convert main channel to 16-bit PCM for aioresonate compatibility

* Use separate host and advertise_host

Pass bind_ip for socket binding and publish_ip for mDNS advertising to
correctly handle scenarios where the server binds to all interfaces
(0.0.0.0) but advertises a specific IP address to clients.

* Bump `aioresonate`

* Add safety check to `TimedClientStream` to avoid memory leaks

* Update `MIN_BUFFER_DURATION` comment with findings

* Update music_assistant/providers/resonate/timed_client_stream.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Clean up `timed_client_stream` reference after playback

* Bump `aioresonate`

* Update call to the now async friendly `set_media_art`

* Update `playback_state` when joining a new group

* Update `group_members` based on `aioresonate` events

Instead of optimistically setting them.

* Move `MusicAssistantMediaStream` outside a method

* Run audio cleanup immediately

* Remove redundant type annotation

* Use `anext()`

* Remove unused async from `_cleanup_old_chunks`

* Simplify method name and clarify lock requirement

* Move `_generate` to class-level method

* Refactor `MusicAssistantMediaStream` parameters

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
4 months agoDelete and ignore uv.lock file
Marvin Schenkel [Fri, 14 Nov 2025 14:04:30 +0000 (15:04 +0100)]
Delete and ignore uv.lock file

4 months agoFix CI by installing all provider's dependencies when linting (#2619)
Maxim Raznatovski [Fri, 14 Nov 2025 13:32:45 +0000 (14:32 +0100)]
Fix CI by installing all provider's dependencies when linting (#2619)

Fix CI lint job by installing all provider dependencies

4 months agoAdded deno for YTMusic Provider (#2636)
Dnny44 [Thu, 13 Nov 2025 17:35:14 +0000 (11:35 -0600)]
Added deno for YTMusic Provider (#2636)

* Added deno for YTMusic Provider

* Commiting uv lock

4 months agoFix UGP member detection in `get_stream` (#2617)
Maxim Raznatovski [Mon, 10 Nov 2025 13:39:59 +0000 (14:39 +0100)]
Fix UGP member detection in `get_stream` (#2617)

4 months agoUse `get_stream` helper in builtin player (#2618)
Maxim Raznatovski [Mon, 10 Nov 2025 13:38:57 +0000 (14:38 +0100)]
Use `get_stream` helper in builtin player (#2618)

4 months agoTyping fixes for the Qobuz provider (#2610)
OzGav [Mon, 10 Nov 2025 09:43:22 +0000 (19:43 +1000)]
Typing fixes for the Qobuz provider (#2610)

4 months agoUse secure connection to MusicBrainz API (#2615)
mtdcr [Sun, 9 Nov 2025 23:01:10 +0000 (00:01 +0100)]
Use secure connection to MusicBrainz API (#2615)

5 months agoUpdate base image versions to 1.4.8
Marcel van der Veldt [Sun, 9 Nov 2025 08:34:19 +0000 (09:34 +0100)]
Update base image versions to 1.4.8

5 months agoRemove explicit lvvmlite and numpy dependencies now that we are using debian.
Marvin Schenkel [Sat, 8 Nov 2025 15:59:59 +0000 (16:59 +0100)]
Remove explicit lvvmlite and numpy dependencies now that we are using debian.

5 months agoApple Music: Add remaining favourite parsing + custom music token config (#2609)
Marvin Schenkel [Sat, 8 Nov 2025 11:49:19 +0000 (12:49 +0100)]
Apple Music: Add remaining favourite parsing + custom music token config (#2609)

5 months agoAdd logging filter
Marcel van der Veldt [Sat, 8 Nov 2025 11:39:37 +0000 (12:39 +0100)]
Add logging filter

5 months agoFix bugs in webserver
Marcel van der Veldt [Fri, 7 Nov 2025 17:43:11 +0000 (18:43 +0100)]
Fix bugs in webserver

5 months agoTyping fixes for the config controller (#2570)
OzGav [Fri, 7 Nov 2025 16:18:39 +0000 (02:18 +1000)]
Typing fixes for the config controller (#2570)

5 months agoRefactor Smart fades (#2582)
Marvin Schenkel [Fri, 7 Nov 2025 16:16:53 +0000 (17:16 +0100)]
Refactor Smart fades (#2582)

5 months agoTyping fixes for the squeezelite provider (#2589)
OzGav [Fri, 7 Nov 2025 16:16:21 +0000 (02:16 +1000)]
Typing fixes for the squeezelite provider (#2589)

5 months agofix macos librespot binary
Marcel van der Veldt [Fri, 7 Nov 2025 16:12:35 +0000 (17:12 +0100)]
fix macos librespot binary

5 months agoApple music improvements (#2607)
Marvin Schenkel [Fri, 7 Nov 2025 15:51:42 +0000 (16:51 +0100)]
Apple music improvements (#2607)

5 months agoRemove sonos workaround
Marcel van der Veldt [Fri, 7 Nov 2025 14:47:30 +0000 (15:47 +0100)]
Remove sonos workaround

5 months agoMore crossfade tweaks
Marcel van der Veldt [Fri, 7 Nov 2025 14:47:18 +0000 (15:47 +0100)]
More crossfade tweaks

5 months agoMerge branch 'dev' of https://github.com/music-assistant/server into dev
Marcel van der Veldt [Fri, 7 Nov 2025 11:48:43 +0000 (12:48 +0100)]
Merge branch 'dev' of https://github.com/music-assistant/server into dev

5 months agoAdd more debugging of stopped streams
Marcel van der Veldt [Fri, 7 Nov 2025 11:48:38 +0000 (12:48 +0100)]
Add more debugging of stopped streams

5 months agofix: abs: another in progress fix (#2605)
Fabian Munkes [Fri, 7 Nov 2025 10:47:01 +0000 (11:47 +0100)]
fix: abs: another in progress fix (#2605)

5 months agofix: MusicCast - non-existing player in zone handling (#2606)
Fabian Munkes [Fri, 7 Nov 2025 10:46:01 +0000 (11:46 +0100)]
fix: MusicCast - non-existing player in zone handling (#2606)

5 months agoyield to loop tweaks
Marcel van der Veldt [Fri, 7 Nov 2025 10:38:49 +0000 (11:38 +0100)]
yield to loop tweaks

5 months agoTyping fixes for the Webserver controller (#2586)
OzGav [Fri, 7 Nov 2025 08:06:25 +0000 (18:06 +1000)]
Typing fixes for the Webserver controller (#2586)

* Fix merge conflicts

* more mypy fixes

* Drafting post upstream changes

* fix run_handler

* PR review comment

* Merge conflict fixes

* Fix WebserverController __init__ signature to match CoreController

5 months agoEnsure Spotify Connect is passive
Marcel van der Veldt [Fri, 7 Nov 2025 00:54:55 +0000 (01:54 +0100)]
Ensure Spotify Connect is passive

5 months agoAdd some temporary debug info to stream controller
Marcel van der Veldt [Fri, 7 Nov 2025 00:49:11 +0000 (01:49 +0100)]
Add some temporary debug info to stream controller

5 months agoAdd Airport Receiver Plugin provider (#2604)
Marcel van der Veldt [Fri, 7 Nov 2025 00:04:14 +0000 (01:04 +0100)]
Add Airport Receiver Plugin provider (#2604)

5 months agoAdd logging to Spotify streaming
Marcel van der Veldt [Thu, 6 Nov 2025 21:19:58 +0000 (22:19 +0100)]
Add logging to Spotify streaming

5 months agoFix Spotify streaming (#2603)
Marcel van der Veldt [Thu, 6 Nov 2025 20:33:51 +0000 (21:33 +0100)]
Fix Spotify streaming (#2603)

5 months agoFix deadlock when trying to join a paused Airplay player to a group (#2602)
Marvin Schenkel [Thu, 6 Nov 2025 20:25:56 +0000 (21:25 +0100)]
Fix deadlock when trying to join a paused Airplay player to a group (#2602)

5 months agoAdd more error handling and logging to (different sample rate) crossfade actions
Marcel van der Veldt [Thu, 6 Nov 2025 13:06:40 +0000 (14:06 +0100)]
Add more error handling and logging to (different sample rate) crossfade actions

5 months agoFix: start stream as fast as possible
Marcel van der Veldt [Thu, 6 Nov 2025 11:44:27 +0000 (12:44 +0100)]
Fix: start stream as fast as possible

Dont wait until the buffer has the crossfade duration if we just started playback

5 months agotry other values for readrate
Marcel van der Veldt [Thu, 6 Nov 2025 03:06:21 +0000 (04:06 +0100)]
try other values for readrate

5 months agoSmall fix for source switching
Marcel van der Veldt [Thu, 6 Nov 2025 00:22:17 +0000 (01:22 +0100)]
Small fix for source switching

5 months agodebug log check_binary returncode and output
Brad Keifer [Wed, 5 Nov 2025 04:57:49 +0000 (15:57 +1100)]
debug log check_binary returncode and output

5 months agoMerge branch 'dev' of https://github.com/music-assistant/server into dev
Marcel van der Veldt [Wed, 5 Nov 2025 20:37:38 +0000 (21:37 +0100)]
Merge branch 'dev' of https://github.com/music-assistant/server into dev

5 months agoFix AirPlay late join sync
Marcel van der Veldt [Wed, 5 Nov 2025 20:37:34 +0000 (21:37 +0100)]
Fix AirPlay late join sync

5 months agoFix typo in active source property
Marcel van der Veldt [Wed, 5 Nov 2025 20:36:56 +0000 (21:36 +0100)]
Fix typo in active source property

5 months agoAllow buffered named pipe writing
Marcel van der Veldt [Wed, 5 Nov 2025 20:36:35 +0000 (21:36 +0100)]
Allow buffered named pipe writing