1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
<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 75
- Cambridge Audio Evo 150
- Cambridge Audio CXN
- Cambridge Audio CXN (v2)
- Cambridge Audio CXR120
- Cambridge Audio CXR200
- Cambridge Audio 851N
- Cambridge Audio Edge NQ
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
```
# Examples
## Basic Example
```python
import asyncio
from aiostreammagic import StreamMagicClient, Source, Info
HOST = "192.168.20.218"
async def main():
"""Basic demo entrypoint."""
client = StreamMagicClient("192.168.20.218")
await client.connect()
info: Info = await client.get_info()
sources: list[Source] = await client.get_sources()
print(f"Model: {info.model}")
for source in sources:
print(f"Name: {source.id} ({source.id})")
await client.disconnect()
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.get_info()}")
print(f"Sources: {client.get_sources()}")
print(f"State: {client.get_state()}")
print(f"Play State: {client.get_play_state()}")
print(f"Now Playing: {client.get_now_playing()}")
async def main():
"""Subscribe demo entrypoint."""
client = StreamMagicClient("192.168.20.218")
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())
```
[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/2024.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/
|