Skip to content

Releases: b0bbywan/pyodio

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 28 Jul 18:01
Immutable release. Only release title and notes can be modified.

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 live TracklistState (tracks, can_edit_tracks),
    fed by the player.tracklist.updated SSE event and eagerly fetched at connect
    and after every reconnect resync. Player.tracks, Player.can_edit_tracks and
    Player.current_track (the entry matching the current mpris:trackid) read
    straight from it.
  • Tracklist commandsPlayer.go_to(), Player.add_track(uri, after_track=..., set_as_current=...) and Player.remove_track(), each taking
    either a Track or a raw track id.
  • Track model — the MPRIS track object path plus flattened metadata, with
    the same title / artist / album / art_url / duration accessors 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.
  • TRACKLIST change key — subscribe via odio.players.on_change() alongside
    added / updated / removed / position to react to queue changes.
  • REST layerOdioClient.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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 18:23
Immutable release. Only release title and notes can be modified.

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-readyupgrade.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 reflects current = latest without 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-bustingPlayer.cover_url varies with the current track
    and art URL, so consumers refetch exactly when the artwork changes.
  • Old-server compatibilityposition_updated_at is 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

v0.1.0-rc3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Jul 18:19
Immutable release. Only release title and notes can be modified.

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

Full Changelog: v0.1.0-rc2...v0.1.0-rc3

v0.1.0-rc2

v0.1.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Jul 19:36
Immutable release. Only release title and notes can be modified.

Full Changelog: v0.1.0-rc1...v0.1.0-rc2

v0.1.0-rc1

v0.1.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Jul 19:33
Immutable release. Only release title and notes can be modified.