From aa6a7306cf203805f1fdb50081408da2bcb5a27f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sat, 23 May 2026 00:29:20 +0200 Subject: [PATCH 01/17] cliairplay: 1.1-unstable-2026-03-16 -> 1.5-unstable-2026-05-03 --- pkgs/by-name/cl/cliairplay/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/cl/cliairplay/package.nix b/pkgs/by-name/cl/cliairplay/package.nix index 389e973e6cb6..c357c16d8284 100644 --- a/pkgs/by-name/cl/cliairplay/package.nix +++ b/pkgs/by-name/cl/cliairplay/package.nix @@ -25,16 +25,16 @@ stdenv.mkDerivation { pname = "cliairplay"; # see the beginning of configure.ac for the upstream version number - version = "1.1-unstable-2026-03-16"; + version = "1.5-unstable-2026-05-03"; src = fetchFromGitHub { owner = "music-assistant"; repo = "cliairplay"; # we try to closely match the commit used in the last music-assistant release from # https://github.com/music-assistant/server/tree/stable/music_assistant/providers/airplay/bin - rev = "991c65acc2afa17ffe32e279dbc585b0b7f530f8"; + rev = "6aeceb49e4e37d044f09be9369b082fc26bcfa19"; fetchSubmodules = true; - hash = "sha256-m1O4l6gFEGNAyskYcRHcA15cubZnNgkaYjdVThRRX7w="; + hash = "sha256-Z2LzRhtQpuXPK6KibnxCqP0V6CulzkwNVHX1V7AFnDA="; }; nativeBuildInputs = [ From 2dd4de66564cee1f1d6867139e8b2a79213e54e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 22 May 2026 01:40:49 +0200 Subject: [PATCH 02/17] python314Packages.aiosendspin: 4.4.0 -> 6.0.5 Diff: https://github.com/Sendspin/aiosendspin/compare/4.4.0...6.0.5 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/5.0.0 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/5.1.0 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/5.1.1 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/5.1.2 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/5.2.0 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/5.3.0 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/6.0.0 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/6.0.1 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/6.0.2 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/6.0.3 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/6.0.4 Changelog: https://github.com/Sendspin/aiosendspin/releases/tag/6.0.5 --- .../python-modules/aiosendspin/default.nix | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/pkgs/development/python-modules/aiosendspin/default.nix b/pkgs/development/python-modules/aiosendspin/default.nix index c56e51a03d3f..3f661ddceaa2 100644 --- a/pkgs/development/python-modules/aiosendspin/default.nix +++ b/pkgs/development/python-modules/aiosendspin/default.nix @@ -29,17 +29,17 @@ buildPythonPackage (finalAttrs: { pname = "aiosendspin"; - version = "4.4.0"; + version = "6.0.5"; pyproject = true; src = fetchFromGitHub { owner = "Sendspin"; repo = "aiosendspin"; tag = finalAttrs.version; - hash = "sha256-7edFCGNbECW5rrTbF7vJ4lJUc2IrQZD9VTR3IxJRP08="; + hash = "sha256-veX6MZSqEQb+tEqZTEgdCObLdaVPJEdTFW5Ivmb0TNQ="; }; - # https://github.com/Sendspin/aiosendspin/blob/4.4.0/pyproject.toml#L7 + # https://github.com/Sendspin/aiosendspin/blob/5.3.0/pyproject.toml#L27 postPatch = '' substituteInPlace pyproject.toml \ --replace-fail 'version = "0.0.0"' 'version = "${finalAttrs.version}"' @@ -54,20 +54,26 @@ buildPythonPackage (finalAttrs: { dependencies = [ aiohttp - av mashumaro - numpy orjson - pillow zeroconf ]; + optional-dependencies = { + server = [ + av + numpy + pillow + ]; + }; + nativeCheckInputs = [ pytest-aiohttp pytest-cov-stub pytest-xdist pytestCheckHook - ]; + ] + ++ finalAttrs.passthru.optional-dependencies.server; pythonImportsCheck = [ "aiosendspin" From 4f1def1558f94029e0723c7539451a1a0dfa0036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 22 May 2026 01:16:31 +0200 Subject: [PATCH 03/17] python314Packages.aiovban: 0.7.0 -> 1.1.0 Diff: https://github.com/wmbest2/aiovban/compare/v0.7.0...v1.1.0 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v0.8.0 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.0.2 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.0.3 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.0.4 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.0.5 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.0.6 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.0.7 Changelog: https://github.com/wmbest2/aiovban/releases/tag/v1.1.0 --- .../python-modules/aiovban/default.nix | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/pkgs/development/python-modules/aiovban/default.nix b/pkgs/development/python-modules/aiovban/default.nix index 67440599968d..5f56f697b3e9 100644 --- a/pkgs/development/python-modules/aiovban/default.nix +++ b/pkgs/development/python-modules/aiovban/default.nix @@ -1,32 +1,52 @@ { lib, + aiovban-pyaudio, buildPythonPackage, fetchFromGitHub, - setuptools, pytestCheckHook, + textual, + uv-build, music-assistant, }: buildPythonPackage (finalAttrs: { pname = "aiovban"; - version = "0.7.0"; + version = "1.1.0"; pyproject = true; src = fetchFromGitHub { owner = "wmbest2"; repo = "aiovban"; tag = "v${finalAttrs.version}"; - hash = "sha256-0mhpmpsV0zSOWbhrPF9bfR9xAtJe6X57guWDZWMH6f0="; + hash = "sha256-yPp4+aQGJISTIFI/OoO7+mAR8daEytxrQn21SsFWEyc="; }; - build-system = [ setuptools ]; + postPatch = '' + substituteInPlace pyproject.toml \ + --replace-fail "uv_build>=0.10.0,<0.11.0" "uv_build" + ''; - nativeCheckInputs = [ pytestCheckHook ]; + build-system = [ uv-build ]; + + dependencies = [ textual ]; + + # avoid infinite recursion with aiovban-pyaudio + doCheck = false; + + nativeCheckInputs = [ + aiovban-pyaudio + pytestCheckHook + ] + ++ aiovban-pyaudio.optional-dependencies.cli; pythonImportsCheck = [ "aiovban" ]; + passthru.tests = finalAttrs.finalPackage.overrideAttrs (_: { + doInstallCheck = true; + }); + meta = { changelog = "https://github.com/wmbest2/aiovban/releases/tag/${finalAttrs.src.tag}"; description = "Asyncio VBAN Protocol Wrapper"; From d155d8ea719f2023d4efd072f3286a7457ba4b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 22 May 2026 01:38:09 +0200 Subject: [PATCH 04/17] python314Packages.aiovban-pyaudio: init at 1.1.0 --- .../aiovban-pyaudio/default.nix | 44 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 + pkgs/top-level/python-packages.nix | 2 + 3 files changed, 48 insertions(+) create mode 100644 pkgs/development/python-modules/aiovban-pyaudio/default.nix diff --git a/pkgs/development/python-modules/aiovban-pyaudio/default.nix b/pkgs/development/python-modules/aiovban-pyaudio/default.nix new file mode 100644 index 000000000000..d4d74d872661 --- /dev/null +++ b/pkgs/development/python-modules/aiovban-pyaudio/default.nix @@ -0,0 +1,44 @@ +{ + lib, + setproctitle, + uvloop, + aiovban, + buildPythonPackage, + pyaudio, + setuptools, +}: + +buildPythonPackage (finalAttrs: { + pname = "aiovban-pyaudio"; + inherit (aiovban) version pyproject src; + + sourceRoot = "${aiovban.src.name}/aiovban_pyaudio"; + + build-system = [ setuptools ]; + + dependencies = [ + aiovban + pyaudio + ]; + + pythonImportsCheck = [ + "aiovban_pyaudio" + ]; + + optional-dependencies = { + cli = [ + setproctitle + uvloop + ]; + }; + + __structuredAttrs = true; + + meta = { + changelog = "https://github.com/wmbest2/aiovban/releases/tag/${finalAttrs.src.tag}"; + description = "PyAudio wrapper for aiovban"; + homepage = "https://github.com/wmbest2/aiovban/tree/main/aiovban_pyaudio"; + license = lib.licenses.mit; + inherit (aiovban.meta) maintainers; + }; +}) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index cdbd50d537e5..5be68bdc26a1 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1855,6 +1855,8 @@ with pkgs; cffconvert = python3Packages.toPythonApplication python3Packages.cffconvert; + aiovban-pyaudio = python3Packages.toPythonApplication python3Packages.aiovban-pyaudio; + clickhouse-lts = callPackage ../by-name/cl/clickhouse/lts.nix { }; cmdpack = callPackages ../tools/misc/cmdpack { }; diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 30560967024b..d03e71bd3826 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -578,6 +578,8 @@ self: super: with self; { aiovban = callPackage ../development/python-modules/aiovban { }; + aiovban-pyaudio = callPackage ../development/python-modules/aiovban-pyaudio { }; + aiovlc = callPackage ../development/python-modules/aiovlc { }; aiovodafone = callPackage ../development/python-modules/aiovodafone { }; From f23faf05018370d08ae790e982e1e3c86260d4a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 22 May 2026 04:09:16 +0200 Subject: [PATCH 05/17] python314Packages.beat-this: init at 1.1.0 --- .../python-modules/beat-this/default.nix | 73 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 75 insertions(+) create mode 100644 pkgs/development/python-modules/beat-this/default.nix diff --git a/pkgs/development/python-modules/beat-this/default.nix b/pkgs/development/python-modules/beat-this/default.nix new file mode 100644 index 000000000000..09211960cf3a --- /dev/null +++ b/pkgs/development/python-modules/beat-this/default.nix @@ -0,0 +1,73 @@ +{ + lib, + buildPythonPackage, + einops, + fetchFromGitHub, + fetchurl, + numpy, + pytestCheckHook, + rotary-embedding-torch, + setuptools, + soundfile, + soxr, + torch, + torchaudio, + writableTmpDirAsHomeHook, +}: + +buildPythonPackage (finalAttrs: { + pname = "beat-this"; + version = "1.1.0"; + pyproject = true; + + src = fetchFromGitHub { + owner = "CPJKU"; + repo = "beat_this"; + tag = "v${finalAttrs.version}"; + hash = "sha256-AEcDptPn5FUBb8+FuYSKjd00sFY5z6bS2iEOU64jido="; + }; + + build-system = [ setuptools ]; + + dependencies = [ + einops + numpy + rotary-embedding-torch + soxr + torch + torchaudio + ]; + + nativeCheckInputs = [ + pytestCheckHook + soundfile + writableTmpDirAsHomeHook + ]; + + preCheck = '' + mkdir -p $HOME/.cache/torch/hub/checkpoints/ + cp ${finalAttrs.passthru.final0Ckpt} $HOME/.cache/torch/hub/checkpoints/beat_this-final0.ckpt + ''; + + pythonImportsCheck = [ "beat_this" ]; + + passthru = { + # The program prints the download URLs in the error message when it cannot download things in the nix sandbox + final0Ckpt = fetchurl { + url = "https://cloud.cp.jku.at/public.php/dav/files/7ik4RrBKTS273gp/final0.ckpt"; + hash = "sha256-jDKLRfWdjdPf8hklP/ao1kgr5X0BM6KRQOL+u/jrgzE="; + }; + small0Ckpt = fetchurl { + url = "https://cloud.cp.jku.at/public.php/dav/files/7ik4RrBKTS273gp/small0.ckpt"; + hash = "sha256-YHS+LE1JDF9hAfzDdKHscq6TRW4ju2AZeDuEn13H1Hs="; + }; + }; + + meta = { + description = "Accurate and general beat tracker"; + homepage = "https://github.com/CPJKU/beat_this"; + changelog = "https://github.com/CPJKU/beat_this/blob/main/CHANGELOG.md"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ SuperSandro2000 ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index d03e71bd3826..1eb593023500 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2032,6 +2032,8 @@ self: super: with self; { beartype = callPackage ../development/python-modules/beartype { }; + beat-this = callPackage ../development/python-modules/beat-this { }; + beaupy = callPackage ../development/python-modules/beaupy { }; beautiful-date = callPackage ../development/python-modules/beautiful-date { }; From 071b79e61d475447b2938d06817356274e32e402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 14 Jun 2026 02:25:42 +0200 Subject: [PATCH 06/17] python314Packages.fastmcp: 3.2.4 -> 3.3.1, python3Packages.fastmcp-slim: init at 3.3.1 Changelog: https://github.com/PrefectHQ/fastmcp/releases/tag/v3.3.0 Changelog: https://github.com/PrefectHQ/fastmcp/releases/tag/v3.3.1 --- .../python-modules/fastmcp-slim/default.nix | 132 ++++++++++++++ .../python-modules/fastmcp/default.nix | 162 ++++-------------- pkgs/top-level/python-packages.nix | 2 + 3 files changed, 166 insertions(+), 130 deletions(-) create mode 100644 pkgs/development/python-modules/fastmcp-slim/default.nix diff --git a/pkgs/development/python-modules/fastmcp-slim/default.nix b/pkgs/development/python-modules/fastmcp-slim/default.nix new file mode 100644 index 000000000000..6eb705b108ba --- /dev/null +++ b/pkgs/development/python-modules/fastmcp-slim/default.nix @@ -0,0 +1,132 @@ +{ + lib, + buildPythonPackage, + fastmcp, + + # build-system + hatchling, + uv-dynamic-versioning, + + # dependencies + anthropic, + authlib, + azure-identity, + cyclopts, + exceptiongroup, + google-genai, + griffelib, + httpx, + jsonref, + jsonschema-path, + mcp, + openai, + openapi-pydantic, + opentelemetry-api, + packaging, + platformdirs, + py-key-value-aio, + pydantic, + pydantic-monty, + pydantic-settings, + pydocket, + pyjwt, + pyperclip, + python-dotenv, + python-multipart, + pyyaml, + rich, + typing-extensions, + uncalled-for, + uvicorn, + watchfiles, + websockets, +}: + +buildPythonPackage (finalAttrs: { + pname = "fastmcp-slim"; + inherit (fastmcp) version src; + sourceRoot = "${finalAttrs.src.name}/fastmcp_slim"; + pyproject = true; + + build-system = [ + hatchling + uv-dynamic-versioning + ]; + + dependencies = [ + platformdirs + pydantic + pydantic-settings + python-dotenv + rich + typing-extensions + ] + ++ pydantic.optional-dependencies.email; + + optional-dependencies = { + anthropic = [ anthropic ]; + apps = [ + # unpackaged prefab-ui + ]; + azure = [ + azure-identity + pyjwt + ]; + client = [ + authlib + ] + ++ finalAttrs.passthru.optional-dependencies.mcp + ++ py-key-value-aio.optional-dependencies.filetree + ++ py-key-value-aio.optional-dependencies.keyring + ++ py-key-value-aio.optional-dependencies.memory; + code-mode = [ pydantic-monty ]; + gemini = [ + google-genai + jsonref + ]; + mcp = [ + exceptiongroup + httpx + mcp + opentelemetry-api + ]; + openai = [ openai ]; + server = [ + authlib + cyclopts + griffelib + jsonref + jsonschema-path + openapi-pydantic + packaging + py-key-value-aio + pyperclip + python-multipart + pyyaml + uncalled-for + uvicorn + watchfiles + websockets + ] + ++ finalAttrs.passthru.optional-dependencies.mcp + ++ py-key-value-aio.optional-dependencies.filetree + ++ py-key-value-aio.optional-dependencies.keyring + ++ py-key-value-aio.optional-dependencies.memory; + tasks = [ + pydocket + ]; + }; + + pythonImportsCheck = [ "fastmcp" ]; + + # tests are done in fastmcp package + doCheck = false; + + meta = { + description = "Dependency-slim FastMCP package"; + changelog = "https://github.com/jlowin/fastmcp/releases/tag/${finalAttrs.src.tag}"; + homepage = "https://github.com/PrefectHQ/fastmcp/tree/main/fastmcp_slim"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ GaetanLepage ]; + }; +}) diff --git a/pkgs/development/python-modules/fastmcp/default.nix b/pkgs/development/python-modules/fastmcp/default.nix index 531d87fdfc38..3879e40bb830 100644 --- a/pkgs/development/python-modules/fastmcp/default.nix +++ b/pkgs/development/python-modules/fastmcp/default.nix @@ -10,54 +10,26 @@ uv-dynamic-versioning, # dependencies - anthropic, - authlib, - azure-identity, - cyclopts, - exceptiongroup, - griffelib, - httpx, - jsonref, - jsonschema-path, - mcp, - fakeredis, - google-genai, - openai, - openapi-pydantic, - opentelemetry-api, - packaging, - platformdirs, - py-key-value-aio, - pydantic, - pydantic-monty, - pydocket, - pyjwt, - pyperclip, - python-dotenv, - pyyaml, - rich, - uncalled-for, - uvicorn, - watchfiles, - websockets, + fastmcp-slim, # tests dirty-equals, - email-validator, fastapi, inline-snapshot, - lupa, opentelemetry-sdk, psutil, pytest-asyncio, pytest-examples, pytest-httpx, + pytest-rerunfailures, + pytest-timeout, + pytest-xdist, pytestCheckHook, }: buildPythonPackage (finalAttrs: { pname = "fastmcp"; - version = "3.2.4"; + version = "3.3.1"; pyproject = true; __structuredAttrs = true; @@ -65,7 +37,7 @@ buildPythonPackage (finalAttrs: { owner = "PrefectHQ"; repo = "fastmcp"; tag = "v${finalAttrs.version}"; - hash = "sha256-rJpxPvqAaa6/vXhG1+R9dI32cY/54e6I+F/zyBVoqBM="; + hash = "sha256-1W5NbWIULxFXGSozZEeITcPt1EbY6IsJLQdyevcn9BI="; }; build-system = [ @@ -73,121 +45,66 @@ buildPythonPackage (finalAttrs: { uv-dynamic-versioning ]; - pythonRelaxDeps = [ - "py-key-value-aio" - "pydocket" - ]; dependencies = [ - authlib - cyclopts - exceptiongroup - griffelib - httpx - jsonref - jsonschema-path - mcp - openapi-pydantic - opentelemetry-api - packaging - platformdirs - py-key-value-aio - pydantic - pyperclip - python-dotenv - pyyaml - rich - uncalled-for - uvicorn - watchfiles - websockets + fastmcp-slim ] - ++ py-key-value-aio.optional-dependencies.filetree - ++ py-key-value-aio.optional-dependencies.keyring - ++ py-key-value-aio.optional-dependencies.memory - ++ pydantic.optional-dependencies.email; + ++ fastmcp-slim.optional-dependencies.client + ++ fastmcp-slim.optional-dependencies.server; optional-dependencies = { - anthropic = [ anthropic ]; - azure = [ - azure-identity - pyjwt - ]; - code-mode = [ pydantic-monty ]; - gemini = [ google-genai ]; - openai = [ openai ]; - tasks = [ - pydocket - fakeredis - ] - ++ fakeredis.optional-dependencies.lua; + anthropic = fastmcp-slim.optional-dependencies.anthropic; + apps = fastmcp-slim.optional-dependencies.apps; + azure = fastmcp-slim.optional-dependencies.azure; + code-mode = fastmcp-slim.optional-dependencies.code-mode; + gemini = fastmcp-slim.optional-dependencies.gemini; + openai = fastmcp-slim.optional-dependencies.openai; + tasks = fastmcp-slim.optional-dependencies.tasks; }; pythonImportsCheck = [ "fastmcp" ]; nativeCheckInputs = [ dirty-equals - email-validator fastapi inline-snapshot - lupa opentelemetry-sdk psutil pytest-asyncio pytest-examples pytest-httpx + pytest-rerunfailures + pytest-timeout + pytest-xdist pytestCheckHook writableTmpDirAsHomeHook ] ++ finalAttrs.passthru.optional-dependencies.anthropic + ++ finalAttrs.passthru.optional-dependencies.apps ++ finalAttrs.passthru.optional-dependencies.azure ++ finalAttrs.passthru.optional-dependencies.code-mode ++ finalAttrs.passthru.optional-dependencies.gemini ++ finalAttrs.passthru.optional-dependencies.openai + ++ finalAttrs.passthru.optional-dependencies.tasks ++ inline-snapshot.optional-dependencies.dirty-equals; disabledTests = [ + # requires internet + "test_github_api_schema_performance" + # RuntimeError: Client failed to connect: Connection closed - "test_keep_alive_maintains_session_across_multiple_calls" - "test_keep_alive_false_starts_new_session_across_multiple_calls" - "test_keep_alive_false_exit_scope_kills_server" - "test_keep_alive_starts_new_session_if_manually_closed" - "test_keep_alive_true_exit_scope_kills_client" - "test_keep_alive_maintains_session_if_reentered" - "test_close_session_and_try_to_use_client_raises_error" - "test_parallel_calls" + "test_single_server_config_include_tags_filtering" "test_run_mcp_config" - "test_settings_from_environment_issue_1749" + + # requires uv "test_uv_transport" "test_uv_transport_module" - "test_github_api_schema_performance" # Hang forever "test_nested_streamable_http_server_resolves_correctly" - # RuntimeError: Client failed to connect: Timed out while waiting for response - "test_timeout" - "test_timeout_tool_call_overrides_client_timeout_even_if_lower" - # Requires prefab-ui (optional dependency) - "test_auto_registers_renderer_resource" - "test_auto_synthesizes_renderer_resource" - "test_equivalent_to_app_true" - - # Requires pydocket (tasks optional dependency, not in test inputs) - "test_mounted_server_does_not_have_docket" - "test_get_tasks_returns_task_eligible_tools" - "test_task_teardown_does_not_hang" - "test_background_task_can_read_snapshotted_request_headers" - "test_background_task_current_http_dependencies_restore_headers" - "test_task_execution_auto_populated_for_task_enabled_tool" - "test_function_tool_task_config_still_works" - "test_async_partial_with_task_true_does_not_raise" - "test_sync_partial_with_task_true_raises" - "test_is_docket_available" - "test_require_docket_passes_when_installed" - - # Shared dependency caching differs in sandbox - "TestSharedDependencies" + "TestPrefabAppConfig" + "test_doc_examples_quality" # AssertionError: assert 'INFO' == 'DEBUG' "test_temporary_settings" @@ -195,36 +112,21 @@ buildPythonPackage (finalAttrs: { # Subprocess-based multi-client tests fail in sandbox "test_multi_client" "test_multi_server" - "test_single_server_config_include_tags_filtering" "test_server_starts_without_auth" "test_canonical_multi_client_with_transforms" ] - ++ lib.optionals stdenv.hostPlatform.isDarwin [ - # RuntimeError: Server failed to start after 10 attempts - "test_unauthorized_access" - "test_stateless_proxy" + ++ lib.optionals stdenv.hostPlatform.isAarch64 [ + # floating point error + "test_index_retrieval[float32-quantization1-1-metric0-3]" ]; disabledTestPaths = [ # Requires prefab-ui (optional dependency) "tests/apps" - "tests/docs/test_doc_examples.py" "tests/test_apps_prefab.py" "tests/test_fastmcp_app.py" # Subprocess crash recovery tests are flaky in sandbox "tests/client/test_stdio.py" - # Requires pydocket/fakeredis (tasks optional dependency, not in test inputs) - "tests/server/tasks" - "tests/server/test_server_docket.py" - "tests/client/tasks" - ] - ++ lib.optionals stdenv.hostPlatform.isDarwin [ - # RuntimeError: Server failed to start after 10 attempts - "tests/client/auth/test_oauth_client.py" - "tests/client/test_sse.py" - "tests/client/test_streamable_http.py" - "tests/server/auth/test_jwt_provider.py" - "tests/server/http/test_http_dependencies.py" ]; __darwinAllowLocalNetworking = true; diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 1eb593023500..c2522ca5f542 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -5593,6 +5593,8 @@ self: super: with self; { fastmcp = callPackage ../development/python-modules/fastmcp { }; + fastmcp-slim = callPackage ../development/python-modules/fastmcp-slim { }; + fastmri = callPackage ../development/python-modules/fastmri { }; fastnlo-toolkit = toPythonModule ( From fa2a788af85583544407ed69911051cc158d60dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 22 May 2026 05:55:42 +0200 Subject: [PATCH 07/17] python314Packages.nnaudio: init at 0.3.4 --- .../python-modules/nnaudio/default.nix | 80 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 82 insertions(+) create mode 100644 pkgs/development/python-modules/nnaudio/default.nix diff --git a/pkgs/development/python-modules/nnaudio/default.nix b/pkgs/development/python-modules/nnaudio/default.nix new file mode 100644 index 000000000000..3d54bcdf3d40 --- /dev/null +++ b/pkgs/development/python-modules/nnaudio/default.nix @@ -0,0 +1,80 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + fetchurl, + librosa, + numpy, + pytestCheckHook, + setuptools, + scipy, + stdenv, + torch, + writableTmpDirAsHomeHook, +}: +let + choice = fetchurl { + url = "https://librosa.org/data/audio/admiralbob77_-_Choice_-_Drum-bass.ogg"; + hash = "sha256-rGRPlkXnwVF05KT4Vh5NFEjX9uWf9rBVazEOu87Yebw="; + }; + vibeace = fetchurl { + url = "https://librosa.org/data/audio/Kevin_MacLeod_-_Vibe_Ace.ogg"; + hash = "sha256-bCOu091apX8rFlLsq2jRXZuCrSV/VOY56yiAygm8EYo="; + }; +in +buildPythonPackage (finalAttrs: { + pname = "nnaudio"; + version = "0.3.4"; + pyproject = true; + + src = fetchFromGitHub { + owner = "KinWaiCheuk"; + repo = "nnAudio"; + rev = "e77d9f874cf37b273f44f68aefbd32fb0b979912"; + hash = "sha256-uJySa2A7IbuY/9Wq/w9gRkBk1NhMrhipyclOWO5koHE="; + }; + + sourceRoot = "${finalAttrs.src.name}/Installation"; + + build-system = [ setuptools ]; + + dependencies = [ + numpy + scipy + torch + ]; + + nativeCheckInputs = [ + librosa + pytestCheckHook + writableTmpDirAsHomeHook + ]; + + preCheck = '' + mkdir -p $HOME/.cache/librosa/ + cp ${choice} $HOME/.cache/librosa/admiralbob77_-_Choice_-_Drum-bass.ogg + cp ${vibeace} $HOME/.cache/librosa/Kevin_MacLeod_-_Vibe_Ace.ogg + export NUMBA_CACHE_DIR=$(mktemp -d) + ''; + + disabledTests = [ + # AttributeError: module 'scipy.signal' has no attribute 'blackmanharris' + "test_cfp_original[cpu]" + "test_cfp_new[cpu]" + # Test fixture matrix has other values + "test_vqt_gamma_zero[cpu]" + ] + ++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) [ + # Test fixture matrix has other values + "test_cqt_1992_v2_log[cpu]" + ]; + + pythonImportsCheck = [ "nnAudio" ]; + + meta = { + description = "Fast GPU audio processing toolbox with 1D convolutional neural network"; + homepage = "https://github.com/KinWaiCheuk/nnAudio"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ SuperSandro2000 ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index c2522ca5f542..858c3ad155e8 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -11467,6 +11467,8 @@ self: super: with self; { nmcli = callPackage ../development/python-modules/nmcli { }; + nnaudio = callPackage ../development/python-modules/nnaudio { }; + nnpdf = toPythonModule (pkgs.nnpdf.override { python3 = python; }); noaa-coops = callPackage ../development/python-modules/noaa-coops { }; From 897cdc7821880ee12ad72f2ba4c576e15c11895a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Wed, 27 May 2026 00:15:29 +0200 Subject: [PATCH 08/17] python314Packages.py-opensonic: 9.1.0 -> 10.0.0, enable tests Diff: https://github.com/khers/py-opensonic/compare/v9.1.0...v10.0.0 Changelog: https://github.com/khers/py-opensonic/blob/refs/tags/v10.0.0/CHANGELOG.md --- .../python-modules/py-opensonic/default.nix | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pkgs/development/python-modules/py-opensonic/default.nix b/pkgs/development/python-modules/py-opensonic/default.nix index 831ae47316b9..1df9023f1d9f 100644 --- a/pkgs/development/python-modules/py-opensonic/default.nix +++ b/pkgs/development/python-modules/py-opensonic/default.nix @@ -1,23 +1,24 @@ { lib, + aiohttp, buildPythonPackage, fetchFromGitHub, - setuptools, - aiohttp, mashumaro, - requests, + pytest-asyncio, + pytestCheckHook, + setuptools, }: buildPythonPackage rec { pname = "py-opensonic"; - version = "9.1.0"; + version = "10.0.0"; pyproject = true; src = fetchFromGitHub { owner = "khers"; repo = "py-opensonic"; tag = "v${version}"; - hash = "sha256-xZHlI62QoKkR4sZf0GUEzUGMpG2urHooPs8GvVyqpIQ="; + hash = "sha256-LT6pTtXCUMhk6uV9Y2inlAuP8osWUwsWOH7/yOW2OXI="; }; build-system = [ setuptools ]; @@ -25,10 +26,16 @@ buildPythonPackage rec { dependencies = [ aiohttp mashumaro - requests ]; - doCheck = false; # no tests + pythonRelaxDeps = [ + "mashumaro" + ]; + + nativeCheckInputs = [ + pytest-asyncio + pytestCheckHook + ]; pythonImportsCheck = [ "libopensonic" From e19d11fbc238cd47980bc5376f452e29a5922f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 5 Jun 2026 14:00:17 +0200 Subject: [PATCH 09/17] python314Packages.pyblu: 2.0.6 -> 2.0.8 Diff: https://github.com/LouisChrist/pyblu/compare/v2.0.6...v2.0.8 Changelog: https://github.com/LouisChrist/pyblu/releases/tag/v2.0.7 Changelog: https://github.com/LouisChrist/pyblu/releases/tag/v2.0.8 --- pkgs/development/python-modules/pyblu/default.nix | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pkgs/development/python-modules/pyblu/default.nix b/pkgs/development/python-modules/pyblu/default.nix index baa7ff79bd63..6c2cea7a524f 100644 --- a/pkgs/development/python-modules/pyblu/default.nix +++ b/pkgs/development/python-modules/pyblu/default.nix @@ -1,25 +1,25 @@ { aiohttp, - aioresponses, buildPythonPackage, fetchFromGitHub, hatchling, lib, lxml, + mocket, pytest-asyncio, pytestCheckHook, }: buildPythonPackage rec { pname = "pyblu"; - version = "2.0.6"; + version = "2.0.8"; pyproject = true; src = fetchFromGitHub { owner = "LouisChrist"; repo = "pyblu"; tag = "v${version}"; - hash = "sha256-qLB9o40tRYgmbYJEEx8r3SodH1hB8MM4yLXbdKIs/xA="; + hash = "sha256-uYYiu0V491eHg47Rc9HGEiddONnFqGuPj34Mkfk5Gnk="; }; pythonRelaxDeps = [ "aiohttp" ]; @@ -34,11 +34,17 @@ buildPythonPackage rec { pythonImportsCheck = [ "pyblu" ]; nativeCheckInputs = [ - aioresponses + mocket pytest-asyncio pytestCheckHook ]; + disabledTestPaths = [ + # all tests fail with: + # aiohttp.client_exceptions.ClientConnectorDNSError: Cannot connect to host node:11000 ssl:default [Could not contact DNS servers] + "tests/test_player.py" + ]; + meta = { changelog = "https://github.com/LouisChrist/pyblu/releases/tag/${src.tag}"; description = "BluOS API client"; From ccf8acd1b5114c658661bebe8006f2f4bdfa20d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 14 Jun 2026 04:37:16 +0200 Subject: [PATCH 10/17] python314Packages.python-mpd2: rename from mpd2 --- pkgs/by-name/au/autosuspend/package.nix | 2 +- pkgs/by-name/hi/high-tide/package.nix | 2 +- pkgs/by-name/mi/miniplayer/package.nix | 2 +- pkgs/by-name/mp/mpdris2/package.nix | 2 +- pkgs/by-name/pl/plattenalbum/package.nix | 2 +- pkgs/by-name/ro/rofi-mpd/package.nix | 2 +- pkgs/by-name/so/sonata/package.nix | 4 ++-- pkgs/by-name/ya/yams/package.nix | 2 +- pkgs/development/python-modules/beets/default.nix | 6 +++--- .../python-modules/{mpd2 => python-mpd2}/default.nix | 0 pkgs/development/python-modules/qtile/default.nix | 4 ++-- pkgs/servers/home-assistant/component-packages.nix | 2 +- pkgs/top-level/python-aliases.nix | 1 + pkgs/top-level/python-packages.nix | 4 ++-- 14 files changed, 18 insertions(+), 17 deletions(-) rename pkgs/development/python-modules/{mpd2 => python-mpd2}/default.nix (100%) diff --git a/pkgs/by-name/au/autosuspend/package.nix b/pkgs/by-name/au/autosuspend/package.nix index fe75c939e0d2..3ba6de8a854c 100644 --- a/pkgs/by-name/au/autosuspend/package.nix +++ b/pkgs/by-name/au/autosuspend/package.nix @@ -51,10 +51,10 @@ python3.pkgs.buildPythonApplication (finalAttrs: { icalendar jsonpath-ng lxml - mpd2 psutil pygobject3 python-dateutil + python-mpd2 requests requests-file tzdata diff --git a/pkgs/by-name/hi/high-tide/package.nix b/pkgs/by-name/hi/high-tide/package.nix index d0a6c34b1026..2d5230fb3a88 100644 --- a/pkgs/by-name/hi/high-tide/package.nix +++ b/pkgs/by-name/hi/high-tide/package.nix @@ -60,7 +60,7 @@ python313Packages.buildPythonApplication (finalAttrs: { pygobject3 tidalapi requests - mpd2 + python-mpd2 pypresence ]); diff --git a/pkgs/by-name/mi/miniplayer/package.nix b/pkgs/by-name/mi/miniplayer/package.nix index 4d374d5187b7..bccb55faaa34 100644 --- a/pkgs/by-name/mi/miniplayer/package.nix +++ b/pkgs/by-name/mi/miniplayer/package.nix @@ -23,7 +23,7 @@ buildPythonApplication (finalAttrs: { dependencies = [ colorthief ffmpeg-python - mpd2 + python-mpd2 pillow pixcat requests diff --git a/pkgs/by-name/mp/mpdris2/package.nix b/pkgs/by-name/mp/mpdris2/package.nix index bb1f9cca323c..8cccd6c2fba1 100644 --- a/pkgs/by-name/mp/mpdris2/package.nix +++ b/pkgs/by-name/mp/mpdris2/package.nix @@ -42,7 +42,7 @@ python3Packages.buildPythonApplication (finalAttrs: { dependencies = with python3Packages; [ dbus-python - mpd2 + python-mpd2 mutagen pygobject3 ]; diff --git a/pkgs/by-name/pl/plattenalbum/package.nix b/pkgs/by-name/pl/plattenalbum/package.nix index c2933b59180c..8eb024408df8 100644 --- a/pkgs/by-name/pl/plattenalbum/package.nix +++ b/pkgs/by-name/pl/plattenalbum/package.nix @@ -36,7 +36,7 @@ python3Packages.buildPythonApplication (finalAttrs: { dependencies = with python3Packages; [ pygobject3 - mpd2 + python-mpd2 ]; dontWrapGApps = true; diff --git a/pkgs/by-name/ro/rofi-mpd/package.nix b/pkgs/by-name/ro/rofi-mpd/package.nix index 32a26f44c668..7ad80a7b09b0 100644 --- a/pkgs/by-name/ro/rofi-mpd/package.nix +++ b/pkgs/by-name/ro/rofi-mpd/package.nix @@ -20,7 +20,7 @@ python3Packages.buildPythonApplication (finalAttrs: { dependencies = with python3Packages; [ mutagen - mpd2 + python-mpd2 toml appdirs ]; diff --git a/pkgs/by-name/so/sonata/package.nix b/pkgs/by-name/so/sonata/package.nix index 0d755644ef25..5200dcc04c02 100644 --- a/pkgs/by-name/so/sonata/package.nix +++ b/pkgs/by-name/so/sonata/package.nix @@ -17,7 +17,7 @@ let buildPythonApplication dbus-python pygobject3 - mpd2 + python-mpd2 setuptools ; in @@ -53,7 +53,7 @@ buildPythonApplication (finalAttrs: { # included because it's difficult to build. pythonPath = [ dbus-python - mpd2 + python-mpd2 pygobject3 setuptools # pkg_resources is imported during runtime ]; diff --git a/pkgs/by-name/ya/yams/package.nix b/pkgs/by-name/ya/yams/package.nix index c5b84b0bb80a..4cb3a31b01b8 100644 --- a/pkgs/by-name/ya/yams/package.nix +++ b/pkgs/by-name/ya/yams/package.nix @@ -22,7 +22,7 @@ python3Packages.buildPythonPackage rec { dependencies = with python3Packages; [ pyyaml psutil - mpd2 + python-mpd2 requests ]; diff --git a/pkgs/development/python-modules/beets/default.nix b/pkgs/development/python-modules/beets/default.nix index 6507544714d6..80bdd408fb56 100644 --- a/pkgs/development/python-modules/beets/default.nix +++ b/pkgs/development/python-modules/beets/default.nix @@ -70,7 +70,7 @@ librosa, mp3gain, mp3val, - mpd2, + python-mpd2, pyacoustid, pylast, pyxdg, @@ -350,9 +350,9 @@ buildPythonPackage (finalAttrs: { mbpseudo = { }; metasync.testPaths = [ ]; missing.testPaths = [ ]; - mpdstats.propagatedBuildInputs = [ mpd2 ]; + mpdstats.propagatedBuildInputs = [ python-mpd2 ]; mpdupdate = { - propagatedBuildInputs = [ mpd2 ]; + propagatedBuildInputs = [ python-mpd2 ]; testPaths = [ ]; }; musicbrainz = { }; diff --git a/pkgs/development/python-modules/mpd2/default.nix b/pkgs/development/python-modules/python-mpd2/default.nix similarity index 100% rename from pkgs/development/python-modules/mpd2/default.nix rename to pkgs/development/python-modules/python-mpd2/default.nix diff --git a/pkgs/development/python-modules/qtile/default.nix b/pkgs/development/python-modules/qtile/default.nix index d096c7a57165..3dfedfa3eb98 100644 --- a/pkgs/development/python-modules/qtile/default.nix +++ b/pkgs/development/python-modules/qtile/default.nix @@ -16,7 +16,7 @@ dbus-fast, iwlib, libcst, - mpd2, + python-mpd2, prompt-toolkit, psutil, pulsectl-asyncio, @@ -118,7 +118,7 @@ buildPythonPackage (finalAttrs: { dbus-fast iwlib libcst - mpd2 + python-mpd2 # prompt-toolkit used for qtile repl # see https://github.com/qtile/qtile/blob/master/libqtile/scripts/repl.py prompt-toolkit diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix index 9a95fa154501..ee46cfa8c7c5 100644 --- a/pkgs/servers/home-assistant/component-packages.nix +++ b/pkgs/servers/home-assistant/component-packages.nix @@ -4245,7 +4245,7 @@ ]; "mpd" = ps: with ps; [ - mpd2 + python-mpd2 ]; "mqtt" = ps: with ps; [ diff --git a/pkgs/top-level/python-aliases.nix b/pkgs/top-level/python-aliases.nix index a8ef3de01e12..f0816d0bb495 100644 --- a/pkgs/top-level/python-aliases.nix +++ b/pkgs/top-level/python-aliases.nix @@ -368,6 +368,7 @@ mapAliases { monarchmoney = throw "'monarchmoney' has been renamed to/replaced by 'monarchmoneycommunity'"; # Added 2026-03-05 monkeytype = throw "'monkeytype' has been removed as it was unmaintained upstream"; # Added 2026-04-19 moretools = "'moretools' has been removed because it is unmaintained"; # Added 2026-01-19 + mpd2 = warnAlias "'mpd2' has been renamed to 'python-mpd2'"; # Added 2026-06-14 mpire = throw "'mpire' has been removed because it is unused in Nixpkgs"; # Added 2026-06-22 msldap-bad = throw "'msldap-bad' has been renamed to/replaced by 'badldap'"; # added 2025-11-06 mullvad-closest = throw "'mullvad-closest' has been removed as it was unmaintained. Consider using 'mullvad-compass' instead."; # Added 2026-01-13 diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 858c3ad155e8..5967288848fe 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -10551,8 +10551,6 @@ self: super: with self; { callPackage ../development/python-modules/mozjpeg_lossless_optimization { }; - mpd2 = callPackage ../development/python-modules/mpd2 { }; - mpegdash = callPackage ../development/python-modules/mpegdash { }; mpi-pytest = callPackage ../development/python-modules/mpi-pytest { }; @@ -16305,6 +16303,8 @@ self: super: with self; { python-motionmount = callPackage ../development/python-modules/python-motionmount { }; + python-mpd2 = callPackage ../development/python-modules/python-mpd2 { }; + python-mpv-jsonipc = callPackage ../development/python-modules/python-mpv-jsonipc { }; python-multipart = callPackage ../development/python-modules/python-multipart { }; From 5744bb6c6a80472b89356cb7658962340c1bc3d0 Mon Sep 17 00:00:00 2001 From: Guilhem Saurel Date: Sat, 23 May 2026 19:45:00 +0200 Subject: [PATCH 11/17] python314Packages.sendspin: 5.9.0 -> 7.4.0 Diff: https://github.com/Sendspin/sendspin-cli/compare/5.9.0...7.4.0 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/6.0.0 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/7.0.0 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/7.1.0 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/7.2.0 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/7.3.0 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/7.3.1 Changelog: https://github.com/Sendspin/sendspin-cli/releases/tag/7.4.0 --- .../python-modules/sendspin/default.nix | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pkgs/development/python-modules/sendspin/default.nix b/pkgs/development/python-modules/sendspin/default.nix index 67e7bf4a0e44..64c212f41054 100644 --- a/pkgs/development/python-modules/sendspin/default.nix +++ b/pkgs/development/python-modules/sendspin/default.nix @@ -8,6 +8,7 @@ numpy, pulsectl-asyncio, pychromecast, + pytest-asyncio, pytestCheckHook, qrcode, readchar, @@ -18,14 +19,14 @@ buildPythonPackage (finalAttrs: { pname = "sendspin"; - version = "5.9.0"; + version = "7.4.0"; pyproject = true; src = fetchFromGitHub { owner = "Sendspin"; repo = "sendspin-cli"; tag = finalAttrs.version; - hash = "sha256-g+qw3mDHij50CEDKGjltMGNZoI6/HeJQ8zq8NSvD3Ls="; + hash = "sha256-B375jsOik0IdLtozH3t3hZKqoO+dtqkzX2bk5YuoO9Y="; }; postPatch = '' @@ -45,20 +46,23 @@ buildPythonPackage (finalAttrs: { readchar rich sounddevice - ]; + ] + ++ aiosendspin.optional-dependencies.server; optional-dependencies = { cast = [ pychromecast ]; }; - nativeCheckInputs = [ pytestCheckHook ]; + nativeCheckInputs = [ + pytest-asyncio + pytestCheckHook + ]; pythonImportsCheck = [ "sendspin" ]; disabledTests = [ - # AssertionError: assert None == (1, 'Digital') - "test_alsa_available_for_hw_device_with_mixer" - "test_hifiberry_dac_discovery" + # requires internet + "test_multi_worker_starts_and_serves_status" ]; meta = { From 653d787cc3c9f0fbd48b381df46a4ed41f215ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Fri, 22 May 2026 01:08:15 +0200 Subject: [PATCH 12/17] python314Packages.sounddevice: 0.5.3 -> 0.5.5 --- .../python-modules/sounddevice/default.nix | 13 ++++++--- .../fix-portaudio-library-path.patch | 28 +++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/pkgs/development/python-modules/sounddevice/default.nix b/pkgs/development/python-modules/sounddevice/default.nix index 3f3fdb55ad07..3ac147f224e8 100644 --- a/pkgs/development/python-modules/sounddevice/default.nix +++ b/pkgs/development/python-modules/sounddevice/default.nix @@ -4,6 +4,7 @@ buildPythonPackage, fetchPypi, setuptools, + setuptools-scm, cffi, numpy, portaudio, @@ -12,15 +13,18 @@ buildPythonPackage rec { pname = "sounddevice"; - version = "0.5.3"; + version = "0.5.5"; pyproject = true; src = fetchPypi { inherit pname version; - hash = "sha256-y6wrYBmPurhFM2l+fEkEzIlexp1fs5c1VsnrdKRimyw="; + hash = "sha256-Ikh7ZRmMtb8iCHVRBbUk94rRc+Wra0Rb2rHJifZpjfM="; }; - build-system = [ setuptools ]; + build-system = [ + setuptools + setuptools-scm + ]; dependencies = [ cffi @@ -43,7 +47,8 @@ buildPythonPackage rec { meta = { description = "Play and Record Sound with Python"; - homepage = "http://python-sounddevice.rtfd.org/"; + homepage = "https://python-sounddevice.readthedocs.io/"; + changelog = "https://github.com/spatialaudio/python-sounddevice/releases/tag/${version}"; license = with lib.licenses; [ mit ]; }; } diff --git a/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch b/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch index 6ec399e25d5f..89f19cdfe528 100644 --- a/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch +++ b/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch @@ -1,8 +1,8 @@ -diff --git a/sounddevice.py b/sounddevice.py -index 0974289..2d56c28 100644 ---- a/sounddevice.py -+++ b/sounddevice.py -@@ -58,32 +58,7 @@ from ctypes.util import find_library as _find_library +diff --git a/src/sounddevice.py b/src/sounddevice.py +index 00fc6f8..72abede 100644 +--- a/src/sounddevice.py ++++ b/src/sounddevice.py +@@ -59,36 +59,7 @@ from _sounddevice import ffi as _ffi @@ -17,22 +17,26 @@ index 0974289..2d56c28 100644 - break - else: - raise OSError('PortAudio library not found') -- _lib = _ffi.dlopen(_libname) +- _lib: ... = _ffi.dlopen(_libname) -except OSError: - if _platform.system() == 'Darwin': - _libname = 'libportaudio.dylib' - elif _platform.system() == 'Windows': -- if 'SD_ENABLE_ASIO' in _os.environ: -- _libname = 'libportaudio' + _platform.architecture()[0] + '-asio.dll' +- if _platform.machine().lower() in ('arm64', 'aarch64'): +- _platform_suffix = 'arm64' - else: -- _libname = 'libportaudio' + _platform.architecture()[0] + '.dll' +- _platform_suffix = _platform.architecture()[0] +- if 'SD_ENABLE_ASIO' in _os.environ: +- _libname = 'libportaudio' + _platform_suffix + '-asio.dll' +- else: +- _libname = 'libportaudio' + _platform_suffix + '.dll' - else: - raise - import _sounddevice_data - _libname = _os.path.join( - next(iter(_sounddevice_data.__path__)), 'portaudio-binaries', _libname) -- _lib = _ffi.dlopen(_libname) -+_lib = _ffi.dlopen('@portaudio@') +- _lib: ... = _ffi.dlopen(_libname) ++_lib: ... = _ffi.dlopen('@portaudio@') - _sampleformats = { + _sampleformats: ... = { 'float32': _lib.paFloat32, From fd0187856307762d13c64e070b2811b85ec65676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Wed, 3 Jun 2026 08:29:03 +0200 Subject: [PATCH 13/17] music-assistant: fix update script after reworking music-assistant to no longer use python.pkgs --- pkgs/by-name/mu/music-assistant/update-providers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/by-name/mu/music-assistant/update-providers.py b/pkgs/by-name/mu/music-assistant/update-providers.py index c464fc1cd5b1..1e29491f471c 100755 --- a/pkgs/by-name/mu/music-assistant/update-providers.py +++ b/pkgs/by-name/mu/music-assistant/update-providers.py @@ -1,5 +1,5 @@ #!/usr/bin/env nix-shell -#!nix-shell -I nixpkgs=./. -i python3 -p "music-assistant.python.withPackages (ps: music-assistant.dependencies ++ (with ps; [ jinja2 packaging ]))" -p nixfmt pyright ruff isort +#!nix-shell -I nixpkgs=./. -i python3 -p "music-assistant.pythonPackages.python.withPackages (ps: music-assistant.dependencies ++ (with ps; [ jinja2 packaging ]))" -p nixfmt pyright ruff isort import asyncio import json import os.path @@ -50,7 +50,7 @@ ROOT: Final = ( .strip() ) -PACKAGE_SET = "music-assistant.python.pkgs" +PACKAGE_SET = "music-assistant.pythonPackages" PACKAGE_MAP = { "git+https://github.com/MarvinSchenkel/pytube.git": "pytube", } @@ -143,7 +143,7 @@ def packageset_attributes(): ROOT, "-qa", "-A", - "music-assistant.python.pkgs", + "music-assistant.pythonPackages", "--arg", "config", "{ allowAliases = false; }", @@ -162,7 +162,7 @@ class NoMatch(Exception): def resolve_package_attribute(package: str) -> str: - pattern = re.compile(rf"^music-assistant\.python\.pkgs\.{package}$", re.I) + pattern = re.compile(rf"^music-assistant\.pythonPackages\.{package}$", re.I) packages = packageset_attributes() matches = [] for attr in packages.keys(): From 6d15905968f799db54f20928297bc03d43e5eba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Mon, 25 May 2026 03:38:48 +0200 Subject: [PATCH 14/17] music-assistant: track builtin providers to provide a smoother out of the box experience Also see https://github.com/music-assistant/models/blob/1.1.119/music_assistant_models/provider.py#L35 --- .../services/audio/music-assistant.nix | 14 +++++++----- pkgs/by-name/mu/music-assistant/package.nix | 4 +++- .../mu/music-assistant/update-providers.py | 22 ++++++++++++++----- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/nixos/modules/services/audio/music-assistant.nix b/nixos/modules/services/audio/music-assistant.nix index 6ff098a67723..505e57c163e9 100644 --- a/nixos/modules/services/audio/music-assistant.nix +++ b/nixos/modules/services/audio/music-assistant.nix @@ -107,13 +107,17 @@ in ]; }; - services.avahi = lib.mkIf (lib.elem "airplay_receiver" cfg.providers) { - enable = true; - openFirewall = lib.mkIf cfg.openFirewall true; - publish = { + services = { + avahi = lib.mkIf (lib.elem "airplay_receiver" cfg.providers) { enable = true; - userServices = true; + openFirewall = lib.mkIf cfg.openFirewall true; + publish = { + enable = true; + userServices = true; + }; }; + + music-assistant.providers = cfg.package.providersBuiltins; }; systemd.services.music-assistant = { diff --git a/pkgs/by-name/mu/music-assistant/package.nix b/pkgs/by-name/mu/music-assistant/package.nix index 1adda47f84a0..3494bc89cdce 100644 --- a/pkgs/by-name/mu/music-assistant/package.nix +++ b/pkgs/by-name/mu/music-assistant/package.nix @@ -24,7 +24,8 @@ let } ); - providerPackages = (import ./providers.nix).providers; + providersMeta = import ./providers.nix; + providerPackages = providersMeta.providers; providerNames = lib.attrNames providerPackages; providerDependencies = lib.concatMap ( provider: (providerPackages.${provider} pythonPackages) @@ -210,6 +211,7 @@ pythonPackages.buildPythonApplication rec { providerPackages providerNames ; + providersBuiltins = providersMeta.builtins; tests = nixosTests.music-assistant; }; diff --git a/pkgs/by-name/mu/music-assistant/update-providers.py b/pkgs/by-name/mu/music-assistant/update-providers.py index 1e29491f471c..c90eae86df44 100755 --- a/pkgs/by-name/mu/music-assistant/update-providers.py +++ b/pkgs/by-name/mu/music-assistant/update-providers.py @@ -24,6 +24,11 @@ TEMPLATE = """# Do not edit manually, run ./update-providers.py { version = "{{ version }}"; + builtins = [ +{%- for builtin in builtins | sort %} + "{{ builtin }}" +{%- endfor %} + ]; providers = { {%- for provider in providers | sort(attribute='domain') %} {{ provider.domain }} = {% if provider.available %}ps: with ps;{% else %}ps:{% endif %} [ @@ -197,7 +202,7 @@ class Provider: return hash(self.domain) -async def resolve_providers(manifests) -> Set: +async def resolve_providers(manifests) -> tuple[Set, Set]: errors = [] providers = set() for manifest in manifests: @@ -227,22 +232,27 @@ async def resolve_providers(manifests) -> Set: if errors: print("\n - ", end="") print("\n - ".join(errors)) - return providers + + builtins = {manifest.domain for manifest in manifests if manifest.builtin} + + return providers, builtins -def render(outpath: str, version: str, providers: Set): +def render(outpath: str, version: str, providers: Set, builtins: Set): env = Environment() template = env.from_string(TEMPLATE) - template.stream(version=version, providers=providers).dump(outpath) + template.stream(version=version, providers=providers, builtins=builtins).dump( + outpath + ) async def main(): version: str = cast(str, await Nix.eval("music-assistant.version")) manifests = await get_provider_manifests(version) - providers = await resolve_providers(manifests) + providers, builtins = await resolve_providers(manifests) outpath = os.path.join(ROOT, "pkgs/by-name/mu/music-assistant/providers.nix") - render(outpath, version, providers) + render(outpath, version, providers, builtins) run_sync(["nixfmt", outpath]) From 932c63b704f7c63a58eed94c726006b3973fed83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Thu, 21 May 2026 23:44:16 +0200 Subject: [PATCH 15/17] music-assistant: 2.8.7 -> 2.9.4 something tried to use sched_setscheduler on startup, so @resources must be allowed. Could be torch but since that is a general requirement we cannot make this conditional. Changelog: https://github.com/music-assistant/server/releases/tag/2.9.0 Changelog: https://github.com/music-assistant/server/releases/tag/2.9.1 Changelog: https://github.com/music-assistant/server/releases/tag/2.9.2 Changelog: https://github.com/music-assistant/server/releases/tag/2.9.3 Changelog: https://github.com/music-assistant/server/releases/tag/2.9.4 Diff: https://github.com/music-assistant/server/compare/2.8.7...2.9.4 --- .../services/audio/music-assistant.nix | 3 +- .../music-assistant/dont-install-deps.patch | 2 +- pkgs/by-name/mu/music-assistant/frontend.nix | 4 +- pkgs/by-name/mu/music-assistant/package.nix | 41 ++++++- pkgs/by-name/mu/music-assistant/providers.nix | 109 ++++++++++++++++-- .../mu/music-assistant/update-providers.py | 25 +++- 6 files changed, 165 insertions(+), 19 deletions(-) diff --git a/nixos/modules/services/audio/music-assistant.nix b/nixos/modules/services/audio/music-assistant.nix index 505e57c163e9..8397c85592ba 100644 --- a/nixos/modules/services/audio/music-assistant.nix +++ b/nixos/modules/services/audio/music-assistant.nix @@ -171,6 +171,7 @@ in DevicePolicy = "closed"; LockPersonality = true; # breaks pyopenssl's cffi calls, used in remote access feature + # not compatible with llvmlite which is required by numba -> librosa MemoryDenyWriteExecute = false; ProcSubset = "pid"; ProtectClock = true; @@ -194,7 +195,7 @@ in SystemCallArchitectures = "native"; SystemCallFilter = [ "@system-service" - "~@privileged @resources" + "~@privileged" "mbind" ] ++ lib.optionals useYTMusic [ diff --git a/pkgs/by-name/mu/music-assistant/dont-install-deps.patch b/pkgs/by-name/mu/music-assistant/dont-install-deps.patch index d074e18fa67c..0df4cf58b369 100644 --- a/pkgs/by-name/mu/music-assistant/dont-install-deps.patch +++ b/pkgs/by-name/mu/music-assistant/dont-install-deps.patch @@ -43,7 +43,7 @@ index 0ac8a70f..5d74e25b 100644 """Set up the YTMusic provider.""" logging.getLogger("yt_dlp").setLevel(self.logger.level + 10) - await self._install_packages() - self._cookie = self.config.get_value(CONF_COOKIE) + self._cookie = str(self.config.get_value(CONF_COOKIE)) self._po_token_server_url = ( self.config.get_value(CONF_PO_TOKEN_SERVER_URL) or DEFAULT_PO_TOKEN_SERVER_URL @@ -1103,8 +1102,6 @@ async def _install_packages(self) -> None: diff --git a/pkgs/by-name/mu/music-assistant/frontend.nix b/pkgs/by-name/mu/music-assistant/frontend.nix index ab091182c71e..e6cf66afac4d 100644 --- a/pkgs/by-name/mu/music-assistant/frontend.nix +++ b/pkgs/by-name/mu/music-assistant/frontend.nix @@ -8,13 +8,13 @@ buildPythonPackage rec { pname = "music-assistant-frontend"; - version = "2.17.146"; + version = "2.17.186"; pyproject = true; src = fetchPypi { pname = "music_assistant_frontend"; inherit version; - hash = "sha256-VU2SXL6SLFiKntmJJtCabBOYOeImYFPHYxvMPmnhmEc="; + hash = "sha256-dNGzXDRZuQLRkMY0erjJZE4h26yFP4Fdn9a3K6T0RvM="; }; build-system = [ setuptools ]; diff --git a/pkgs/by-name/mu/music-assistant/package.nix b/pkgs/by-name/mu/music-assistant/package.nix index 3494bc89cdce..ce6c3ad5ac4f 100644 --- a/pkgs/by-name/mu/music-assistant/package.nix +++ b/pkgs/by-name/mu/music-assistant/package.nix @@ -6,6 +6,7 @@ ffmpeg_7-headless, nixosTests, replaceVars, + writableTmpDirAsHomeHook, providers ? [ ], }: @@ -15,10 +16,10 @@ let music-assistant-frontend = prev.callPackage ./frontend.nix { }; music-assistant-models = final.music-assistant-models.overridePythonAttrs (oldAttrs: { - version = "1.1.115"; + version = "1.1.129"; src = oldAttrs.src.override { - hash = "sha256-oEXL0B8JNH4PcltpES375ov7QGs+gtYKlMGr1B7BlKY="; + hash = "sha256-6gVHlFTt/bsj4nUGPS6HDUQ7zczpfos75U6l4Yk9W6k="; }; }); } @@ -39,14 +40,14 @@ assert pythonPackages.buildPythonApplication rec { pname = "music-assistant"; - version = "2.8.7"; + version = "2.9.4"; pyproject = true; src = fetchFromGitHub { owner = "music-assistant"; repo = "server"; tag = version; - hash = "sha256-m91q/8XYoZ5Azu79fKD0euRCuf29w3vj5cxdFheDsmI="; + hash = "sha256-PiSBghhlxknijRqghkO8wn1CB2XqaJrjrvGNvZUlNbo="; }; patches = [ @@ -82,6 +83,11 @@ pythonPackages.buildPythonApplication rec { ]; postPatch = '' + # Undo Python 3.14 only syntax + substituteInPlace music_assistant/controllers/streams/controller.py \ + --replace-fail "except BrokenPipeError, ConnectionResetError, ConnectionError:" "except (BrokenPipeError, ConnectionResetError, ConnectionError):" \ + --replace-fail "except BrokenPipeError, ConnectionResetError:" "except (BrokenPipeError, ConnectionResetError):" + substituteInPlace pyproject.toml \ --replace-fail "0.0.0" "${version}" \ --replace-fail "==" ">=" @@ -110,6 +116,7 @@ pythonPackages.buildPythonApplication rec { "mashumaro" "orjson" "xmltodict" + "zeroconf" ]; pythonRemoveDeps = [ @@ -140,6 +147,7 @@ pythonPackages.buildPythonApplication rec { ifaddr librosa mashumaro + modern-colorthief music-assistant-frontend music-assistant-models mutagen @@ -151,6 +159,8 @@ pythonPackages.buildPythonApplication rec { pyjwt python-slugify shortuuid + torch + torchaudio unidecode xmltodict zeroconf @@ -175,18 +185,36 @@ pythonPackages.buildPythonApplication rec { with pythonPackages; [ pytestCheckHook + writableTmpDirAsHomeHook ] ++ lib.concatAttrValues optional-dependencies - ++ (lib.concatMap (provider: providerPackages.${provider} python.pkgs) [ + ++ (lib.concatMap (provider: providerPackages.${provider} pythonPackages) [ + "acoustid_lookup" "audible" "dlna" + "fastmcp_server" "jellyfin" + "mpd" + "msx_bridge" "opensubsonic" "sendspin" + "smart_fades" "snapcast" + "sonic_analysis" + "sonic_similarity" "tidal" + "wiim" + "ytmusic" ]); + preCheck = '' + export NUMBA_CACHE_DIR=$(mktemp -d) + + # required for smart_fades tests + mkdir -p $HOME/.cache/torch/hub/checkpoints/ + cp ${pythonPackages.beat-this.passthru.small0Ckpt} $HOME/.cache/torch/hub/checkpoints/beat_this-small0.ckpt + ''; + disabledTestPaths = [ # no multicast support in build sandbox: # "OSError: [Errno 19] No such device" @@ -194,9 +222,12 @@ pythonPackages.buildPythonApplication rec { # provider is missing dependencies "tests/providers/apple_music" "tests/providers/bandcamp" + "tests/providers/hue_entertainment" "tests/providers/kion_music" "tests/providers/nicovideo" + "tests/providers/qqmusic" "tests/providers/yandex_music" + "tests/providers/yandex_ynison" "tests/providers/zvuk_music" # mocking music_assistant.providers.airplay.pairing.AirPlayPairing does not work "tests/providers/airplay/test_player.py::test_start_pairing__pin_decision" diff --git a/pkgs/by-name/mu/music-assistant/providers.nix b/pkgs/by-name/mu/music-assistant/providers.nix index 4acb6678c682..8c75a4f5c2c2 100644 --- a/pkgs/by-name/mu/music-assistant/providers.nix +++ b/pkgs/by-name/mu/music-assistant/providers.nix @@ -1,8 +1,27 @@ # Do not edit manually, run ./update-providers.py { - version = "2.8.7"; + version = "2.9.4"; + builtins = [ + "builtin" + "coverartarchive" + "fanarttv" + "itunes_artwork" + "local_audio" + "loudness_analysis" + "lrclib" + "musicbrainz" + "sendspin" + "sync_group" + "theaudiodb" + "universal_player" + "wikipedia" + ]; providers = { + acoustid_lookup = + ps: with ps; [ + pyacoustid + ]; airplay = ps: with ps; [ srptools @@ -65,6 +84,10 @@ ]; fanarttv = ps: [ ]; + fastmcp_server = + ps: with ps; [ + fastmcp + ]; filesystem_local = ps: [ ]; filesystem_nfs = ps: [ @@ -89,10 +112,14 @@ ps: with ps; [ pyheos ]; + hue_entertainment = ps: [ + ]; # missing hue-entertainment ibroadcast = ps: [ ]; # missing ibroadcastaio internet_archive = ps: [ ]; + itunes_artwork = ps: [ + ]; itunes_podcasts = ps: [ ]; jellyfin = @@ -101,6 +128,8 @@ ]; kion_music = ps: [ ]; # missing yandex-music + lastfm_recommendations = ps: [ + ]; lastfm_scrobble = ps: with ps; [ pylast @@ -109,16 +138,40 @@ ps: with ps; [ liblistenbrainz ]; + local_audio = + ps: with ps; [ + sounddevice + ]; + loudness_analysis = ps: [ + ]; lrclib = ps: [ ]; + motherearthradio = ps: [ + ]; + mpd = + ps: with ps; [ + python-mpd2 + ]; + msx_bridge = + ps: with ps; [ + pydantic + ]; musicbrainz = ps: [ ]; musiccast = ps: with ps; [ aiomusiccast ]; - nicovideo = ps: [ - ]; # missing niconico.py-ma + musicme = ps: [ + ]; + neteasecloudmusic = ps: [ + ]; + nicovideo = + ps: with ps; [ + pydantic + ]; # missing niconico.py-ma + nts = ps: [ + ]; nugs = ps: [ ]; opensubsonic = @@ -147,6 +200,8 @@ ]; qobuz = ps: [ ]; + qqmusic = ps: [ + ]; # missing qqmusic-api-python radiobrowser = ps: with ps; [ radios @@ -158,13 +213,26 @@ async-upnp-client rokuecp ]; + samsung_wam = ps: [ + ]; # missing pywam sendspin = - ps: with ps; [ + ps: + with ps; + [ aiosendspin av - ]; + ] + ++ aiosendspin.optional-dependencies.server; siriusxm = ps: [ ]; # missing sxm + smart_fades = + ps: with ps; [ + beat-this + nnaudio + threadpoolctl + ]; + smart_playlist = ps: [ + ]; snapcast = ps: with ps; [ bidict @@ -173,6 +241,20 @@ ]; somafm = ps: [ ]; + sonic_analysis = + ps: with ps; [ + huggingface-hub + pyyaml + threadpoolctl + torchlibrosa + transformers + ]; + sonic_similarity = + ps: with ps; [ + huggingface-hub + transformers + usearch + ]; sonos = ps: with ps; [ aiosonos @@ -220,8 +302,20 @@ ps: with ps; [ aiovban ]; + webdav = ps: [ + ]; + wiim = + ps: with ps; [ + wiim + ]; + wikipedia = ps: [ + ]; yandex_music = ps: [ - ]; # missing yandex-music + ]; # missing yandex-music, ya-passport-auth + yandex_smarthome = ps: [ + ]; # missing ya-passport-auth + yandex_ynison = ps: [ + ]; # missing ya-passport-auth yousee = ps: [ ]; ytmusic = @@ -232,6 +326,7 @@ ytmusicapi ]; # missing deno zvuk_music = ps: [ - ]; # missing zvuk-music + ]; + # missing zvuk-music }; } diff --git a/pkgs/by-name/mu/music-assistant/update-providers.py b/pkgs/by-name/mu/music-assistant/update-providers.py index c90eae86df44..b9273f4280b7 100755 --- a/pkgs/by-name/mu/music-assistant/update-providers.py +++ b/pkgs/by-name/mu/music-assistant/update-providers.py @@ -33,9 +33,13 @@ TEMPLATE = """# Do not edit manually, run ./update-providers.py {%- for provider in providers | sort(attribute='domain') %} {{ provider.domain }} = {% if provider.available %}ps: with ps;{% else %}ps:{% endif %} [ {%- for requirement in provider.available | sort %} - {{ requirement }} + {{ requirement }} {%- endfor %} - ];{% if provider.missing %} # missing {{ ", ".join(provider.missing) }}{% endif %} + ] +{%- for requirement in provider.extra_list_deps | sort %} + ++ {{ requirement }} +{%- endfor %} +;{% if provider.missing %} # missing {{ ", ".join(provider.missing) }}{% endif %} {%- endfor %} }; } @@ -62,6 +66,9 @@ PACKAGE_MAP = { EXTRA_DEPS = { + # Those providers cannot guard pydantic behind TYPE_CHECKING + "msx_bridge": ["pydantic"], + "nicovideo": ["pydantic"], "ytmusic": [ # https://github.com/music-assistant/server/blob/2.5.8/music_assistant/providers/ytmusic/__init__.py#L120 "bgutil-ytdlp-pot-provider", @@ -70,6 +77,11 @@ EXTRA_DEPS = { } +EXTRA_LIST_DEPS = { + "sendspin": ["aiosendspin.optional-dependencies.server"], +} + + def run_sync(cmd: List[str]) -> None: print(f"$ {' '.join(cmd)}") process = run(cmd) @@ -194,6 +206,7 @@ class Provider: domain: str available: list[str] = field(default_factory=list) missing: list[str] = field(default_factory=list) + extra_list_deps: list[str] = field(default_factory=list) def __eq__(self, other): return self.domain == other.domain @@ -207,7 +220,7 @@ async def resolve_providers(manifests) -> tuple[Set, Set]: providers = set() for manifest in manifests: provider = Provider(manifest.domain) - requirements = manifest.requirements + EXTRA_DEPS.get(manifest.domain, []) + requirements = manifest.requirements for requirement in requirements: # allow substituting requirement specifications that packaging cannot parse if requirement in PACKAGE_MAP: @@ -228,6 +241,12 @@ async def resolve_providers(manifests) -> tuple[Set, Set]: version = await get_package_version(attr) if version not in requirement.specifier: errors.append(f"{requirement} not satisfied by version {version}") + if manifest.domain in EXTRA_DEPS: + for requirement in EXTRA_DEPS[manifest.domain]: + provider.available.append(requirement) + if manifest.domain in EXTRA_LIST_DEPS: + for requirement in EXTRA_LIST_DEPS[manifest.domain]: + provider.extra_list_deps.append(requirement) providers.add(provider) if errors: print("\n - ", end="") From 44a1f74259647917ed880ec9be38effc791e4e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Mon, 25 May 2026 04:32:28 +0200 Subject: [PATCH 16/17] nixos/music-assistant: allow to access /proc/cpuinfo which is required for torch to function Also to display a warning but that is not that important. --- nixos/modules/services/audio/music-assistant.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nixos/modules/services/audio/music-assistant.nix b/nixos/modules/services/audio/music-assistant.nix index 8397c85592ba..8be485f1ec76 100644 --- a/nixos/modules/services/audio/music-assistant.nix +++ b/nixos/modules/services/audio/music-assistant.nix @@ -173,7 +173,10 @@ in # breaks pyopenssl's cffi calls, used in remote access feature # not compatible with llvmlite which is required by numba -> librosa MemoryDenyWriteExecute = false; - ProcSubset = "pid"; + # required for torch to properly detect the supported engines + # allows Music-Assistant to warn, if x86_64-v2 cpu features are missing + BindReadOnlyPaths = [ "/proc/cpuinfo" ]; + ProcSubset = "all"; ProtectClock = true; ProtectControlGroups = true; ProtectHome = true; From e21205445368867f6c0c32a8a17515ddfa85dc94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Mon, 15 Jun 2026 02:49:59 +0200 Subject: [PATCH 17/17] music-assistant: disable default providers --- .../mu/music-assistant/disable-default-provider.diff | 12 ++++++++++++ pkgs/by-name/mu/music-assistant/package.nix | 4 ++++ 2 files changed, 16 insertions(+) create mode 100644 pkgs/by-name/mu/music-assistant/disable-default-provider.diff diff --git a/pkgs/by-name/mu/music-assistant/disable-default-provider.diff b/pkgs/by-name/mu/music-assistant/disable-default-provider.diff new file mode 100644 index 000000000000..a86aa4175cb7 --- /dev/null +++ b/pkgs/by-name/mu/music-assistant/disable-default-provider.diff @@ -0,0 +1,12 @@ +diff --git a/music_assistant/mass.py b/music_assistant/mass.py +index 752f9e0af..9d7b3a521 100644 +--- a/music_assistant/mass.py ++++ b/music_assistant/mass.py +@@ -923,6 +923,7 @@ async def _load_providers(self) -> None: + changes_made = False + newly_created_defaults: set[str] = set() + for default_provider, require_mdns in DEFAULT_PROVIDERS: ++ continue + if default_provider in default_providers_setup: + # already processed/setup before, skip + continue diff --git a/pkgs/by-name/mu/music-assistant/package.nix b/pkgs/by-name/mu/music-assistant/package.nix index ce6c3ad5ac4f..c66e51117c4d 100644 --- a/pkgs/by-name/mu/music-assistant/package.nix +++ b/pkgs/by-name/mu/music-assistant/package.nix @@ -80,6 +80,10 @@ pythonPackages.buildPythonApplication rec { # ^^^^^^^^^^^^^^^ # E IndexError: tuple index out of range ./fix-webserver-tests-in-sandbox.patch + + # As providers must be configured through the nixos module, there is no gain + # if Music Assistant tries to enable some of them without the proper dependencies. + ./disable-default-provider.diff ]; postPatch = ''