Skip to content

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 14 May 10:47
· 21 commits to master since this release

v1.1.0 — asyncio rewrite

First stable release of the asyncio rewrite of the hifiberry/snapcastmpris fork, retargeted for odio streamer (b0bbywan/odios).

Install:

curl -fsSL https://apt.odio.love/key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/odio.gpg
echo "deb [signed-by=/usr/share/keyrings/odio.gpg] https://apt.odio.love stable main" \
    | sudo tee /etc/apt/sources.list.d/odio.list
sudo apt update
sudo apt install snapclientmpris

Enable (user mode, default — session D-Bus):

systemctl --user enable --now snapclientmpris.service

Enable (system mode — legacy hifiberry-style, system D-Bus):

sudo cp /usr/share/snapclientmpris/snapclientmpris.conf /etc/snapclientmpris.conf
sudo sed -i 's/^dbus-bus = session/dbus-bus = system/' /etc/snapclientmpris.conf
sudo systemctl enable --now snapclientmpris.service

✨ What's new

  • Multi-room playback control: MPRIS Play / Pause / Next / Previous / Stop forward to the stream source via snapserver's Stream.Control — pausing from one room pauses every listener on the stream (Spotify-Connect-like semantics). Can* capabilities mirrored from the stream so MPRIS clients only enable the buttons the source actually supports.
  • Real track metadata: title, artist, album, art are picked up from snapserver's Stream.OnProperties event (snapserver >= 0.27) and surfaced as xesam:* / mpris:* keys.
  • Zeroconf snapserver discovery: leave server = unset and the daemon finds the snapserver via _snapcast-ctrl._tcp (snapserver >= 0.33). control-port override stays for older snapserver.

⚙️ Configuration

  • XDG-aware: $XDG_CONFIG_HOME/snapclientmpris/snapclientmpris.conf with /etc/snapclientmpris.conf as fallback; example template at /usr/share/snapclientmpris/snapclientmpris.conf.
  • dbus-bus key: session (default — systemctl --user) or system (legacy hifiberry-style, runs as _snapclient with the shipped D-Bus policy at /usr/share/dbus-1/system.d/org.mpris.MediaPlayer2.snapcast.conf).

🛠️ Under the hood

  • Asyncio core: single event loop. python-snapcast drives the snapserver JSON-RPC channel; dbus-fast exports MPRIS. No more threads + GLib MainLoop + dbus-python + websocket-client.
  • Repo renamed snapcastmprissnapclientmpris (the daemon controls the local snapclient, not the snapserver). Bus name unchanged: org.mpris.MediaPlayer2.snapcast.
  • Dropped: ALSA volume sync and the HiFiBerry pause-all integration — both were tied to the original appliance and don't fit the odio.love target.

🏗️ CI / Dev

  • Top-level Makefile (lint / test / build / deb / sync-deb / clean) shared by local dev and the GitHub workflow.
  • ruff + mypy + pytest gating PRs.
  • .deb built on debian:trixie, attached to this release, and dispatched to b0bbywan/odio-apt-repo so apt.odio.love picks it up.

Full changelog: v1.0.1-rc.1...v1.1.0

What's Changed

New Contributors