Fix zeroconf interfaces config
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 6 Feb 2026 18:25:09 +0000 (19:25 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 6 Feb 2026 18:25:09 +0000 (19:25 +0100)
music_assistant/controllers/players/player_controller.py
music_assistant/controllers/streams/streams_controller.py
music_assistant/mass.py

index fbc1364a52b430892dfdb9892bf854734ecf5da5..fa3137e34cf55e4093127358b62660c468889c5e 100644 (file)
@@ -67,6 +67,7 @@ from music_assistant.constants import (
     CONF_ENTRY_ANNOUNCE_VOLUME_MIN,
     CONF_ENTRY_ANNOUNCE_VOLUME_STRATEGY,
     CONF_ENTRY_TTS_PRE_ANNOUNCE,
+    CONF_ENTRY_ZEROCONF_INTERFACES,
     CONF_PLAYER_DSP,
     CONF_PLAYERS,
     CONF_PRE_ANNOUNCE_CHIME_URL,
@@ -90,7 +91,12 @@ from .sync_groups import SyncGroupController, SyncGroupPlayer
 if TYPE_CHECKING:
     from collections.abc import Iterator
 
-    from music_assistant_models.config_entries import CoreConfig, PlayerConfig
+    from music_assistant_models.config_entries import (
+        ConfigEntry,
+        ConfigValueType,
+        CoreConfig,
+        PlayerConfig,
+    )
     from music_assistant_models.player_queue import PlayerQueue
 
     from music_assistant import MusicAssistant
@@ -221,6 +227,14 @@ class PlayerController(CoreController):
         self._player_command_locks: dict[str, asyncio.Lock] = {}
         self._sync_groups: SyncGroupController = SyncGroupController(self)
 
+    async def get_config_entries(
+        self,
+        action: str | None = None,
+        values: dict[str, ConfigValueType] | None = None,
+    ) -> tuple[ConfigEntry, ...]:
+        """Return Config Entries for the Player Controller."""
+        return (CONF_ENTRY_ZEROCONF_INTERFACES,)
+
     async def setup(self, config: CoreConfig) -> None:
         """Async initialize of module."""
         self._poll_task = self.mass.create_task(self._poll_players())
index 4cf05734ca1418651cb59600433893219e32cf86..683b8e958414918cb9432a34c8251c9c89e6e47d 100644 (file)
@@ -45,7 +45,6 @@ from music_assistant.constants import (
     CONF_ENTRY_ENABLE_ICY_METADATA,
     CONF_ENTRY_LOG_LEVEL,
     CONF_ENTRY_SUPPORT_GAPLESS_DIFFERENT_SAMPLE_RATES,
-    CONF_ENTRY_ZEROCONF_INTERFACES,
     CONF_HTTP_PROFILE,
     CONF_OUTPUT_CHANNELS,
     CONF_OUTPUT_CODEC,
@@ -303,7 +302,6 @@ class StreamsController(CoreController):
                 category="generic",
                 advanced=True,
             ),
-            CONF_ENTRY_ZEROCONF_INTERFACES,
         )
 
     async def setup(self, config: CoreConfig) -> None:
index 7434c8dd643795a436584e4935effe2d418f2b22..6268e661e94a30f4e68add57bdbb41924dc2a60a 100644 (file)
@@ -151,13 +151,13 @@ class MusicAssistant:
         await self.config.setup()
         # create shared zeroconf instance
         zeroconf_interfaces = self.config.get_raw_core_config_value(
-            "streams", CONF_ZEROCONF_INTERFACES, "default"
+            "players", CONF_ZEROCONF_INTERFACES, "default"
         )
+        # IPv6 requires InterfaceChoice.All, so only enable when zeroconf_interfaces is "all"
+        use_all_interfaces = zeroconf_interfaces == "all"
         self.aiozc = AsyncZeroconf(
-            ip_version=IPVersion.All,
-            interfaces=InterfaceChoice.All
-            if zeroconf_interfaces == "all"
-            else InterfaceChoice.Default,
+            ip_version=IPVersion.All if use_all_interfaces else IPVersion.V4Only,
+            interfaces=InterfaceChoice.All if use_all_interfaces else InterfaceChoice.Default,
         )
         # load all available providers from manifest files
         await self.__load_provider_manifests()