Releases: b0bbywan/pyodio
Release list
v0.2.0
Highlights
MPRIS tracklist support. Players implementing the MPRIS TrackList interface now expose their queue as live hub state — the tracks, the current entry, and the commands that edit them — kept fresh over SSE like every other domain.
Tracklists need go-odio-api v0.16.1 or later. Older servers keep working unchanged: tracklist_supported stays False, the tracklist fetch failure is swallowed, and no tracklist event is ever emitted.
✨ Features
Player.tracklist— a liveTracklistState(tracks,can_edit_tracks),
fed by theplayer.tracklist.updatedSSE event and eagerly fetched at connect
and after every reconnect resync.Player.tracks,Player.can_edit_tracksand
Player.current_track(the entry matching the currentmpris:trackid) read
straight from it.- Tracklist commands —
Player.go_to(),Player.add_track(uri, after_track=..., set_as_current=...)andPlayer.remove_track(), each taking
either aTrackor a raw track id. Trackmodel — the MPRIS track object path plus flattened metadata, with
the sametitle/artist/album/art_url/durationaccessors as
PlayerState.PlayerState.tracklist_supported— whether the player implements the
TrackList interface, so consumers can gate their UI without probing. A
tracklist event flips it on even if the initial snapshot predated support.TRACKLISTchange key — subscribe viaodio.players.on_change()alongside
added/updated/removed/positionto react to queue changes.- REST layer —
OdioClient.get_player_tracklist(),
player_tracklist_goto(),player_tracklist_add()and
player_tracklist_remove(), one per odio-api tracklist endpoint.
🧹 Internal
- Tests — tracklist parsing, the four REST calls, and the hub's SSE, resync
and failure paths are exercised against the in-memory fake odio-api server. - Docs — the README quick start and hub reference cover the tracklist
surface.
Full Changelog: v0.1.0...v0.2.0
v0.1.0
Highlights
First stable release — pyodio is now on PyPI: pip install pyodio.
pyodio is the async Python client for odio-api: connect once and the library keeps a live mirror of the server state (MPRIS players, audio, systemd services, Bluetooth, power, upgrades) over the SSE stream, with automatic reconnection and resynchronization. Built as the foundation for the odio Home Assistant integration (odio-ha).
- #3 — HA-parity upgrade semantics: upgrade runs are closed by the server's lifecycle verdict — never by the raw script
end— so systemd-triggered and directly-run scripts behave identically.
✨ Features
OdioHub— the stateful, event-driven API. Every entity carries both its
current state and the commands that act on it: players (transport, volume,
position with client-side extrapolation), audio clients and outputs, systemd
services, Bluetooth adapter and devices, power actions, upgrades. Backends
the server doesn't expose are gated off automatically.OdioClient— the thin async REST layer underneath, one method per
endpoint, usable standalone.- Upgrade runs, HA-ready —
upgrade.in_progress,progress_percent,
version fields and run state follow the server's run-lifecycle contract:
the terminal state is the verdict (idle= success,failed= failure),
and a successful run reflectscurrent = latestwithout waiting for
re-detection. OdioHub.start()— start the event stream without a blocking initial
sync, for callers holding cached state while the server is down.- Cover cache-busting —
Player.cover_urlvaries with the current track
and art URL, so consumers refetch exactly when the artwork changes. - Old-server compatibility —
position_updated_atis stamped at receipt
when servers omit it, keeping position extrapolation working.
🧹 Internal
- CI & publishing (#1) — ruff, mypy, pytest on Python 3.12–3.14, sdist +
wheel build, immutable GitHub releases, trusted publishing to TestPyPI on
every tag and to PyPI on final releases. - Test suite — the whole surface is exercised against an in-memory fake
odio-api server (REST + SSE), including reconnection and upgrade lifecycle
scenarios.
Full Changelog: https://github.com/b0bbywan/pyodio/commits/v0.1.0
v0.1.0-rc3
What's Changed
- Add CI: ruff, mypy, tests, build and PyPI publishing by @b0bbywan in #1
- chore(deps): bump actions/checkout from 6 to 7 in the actions group by @dependabot[bot] in #2
New Contributors
- @b0bbywan made their first contribution in #1
- @dependabot[bot] made their first contribution in #2
Full Changelog: v0.1.0-rc2...v0.1.0-rc3
v0.1.0-rc2
Full Changelog: v0.1.0-rc1...v0.1.0-rc2
v0.1.0-rc1
Full Changelog: https://github.com/b0bbywan/pyodio/commits/v0.1.0-rc1