From 0af5a7c9f45aee37ed7a45b414750ac08d6d913b Mon Sep 17 00:00:00 2001 From: Matt Blum Date: Fri, 7 Mar 2025 03:02:00 -0600 Subject: [PATCH] Add advanced networking (list of IPs) to Sonos S1 provider (#1988) --- .../providers/sonos_s1/__init__.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/music_assistant/providers/sonos_s1/__init__.py b/music_assistant/providers/sonos_s1/__init__.py index ebb2e5aa8..74d556e4e 100644 --- a/music_assistant/providers/sonos_s1/__init__.py +++ b/music_assistant/providers/sonos_s1/__init__.py @@ -26,8 +26,8 @@ from music_assistant_models.errors import PlayerCommandFailed, PlayerUnavailableError from music_assistant_models.player import DeviceInfo, Player, PlayerMedia from requests.exceptions import RequestException +from soco import SoCo, events_asyncio, zonegroupstate from soco import config as soco_config -from soco import events_asyncio, zonegroupstate from soco.discovery import discover, scan_network from music_assistant.constants import ( @@ -35,6 +35,7 @@ CONF_ENTRY_CROSSFADE, CONF_ENTRY_FLOW_MODE_HIDDEN_DISABLED, CONF_ENTRY_HTTP_PROFILE_FORCED_1, + CONF_ENTRY_MANUAL_DISCOVERY_IPS, CONF_ENTRY_OUTPUT_CODEC, VERBOSE_LOG_LEVEL, create_sample_rates_config_entry, @@ -47,7 +48,6 @@ if TYPE_CHECKING: from music_assistant_models.config_entries import ProviderConfig from music_assistant_models.provider import ProviderManifest - from soco.core import SoCo from music_assistant.mass import MusicAssistant from music_assistant.models import ProviderInstanceType @@ -120,6 +120,7 @@ async def get_config_entries( category="advanced", required=False, ), + CONF_ENTRY_MANUAL_DISCOVERY_IPS, ) @@ -365,6 +366,25 @@ async def discover_players(self) -> None: if self._discovery_running: return + # Handle config option for manual IP's + manual_ip_config = cast( + list[str], self.config.get_value(CONF_ENTRY_MANUAL_DISCOVERY_IPS.key) + ) + for ip_address in manual_ip_config: + try: + player = SoCo(ip_address) + self._add_player(player) + except RequestException as err: + # player is offline + self.logger.debug("Failed to add SonosPlayer %s: %s", player, err) + except Exception as err: + self.logger.warning( + "Failed to add SonosPlayer %s: %s", + player, + err, + exc_info=err if self.logger.isEnabledFor(10) else None, + ) + allow_network_scan = self.config.get_value(CONF_NETWORK_SCAN) if not (household_id := self.config.get_value(CONF_HOUSEHOLD_ID)): household_id = "Sonos"