From d56af15cc1962aecf7f96ae20ed0a92c97370579 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Thu, 4 Jan 2024 17:11:19 +0100 Subject: [PATCH 01/13] Commit initial work --- .gitignore | 105 ++++++++++++++++++++++++++++++++++ LICENSE | 21 +++++++ pyproject.toml | 28 +++++++++ requirements.txt | 9 +++ requirements_dev.txt | 9 +++ setup.cfg | 34 +++++++++++ setup.py | 4 ++ src/linkplay/__init__.py | 0 src/linkplay/bridge.py | 50 ++++++++++++++++ src/linkplay/consts.py | 89 ++++++++++++++++++++++++++++ src/linkplay/exceptions.py | 6 ++ src/linkplay/utils.py | 24 ++++++++ src/py.typed | 0 tests/linkplay/test_bridge.py | 6 ++ tox.ini | 27 +++++++++ version.txt | 1 + 16 files changed, 413 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 requirements_dev.txt create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 src/linkplay/__init__.py create mode 100644 src/linkplay/bridge.py create mode 100644 src/linkplay/consts.py create mode 100644 src/linkplay/exceptions.py create mode 100644 src/linkplay/utils.py create mode 100644 src/py.typed create mode 100644 tests/linkplay/test_bridge.py create mode 100644 tox.ini create mode 100644 version.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..398785f --- /dev/null +++ b/.gitignore @@ -0,0 +1,105 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +.vscode \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..094b494 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Velleman Group nv + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d1289ee --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,28 @@ +[build-system] +requires = ["setuptools>=42.0", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.pytest.ini_options] +addopts = "--cov=linkplay" +testpaths = [ + "tests", +] + +log_cli = true +log_cli_level = "INFO" +log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" +log_cli_date_format = "%Y-%m-%d %H:%M:%S" + +[tool.mypy] +mypy_path = "src" +check_untyped_defs = true +disallow_any_generics = true +ignore_missing_imports = true +no_implicit_optional = true +show_error_codes = true +strict_equality = true +warn_redundant_casts = true +warn_return_any = true +warn_unreachable = true +warn_unused_configs = true +no_implicit_reexport = true \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1191179 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +# requirements.txt +# +# installs dependencies from ./setup.py, and the package itself, +# in editable mode +-e . + +# (the -e above is optional). you could also just install the package +# normally with just the line below (after uncommenting) +# . \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..c9263bd --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,9 @@ +# requirements_dev.txt +# +# installs dev dependencies from ./setup.py, and the package itself, +# in editable mode +-e ./[testing] + +# (the -e above is optional). you could also just install the package +# normally with just the line below (after uncommenting) +# . \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..2105535 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,34 @@ +[metadata] +name = python_linkplay +description = Python library to control LinkPlay devices +author = Velleman Group nv +version = 0.0.0 + +[options] +packages = find_namespace: +install_requires = + async-timeout>=4.0.3 + aiohttp>=3.9.1 +python_requires = >=3.8 +package_dir = + =src +zip_safe = no + +[options.package_data] +linkplay = py.typed + +[options.packages.find] +where = src + +[options.extras_require] +testing = + pytest>=7.3.1 + pytest-cov>=4.1.0 + pytest-mock>=3.10.0 + mypy>=1.3.0 + flake8>=6.0.0 + tox>=4.6.0 + typing-extensions>=4.6.3 + +[flake8] +max-line-length = 160 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..57c026b --- /dev/null +++ b/setup.py @@ -0,0 +1,4 @@ +from setuptools import setup + +if __name__ == "__main__": + setup() \ No newline at end of file diff --git a/src/linkplay/__init__.py b/src/linkplay/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py new file mode 100644 index 0000000..95db577 --- /dev/null +++ b/src/linkplay/bridge.py @@ -0,0 +1,50 @@ +from typing import Dict +from aiohttp import ClientSession + +from linkplay.consts import LinkPlayCommand, DeviceStatus, PlayerStatus, API_ENDPOINT +from linkplay.utils import session_call_api + + +class LinkPlayBridge(): + """Represents a LinkPlay device.""" + + protocol: str + ip: str + device_status: Dict[DeviceStatus, str] + player_status: Dict[PlayerStatus, str] + + def __init__(self, protocol: str, ip: str, ): + self.protocol = protocol + self.ip = ip + + @property + def endpoint(self) -> str: + return API_ENDPOINT.format(self.protocol, self.ip) + + async def update_device_status(self, session: ClientSession): + self.device_status = await session_call_api(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) + + async def update_player_status(self, session: ClientSession): + status = await session_call_api(self.endpoint, session, LinkPlayCommand.PLAYER_STATUS) + status[PlayerStatus.TITLE] = bytes.fromhex(status[PlayerStatus.TITLE]).decode("utf-8") + status[PlayerStatus.ARTIST] = bytes.fromhex(status[PlayerStatus.ARTIST]).decode("utf-8") + status[PlayerStatus.ALBUM] = bytes.fromhex(status[PlayerStatus.ALBUM]).decode("utf-8") + self.player_status = status + + async def next(self, session: ClientSession): + await session_call_api(self.endpoint, session, LinkPlayCommand.NEXT) + + async def previous(self, session: ClientSession): + await session_call_api(self.endpoint, session, LinkPlayCommand.PREVIOUS) + + async def play(self, session: ClientSession, value: str): + await session_call_api(self.endpoint, session, LinkPlayCommand.PLAY.format(value)) + + async def resume(self, session: ClientSession): + await session_call_api(self.endpoint, session, LinkPlayCommand.RESUME) + + async def mute(self, session: ClientSession): + await session_call_api(self.endpoint, session, LinkPlayCommand.MUTE) + + async def unmute(self, session: ClientSession): + await session_call_api(self.endpoint, session, LinkPlayCommand.UNMUTE) diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py new file mode 100644 index 0000000..6b4bb30 --- /dev/null +++ b/src/linkplay/consts.py @@ -0,0 +1,89 @@ +from enum import StrEnum + +API_ENDPOINT: str = "{}://{}/httpapi.asp" +API_TIMEOUT = 2 + + +class LinkPlayCommand(StrEnum): + DEVICE_STATUS = "getStatus" + SYSLOG = "getsyslog" + UPDATE_SERVER = "GetUpdateServer" + PLAYER_STATUS = "getPlayerStatus" + NEXT = "setPlayerCmd:next" + PREVIOUS = "setPlayerCmd:prev" + UNMUTE = "setPlayerCmd:mute:0" + MUTE = "setPlayerCmd:mute:1" + RESUME = "setPlayerCmd:resume" + PLAY = "setPlayerCmd:play:{}" + SEEK = "setPlayerCmd:seek:{}" + VOL = "setPlayerCmd:vol:{}" + + +class SpeakerType(StrEnum): + """Defines the speaker type.""" + MAIN_SPEAKER = "0" + SUB_SPEAKER = "1" + + +class ChannelType(StrEnum): + """Defines the channel type.""" + STEREO = "0" + LEFT_CHANNEL = "1" + RIGHT_CHANNEL = "2" + + +class PlaybackMode(StrEnum): + """Defines the playback mode.""" + NONE = "0" + WIIMU = "10" + HTTP = "20" + + +class PlaylistMode(StrEnum): + """Defines the playlist mode.""" + CONTINOUS_PLAY_ONE_SONG = "-1" + PLAY_IN_ORDER = "0" + CONTINUOUS_PLAYBACK = "1" + RANDOM_PLAYBACK = "2" + LIST_CYCLE = "3" + + +class EqualizerMode(StrEnum): + """Defines the equalizer mode.""" + NONE = "0" + CLASSIC = "1" + POP = "2" + JAZZ = "3" + VOCAL = "4" + + +class PlayingStatus(StrEnum): + """Defines the playing status.""" + PLAYING = "play" + LOADING = "load" + STOPPED = "stop" + PAUSED = "pause" + + +class PlayerStatus(StrEnum): + SPEAKER_TYPE = "type" + CHANNEL_TYPE = "ch" + PLAYBACK_MODE = "mode" + PLAYLIST_MODE = "loop" + EQUALIZER_MODE = "eq" + PLAYING_STATUS = "status" + CURRENT_POSITION = "curpos" + OFFSET_POSITION = "offset_pts" + TOTAL_LENGTH = "totlen" + TITLE = "Title" + ARTIST = "Artist" + ALBUM = "Album" + ALARM_FLAG = "alarmflag" + PLAYLIST_COUNT = "plicount" + PLAYLIST_INDEX = "plicurr" + VOLUME = "vol" + MUTED = "mute" + + +class DeviceStatus(StrEnum): + UUID = "uuid" diff --git a/src/linkplay/exceptions.py b/src/linkplay/exceptions.py new file mode 100644 index 0000000..3679893 --- /dev/null +++ b/src/linkplay/exceptions.py @@ -0,0 +1,6 @@ +class LinkPlayException(Exception): + pass + + +class LinkPlayRequestException(LinkPlayException): + pass diff --git a/src/linkplay/utils.py b/src/linkplay/utils.py new file mode 100644 index 0000000..c351671 --- /dev/null +++ b/src/linkplay/utils.py @@ -0,0 +1,24 @@ +import asyncio +from asyncio import CancelledError +import async_timeout +from aiohttp import ClientSession, ClientError +from http import HTTPStatus + +from linkplay.consts import API_TIMEOUT +from linkplay.exceptions import LinkPlayRequestException + + +async def session_call_api(endpoint: str, session: ClientSession, command: str): + url = f"{endpoint}?command={command}" + + try: + async with async_timeout.timeout(API_TIMEOUT): + response = await session.get(url, ssl=False) + + except (asyncio.TimeoutError, ClientError, CancelledError) as error: + raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}': {}".format(url, error)) from error + + if response.status == HTTPStatus.OK: + return await response.text() + + raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}': {} / {}".format(url, response.status, response)) diff --git a/src/py.typed b/src/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/tests/linkplay/test_bridge.py b/tests/linkplay/test_bridge.py new file mode 100644 index 0000000..8fdf028 --- /dev/null +++ b/tests/linkplay/test_bridge.py @@ -0,0 +1,6 @@ +from linkplay.bridge import LinkPlayBridge + + +def test_endpoint(): + bridge = LinkPlayBridge("http", "1.2.3.4") + assert "http://1.2.3.4/httpapi.asp" == bridge.endpoint diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..a157cd2 --- /dev/null +++ b/tox.ini @@ -0,0 +1,27 @@ +[tox] +minversion = 4.6.0 +envlist = py311, flake8, mypy +isolated_build = true + +[gh-actions] +python = + 3.11: py311, mypy, flake8 + +[testenv] +setenv = + PYTHONPATH = {toxinidir} +deps = + -r{toxinidir}/requirements_dev.txt +commands = + pytest --cov-report html:htmlcov/pytest --basetemp={envtmpdir} + +[testenv:flake8] +basepython = python3.11 +deps = flake8 +commands = flake8 src tests + +[testenv:mypy] +basepython = python3.11 +deps = + -r{toxinidir}/requirements_dev.txt +commands = mypy --install-types --non-interactive src \ No newline at end of file diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..bd52db8 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.0.0 \ No newline at end of file From c937f7dfdc8e964c0a4b6d02fc721548374a0096 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Thu, 4 Jan 2024 17:18:05 +0100 Subject: [PATCH 02/13] Change endpoint to be just protocol and ip --- src/linkplay/bridge.py | 4 ++-- src/linkplay/consts.py | 2 +- src/linkplay/utils.py | 4 ++-- tests/linkplay/test_bridge.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index 95db577..dd9db1d 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -1,7 +1,7 @@ from typing import Dict from aiohttp import ClientSession -from linkplay.consts import LinkPlayCommand, DeviceStatus, PlayerStatus, API_ENDPOINT +from linkplay.consts import LinkPlayCommand, DeviceStatus, PlayerStatus from linkplay.utils import session_call_api @@ -19,7 +19,7 @@ def __init__(self, protocol: str, ip: str, ): @property def endpoint(self) -> str: - return API_ENDPOINT.format(self.protocol, self.ip) + return f"{self.protocol}://{self.ip}" async def update_device_status(self, session: ClientSession): self.device_status = await session_call_api(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index 6b4bb30..e03cdd2 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -1,6 +1,6 @@ from enum import StrEnum -API_ENDPOINT: str = "{}://{}/httpapi.asp" +API_ENDPOINT: str = "{}/httpapi.asp?command={}" API_TIMEOUT = 2 diff --git a/src/linkplay/utils.py b/src/linkplay/utils.py index c351671..12129ad 100644 --- a/src/linkplay/utils.py +++ b/src/linkplay/utils.py @@ -4,12 +4,12 @@ from aiohttp import ClientSession, ClientError from http import HTTPStatus -from linkplay.consts import API_TIMEOUT +from linkplay.consts import API_ENDPOINT, API_TIMEOUT from linkplay.exceptions import LinkPlayRequestException async def session_call_api(endpoint: str, session: ClientSession, command: str): - url = f"{endpoint}?command={command}" + url = API_ENDPOINT.format(endpoint, command) try: async with async_timeout.timeout(API_TIMEOUT): diff --git a/tests/linkplay/test_bridge.py b/tests/linkplay/test_bridge.py index 8fdf028..0dbf23c 100644 --- a/tests/linkplay/test_bridge.py +++ b/tests/linkplay/test_bridge.py @@ -3,4 +3,4 @@ def test_endpoint(): bridge = LinkPlayBridge("http", "1.2.3.4") - assert "http://1.2.3.4/httpapi.asp" == bridge.endpoint + assert "http://1.2.3.4" == bridge.endpoint From 48848998f152e0670fd6ff74b5e9327c9a20dabc Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Fri, 5 Jan 2024 10:08:58 +0100 Subject: [PATCH 03/13] Add discovery Add more command Add comments Add utility commands Fill DeviceStatus enum Auto fill device_status Auto fill player_status Add main method to test --- setup.cfg | 5 +- src/linkplay/__main__.py | 17 ++++++ src/linkplay/bridge.py | 106 ++++++++++++++++++++++++++++++-------- src/linkplay/consts.py | 91 +++++++++++++++++++++++++++++++- src/linkplay/discovery.py | 37 +++++++++++++ src/linkplay/utils.py | 20 +++++-- 6 files changed, 248 insertions(+), 28 deletions(-) create mode 100644 src/linkplay/__main__.py create mode 100644 src/linkplay/discovery.py diff --git a/setup.cfg b/setup.cfg index 2105535..7795840 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,8 +7,9 @@ version = 0.0.0 [options] packages = find_namespace: install_requires = - async-timeout>=4.0.3 - aiohttp>=3.9.1 + async-timeout==4.0.3 + aiohttp==3.9.1 + async_upnp_client==0.38.0 python_requires = >=3.8 package_dir = =src diff --git a/src/linkplay/__main__.py b/src/linkplay/__main__.py new file mode 100644 index 0000000..5a133a4 --- /dev/null +++ b/src/linkplay/__main__.py @@ -0,0 +1,17 @@ +import asyncio +import aiohttp + +from linkplay.consts import PlayerStatus +from linkplay.discovery import discover_linkplay_devices + +async def main(): + async with aiohttp.ClientSession() as session: + bridges = await discover_linkplay_devices(session) + + if len(bridges) > 0: + bridge = bridges[0] + await bridge.set_volume(session, 100) + print(f"{bridge}: {bridge.player_status[PlayerStatus.ARTIST]} - {bridge.player_status[PlayerStatus.TITLE]} - {bridge.volume}%") + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index dd9db1d..390ba6d 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -1,8 +1,8 @@ from typing import Dict from aiohttp import ClientSession -from linkplay.consts import LinkPlayCommand, DeviceStatus, PlayerStatus -from linkplay.utils import session_call_api +from linkplay.consts import LinkPlayCommand, DeviceStatus, PlayerStatus, MuteMode, UNKNOWN_TRACK_PLAYING +from linkplay.utils import session_call_api_json, session_call_api_ok class LinkPlayBridge(): @@ -10,41 +10,105 @@ class LinkPlayBridge(): protocol: str ip: str - device_status: Dict[DeviceStatus, str] - player_status: Dict[PlayerStatus, str] + device_status: Dict[DeviceStatus, str] = dict.fromkeys(DeviceStatus.__members__.values(), None) + player_status: Dict[PlayerStatus, str] = dict.fromkeys(PlayerStatus.__members__.values(), None) - def __init__(self, protocol: str, ip: str, ): + def __init__(self, protocol: str, ip: str): self.protocol = protocol self.ip = ip - @property - def endpoint(self) -> str: - return f"{self.protocol}://{self.ip}" + def __repr__(self) -> str: + if not self.device_status[DeviceStatus.DEVICE_NAME]: + return self.endpoint - async def update_device_status(self, session: ClientSession): - self.device_status = await session_call_api(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) + return self.device_status[DeviceStatus.DEVICE_NAME] + + async def update_device_status(self, session: ClientSession) -> None: + """Update the device status.""" + self.device_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) async def update_player_status(self, session: ClientSession): - status = await session_call_api(self.endpoint, session, LinkPlayCommand.PLAYER_STATUS) - status[PlayerStatus.TITLE] = bytes.fromhex(status[PlayerStatus.TITLE]).decode("utf-8") - status[PlayerStatus.ARTIST] = bytes.fromhex(status[PlayerStatus.ARTIST]).decode("utf-8") - status[PlayerStatus.ALBUM] = bytes.fromhex(status[PlayerStatus.ALBUM]).decode("utf-8") - self.player_status = status + """Update the player status.""" + self.player_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.PLAYER_STATUS) + self.player_status[PlayerStatus.TITLE] = bytes.fromhex(self.player_status[PlayerStatus.TITLE]).decode("utf-8") + self.player_status[PlayerStatus.ARTIST] = bytes.fromhex(self.player_status[PlayerStatus.ARTIST]).decode("utf-8") + self.player_status[PlayerStatus.ALBUM] = bytes.fromhex(self.player_status[PlayerStatus.ALBUM]).decode("utf-8") + + if self.title == UNKNOWN_TRACK_PLAYING and self.artist == UNKNOWN_TRACK_PLAYING and self.album == UNKNOWN_TRACK_PLAYING: + self.player_status[PlayerStatus.TITLE], self.player_status[PlayerStatus.ARTIST], self.player_status[PlayerStatus.ALBUM] = None, None, None async def next(self, session: ClientSession): - await session_call_api(self.endpoint, session, LinkPlayCommand.NEXT) + """Play the next song in the playlist.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.NEXT) async def previous(self, session: ClientSession): - await session_call_api(self.endpoint, session, LinkPlayCommand.PREVIOUS) + """Play the previous song in the playlist.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PREVIOUS) async def play(self, session: ClientSession, value: str): - await session_call_api(self.endpoint, session, LinkPlayCommand.PLAY.format(value)) + """Start playing the selected track.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAY.format(value)) async def resume(self, session: ClientSession): - await session_call_api(self.endpoint, session, LinkPlayCommand.RESUME) + """Resume playing the current track.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.RESUME) async def mute(self, session: ClientSession): - await session_call_api(self.endpoint, session, LinkPlayCommand.MUTE) + """Mute the player.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.MUTE) + self.player_status[PlayerStatus.MUTED] = MuteMode.MUTED async def unmute(self, session: ClientSession): - await session_call_api(self.endpoint, session, LinkPlayCommand.UNMUTE) + """Unmute the player.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.UNMUTE) + self.player_status[PlayerStatus.MUTED] = MuteMode.UNMUTED + + async def play_playlist(self, session: ClientSession, index: int): + """Start playing chosen playlist by index number.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAYLIST.format(index)) + + async def pause(self, session: ClientSession): + """Pause the current playing track.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PAUSE) + + async def toggle(self, session: ClientSession): + """Start playing if the player is currently not playing. Stops playing if it is.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.TOGGLE) + + async def set_volume(self, session: ClientSession, value: int): + """Set the player volume.""" + if not 0 <= value <= 100: + raise ValueError("Volume must be between 0 and 100.") + + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.VOLUME.format(value)) + self.player_status[PlayerStatus.VOLUME] = str(value) + + @property + def endpoint(self) -> str: + """Returns the current player endpoint.""" + return f"{self.protocol}://{self.ip}" + + @property + def muted(self) -> bool: + """Returns if the player is muted.""" + return self.player_status[PlayerStatus.MUTED] == MuteMode.MUTED + + @property + def title(self) -> str: + """Returns if the currently playing title of the track.""" + return self.player_status[PlayerStatus.TITLE] + + @property + def artist(self) -> str: + """Returns if the currently playing artist.""" + return self.player_status[PlayerStatus.ARTIST] + + @property + def album(self) -> str: + """Returns if the currently playing album.""" + return self.player_status[PlayerStatus.ALBUM] + + @property + def volume(self) -> int: + """Returns the player volume.""" + return int(self.player_status[PlayerStatus.VOLUME]) diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index e03cdd2..44d8f48 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -1,7 +1,9 @@ from enum import StrEnum API_ENDPOINT: str = "{}/httpapi.asp?command={}" -API_TIMEOUT = 2 +API_TIMEOUT: int = 2 +UNKNOWN_TRACK_PLAYING: str = "Unknown" +UPNP_DEVICE_TYPE = 'urn:schemas-upnp-org:device:MediaRenderer:1' class LinkPlayCommand(StrEnum): @@ -16,7 +18,10 @@ class LinkPlayCommand(StrEnum): RESUME = "setPlayerCmd:resume" PLAY = "setPlayerCmd:play:{}" SEEK = "setPlayerCmd:seek:{}" - VOL = "setPlayerCmd:vol:{}" + VOLUME = "setPlayerCmd:vol:{}" + PLAYLIST = "setPlayerCmd:playlist:uri:{}" + PAUSE = "setPlayerCmd:pause" + TOGGLE = "setPlayerCmd:onepause" class SpeakerType(StrEnum): @@ -64,6 +69,10 @@ class PlayingStatus(StrEnum): STOPPED = "stop" PAUSED = "pause" +class MuteMode(StrEnum): + UNMUTED = "0" + MUTED = "1" + class PlayerStatus(StrEnum): SPEAKER_TYPE = "type" @@ -87,3 +96,81 @@ class PlayerStatus(StrEnum): class DeviceStatus(StrEnum): UUID = "uuid" + DEVICE_NAME = "DeviceName" + GROUP_NAME = "GroupName" + SSID = "ssid" + LANGUAGE = "language" + FIRMWARE = "firmware" + HARDWARE = "hardware" + BUILD = "build" + PROJECT = "project" + PRIV_PRJ = "priv_prj" + PROJECT_BUILD_NAME = "project_build_name" + RELEASE = "Release" + TEMP_UUID = "temp_uuid" + HIDE_SSID = "hideSSID" + SSID_STRATEGY = "SSIDStrategy" + BRANCH = "branch" + GROUP = "group" + WMRM_VERSION = "wmrm_version" + INTERNET = "internet" + MAC_ADDRESS = "MAC" + STA_MAC_ADDRESS = "STA_MAC" + COUNTRY_CODE = "CountryCode" + COUNTRY_REGION = "CountryRegion" + NET_STAT = "netstat" + ESSID = "essid" + APCLI0 = "apcli0" + ETH2 = "eth2" + RA0 = "ra0" + ETH_DHCP = "eth_dhcp" + VERSION_UPDATE = "VersionUpdate" + NEW_VER = "NewVer" + SET_DNS_ENABLE = "set_dns_enable" + MCU_VER = "mcu_ver" + MCU_VER_NEW = "mcu_ver_new" + DSP_VER = "dsp_ver" + DSP_VER_NEW = "dsp_ver_new" + DATE = "date" + TIME = "time" + TIMEZONE = "tz" + DST_ENABLE = "dst_enable" + REGION = "region" + PROMPT_STATUS = "prompt_status" + IOT_VER = "iot_ver" + UPNP_VERSION = "upnp_version" + CAP1 = "cap1" + CAPABILITY = "capability" + LANGUAGES = "languages" + STREAMS_ALL = "streams_all" + STREAMS = "streams" + EXTERNAL = "external" + PLM_SUPPORT = "plm_support" + PRESET_KEY = "preset_key" + SPOTIFY_ACTIVE = "spotify_active" + LBC_SUPPORT = "lbc_support" + PRIVACY_MODE = "privacy_mode" + WIFI_CHANNEL = "WifiChannel" + RSSI = "RSSI" + BSSID = "BSSID" + BATTERY = "battery" + BATTERY_PERCENT = "battery_percent" + SECURE_MODE = "securemode" + AUTH = "auth" + ENCRYPTION = "encry" + UPNP_UUID = "upnp_uuid" + UART_PASS_PORT = "uart_pass_port" + COMMUNICATION_PORT = "communication_port" + WEB_FIRMWARE_UPDATE_HIDE = "web_firmware_update_hide" + IGNORE_TALKSTART = "ignore_talkstart" + WEB_LOGIN_RESULT = "web_login_result" + SILENCE_OTA_TIME = "silenceOTATime" + IGNORE_SILENCE_OTA_TIME = "ignore_silenceOTATime" + NEW_TUNEIN_PRESET_AND_ALARM = "new_tunein_preset_and_alarm" + IHEARTRADIO_NEW = "iheartradio_new" + NEW_IHEART_PODCAST = "new_iheart_podcast" + TIDAL_VERSION = "tidal_version" + SERVICE_VERSION = "service_version" + ETH_MAC_ADDRESS = "ETH_MAC" + SECURITY = "security" + SECURITY_VERSION = "security_version" diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py new file mode 100644 index 0000000..9cee838 --- /dev/null +++ b/src/linkplay/discovery.py @@ -0,0 +1,37 @@ +from typing import List, Optional +from aiohttp import ClientSession +from async_upnp_client.search import async_search +from async_upnp_client.utils import CaseInsensitiveDict + +from linkplay.consts import UPNP_DEVICE_TYPE +from linkplay.bridge import LinkPlayBridge +from linkplay.exceptions import LinkPlayRequestException + + +async def linkplay_factory_bridge(ip: str, session: ClientSession) -> Optional[LinkPlayBridge]: + """Attempts to create a LinkPlayBridge from the given IP address. + Returns None if the device is not an expected LinkPlay device.""" + bridge = LinkPlayBridge("http", ip) + try: + await bridge.update_device_status(session) + await bridge.update_player_status(session) + except LinkPlayRequestException: + return None + return bridge + + +async def discover_linkplay_devices(session: ClientSession) -> List[LinkPlayBridge]: + """Attempts to discover LinkPlay devices on the local network.""" + devices: List[LinkPlayBridge] = [] + async def add_linkplay_device_to_list(upnp_device: CaseInsensitiveDict): + device_ip_address = upnp_device.get('_host') + bridge = await linkplay_factory_bridge(device_ip_address, session) + if bridge: + devices.append(device_ip_address) + + await async_search( + search_target=UPNP_DEVICE_TYPE, + async_callback=add_linkplay_device_to_list + ) + + return devices diff --git a/src/linkplay/utils.py b/src/linkplay/utils.py index 12129ad..f35eeff 100644 --- a/src/linkplay/utils.py +++ b/src/linkplay/utils.py @@ -1,8 +1,10 @@ import asyncio -from asyncio import CancelledError +from typing import Dict +import json +from http import HTTPStatus + import async_timeout from aiohttp import ClientSession, ClientError -from http import HTTPStatus from linkplay.consts import API_ENDPOINT, API_TIMEOUT from linkplay.exceptions import LinkPlayRequestException @@ -15,10 +17,22 @@ async def session_call_api(endpoint: str, session: ClientSession, command: str): async with async_timeout.timeout(API_TIMEOUT): response = await session.get(url, ssl=False) - except (asyncio.TimeoutError, ClientError, CancelledError) as error: + except (asyncio.TimeoutError, ClientError, asyncio.CancelledError) as error: raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}': {}".format(url, error)) from error if response.status == HTTPStatus.OK: return await response.text() raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}': {} / {}".format(url, response.status, response)) + + +async def session_call_api_json(endpoint: str, session: ClientSession, command: str) -> Dict[str, str]: + result = await session_call_api(endpoint, session, command) + return json.loads(result) + + +async def session_call_api_ok(endpoint: str, session: ClientSession, command: str): + result = await session_call_api(endpoint, session, command) + + if result != "OK": + raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}'".format(endpoint)) From c9554cc9adfffc7e133799937c26fdcc75f51b24 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Fri, 5 Jan 2024 13:27:13 +0100 Subject: [PATCH 04/13] Add more commands Add more properties Add some util and tests --- src/linkplay/bridge.py | 79 +++++++++++++++++----------- src/linkplay/consts.py | 96 ++++++++++++++++++++++++++++++++--- src/linkplay/discovery.py | 17 ++++--- src/linkplay/utils.py | 37 +++++++++++--- tests/linkplay/test_bridge.py | 1 + tests/linkplay/test_utils.py | 6 +++ 6 files changed, 184 insertions(+), 52 deletions(-) create mode 100644 tests/linkplay/test_utils.py diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index 390ba6d..cb90918 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -1,41 +1,39 @@ from typing import Dict + from aiohttp import ClientSession -from linkplay.consts import LinkPlayCommand, DeviceStatus, PlayerStatus, MuteMode, UNKNOWN_TRACK_PLAYING -from linkplay.utils import session_call_api_json, session_call_api_ok +from linkplay.consts import LinkPlayCommand, DeviceAttribute, PlayerAttribute, MuteMode, EqualizerMode, LoopMode, PlaybackMode, PLAYBACK_MODE_MAP, PlaymodeSupport +from linkplay.utils import session_call_api_json, session_call_api_ok, decode_hexstr class LinkPlayBridge(): """Represents a LinkPlay device.""" protocol: str - ip: str - device_status: Dict[DeviceStatus, str] = dict.fromkeys(DeviceStatus.__members__.values(), None) - player_status: Dict[PlayerStatus, str] = dict.fromkeys(PlayerStatus.__members__.values(), None) + ip_address: str + device_status: Dict[DeviceAttribute, str] = dict.fromkeys(DeviceAttribute.__members__.values(), "") + player_status: Dict[PlayerAttribute, str] = dict.fromkeys(PlayerAttribute.__members__.values(), "") - def __init__(self, protocol: str, ip: str): + def __init__(self, protocol: str, ip_address: str): self.protocol = protocol - self.ip = ip + self.ip_address = ip_address def __repr__(self) -> str: - if not self.device_status[DeviceStatus.DEVICE_NAME]: + if self.device_status[DeviceAttribute.DEVICE_NAME] == "": return self.endpoint - return self.device_status[DeviceStatus.DEVICE_NAME] + return self.device_status[DeviceAttribute.DEVICE_NAME] async def update_device_status(self, session: ClientSession) -> None: """Update the device status.""" - self.device_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) + self.device_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) # type: ignore[assignment] async def update_player_status(self, session: ClientSession): """Update the player status.""" - self.player_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.PLAYER_STATUS) - self.player_status[PlayerStatus.TITLE] = bytes.fromhex(self.player_status[PlayerStatus.TITLE]).decode("utf-8") - self.player_status[PlayerStatus.ARTIST] = bytes.fromhex(self.player_status[PlayerStatus.ARTIST]).decode("utf-8") - self.player_status[PlayerStatus.ALBUM] = bytes.fromhex(self.player_status[PlayerStatus.ALBUM]).decode("utf-8") - - if self.title == UNKNOWN_TRACK_PLAYING and self.artist == UNKNOWN_TRACK_PLAYING and self.album == UNKNOWN_TRACK_PLAYING: - self.player_status[PlayerStatus.TITLE], self.player_status[PlayerStatus.ARTIST], self.player_status[PlayerStatus.ALBUM] = None, None, None + self.player_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.PLAYER_STATUS) # type: ignore[assignment] + self.player_status[PlayerAttribute.TITLE] = decode_hexstr(self.title) + self.player_status[PlayerAttribute.ARTIST] = decode_hexstr(self.artist) + self.player_status[PlayerAttribute.ALBUM] = decode_hexstr(self.album) async def next(self, session: ClientSession): """Play the next song in the playlist.""" @@ -47,7 +45,7 @@ async def previous(self, session: ClientSession): async def play(self, session: ClientSession, value: str): """Start playing the selected track.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAY.format(value)) + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAY.format(value)) # type: ignore[str-format] async def resume(self, session: ClientSession): """Resume playing the current track.""" @@ -56,16 +54,16 @@ async def resume(self, session: ClientSession): async def mute(self, session: ClientSession): """Mute the player.""" await session_call_api_ok(self.endpoint, session, LinkPlayCommand.MUTE) - self.player_status[PlayerStatus.MUTED] = MuteMode.MUTED + self.player_status[PlayerAttribute.MUTED] = MuteMode.MUTED async def unmute(self, session: ClientSession): """Unmute the player.""" await session_call_api_ok(self.endpoint, session, LinkPlayCommand.UNMUTE) - self.player_status[PlayerStatus.MUTED] = MuteMode.UNMUTED + self.player_status[PlayerAttribute.MUTED] = MuteMode.UNMUTED async def play_playlist(self, session: ClientSession, index: int): """Start playing chosen playlist by index number.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAYLIST.format(index)) + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAYLIST.format(index)) # type: ignore[str-format] async def pause(self, session: ClientSession): """Pause the current playing track.""" @@ -80,35 +78,56 @@ async def set_volume(self, session: ClientSession, value: int): if not 0 <= value <= 100: raise ValueError("Volume must be between 0 and 100.") - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.VOLUME.format(value)) - self.player_status[PlayerStatus.VOLUME] = str(value) + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.VOLUME.format(value)) # type: ignore[str-format] + self.player_status[PlayerAttribute.VOLUME] = str(value) + + async def set_equalizer_mode(self, session: ClientSession, mode: EqualizerMode): + """Set the equalizer mode.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.EQUALIZER_MODE.format(mode)) # type: ignore[str-format] + + async def set_loop_mode(self, session: ClientSession, mode: LoopMode): + """Set the loop mode.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.LOOP_MODE.format(mode)) # type: ignore[str-format] + + async def set_play_mode(self, session: ClientSession, mode: PlaybackMode): + """Set the play mode.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.SWITCH_MODE.format(PLAYBACK_MODE_MAP[mode])) # type: ignore[str-format] + + async def reboot(self, session: ClientSession): + """Reboot the player.""" + await session_call_api_ok(self.endpoint, session, LinkPlayCommand.REBOOT) @property def endpoint(self) -> str: """Returns the current player endpoint.""" - return f"{self.protocol}://{self.ip}" + return f"{self.protocol}://{self.ip_address}" @property def muted(self) -> bool: """Returns if the player is muted.""" - return self.player_status[PlayerStatus.MUTED] == MuteMode.MUTED + return self.player_status[PlayerAttribute.MUTED] == MuteMode.MUTED @property def title(self) -> str: """Returns if the currently playing title of the track.""" - return self.player_status[PlayerStatus.TITLE] + return self.player_status[PlayerAttribute.TITLE] @property def artist(self) -> str: """Returns if the currently playing artist.""" - return self.player_status[PlayerStatus.ARTIST] + return self.player_status[PlayerAttribute.ARTIST] @property def album(self) -> str: """Returns if the currently playing album.""" - return self.player_status[PlayerStatus.ALBUM] + return self.player_status[PlayerAttribute.ALBUM] @property def volume(self) -> int: - """Returns the player volume.""" - return int(self.player_status[PlayerStatus.VOLUME]) + """Returns the player volume, expressed in %.""" + return int(self.player_status[PlayerAttribute.VOLUME]) + + @property + def playmode_support(self) -> PlaymodeSupport: + """Returns the player playmode support.""" + return PlaymodeSupport(int(self.device_status[DeviceAttribute.PLAYMODE_SUPPORT], base=16)) diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index 44d8f48..38d60e4 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -1,4 +1,5 @@ -from enum import StrEnum +from enum import StrEnum, IntFlag +from typing import Dict API_ENDPOINT: str = "{}/httpapi.asp?command={}" API_TIMEOUT: int = 2 @@ -7,9 +8,11 @@ class LinkPlayCommand(StrEnum): + """Defines the LinkPlay commands.""" DEVICE_STATUS = "getStatus" SYSLOG = "getsyslog" UPDATE_SERVER = "GetUpdateServer" + REBOOT = "reboot" PLAYER_STATUS = "getPlayerStatus" NEXT = "setPlayerCmd:next" PREVIOUS = "setPlayerCmd:prev" @@ -22,6 +25,9 @@ class LinkPlayCommand(StrEnum): PLAYLIST = "setPlayerCmd:playlist:uri:{}" PAUSE = "setPlayerCmd:pause" TOGGLE = "setPlayerCmd:onepause" + EQUALIZER_MODE = "setPlayerCmd:equalizer:{}" + LOOP_MODE = "setPlayerCmd:loopmode:{}" + SWITCH_MODE = "setPlayerCmd:switchmode:{}" class SpeakerType(StrEnum): @@ -39,13 +45,71 @@ class ChannelType(StrEnum): class PlaybackMode(StrEnum): """Defines the playback mode.""" + IDLE = "-1" NONE = "0" - WIIMU = "10" - HTTP = "20" + AIRPLAY = "1" + DLNA = "2" + QPLAY = "3", + NETWORK = "10" + WIIMU_LOCAL = "11" + WIIMU_STATION = "12" + WIIMU_RADIO = "13" + WIIMU_SONGLIST = "14" + TF_CARD_1 = "16" + WIIMU_MAX = "19" + API = "20" + UDISK = "21" + HTTP_MAX = "29" + ALARM = "30" + SPOTIFY = "31" + LINE_IN = "40" + BLUETOOTH = "41" + EXT_LOCAL = "42" + OPTICAL = "43" + RCA = "44" + CO_AXIAL = "45" + FM = "46" + LINE_IN_2 = "47" + XLR = "48" + HDMI = "49" + MIRROR = "50" + USB_DAC = "51" + TF_CARD_2 = "52" + TALK = "60" + SLAVE = "99" +PLAYBACK_MODE_MAP: Dict[PlaybackMode, str] = { + PlaybackMode.IDLE: 'Idle', + PlaybackMode.NONE: 'Idle', + PlaybackMode.AIRPLAY: 'Airplay', + PlaybackMode.DLNA: 'DLNA', + PlaybackMode.QPLAY: 'QPlay', + PlaybackMode.NETWORK: 'Network', + PlaybackMode.WIIMU_LOCAL: 'udisk', + PlaybackMode.TF_CARD_1: 'TFcard', + PlaybackMode.API: 'API', + PlaybackMode.UDISK: 'udisk', + PlaybackMode.ALARM: 'Alarm', + PlaybackMode.SPOTIFY: 'Spotify', + PlaybackMode.LINE_IN: 'line-in', + PlaybackMode.BLUETOOTH: 'bluetooth', + PlaybackMode.OPTICAL: 'optical', + PlaybackMode.RCA: 'RCA', + PlaybackMode.CO_AXIAL: 'co-axial', + PlaybackMode.FM: 'FM', + PlaybackMode.LINE_IN_2: 'line-in2', + PlaybackMode.XLR: 'XLR', + PlaybackMode.HDMI: 'HDMI', + PlaybackMode.MIRROR: 'cd', + PlaybackMode.USB_DAC: 'USB DAC', + PlaybackMode.TF_CARD_2: 'TFcard', + PlaybackMode.TALK: 'Talk', + PlaybackMode.SLAVE: 'Idle' +} -class PlaylistMode(StrEnum): - """Defines the playlist mode.""" + +class LoopMode(StrEnum): + """Defines the loop mode.""" CONTINOUS_PLAY_ONE_SONG = "-1" PLAY_IN_ORDER = "0" CONTINUOUS_PLAYBACK = "1" @@ -69,12 +133,27 @@ class PlayingStatus(StrEnum): STOPPED = "stop" PAUSED = "pause" + class MuteMode(StrEnum): + """Defines the mute mode.""" UNMUTED = "0" MUTED = "1" -class PlayerStatus(StrEnum): +class PlaymodeSupport(IntFlag): + """Defines which modes the player supports.""" + LINE_IN = 1 + BLUETOOTH = 2 + USB = 4 + OPTICAL = 8 + UNKNOWN = 16 + COAXIAL = 32 + LINE_IN_2 = 64 + USBDAC = 32768 + + +class PlayerAttribute(StrEnum): + """Defines the player attributes.""" SPEAKER_TYPE = "type" CHANNEL_TYPE = "ch" PLAYBACK_MODE = "mode" @@ -94,7 +173,8 @@ class PlayerStatus(StrEnum): MUTED = "mute" -class DeviceStatus(StrEnum): +class DeviceAttribute(StrEnum): + """Defines the device attributes.""" UUID = "uuid" DEVICE_NAME = "DeviceName" GROUP_NAME = "GroupName" @@ -145,7 +225,7 @@ class DeviceStatus(StrEnum): STREAMS_ALL = "streams_all" STREAMS = "streams" EXTERNAL = "external" - PLM_SUPPORT = "plm_support" + PLAYMODE_SUPPORT = "plm_support" PRESET_KEY = "preset_key" SPOTIFY_ACTIVE = "spotify_active" LBC_SUPPORT = "lbc_support" diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py index 9cee838..53305ec 100644 --- a/src/linkplay/discovery.py +++ b/src/linkplay/discovery.py @@ -1,4 +1,5 @@ from typing import List, Optional + from aiohttp import ClientSession from async_upnp_client.search import async_search from async_upnp_client.utils import CaseInsensitiveDict @@ -8,10 +9,10 @@ from linkplay.exceptions import LinkPlayRequestException -async def linkplay_factory_bridge(ip: str, session: ClientSession) -> Optional[LinkPlayBridge]: +async def linkplay_factory_bridge(ip_address: str, session: ClientSession) -> Optional[LinkPlayBridge]: """Attempts to create a LinkPlayBridge from the given IP address. Returns None if the device is not an expected LinkPlay device.""" - bridge = LinkPlayBridge("http", ip) + bridge = LinkPlayBridge("http", ip_address) try: await bridge.update_device_status(session) await bridge.update_player_status(session) @@ -23,11 +24,15 @@ async def linkplay_factory_bridge(ip: str, session: ClientSession) -> Optional[L async def discover_linkplay_devices(session: ClientSession) -> List[LinkPlayBridge]: """Attempts to discover LinkPlay devices on the local network.""" devices: List[LinkPlayBridge] = [] + async def add_linkplay_device_to_list(upnp_device: CaseInsensitiveDict): - device_ip_address = upnp_device.get('_host') - bridge = await linkplay_factory_bridge(device_ip_address, session) - if bridge: - devices.append(device_ip_address) + ip_address: str | None = upnp_device.get('_host') + + if not ip_address: + return + + if bridge := await linkplay_factory_bridge(ip_address, session): + devices.append(bridge) await async_search( search_target=UPNP_DEVICE_TYPE, diff --git a/src/linkplay/utils.py b/src/linkplay/utils.py index f35eeff..e0afe35 100644 --- a/src/linkplay/utils.py +++ b/src/linkplay/utils.py @@ -11,6 +11,19 @@ async def session_call_api(endpoint: str, session: ClientSession, command: str): + """Calls the LinkPlay API and returns the result as a string. + + Args: + endpoint (str): The endpoint to use. + session (ClientSession): The client session to use. + command (str): The command to use. + + Raises: + LinkPlayRequestException: Thrown when the request fails or an invalid response is received. + + Returns: + str: The response of the API call. + """ url = API_ENDPOINT.format(endpoint, command) try: @@ -18,21 +31,29 @@ async def session_call_api(endpoint: str, session: ClientSession, command: str): response = await session.get(url, ssl=False) except (asyncio.TimeoutError, ClientError, asyncio.CancelledError) as error: - raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}': {}".format(url, error)) from error + raise LinkPlayRequestException(f"Error requesting data from '{url}'") from error - if response.status == HTTPStatus.OK: - return await response.text() + if response.status != HTTPStatus.OK: + raise LinkPlayRequestException(f"Unexpected HTTPStatus {response.status} received from '{url}'") - raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}': {} / {}".format(url, response.status, response)) + return await response.text() -async def session_call_api_json(endpoint: str, session: ClientSession, command: str) -> Dict[str, str]: +async def session_call_api_json(endpoint: str, session: ClientSession, + command: str) -> Dict[str, str]: + """Calls the LinkPlay API and returns the result as a JSON object.""" result = await session_call_api(endpoint, session, command) - return json.loads(result) + return json.loads(result) # type: ignore async def session_call_api_ok(endpoint: str, session: ClientSession, command: str): + """Calls the LinkPlay API and checks if the response is OK. Throws exception if not.""" result = await session_call_api(endpoint, session, command) - + if result != "OK": - raise LinkPlayRequestException("Error requesting data from LinkPlayDevice (httpapi) '{}'".format(endpoint)) + raise LinkPlayRequestException(f"Didn't receive expected OK from {endpoint}") + + +def decode_hexstr(hexstr: str) -> str: + """Decode a hex string.""" + return bytes.fromhex(hexstr).decode("utf-8") diff --git a/tests/linkplay/test_bridge.py b/tests/linkplay/test_bridge.py index 0dbf23c..60b9b77 100644 --- a/tests/linkplay/test_bridge.py +++ b/tests/linkplay/test_bridge.py @@ -2,5 +2,6 @@ def test_endpoint(): + """Tests if the endpoint is correctly constructed.""" bridge = LinkPlayBridge("http", "1.2.3.4") assert "http://1.2.3.4" == bridge.endpoint diff --git a/tests/linkplay/test_utils.py b/tests/linkplay/test_utils.py new file mode 100644 index 0000000..e572f8f --- /dev/null +++ b/tests/linkplay/test_utils.py @@ -0,0 +1,6 @@ +from linkplay.utils import decode_hexstr + + +def test_decode_hexstr(): + """Tests the decode_hexstr function.""" + assert "Unknown" == decode_hexstr('556E6B6E6F776E') From 9626613b8b2472a1564cf74df99f1d1c1185c477 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Fri, 5 Jan 2024 14:17:28 +0100 Subject: [PATCH 05/13] Split bridge into device and player Pass ClientSession to bridge --- src/linkplay/__main__.py | 13 +-- src/linkplay/bridge.py | 182 +++++++++++++++++++++------------- src/linkplay/consts.py | 4 +- src/linkplay/discovery.py | 6 +- tests/linkplay/test_bridge.py | 2 +- 5 files changed, 127 insertions(+), 80 deletions(-) diff --git a/src/linkplay/__main__.py b/src/linkplay/__main__.py index 5a133a4..ae339fb 100644 --- a/src/linkplay/__main__.py +++ b/src/linkplay/__main__.py @@ -1,17 +1,14 @@ import asyncio + import aiohttp -from linkplay.consts import PlayerStatus -from linkplay.discovery import discover_linkplay_devices +from linkplay.consts import EqualizerMode +from linkplay.discovery import linkplay_factory_bridge + async def main(): async with aiohttp.ClientSession() as session: - bridges = await discover_linkplay_devices(session) - - if len(bridges) > 0: - bridge = bridges[0] - await bridge.set_volume(session, 100) - print(f"{bridge}: {bridge.player_status[PlayerStatus.ARTIST]} - {bridge.player_status[PlayerStatus.TITLE]} - {bridge.volume}%") + pass if __name__ == "__main__": asyncio.run(main()) diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index cb90918..921f356 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -1,133 +1,181 @@ +from __future__ import annotations from typing import Dict from aiohttp import ClientSession -from linkplay.consts import LinkPlayCommand, DeviceAttribute, PlayerAttribute, MuteMode, EqualizerMode, LoopMode, PlaybackMode, PLAYBACK_MODE_MAP, PlaymodeSupport +from linkplay.consts import ( + LinkPlayCommand, + DeviceAttribute, + PlayerAttribute, + MuteMode, + EqualizerMode, + LoopMode, + PlaybackMode, + PLAYBACK_MODE_MAP, + PlaymodeSupport +) from linkplay.utils import session_call_api_json, session_call_api_ok, decode_hexstr -class LinkPlayBridge(): +class LinkPlayDevice(): """Represents a LinkPlay device.""" - protocol: str - ip_address: str - device_status: Dict[DeviceAttribute, str] = dict.fromkeys(DeviceAttribute.__members__.values(), "") - player_status: Dict[PlayerAttribute, str] = dict.fromkeys(PlayerAttribute.__members__.values(), "") + bridge: LinkPlayBridge + properties: Dict[DeviceAttribute, str] = dict.fromkeys(DeviceAttribute.__members__.values(), "") - def __init__(self, protocol: str, ip_address: str): - self.protocol = protocol - self.ip_address = ip_address + def __init__(self, bridge: LinkPlayBridge): + self.bridge = bridge - def __repr__(self) -> str: - if self.device_status[DeviceAttribute.DEVICE_NAME] == "": - return self.endpoint + async def update_status(self) -> None: + """Update the device status.""" + self.properties = await self.bridge.json_request(LinkPlayCommand.DEVICE_STATUS) # type: ignore[assignment] - return self.device_status[DeviceAttribute.DEVICE_NAME] + async def reboot(self): + """Reboot the device.""" + await self.bridge.request(LinkPlayCommand.REBOOT) - async def update_device_status(self, session: ClientSession) -> None: - """Update the device status.""" - self.device_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.DEVICE_STATUS) # type: ignore[assignment] + @property + def name(self) -> str: + """The name of the device.""" + return self.properties[DeviceAttribute.DEVICE_NAME] - async def update_player_status(self, session: ClientSession): + @property + def playmode_support(self) -> PlaymodeSupport: + """Returns the player playmode support.""" + return PlaymodeSupport(int(self.properties[DeviceAttribute.PLAYMODE_SUPPORT], base=16)) + + +class LinkPlayPlayer(): + """Represents a LinkPlay player.""" + + bridge: LinkPlayBridge + properties: Dict[PlayerAttribute, str] = dict.fromkeys(PlayerAttribute.__members__.values(), "") + + def __init__(self, bridge: LinkPlayBridge): + self.bridge = bridge + + async def update_status(self): """Update the player status.""" - self.player_status = await session_call_api_json(self.endpoint, session, LinkPlayCommand.PLAYER_STATUS) # type: ignore[assignment] - self.player_status[PlayerAttribute.TITLE] = decode_hexstr(self.title) - self.player_status[PlayerAttribute.ARTIST] = decode_hexstr(self.artist) - self.player_status[PlayerAttribute.ALBUM] = decode_hexstr(self.album) + self.properties = await self.bridge.json_request(LinkPlayCommand.PLAYER_STATUS) # type: ignore[assignment] + self.properties[PlayerAttribute.TITLE] = decode_hexstr(self.title) + self.properties[PlayerAttribute.ARTIST] = decode_hexstr(self.artist) + self.properties[PlayerAttribute.ALBUM] = decode_hexstr(self.album) - async def next(self, session: ClientSession): + async def next(self): """Play the next song in the playlist.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.NEXT) + await self.bridge.request(LinkPlayCommand.NEXT) - async def previous(self, session: ClientSession): + async def previous(self): """Play the previous song in the playlist.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PREVIOUS) + await self.bridge.request(LinkPlayCommand.PREVIOUS) - async def play(self, session: ClientSession, value: str): + async def play(self, value: str): """Start playing the selected track.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAY.format(value)) # type: ignore[str-format] + await self.bridge.request(LinkPlayCommand.PLAY.format(value)) # type: ignore[str-format] - async def resume(self, session: ClientSession): + async def resume(self): """Resume playing the current track.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.RESUME) + await self.bridge.request(LinkPlayCommand.RESUME) - async def mute(self, session: ClientSession): + async def mute(self): """Mute the player.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.MUTE) - self.player_status[PlayerAttribute.MUTED] = MuteMode.MUTED + await self.bridge.request(LinkPlayCommand.MUTE) + self.properties[PlayerAttribute.MUTED] = MuteMode.MUTED - async def unmute(self, session: ClientSession): + async def unmute(self): """Unmute the player.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.UNMUTE) - self.player_status[PlayerAttribute.MUTED] = MuteMode.UNMUTED + await self.bridge.request(LinkPlayCommand.UNMUTE) + self.properties[PlayerAttribute.MUTED] = MuteMode.UNMUTED - async def play_playlist(self, session: ClientSession, index: int): + async def play_playlist(self, index: int): """Start playing chosen playlist by index number.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PLAYLIST.format(index)) # type: ignore[str-format] + await self.bridge.request(LinkPlayCommand.PLAYLIST.format(index)) # type: ignore[str-format] - async def pause(self, session: ClientSession): + async def pause(self): """Pause the current playing track.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.PAUSE) + await self.bridge.request(LinkPlayCommand.PAUSE) - async def toggle(self, session: ClientSession): + async def toggle(self): """Start playing if the player is currently not playing. Stops playing if it is.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.TOGGLE) + await self.bridge.request(LinkPlayCommand.TOGGLE) - async def set_volume(self, session: ClientSession, value: int): + async def set_volume(self, value: int): """Set the player volume.""" if not 0 <= value <= 100: raise ValueError("Volume must be between 0 and 100.") - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.VOLUME.format(value)) # type: ignore[str-format] - self.player_status[PlayerAttribute.VOLUME] = str(value) + await self.bridge.request(LinkPlayCommand.VOLUME.format(value)) # type: ignore[str-format] + self.properties[PlayerAttribute.VOLUME] = str(value) - async def set_equalizer_mode(self, session: ClientSession, mode: EqualizerMode): + async def set_equalizer_mode(self, mode: EqualizerMode): """Set the equalizer mode.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.EQUALIZER_MODE.format(mode)) # type: ignore[str-format] + await self.bridge.request(LinkPlayCommand.EQUALIZER_MODE.format(mode)) # type: ignore[str-format] - async def set_loop_mode(self, session: ClientSession, mode: LoopMode): + async def set_loop_mode(self, mode: LoopMode): """Set the loop mode.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.LOOP_MODE.format(mode)) # type: ignore[str-format] + await self.bridge.request(LinkPlayCommand.LOOP_MODE.format(mode)) # type: ignore[str-format] - async def set_play_mode(self, session: ClientSession, mode: PlaybackMode): + async def set_play_mode(self, mode: PlaybackMode): """Set the play mode.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.SWITCH_MODE.format(PLAYBACK_MODE_MAP[mode])) # type: ignore[str-format] - - async def reboot(self, session: ClientSession): - """Reboot the player.""" - await session_call_api_ok(self.endpoint, session, LinkPlayCommand.REBOOT) - - @property - def endpoint(self) -> str: - """Returns the current player endpoint.""" - return f"{self.protocol}://{self.ip_address}" + await self.bridge.request(LinkPlayCommand.SWITCH_MODE.format(PLAYBACK_MODE_MAP[mode])) # type: ignore[str-format] @property def muted(self) -> bool: """Returns if the player is muted.""" - return self.player_status[PlayerAttribute.MUTED] == MuteMode.MUTED + return self.properties[PlayerAttribute.MUTED] == MuteMode.MUTED @property def title(self) -> str: """Returns if the currently playing title of the track.""" - return self.player_status[PlayerAttribute.TITLE] + return self.properties[PlayerAttribute.TITLE] @property def artist(self) -> str: """Returns if the currently playing artist.""" - return self.player_status[PlayerAttribute.ARTIST] + return self.properties[PlayerAttribute.ARTIST] @property def album(self) -> str: """Returns if the currently playing album.""" - return self.player_status[PlayerAttribute.ALBUM] + return self.properties[PlayerAttribute.ALBUM] @property def volume(self) -> int: """Returns the player volume, expressed in %.""" - return int(self.player_status[PlayerAttribute.VOLUME]) + return int(self.properties[PlayerAttribute.VOLUME]) + + +class LinkPlayBridge(): + """Represents a LinkPlay device.""" + + protocol: str + ip_address: str + session: ClientSession + device: LinkPlayDevice + player: LinkPlayPlayer + + def __init__(self, protocol: str, ip_address: str, session: ClientSession): + self.protocol = protocol + self.ip_address = ip_address + self.session = session + self.device = LinkPlayDevice(self) + self.player = LinkPlayPlayer(self) + + def __repr__(self) -> str: + if self.device.name == "": + return self.endpoint + + return self.device.name @property - def playmode_support(self) -> PlaymodeSupport: - """Returns the player playmode support.""" - return PlaymodeSupport(int(self.device_status[DeviceAttribute.PLAYMODE_SUPPORT], base=16)) + def endpoint(self) -> str: + """Returns the current player endpoint.""" + return f"{self.protocol}://{self.ip_address}" + + async def json_request(self, command: str) -> Dict[str, str]: + """Performs a GET request on the given command and returns the result as a JSON object.""" + return await session_call_api_json(self.endpoint, self.session, command) + + async def request(self, command: str) -> None: + """Performs a GET request on the given command and verifies the result.""" + await session_call_api_ok(self.endpoint, self.session, command) diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index 38d60e4..887119d 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -28,6 +28,7 @@ class LinkPlayCommand(StrEnum): EQUALIZER_MODE = "setPlayerCmd:equalizer:{}" LOOP_MODE = "setPlayerCmd:loopmode:{}" SWITCH_MODE = "setPlayerCmd:switchmode:{}" + M3U_PLAYLIST = "setPlayerCmd:m3u:play:{}" class SpeakerType(StrEnum): @@ -78,13 +79,14 @@ class PlaybackMode(StrEnum): TALK = "60" SLAVE = "99" + PLAYBACK_MODE_MAP: Dict[PlaybackMode, str] = { PlaybackMode.IDLE: 'Idle', PlaybackMode.NONE: 'Idle', PlaybackMode.AIRPLAY: 'Airplay', PlaybackMode.DLNA: 'DLNA', PlaybackMode.QPLAY: 'QPlay', - PlaybackMode.NETWORK: 'Network', + PlaybackMode.NETWORK: 'wifi', PlaybackMode.WIIMU_LOCAL: 'udisk', PlaybackMode.TF_CARD_1: 'TFcard', PlaybackMode.API: 'API', diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py index 53305ec..4c4e30f 100644 --- a/src/linkplay/discovery.py +++ b/src/linkplay/discovery.py @@ -12,10 +12,10 @@ async def linkplay_factory_bridge(ip_address: str, session: ClientSession) -> Optional[LinkPlayBridge]: """Attempts to create a LinkPlayBridge from the given IP address. Returns None if the device is not an expected LinkPlay device.""" - bridge = LinkPlayBridge("http", ip_address) + bridge = LinkPlayBridge("http", ip_address, session) try: - await bridge.update_device_status(session) - await bridge.update_player_status(session) + await bridge.device.update_status() + await bridge.player.update_status() except LinkPlayRequestException: return None return bridge diff --git a/tests/linkplay/test_bridge.py b/tests/linkplay/test_bridge.py index 60b9b77..d61ff17 100644 --- a/tests/linkplay/test_bridge.py +++ b/tests/linkplay/test_bridge.py @@ -3,5 +3,5 @@ def test_endpoint(): """Tests if the endpoint is correctly constructed.""" - bridge = LinkPlayBridge("http", "1.2.3.4") + bridge = LinkPlayBridge("http", "1.2.3.4", None) assert "http://1.2.3.4" == bridge.endpoint From fd8d466bc61a9456b925dabca895744e0a3111c5 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Fri, 5 Jan 2024 15:29:27 +0100 Subject: [PATCH 06/13] Add docs to README Add image on Correct PlaymodeSupport --- README.md | 15 +++++++++++++ image.png | Bin 0 -> 225548 bytes src/linkplay/__main__.py | 5 ++--- src/linkplay/bridge.py | 46 +++++++++++++++++++++++++++++++++++++- src/linkplay/consts.py | 16 ++++++------- src/linkplay/discovery.py | 4 ++-- 6 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 image.png diff --git a/README.md b/README.md index 06fc386..6eeeffa 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ # python-linkplay LinkPlay library for Python + +## Documentation + +Used documentation + +- https://github.com/n4archive/LinkPlayAPI +- https://github.com/nagyrobi/home-assistant-custom-components-linkplay +- https://github.com/ramikg/linkplay-cli +- https://developer.arylic.com/httpapi/ +- http://airscope-audio.net/core2/pdf/airscope-module-http.pdf +- https://www.wiimhome.com/pdf/HTTP%20API%20for%20WiiM%20Mini.pdf + +## Multiroom + +![Alt text](image.png) \ No newline at end of file diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..81fb35cd316df90826173927a57265e7db655fbe GIT binary patch literal 225548 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%0A03(IV(k%pHVq%15y+FQ~h{N@q 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 literal 0 HcmV?d00001 diff --git a/src/linkplay/__main__.py b/src/linkplay/__main__.py index ae339fb..4667bb1 100644 --- a/src/linkplay/__main__.py +++ b/src/linkplay/__main__.py @@ -2,13 +2,12 @@ import aiohttp -from linkplay.consts import EqualizerMode -from linkplay.discovery import linkplay_factory_bridge +from linkplay.discovery import discover_linkplay_devices async def main(): async with aiohttp.ClientSession() as session: - pass + devices = await discover_linkplay_devices(session) if __name__ == "__main__": asyncio.run(main()) diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index 921f356..729d240 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -4,6 +4,7 @@ from aiohttp import ClientSession from linkplay.consts import ( + ChannelType, LinkPlayCommand, DeviceAttribute, PlayerAttribute, @@ -12,7 +13,9 @@ LoopMode, PlaybackMode, PLAYBACK_MODE_MAP, - PlaymodeSupport + PlayingStatus, + PlaymodeSupport, + SpeakerType ) from linkplay.utils import session_call_api_json, session_call_api_ok, decode_hexstr @@ -94,6 +97,7 @@ async def play_playlist(self, index: int): async def pause(self): """Pause the current playing track.""" await self.bridge.request(LinkPlayCommand.PAUSE) + self.properties[PlayerAttribute.PLAYING_STATUS] = PlayingStatus.PAUSED async def toggle(self): """Start playing if the player is currently not playing. Stops playing if it is.""" @@ -144,6 +148,46 @@ def volume(self) -> int: """Returns the player volume, expressed in %.""" return int(self.properties[PlayerAttribute.VOLUME]) + @property + def current_position(self) -> int: + """Returns the current position of the track in milliseconds.""" + return int(self.properties[PlayerAttribute.CURRENT_POSITION]) + + @property + def total_length(self) -> int: + """Returns the total length of the track in milliseconds.""" + return int(self.properties[PlayerAttribute.TOTAL_LENGTH]) + + @property + def status(self) -> PlayingStatus: + """Returns the current playing status.""" + return PlayingStatus(self.properties[PlayerAttribute.PLAYING_STATUS]) + + @property + def equalizer_mode(self) -> EqualizerMode: + """Returns the current equalizer mode.""" + return EqualizerMode(self.properties[PlayerAttribute.EQUALIZER_MODE]) + + @property + def speaker_type(self) -> SpeakerType: + """Returns the current speaker the player is playing on.""" + return SpeakerType(self.properties[PlayerAttribute.SPEAKER_TYPE]) + + @property + def channel_type(self) -> ChannelType: + """Returns the channel the player is playing on.""" + return ChannelType(self.properties[PlayerAttribute.CHANNEL_TYPE]) + + @property + def playback_mode(self) -> PlaybackMode: + """Returns the channel the player is playing on.""" + return PlaybackMode(self.properties[PlayerAttribute.PLAYBACK_MODE]) + + @property + def loop_mode(self) -> LoopMode: + """Returns the current playlist mode.""" + return LoopMode(self.properties[PlayerAttribute.PLAYLIST_MODE]) + class LinkPlayBridge(): """Represents a LinkPlay device.""" diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index 887119d..0c9f416 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -50,7 +50,7 @@ class PlaybackMode(StrEnum): NONE = "0" AIRPLAY = "1" DLNA = "2" - QPLAY = "3", + QPLAY = "3" NETWORK = "10" WIIMU_LOCAL = "11" WIIMU_STATION = "12" @@ -144,14 +144,14 @@ class MuteMode(StrEnum): class PlaymodeSupport(IntFlag): """Defines which modes the player supports.""" - LINE_IN = 1 - BLUETOOTH = 2 - USB = 4 - OPTICAL = 8 - UNKNOWN = 16 - COAXIAL = 32 - LINE_IN_2 = 64 + LINE_IN = 2 + BLUETOOTH = 4 + USB = 8 + OPTICAL = 16 + COAXIAL = 64 + LINE_IN_2 = 256 USBDAC = 32768 + OPTICAL_2 = 262144 class PlayerAttribute(StrEnum): diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py index 4c4e30f..95f76d5 100644 --- a/src/linkplay/discovery.py +++ b/src/linkplay/discovery.py @@ -1,4 +1,4 @@ -from typing import List, Optional +from typing import List from aiohttp import ClientSession from async_upnp_client.search import async_search @@ -9,7 +9,7 @@ from linkplay.exceptions import LinkPlayRequestException -async def linkplay_factory_bridge(ip_address: str, session: ClientSession) -> Optional[LinkPlayBridge]: +async def linkplay_factory_bridge(ip_address: str, session: ClientSession) -> LinkPlayBridge | None: """Attempts to create a LinkPlayBridge from the given IP address. Returns None if the device is not an expected LinkPlay device.""" bridge = LinkPlayBridge("http", ip_address, session) From be2a1caa6c128e28479245d26db84e380e927ed9 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Fri, 5 Jan 2024 16:14:23 +0100 Subject: [PATCH 07/13] Start implementing multirooms --- src/linkplay/__main__.py | 5 +++-- src/linkplay/bridge.py | 18 +++++++++++++++++- src/linkplay/consts.py | 7 +++++++ src/linkplay/discovery.py | 23 ++++++++++++++++++++--- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/linkplay/__main__.py b/src/linkplay/__main__.py index 4667bb1..0fec69d 100644 --- a/src/linkplay/__main__.py +++ b/src/linkplay/__main__.py @@ -2,12 +2,13 @@ import aiohttp -from linkplay.discovery import discover_linkplay_devices +from linkplay.discovery import discover_linkplay_bridges, discover_multirooms async def main(): async with aiohttp.ClientSession() as session: - devices = await discover_linkplay_devices(session) + bridges = await discover_linkplay_bridges(session) + multirooms = await discover_multirooms(bridges) if __name__ == "__main__": asyncio.run(main()) diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index 729d240..03b39da 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Dict +from typing import Dict, List from aiohttp import ClientSession @@ -37,6 +37,11 @@ async def reboot(self): """Reboot the device.""" await self.bridge.request(LinkPlayCommand.REBOOT) + @property + def uuid(self) -> str: + """The UUID of the device.""" + return self.properties[DeviceAttribute.UUID] + @property def name(self) -> str: """The name of the device.""" @@ -223,3 +228,14 @@ async def json_request(self, command: str) -> Dict[str, str]: async def request(self, command: str) -> None: """Performs a GET request on the given command and verifies the result.""" await session_call_api_ok(self.endpoint, self.session, command) + + +class LinkPlayMultiroom(): + """Represents a LinkPlay multiroom.""" + + leader: LinkPlayBridge + followers: List[LinkPlayBridge] + + def __init__(self, leader: LinkPlayBridge, followers: List[LinkPlayBridge]): + self.leader = leader + self.followers = followers \ No newline at end of file diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index 0c9f416..5488af1 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -29,6 +29,7 @@ class LinkPlayCommand(StrEnum): LOOP_MODE = "setPlayerCmd:loopmode:{}" SWITCH_MODE = "setPlayerCmd:switchmode:{}" M3U_PLAYLIST = "setPlayerCmd:m3u:play:{}" + MULTIROOM_LIST = "multiroom:getSlaveList" class SpeakerType(StrEnum): @@ -256,3 +257,9 @@ class DeviceAttribute(StrEnum): ETH_MAC_ADDRESS = "ETH_MAC" SECURITY = "security" SECURITY_VERSION = "security_version" + +class MultiroomAttribute(StrEnum): + """Defines the player attributes.""" + NUM_FOLLOWERS = "slaves" + FOLLOWER_LIST = "slave_list" + UUID = "uuid" diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py index 95f76d5..074d0a1 100644 --- a/src/linkplay/discovery.py +++ b/src/linkplay/discovery.py @@ -4,8 +4,8 @@ from async_upnp_client.search import async_search from async_upnp_client.utils import CaseInsensitiveDict -from linkplay.consts import UPNP_DEVICE_TYPE -from linkplay.bridge import LinkPlayBridge +from linkplay.consts import UPNP_DEVICE_TYPE, LinkPlayCommand, MultiroomAttribute +from linkplay.bridge import LinkPlayBridge, LinkPlayMultiroom from linkplay.exceptions import LinkPlayRequestException @@ -21,7 +21,7 @@ async def linkplay_factory_bridge(ip_address: str, session: ClientSession) -> Li return bridge -async def discover_linkplay_devices(session: ClientSession) -> List[LinkPlayBridge]: +async def discover_linkplay_bridges(session: ClientSession) -> List[LinkPlayBridge]: """Attempts to discover LinkPlay devices on the local network.""" devices: List[LinkPlayBridge] = [] @@ -40,3 +40,20 @@ async def add_linkplay_device_to_list(upnp_device: CaseInsensitiveDict): ) return devices + +async def discover_multirooms(bridges: List[LinkPlayBridge]) -> List[LinkPlayMultiroom]: + """Discovers multirooms through the list of provided bridges.""" + multirooms: List[LinkPlayMultiroom] = [] + + for bridge in bridges: + properties = await bridge.json_request(LinkPlayCommand.MULTIROOM_LIST) + + if int(properties[MultiroomAttribute.NUM_FOLLOWERS]) > 0: + followers: List[LinkPlayBridge] = [] + for follower in properties[MultiroomAttribute.FOLLOWER_LIST]: + follower_uuid = follower[MultiroomAttribute.UUID] + follower_bridge = next((b for b in bridges if b.device.uuid == follower_uuid), None) + if follower_bridge: + followers.append(follower_bridge) + + multirooms.append(LinkPlayMultiroom(bridge, followers)) From 2c71759f68df723d51964634203d2d4a07113a97 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Mon, 8 Jan 2024 09:50:05 +0100 Subject: [PATCH 08/13] Add multiroom commands support Add unit tests --- pyproject.toml | 2 +- setup.cfg | 1 + src/linkplay/__main__.py | 1 + src/linkplay/bridge.py | 47 +++++- src/linkplay/consts.py | 7 + src/linkplay/discovery.py | 25 +-- tests/linkplay/test_bridge.py | 279 +++++++++++++++++++++++++++++++++- 7 files changed, 347 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d1289ee..3cc3b51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=42.0", "wheel"] build-backend = "setuptools.build_meta" [tool.pytest.ini_options] -addopts = "--cov=linkplay" +asyncio_mode = "auto" testpaths = [ "tests", ] diff --git a/setup.cfg b/setup.cfg index 7795840..81dd3d4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,6 +26,7 @@ testing = pytest>=7.3.1 pytest-cov>=4.1.0 pytest-mock>=3.10.0 + pytest-asyncio>=0.23.3 mypy>=1.3.0 flake8>=6.0.0 tox>=4.6.0 diff --git a/src/linkplay/__main__.py b/src/linkplay/__main__.py index 0fec69d..57f4d92 100644 --- a/src/linkplay/__main__.py +++ b/src/linkplay/__main__.py @@ -9,6 +9,7 @@ async def main(): async with aiohttp.ClientSession() as session: bridges = await discover_linkplay_bridges(session) multirooms = await discover_multirooms(bridges) + print(multirooms) if __name__ == "__main__": asyncio.run(main()) diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index 03b39da..b3d755e 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -52,6 +52,11 @@ def playmode_support(self) -> PlaymodeSupport: """Returns the player playmode support.""" return PlaymodeSupport(int(self.properties[DeviceAttribute.PLAYMODE_SUPPORT], base=16)) + @property + def eth(self) -> str: + """Returns the ethernet address.""" + return self.properties[DeviceAttribute.ETH_DHCP] + class LinkPlayPlayer(): """Represents a LinkPlay player.""" @@ -119,14 +124,17 @@ async def set_volume(self, value: int): async def set_equalizer_mode(self, mode: EqualizerMode): """Set the equalizer mode.""" await self.bridge.request(LinkPlayCommand.EQUALIZER_MODE.format(mode)) # type: ignore[str-format] + self.properties[PlayerAttribute.EQUALIZER_MODE] = mode async def set_loop_mode(self, mode: LoopMode): """Set the loop mode.""" await self.bridge.request(LinkPlayCommand.LOOP_MODE.format(mode)) # type: ignore[str-format] + self.properties[PlayerAttribute.PLAYLIST_MODE] = mode async def set_play_mode(self, mode: PlaybackMode): """Set the play mode.""" await self.bridge.request(LinkPlayCommand.SWITCH_MODE.format(PLAYBACK_MODE_MAP[mode])) # type: ignore[str-format] + self.properties[PlayerAttribute.PLAYBACK_MODE] = mode @property def muted(self) -> bool: @@ -195,7 +203,7 @@ def loop_mode(self) -> LoopMode: class LinkPlayBridge(): - """Represents a LinkPlay device.""" + """Represents a LinkPlay bridge to control the device and player attached to it.""" protocol: str ip_address: str @@ -231,11 +239,44 @@ async def request(self, command: str) -> None: class LinkPlayMultiroom(): - """Represents a LinkPlay multiroom.""" + """Represents a LinkPlay multiroom group. Contains a leader and a list of followers. + The leader is the device that controls the group.""" leader: LinkPlayBridge followers: List[LinkPlayBridge] def __init__(self, leader: LinkPlayBridge, followers: List[LinkPlayBridge]): self.leader = leader - self.followers = followers \ No newline at end of file + self.followers = followers + + async def ungroup(self): + """Ungroups the multiroom group.""" + await self.leader.request(LinkPlayCommand.MULTIROOM_UNGROUP) + self.followers = [] + + async def add_follower(self, follower: LinkPlayBridge): + """Adds a follower to the multiroom group.""" + await follower.request(LinkPlayCommand.MULTIROOM_JOIN.format(self.leader.device.eth)) # type: ignore[str-format] + self.followers.append(follower) + + async def remove_follower(self, follower: LinkPlayBridge): + """Removes a follower from the multiroom group.""" + await self.leader.request(LinkPlayCommand.MULTIROOM_KICK.format(follower.device.eth)) # type: ignore[str-format] + self.followers.remove(follower) + + async def set_volume(self, value: int): + """Sets the volume for the multiroom group.""" + assert 0 < value <= 100 + str_vol = str(value) + await self.leader.request(LinkPlayCommand.MULTIROOM_VOL.format(str_vol)) # type: ignore[str-format] + + for bridge in [self.leader] + self.followers: + bridge.player.properties[PlayerAttribute.VOLUME] = str_vol + + async def mute(self): + """Mutes the multiroom group.""" + await self.leader.request(LinkPlayCommand.MULTIROOM_MUTE) + + async def unmute(self): + """Unmutes the multiroom group.""" + await self.leader.request(LinkPlayCommand.MULTIROOM_UNMUTE) diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index 5488af1..c729682 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -30,6 +30,12 @@ class LinkPlayCommand(StrEnum): SWITCH_MODE = "setPlayerCmd:switchmode:{}" M3U_PLAYLIST = "setPlayerCmd:m3u:play:{}" MULTIROOM_LIST = "multiroom:getSlaveList" + MULTIROOM_UNGROUP = "multiroom:ungroup" + MULTIROOM_KICK = "multiroom:SlaveKickout:{}" + MULTIROOM_VOL = "setPlayerCmd:slave_vol:{}" + MULTIROOM_MUTE = "setPlayerCmd:slave_mute:mute" + MULTIROOM_UNMUTE = "setPlayerCmd:slave_mute:unmute" + MULTIROOM_JOIN = "ConnectMasterAp:JoinGroupMaster:eth{}:wifi0.0.0.0" class SpeakerType(StrEnum): @@ -258,6 +264,7 @@ class DeviceAttribute(StrEnum): SECURITY = "security" SECURITY_VERSION = "security_version" + class MultiroomAttribute(StrEnum): """Defines the player attributes.""" NUM_FOLLOWERS = "slaves" diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py index 074d0a1..7ac06d4 100644 --- a/src/linkplay/discovery.py +++ b/src/linkplay/discovery.py @@ -1,4 +1,4 @@ -from typing import List +from typing import Any, Dict, List from aiohttp import ClientSession from async_upnp_client.search import async_search @@ -41,19 +41,24 @@ async def add_linkplay_device_to_list(upnp_device: CaseInsensitiveDict): return devices + async def discover_multirooms(bridges: List[LinkPlayBridge]) -> List[LinkPlayMultiroom]: """Discovers multirooms through the list of provided bridges.""" multirooms: List[LinkPlayMultiroom] = [] for bridge in bridges: - properties = await bridge.json_request(LinkPlayCommand.MULTIROOM_LIST) + properties: Dict[Any, Any] = await bridge.json_request(LinkPlayCommand.MULTIROOM_LIST) + + if int(properties[MultiroomAttribute.NUM_FOLLOWERS]) == 0: + continue + + followers: List[LinkPlayBridge] = [] + for follower in properties[MultiroomAttribute.FOLLOWER_LIST]: + follower_uuid = follower[MultiroomAttribute.UUID] + follower_bridge = next((b for b in bridges if b.device.uuid == follower_uuid), None) + if follower_bridge: + followers.append(follower_bridge) - if int(properties[MultiroomAttribute.NUM_FOLLOWERS]) > 0: - followers: List[LinkPlayBridge] = [] - for follower in properties[MultiroomAttribute.FOLLOWER_LIST]: - follower_uuid = follower[MultiroomAttribute.UUID] - follower_bridge = next((b for b in bridges if b.device.uuid == follower_uuid), None) - if follower_bridge: - followers.append(follower_bridge) + multirooms.append(LinkPlayMultiroom(bridge, followers)) - multirooms.append(LinkPlayMultiroom(bridge, followers)) + return multirooms diff --git a/tests/linkplay/test_bridge.py b/tests/linkplay/test_bridge.py index d61ff17..0a83628 100644 --- a/tests/linkplay/test_bridge.py +++ b/tests/linkplay/test_bridge.py @@ -1,7 +1,284 @@ -from linkplay.bridge import LinkPlayBridge +from unittest.mock import AsyncMock + +from linkplay.bridge import ( + LinkPlayBridge, + LinkPlayDevice, + LinkPlayPlayer, + LinkPlayMultiroom +) +from linkplay.consts import ( + EqualizerMode, + LinkPlayCommand, + DeviceAttribute, + LoopMode, + PlaybackMode, + PlayerAttribute, + MuteMode, + PlayingStatus, + PLAYBACK_MODE_MAP +) def test_endpoint(): """Tests if the endpoint is correctly constructed.""" bridge = LinkPlayBridge("http", "1.2.3.4", None) assert "http://1.2.3.4" == bridge.endpoint + + +async def test_device_update_status(): + """Tests if the device update status is correctly called.""" + bridge = AsyncMock() + bridge.json_request.return_value = {DeviceAttribute.UUID: "1234"} + device = LinkPlayDevice(bridge) + + await device.update_status() + + bridge.json_request.assert_called_once_with(LinkPlayCommand.DEVICE_STATUS) + assert device.uuid == "1234" + + +async def test_device_reboot(): + """Tests if the device update is correctly called.""" + bridge = AsyncMock() + device = LinkPlayDevice(bridge) + + await device.reboot() + + bridge.request.assert_called_once_with(LinkPlayCommand.REBOOT) + + +async def test_player_update_status(): + """Tests if the player update status is correctly called.""" + bridge = AsyncMock() + bridge.json_request.return_value = { + PlayerAttribute.TITLE: "556E6B6E6F776E", + PlayerAttribute.ARTIST: "556E6B6E6F776E", + PlayerAttribute.ALBUM: "556E6B6E6F776E" + } + player = LinkPlayPlayer(bridge) + + await player.update_status() + + bridge.json_request.assert_called_once_with(LinkPlayCommand.PLAYER_STATUS) + assert player.title == "Unknown" + + +async def test_player_next(): + """Tests if the player next track is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.next() + + bridge.request.assert_called_once_with(LinkPlayCommand.NEXT) + + +async def test_player_previous(): + """Tests if the player previous track is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.previous() + + bridge.request.assert_called_once_with(LinkPlayCommand.PREVIOUS) + + +async def test_player_play(): + """Tests if the player play is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.play("test") + + bridge.request.assert_called_once_with(LinkPlayCommand.PLAY.format("test")) + + +async def test_player_resume(): + """Tests if the player resume is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.resume() + + bridge.request.assert_called_once_with(LinkPlayCommand.RESUME) + + +async def test_player_mute(): + """Tests if the player mute is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.mute() + + bridge.request.assert_called_once_with(LinkPlayCommand.MUTE) + assert player.muted + + +async def test_player_unmute(): + """Tests if the player mute is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + player.properties[PlayerAttribute.MUTED] = MuteMode.MUTED + + await player.unmute() + + bridge.request.assert_called_once_with(LinkPlayCommand.UNMUTE) + assert not player.muted + + +async def test_player_play_playlist(): + """Tests if the player play_playlist is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.play_playlist(1) + + bridge.request.assert_called_once_with(LinkPlayCommand.PLAYLIST.format(1)) + + +async def test_player_pause(): + """Tests if the player pause is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.pause() + + bridge.request.assert_called_once_with(LinkPlayCommand.PAUSE) + assert player.status == PlayingStatus.PAUSED + + +async def test_player_toggle(): + """Tests if the player pause is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.toggle() + + bridge.request.assert_called_once_with(LinkPlayCommand.TOGGLE) + + +async def test_player_set_volume(): + """Tests if the player set volume is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.set_volume(100) + + bridge.request.assert_called_once_with(LinkPlayCommand.VOLUME.format(100)) + assert player.volume == 100 + + +async def test_player_set_equalizer_mode(): + """Tests if the player set equalizer mode is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + mode = EqualizerMode.JAZZ + + await player.set_equalizer_mode(mode) + + bridge.request.assert_called_once_with(LinkPlayCommand.EQUALIZER_MODE.format(mode)) + assert mode == player.equalizer_mode + + +async def test_player_set_loop_mode(): + """Tests if the player set loop mode is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + mode = LoopMode.CONTINUOUS_PLAYBACK + + await player.set_loop_mode(mode) + + bridge.request.assert_called_once_with(LinkPlayCommand.LOOP_MODE.format(mode)) + assert mode == player.loop_mode + + +async def test_player_set_play_mode(): + """Tests if the player set play mode is correctly called.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + mode = PlaybackMode.NETWORK + mode_conv = PLAYBACK_MODE_MAP[mode] + + await player.set_play_mode(mode) + + bridge.request.assert_called_once_with(LinkPlayCommand.SWITCH_MODE.format(mode_conv)) + assert mode == player.playback_mode + + +async def test_multiroom_setup(): + """Tests if multiroom sets up correctly.""" + leader = AsyncMock() + followers = [AsyncMock(), AsyncMock()] + + multiroom = LinkPlayMultiroom(leader, followers) + + assert multiroom.leader == leader + assert multiroom.followers == followers + + +async def test_multiroom_ungroup(): + """Tests if multiroom ungroup is correctly called on the leader.""" + leader = AsyncMock() + followers = [AsyncMock()] + multiroom = LinkPlayMultiroom(leader, followers) + + await multiroom.ungroup() + + leader.request.assert_called_once_with(LinkPlayCommand.MULTIROOM_UNGROUP) + assert multiroom.followers == [] + + +async def test_multiroom_add_follower(): + """Tests if multiroom add follower is correctly called on the follower.""" + leader = AsyncMock() + leader.device.eth = "1.2.3.4" + follower = AsyncMock() + multiroom = LinkPlayMultiroom(leader, []) + + await multiroom.add_follower(follower) + + follower.request.assert_called_once_with(LinkPlayCommand.MULTIROOM_JOIN.format(leader.device.eth)) + assert multiroom.followers == [follower] + + +async def test_multiroom_remove_follower(): + """Tests if multiroom remove folllower is correctly called on the leader.""" + leader = AsyncMock() + follower = AsyncMock() + follower.device.eth = "1.2.3.4" + multiroom = LinkPlayMultiroom(leader, [follower]) + + await multiroom.remove_follower(follower) + + leader.request.assert_called_once_with(LinkPlayCommand.MULTIROOM_KICK.format(follower.device.eth)) + assert multiroom.followers == [] + + +async def test_multiroom_mute(): + """Tests if multiroom mute is correctly called on the leader.""" + leader = AsyncMock() + multiroom = LinkPlayMultiroom(leader, []) + + await multiroom.mute() + + leader.request.assert_called_once_with(LinkPlayCommand.MULTIROOM_MUTE) + + +async def test_multiroom_unmute(): + """Tests if multiroom unmute is correctly called on the leader.""" + leader = AsyncMock() + multiroom = LinkPlayMultiroom(leader, []) + + await multiroom.unmute() + + leader.request.assert_called_once_with(LinkPlayCommand.MULTIROOM_UNMUTE) + + +async def test_multiroom_set_volume(): + """Tests if multiroom set volume is correctly called on the leader.""" + leader = AsyncMock() + multiroom = LinkPlayMultiroom(leader, [AsyncMock()]) + + await multiroom.set_volume(100) + + leader.request.assert_called_once_with(LinkPlayCommand.MULTIROOM_VOL.format(100)) From 42f1885e0754997ae271f90a52f12b64a26e6157 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Wed, 14 Feb 2024 14:25:56 +0100 Subject: [PATCH 09/13] p --- LICENSE | 2 +- src/linkplay/discovery.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 094b494..5eb46d2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Velleman Group nv +Copyright (c) 2024 Velleman Group nv Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/linkplay/discovery.py b/src/linkplay/discovery.py index 7ac06d4..11d7f53 100644 --- a/src/linkplay/discovery.py +++ b/src/linkplay/discovery.py @@ -55,8 +55,7 @@ async def discover_multirooms(bridges: List[LinkPlayBridge]) -> List[LinkPlayMul followers: List[LinkPlayBridge] = [] for follower in properties[MultiroomAttribute.FOLLOWER_LIST]: follower_uuid = follower[MultiroomAttribute.UUID] - follower_bridge = next((b for b in bridges if b.device.uuid == follower_uuid), None) - if follower_bridge: + if follower_bridge := next((b for b in bridges if b.device.uuid == follower_uuid), None): followers.append(follower_bridge) multirooms.append(LinkPlayMultiroom(bridge, followers)) From 425f0fc204d28f3e2e8aae117b31fa059846dc4f Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Mon, 19 Feb 2024 08:32:13 +0100 Subject: [PATCH 10/13] p --- README.md | 18 +++++++++++++++--- src/linkplay/__main__.py | 3 +-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6eeeffa..71f09fa 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,21 @@ # python-linkplay -LinkPlay library for Python +A Python Library for Seamless LinkPlay Device Control -## Documentation +## Intro -Used documentation +Welcome to python-linkplay, a powerful and user-friendly Python library designed to simplify the integration and control of LinkPlay-enabled devices in your projects. LinkPlay technology empowers a wide range of smart audio devices, making them interconnected and easily controllable. With python-linkpaly, you can harness this capability and seamlessly manage your LinkPlay devices from within your Python applications. + +## Key features + +1. Unified Control: python-linkplay provides a unified interface for controlling various LinkPlay-enabled devices, streamlining the process of interacting with speakers, smart home audio systems, and more. + +2. Device Discovery: Easily discover and connect to LinkPlay devices on your network, ensuring a hassle-free setup and integration into your Python applications. + +3. Playback Management: Take charge of audio playback on LinkPlay devices with functions to play, pause, skip tracks, adjust volume, and more, offering a comprehensive set of controls for a seamless user experience. + +4. Metadata Retrieval: Retrieve essential metadata such as track information, artist details, and album data, enabling you to enhance the user interface and display relevant information in your applications. + +## LinkPlay API documentation - https://github.com/n4archive/LinkPlayAPI - https://github.com/nagyrobi/home-assistant-custom-components-linkplay diff --git a/src/linkplay/__main__.py b/src/linkplay/__main__.py index 57f4d92..c30cca3 100644 --- a/src/linkplay/__main__.py +++ b/src/linkplay/__main__.py @@ -1,5 +1,4 @@ import asyncio - import aiohttp from linkplay.discovery import discover_linkplay_bridges, discover_multirooms @@ -9,7 +8,7 @@ async def main(): async with aiohttp.ClientSession() as session: bridges = await discover_linkplay_bridges(session) multirooms = await discover_multirooms(bridges) - print(multirooms) + return bridges, multirooms if __name__ == "__main__": asyncio.run(main()) From 8ac08a9f9e967cda82ab4e2c503170af675949be Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Mon, 19 Feb 2024 10:09:15 +0100 Subject: [PATCH 11/13] p --- .github/workflows/release.yaml | 52 ++++++++++++++++++++++++++++++++++ .github/workflows/test.yaml | 24 ++++++++++++++++ README.md | 5 ++++ setup.cfg | 2 +- setup.py | 3 +- tox.ini | 1 + 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release.yaml create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..350148c --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,52 @@ +name: release +run-name: Creating releases/${{ inputs.version }} + +on: + workflow_dispatch: + inputs: + version: + description: 'Version' + required: true + type: string + +jobs: + create_release_branch: + name: Create release branch + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Update version + run: | + echo -n "${{ github.event.inputs.version }}" > version.txt + sed -i 's/version = [^;]*/version = ${{ github.event.inputs.version }}/g' setup.cfg + - name: Create release branch + run: | + git config --local user.name "github-actions[bot]" + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -B releases/${{ github.event.inputs.version }} + git commit --allow-empty -am "Create version ${{ github.event.inputs.version }}" + git push --set-upstream origin releases/${{ github.event.inputs.version }} + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: 3.11 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox tox-gh-actions + - name: Test with tox + run: tox + + pypi-publish: + runs-on: ubuntu-latest + name: Upload release to PyPI + environment: + name: pypi + url: https://pypi.org/p/python-linkplay + permissions: + id-token: write + steps: + - uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..2363af2 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,24 @@ +name: test + +on: [push, pull_request] + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + python-version: ['3.11'] + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox tox-gh-actions + - name: Test with tox + run: tox \ No newline at end of file diff --git a/README.md b/README.md index 71f09fa..dc4c410 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ + +[![PyPI package](https://badge.fury.io/py/python-linkplay.svg)](https://pypi.org/project/python-linkplay/) + +[![Release](https://github.com/velleman/python-linkplay/actions/workflows/release/badge.svg)](https://github.com/velleman/python-linkplay/actions/workflows/release.yaml) + # python-linkplay A Python Library for Seamless LinkPlay Device Control diff --git a/setup.cfg b/setup.cfg index 81dd3d4..878c963 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,7 @@ name = python_linkplay description = Python library to control LinkPlay devices author = Velleman Group nv -version = 0.0.0 +version = 0.0.1 [options] packages = find_namespace: diff --git a/setup.py b/setup.py index 57c026b..26e08e4 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ from setuptools import setup + if __name__ == "__main__": - setup() \ No newline at end of file + setup() diff --git a/tox.ini b/tox.ini index a157cd2..5de764f 100644 --- a/tox.ini +++ b/tox.ini @@ -8,6 +8,7 @@ python = 3.11: py311, mypy, flake8 [testenv] +package = wheel setenv = PYTHONPATH = {toxinidir} deps = From f526a5670e2ddbf2cac3c24b94b0d15551479982 Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Mon, 19 Feb 2024 10:15:37 +0100 Subject: [PATCH 12/13] Bump setup-python --- .github/workflows/release.yaml | 3 +-- .github/workflows/test.yaml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 350148c..10b6f06 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -29,8 +29,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: 3.11 - name: Install dependencies diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2363af2..881bbdd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From c64617406b589a03ea8061764f678c1bf931191d Mon Sep 17 00:00:00 2001 From: Philip Vanloo Date: Mon, 19 Feb 2024 10:42:07 +0100 Subject: [PATCH 13/13] p --- .github/workflows/release.yaml | 9 ++++----- setup.cfg | 11 ++++++++--- src/linkplay/__init__.py | 1 + src/linkplay/__version__.py | 1 + version.txt | 1 - 5 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 src/linkplay/__version__.py delete mode 100644 version.txt diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 10b6f06..8d061e4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,8 +17,7 @@ jobs: - uses: actions/checkout@v4 - name: Update version run: | - echo -n "${{ github.event.inputs.version }}" > version.txt - sed -i 's/version = [^;]*/version = ${{ github.event.inputs.version }}/g' setup.cfg + echo "${{ github.event.inputs.version }}" > src/linkplay/__version__.py - name: Create release branch run: | git config --local user.name "github-actions[bot]" @@ -35,9 +34,9 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install tox tox-gh-actions - - name: Test with tox - run: tox + pip install build + - name: Build package + run: python -m build pypi-publish: runs-on: ubuntu-latest diff --git a/setup.cfg b/setup.cfg index 878c963..e5c139f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,8 +1,11 @@ [metadata] name = python_linkplay -description = Python library to control LinkPlay devices +description = A Python Library for Seamless LinkPlay Device Control author = Velleman Group nv -version = 0.0.1 +version = attr: linkplay.VERSION +license = MIT +classifiers = + Programming Language :: Python :: 3 [options] packages = find_namespace: @@ -33,4 +36,6 @@ testing = typing-extensions>=4.6.3 [flake8] -max-line-length = 160 \ No newline at end of file +max-line-length = 160 +per-file-ignores = + */__init__.py: F401 \ No newline at end of file diff --git a/src/linkplay/__init__.py b/src/linkplay/__init__.py index e69de29..71e183a 100644 --- a/src/linkplay/__init__.py +++ b/src/linkplay/__init__.py @@ -0,0 +1 @@ +from linkplay.__version__ import __version__ as VERSION diff --git a/src/linkplay/__version__.py b/src/linkplay/__version__.py new file mode 100644 index 0000000..c57bfd5 --- /dev/null +++ b/src/linkplay/__version__.py @@ -0,0 +1 @@ +__version__ = '0.0.0' diff --git a/version.txt b/version.txt deleted file mode 100644 index bd52db8..0000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.0.0 \ No newline at end of file