Metadata-Version: 2.4
Name: aiostreammagic
Version: 2.12.1
Summary: An async python package for interfacing with Cambridge Audio / Stream Magic compatible streamers.
License-Expression: MIT
License-File: LICENSE
Author: Noah Husby
Author-email: 32528627+noahhusby@users.noreply.github.com
Maintainer: Noah Husby
Maintainer-email: 32528627+noahhusby@users.noreply.github.com
Requires-Python: >=3.11
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Provides-Extra: dev
Provides-Extra: docs
Requires-Dist: aiohttp (>=3.12.14)
Requires-Dist: mashumaro (>=3.17)
Requires-Dist: mypy (==1.19.1) ; extra == "dev"
Requires-Dist: orjson (>=3.11.0)
Requires-Dist: pdoc (>=14.7,<17.0) ; extra == "docs"
Requires-Dist: pytest (==9.0.2) ; extra == "dev"
Requires-Dist: pytest-asyncio (==1.3.0) ; extra == "dev"
Requires-Dist: pytest-cov (==7.0.0) ; extra == "dev"
Requires-Dist: ruff (==0.15.0) ; extra == "dev"
Requires-Dist: yarl (>=1.20.1)
Project-URL: Documentation, https://github.com/noahhusby/aiostreammagic
Project-URL: Homepage, https://github.com/noahhusby/aiostreammagic
Project-URL: Repository, https://github.com/noahhusby/aiostreammagic
Description-Content-Type: text/markdown

<div align="center">

# aiostreammagic

#### An async python package for interfacing with Cambridge Audio / Stream Magic compatible streamers

[**📖 Read the docs »**][docs]

[![GitHub Release][releases-shield]][releases]
[![Python Versions][python-versions-shield]][pypi]
[![Downloads][downloads-shield]][pypi]
![Project Maintenance][maintenance-shield]
[![License][license-shield]](LICENSE.md)

</div>

# About

This module implements a Python client for the Stream Magic API used to control Cambridge Audio streamers. The API connects over websockets and supports several streamers, receivers, and pre-amps.

## Supported Devices

- Cambridge Audio Evo One
- Cambridge Audio Evo 75
- Cambridge Audio Evo 150
- Cambridge Audio CXN
- Cambridge Audio CXN V2
- Cambridge Audio CXN100
- Cambridge Audio CXR120
- Cambridge Audio CXR200
- Cambridge Audio 851N
- Cambridge Audio Edge NQ
- Cambridge Audio AXN10

If your model is not on the list of supported devices, and everything works correctly then add it to the list by opening a pull request.

# Installation

```shell
pip install aiostreammagic
```

# Usage

## Basic Example

```python
import asyncio

from aiostreammagic import StreamMagicClient

HOST = "192.168.20.218"


async def main():
    """Basic demo entrypoint."""
    async with StreamMagicClient(HOST) as client:

        print(f"Model: {client.info.model}")

        for source in client.sources:
            print(f"Name: {source.id} ({source.id})")

if __name__ == '__main__':
    asyncio.run(main())
```

## Subscription Example

The Cambridge Audio StreamMagic API can automatically notify the client of changes instead of the need for polling. Register a callback to be called whenver new information is available.

```python
import asyncio

from aiostreammagic import StreamMagicClient

HOST = "192.168.20.218"


async def on_state_change(client: StreamMagicClient):
    """Called when new information is received."""
    print(f"System info: {client.info}")
    print(f"Sources: {client.sources}")
    print(f"State: {client.state}")
    print(f"Play State: {client.play_state}")
    print(f"Now Playing: {client.now_playing}")

async def main():
    """Subscribe demo entrypoint."""
    client = StreamMagicClient(HOST)
    await client.register_state_update_callbacks(on_state_change)
    await client.connect()

    # Play media using the unit's front controls or StreamMagic app
    await asyncio.sleep(60)

    await client.disconnect()


if __name__ == '__main__':
    asyncio.run(main())
```

## Advanced Audio Settings

### Balance

Adjust left/right speaker balance (requires pre-amp mode):

```python
async with StreamMagicClient(HOST) as client:
    await client.set_pre_amp_mode(True)
    await client.set_balance(-5)  # Range: -15 (left) to 15 (right)
```

### Room Correction

Enable and adjust tilt EQ for room acoustics (negative values add warmth for bright/hard-surfaced rooms, positive values add brightness for soft/damped rooms):

```python
async with StreamMagicClient(HOST) as client:
    await client.set_room_correction_mode(True)
    await client.set_room_correction_intensity(8)  # Range: -15 to 15
```

### Equalizer

Configure the 7-band parametric equalizer (bands 0-6 at 80, 120, 315, 800, 2000, 5000, 8000 Hz):

```python
from aiostreammagic import EQBand, UserEQ

async with StreamMagicClient(HOST) as client:
    # Enable equalizer
    await client.set_equalizer_mode(True)

    # Adjust individual bands (0-6)
    await client.set_equalizer_band_gain(3, 2.5)  # Band 3, +2.5 dB, Range: -6 to +3

    # Set all bands at once (Balanced Hi-Fi preset)
    gains = [1.0, 0.5, 0.0, 0.0, 0.0, 0.5, 1.0]
    bands = [EQBand(index=i, gain=gains[i]) for i in range(7)]
    await client.set_equalizer_params(UserEQ(enabled=True, bands=bands))

    # Reset to defaults
    await client.set_equalizer_defaults()
```

[license-shield]: https://img.shields.io/github/license/noahhusby/aiostreammagic.svg
[docs]: https://noahhusby.github.io/aiostreammagic/
[downloads-shield]: https://img.shields.io/pypi/dm/aiostreammagic
[python-versions-shield]: https://img.shields.io/pypi/pyversions/aiostreammagic
[maintenance-shield]: https://img.shields.io/maintenance/yes/2025.svg
[releases-shield]: https://img.shields.io/github/release/noahhusby/aiostreammagic.svg
[releases]: https://github.com/noahhusby/aiostreammagic/releases
[pypi]: https://pypi.org/project/aiostreammagic/

