You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
aiosendspin[server]~=6.0.1 pin locks out 6.1.x, where MediaCommand.SEEK lives — servers advertising seek silence the daemon #280
~=6.0.1 resolves to >=6.0.1, <6.1.0, so a fresh pip install sendspin can never receive aiosendspin 6.1.x.
That matters because 6.1.0 added seek and seek_relative to MediaCommand, and servers have started advertising them. Loxone/Sonn Core 4.0.0-beta.21 puts both into controller.supported_commands for any track with a known duration. On aiosendspin 6.0.x that value cannot be parsed, and since supported_commands is typed list[MediaCommand], the whole server/state message is thrown away:
ERROR:aiosendspin.client.client:Failed to parse server message: {"type":"server/state","payload":{"controller":{"supported_commands":[...,"seek","seek_relative"],"volume":10,...,"seek_max_ms":310000}}}
ValueError: 'seek' is not a valid MediaCommand
mashumaro.exceptions.InvalidFieldValue: Field "supported_commands" of type list[MediaCommand] in ControllerStatePayload has invalid value [...]
The daemon then never starts a stream — the room is simply silent, while volume commands (a different message) still apply, so the client looks alive. Live streams with no duration keep working, which makes it look source-specific rather than protocol-specific.
Installing aiosendspin==6.1.1 fixes it completely (verified here across 5 rooms: Stream started with codec pcm immediately after the restart, audio at the card), but leaves the install outside the daemon's own declared range:
ERROR: pip's dependency resolver ... sendspin 7.5.0 requires aiosendspin[server]~=6.0.1, but you have aiosendspin 6.1.1 which is incompatible.
Would you consider relaxing the pin to >=6.0.1,<7 (or cutting a 7.5.1 that does)? The 6.0.5 → 6.1.1 delta is additive on the client side — two enum members, the matching ControllerStatePayload fields, and small server-role changes.
Independent confirmation from a second deployment — moOde 10.3.4 on a Raspberry Pi against Music Assistant 2.10.x, i.e. the same combination reported in #278.
Observed: every controller update discarded, 24 server/state messages in a 90-minute journal window (18 of them in a single hour):
ERROR:aiosendspin.client.client:Failed to parse server message: {"type":"server/state", ..., "supported_commands": [..., "seek_relative", ...]}
mashumaro.exceptions.InvalidFieldValue: Field "supported_commands" of type list[MediaCommand] has invalid value [...]
Audio is unaffected throughout — Stream started with codec flac, device held, metadata flowing — so the client looks alive while volume/mute/repeat/shuffle silently stop syncing. Zero such messages once aiosendspin is 6.1.1.
A durable interim workaround for anyone hitting this today.uv tool install accepts --overrides, which overrides the transitive constraint, and — unlike a hand-applied uv pip install — uv records it in the tool receipt, so it survives uv tool upgrade:
Verified here: uv-receipt.toml then contains overrides = [{ name = "aiosendspin", specifier = ">=6.1.1,<6.2" }], and a subsequent uv tool upgrade sendspin leaves the override in place instead of re-resolving back to 6.0.5 (which a plain upgrade, --reinstall, and --force all do).
Two things from testing that may save others time:
uv tool install ... --with "aiosendspin>=6.1.1" fails with requirements are unsatisfiable — an added requirement cannot override a transitive pin; only --overrides can.
Activity
fix(sendspin): record a declared aiosendspin override so MA controlle…
kiwipaulrob commentedon Sep 29, 2026
Independent confirmation from a second deployment — moOde 10.3.4 on a Raspberry Pi against Music Assistant 2.10.x, i.e. the same combination reported in #278.
Observed: every controller update discarded, 24
server/statemessages in a 90-minute journal window (18 of them in a single hour):Audio is unaffected throughout —
Stream started with codec flac, device held, metadata flowing — so the client looks alive while volume/mute/repeat/shuffle silently stop syncing. Zero such messages onceaiosendspinis 6.1.1.A durable interim workaround for anyone hitting this today.
uv tool installaccepts--overrides, which overrides the transitive constraint, and — unlike a hand-applieduv pip install— uv records it in the tool receipt, so it survivesuv tool upgrade:Verified here:
uv-receipt.tomlthen containsoverrides = [{ name = "aiosendspin", specifier = ">=6.1.1,<6.2" }], and a subsequentuv tool upgrade sendspinleaves the override in place instead of re-resolving back to 6.0.5 (which a plain upgrade,--reinstall, and--forceall do).Two things from testing that may save others time:
uv tool install ... --with "aiosendspin>=6.1.1"fails withrequirements are unsatisfiable— an added requirement cannot override a transitive pin; only--overridescan.<6.2. Unbounded>=6.1.1resolves to 9.1.1, and per Add paired source@v1 support and update aiosendspin to 9.1 #276 that version required migrating client/daemon/TUI, so 6.1.x is the drop-in range.Still hoping for the pin relaxation to
>=6.0.1,<7(or a 7.5.1) so the workaround isn't needed — but this gives users a supported path in the meantime.