From c856d1fa093bf05161a5bb172b6399207b23e5fd Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Wed, 27 Mar 2024 00:01:29 +0100 Subject: [PATCH] Add categories to config entries (#1185) add categories to config entries --- .../common/models/config_entries.py | 64 ++++++++++++------- music_assistant/common/models/enums.py | 2 + music_assistant/common/models/player.py | 4 ++ music_assistant/constants.py | 2 +- music_assistant/server/controllers/players.py | 9 +++ music_assistant/server/controllers/streams.py | 4 +- .../server/controllers/webserver.py | 2 +- .../server/models/player_provider.py | 4 ++ .../server/providers/airplay/__init__.py | 8 +-- .../server/providers/chromecast/__init__.py | 2 +- .../server/providers/dlna/__init__.py | 2 +- .../server/providers/filesystem_local/base.py | 1 - .../providers/filesystem_smb/__init__.py | 2 +- .../server/providers/fully_kiosk/__init__.py | 4 +- .../server/providers/hass/__init__.py | 2 +- .../server/providers/hass_players/__init__.py | 4 +- .../server/providers/slimproto/__init__.py | 17 +++-- .../server/providers/snapcast/__init__.py | 6 +- .../server/providers/sonos/__init__.py | 8 +-- .../server/providers/ugp/__init__.py | 4 +- 20 files changed, 96 insertions(+), 55 deletions(-) diff --git a/music_assistant/common/models/config_entries.py b/music_assistant/common/models/config_entries.py index 0234fbbf..1d0ba739 100644 --- a/music_assistant/common/models/config_entries.py +++ b/music_assistant/common/models/config_entries.py @@ -25,6 +25,7 @@ from music_assistant.constants import ( CONF_EQ_TREBLE, CONF_FLOW_MODE, CONF_HIDE_PLAYER, + CONF_ICON, CONF_LOG_LEVEL, CONF_OUTPUT_CHANNELS, CONF_SYNC_ADJUST, @@ -52,9 +53,16 @@ ConfigEntryTypeMap = { ConfigEntryType.LABEL: str, ConfigEntryType.DIVIDER: str, ConfigEntryType.ACTION: str, + ConfigEntryType.ALERT: str, + ConfigEntryType.ICON: str, } -UI_ONLY = (ConfigEntryType.LABEL, ConfigEntryType.DIVIDER, ConfigEntryType.ACTION) +UI_ONLY = ( + ConfigEntryType.LABEL, + ConfigEntryType.DIVIDER, + ConfigEntryType.ACTION, + ConfigEntryType.ALERT, +) @dataclass @@ -95,8 +103,8 @@ class ConfigEntry(DataClassDictMixin): depends_on: str | None = None # hidden: hide from UI hidden: bool = False - # advanced: this is an advanced setting (frontend hides it in some corner) - advanced: bool = False + # category: category to group this setting into in the frontend (e.g. advanced) + category: str = "generic" # action: (configentry)action that is needed to get the value for this entry action: str | None = None # action_label: default label for the action when no translation for the action is present @@ -298,7 +306,7 @@ CONF_ENTRY_LOG_LEVEL = ConfigEntry( ConfigValueOption("verbose", "VERBOSE"), ), default_value="GLOBAL", - advanced=True, + category="advanced", ) DEFAULT_PROVIDER_CONFIG_ENTRIES = (CONF_ENTRY_LOG_LEVEL,) @@ -311,7 +319,6 @@ CONF_ENTRY_FLOW_MODE = ConfigEntry( type=ConfigEntryType.BOOLEAN, label="Enable queue flow mode", default_value=False, - advanced=False, ) @@ -335,7 +342,7 @@ CONF_ENTRY_OUTPUT_CHANNELS = ConfigEntry( ], default_value="stereo", label="Output Channel Mode", - advanced=True, + category="audio", ) CONF_ENTRY_VOLUME_NORMALIZATION = ConfigEntry( @@ -344,6 +351,7 @@ CONF_ENTRY_VOLUME_NORMALIZATION = ConfigEntry( label="Enable volume normalization", default_value=True, description="Enable volume normalization (EBU-R128 based)", + category="audio", ) CONF_ENTRY_VOLUME_NORMALIZATION_TARGET = ConfigEntry( @@ -354,7 +362,7 @@ CONF_ENTRY_VOLUME_NORMALIZATION_TARGET = ConfigEntry( label="Target level for volume normalization", description="Adjust average (perceived) loudness to this target level", depends_on=CONF_VOLUME_NORMALIZATION, - advanced=True, + category="audio", ) CONF_ENTRY_EQ_BASS = ConfigEntry( @@ -364,7 +372,7 @@ CONF_ENTRY_EQ_BASS = ConfigEntry( default_value=0, label="Equalizer: bass", description="Use the builtin basic equalizer to adjust the bass of audio.", - advanced=True, + category="audio", ) CONF_ENTRY_EQ_MID = ConfigEntry( @@ -374,7 +382,7 @@ CONF_ENTRY_EQ_MID = ConfigEntry( default_value=0, label="Equalizer: midrange", description="Use the builtin basic equalizer to adjust the midrange of audio.", - advanced=True, + category="audio", ) CONF_ENTRY_EQ_TREBLE = ConfigEntry( @@ -384,7 +392,7 @@ CONF_ENTRY_EQ_TREBLE = ConfigEntry( default_value=0, label="Equalizer: treble", description="Use the builtin basic equalizer to adjust the treble of audio.", - advanced=True, + category="audio", ) @@ -394,7 +402,7 @@ CONF_ENTRY_CROSSFADE = ConfigEntry( label="Enable crossfade", default_value=False, description="Enable a crossfade transition between (queue) tracks.", - advanced=False, + category="audio", ) CONF_ENTRY_CROSSFADE_DURATION = ConfigEntry( @@ -405,7 +413,7 @@ CONF_ENTRY_CROSSFADE_DURATION = ConfigEntry( label="Crossfade duration", description="Duration in seconds of the crossfade between tracks (if enabled)", depends_on=CONF_CROSSFADE, - advanced=True, + category="audio", ) CONF_ENTRY_HIDE_PLAYER = ConfigEntry( @@ -413,7 +421,6 @@ CONF_ENTRY_HIDE_PLAYER = ConfigEntry( type=ConfigEntryType.BOOLEAN, label="Hide this player in the user interface", default_value=False, - advanced=True, ) CONF_ENTRY_ENFORCE_MP3 = ConfigEntry( @@ -425,7 +432,7 @@ CONF_ENTRY_ENFORCE_MP3 = ConfigEntry( "to all players. Some players can not deal with that and require the stream to be packed " "into a lossy mp3 codec. \n\n " "Only enable when needed. Saves some bandwidth at the cost of audio quality.", - advanced=True, + category="audio", ) CONF_ENTRY_SYNC_ADJUST = ConfigEntry( @@ -437,7 +444,7 @@ CONF_ENTRY_SYNC_ADJUST = ConfigEntry( description="If this player is playing audio synced with other players " "and you always hear the audio too early or late on this player, " "you can shift the audio a bit.", - advanced=True, + category="advanced", ) @@ -446,8 +453,7 @@ CONF_ENTRY_TTS_PRE_ANNOUNCE = ConfigEntry( type=ConfigEntryType.BOOLEAN, default_value=True, label="Pre-announce TTS announcements", - description="When a TTS (text-to-speech) message is sent to the Announce feature, " - "prepend the announcement with a short pre-announcement sound (bell whistle).", + category="announcements", ) @@ -457,13 +463,12 @@ CONF_ENTRY_ANNOUNCE_VOLUME_STRATEGY = ConfigEntry( options=[ ConfigValueOption("Absolute volume", "absolute"), ConfigValueOption("Relative volume increase", "relative"), - ConfigValueOption("Percentual volume increase", "percentual"), + ConfigValueOption("Volume increase by fixed percentage", "percentual"), ConfigValueOption("Do not adjust volume", "none"), ], default_value="percentual", label="Volume strategy for Announcements", - description="When an announcement is being broadcast to this player, " - "how should the volume be adjusted temporary (use in combination with the volume value below).", + category="announcements", ) CONF_ENTRY_ANNOUNCE_VOLUME = ConfigEntry( @@ -471,8 +476,7 @@ CONF_ENTRY_ANNOUNCE_VOLUME = ConfigEntry( type=ConfigEntryType.INTEGER, default_value=85, label="Volume for Announcements", - description="The percentual, relative or absolute volume level, " - "used with the strategy for announcements.", + category="announcements", ) CONF_ENTRY_ANNOUNCE_VOLUME_MIN = ConfigEntry( @@ -481,6 +485,7 @@ CONF_ENTRY_ANNOUNCE_VOLUME_MIN = ConfigEntry( default_value=15, label="Minimum Volume level for Announcements", description="The volume (adjustment) of announcements should no go below this level.", + category="announcements", ) CONF_ENTRY_ANNOUNCE_VOLUME_MAX = ConfigEntry( @@ -489,4 +494,19 @@ CONF_ENTRY_ANNOUNCE_VOLUME_MAX = ConfigEntry( default_value=75, label="Maximum Volume level for Announcements", description="The volume (adjustment) of announcements should no go above this level.", + category="announcements", +) + +CONF_ENTRY_PLAYER_ICON = ConfigEntry( + key=CONF_ICON, + type=ConfigEntryType.ICON, + default_value="mdi-speaker", + label="Icon", + description="Material design icon for this player. " + "\n\nSee https://pictogrammers.com/library/mdi/", + category="generic", +) + +CONF_ENTRY_PLAYER_ICON_GROUP = ConfigEntry.from_dict( + {**CONF_ENTRY_PLAYER_ICON.to_dict(), "default_value": "mdi-speaker-multiple"} ) diff --git a/music_assistant/common/models/enums.py b/music_assistant/common/models/enums.py index fae363c7..755e839d 100644 --- a/music_assistant/common/models/enums.py +++ b/music_assistant/common/models/enums.py @@ -388,6 +388,8 @@ class ConfigEntryType(StrEnum): LABEL = "label" DIVIDER = "divider" ACTION = "action" + ICON = "icon" + ALERT = "alert" UNKNOWN = "unknown" @classmethod diff --git a/music_assistant/common/models/player.py b/music_assistant/common/models/player.py index 9ca4f123..33bee344 100644 --- a/music_assistant/common/models/player.py +++ b/music_assistant/common/models/player.py @@ -91,6 +91,10 @@ class Player(DataClassDictMixin): # a hidden player is hidden in the UI only but can still be controlled hidden: bool = False + # icon: material design icon for this player + # will be set by the player manager based on config + icon: str = "mdi-speaker" + # group_volume: if the player is a player group or syncgroup master, # this will return the average volume of all child players # if not a group player, this is just the player's volume diff --git a/music_assistant/constants.py b/music_assistant/constants.py index 383952b5..bd6a965e 100644 --- a/music_assistant/constants.py +++ b/music_assistant/constants.py @@ -60,7 +60,7 @@ CONF_ANNOUNCE_VOLUME_STRATEGY: Final[str] = "announce_volume_strategy" CONF_ANNOUNCE_VOLUME: Final[str] = "announce_volume" CONF_ANNOUNCE_VOLUME_MIN: Final[str] = "announce_volume_min" CONF_ANNOUNCE_VOLUME_MAX: Final[str] = "announce_volume_max" - +CONF_ICON: Final[str] = "icon" # config default values DEFAULT_HOST: Final[str] = "0.0.0.0" diff --git a/music_assistant/server/controllers/players.py b/music_assistant/server/controllers/players.py index c44f2cbc..720a6aeb 100644 --- a/music_assistant/server/controllers/players.py +++ b/music_assistant/server/controllers/players.py @@ -15,6 +15,8 @@ from music_assistant.common.models.config_entries import ( CONF_ENTRY_ANNOUNCE_VOLUME_MAX, CONF_ENTRY_ANNOUNCE_VOLUME_MIN, CONF_ENTRY_ANNOUNCE_VOLUME_STRATEGY, + CONF_ENTRY_PLAYER_ICON, + CONF_ENTRY_PLAYER_ICON_GROUP, CONF_ENTRY_TTS_PRE_ANNOUNCE, ) from music_assistant.common.models.enums import ( @@ -273,6 +275,13 @@ class PlayerController(CoreController): player.hidden = self.mass.config.get_raw_player_config_value( player.player_id, CONF_HIDE_PLAYER, False ) + player.icon = self.mass.config.get_raw_player_config_value( + player.player_id, + CONF_ENTRY_PLAYER_ICON.key, + CONF_ENTRY_PLAYER_ICON_GROUP.default_value + if player.type in (PlayerType.GROUP, PlayerType.SYNC_GROUP) + else CONF_ENTRY_PLAYER_ICON.default_value, + ) # handle syncgroup - get attributes from first player that has this group as source if player.player_id.startswith(SYNCGROUP_PREFIX): if player.powered and (sync_leader := self.get_sync_leader(player)): diff --git a/music_assistant/server/controllers/streams.py b/music_assistant/server/controllers/streams.py index b6b74fdd..42e32921 100644 --- a/music_assistant/server/controllers/streams.py +++ b/music_assistant/server/controllers/streams.py @@ -330,7 +330,7 @@ class StreamsController(CoreController): "on the given IP and TCP port by players on the local network. \n" "This is an advanced setting that should normally " "not be adjusted in regular setups.", - advanced=True, + category="advanced", ), ConfigEntry( key=CONF_BIND_IP, @@ -342,7 +342,7 @@ class StreamsController(CoreController): "Use 0.0.0.0 to bind to all interfaces, which is the default. \n" "This is an advanced setting that should normally " "not be adjusted in regular setups.", - advanced=True, + category="advanced", ), ) diff --git a/music_assistant/server/controllers/webserver.py b/music_assistant/server/controllers/webserver.py index 12a0987c..7863aef6 100644 --- a/music_assistant/server/controllers/webserver.py +++ b/music_assistant/server/controllers/webserver.py @@ -132,7 +132,7 @@ class WebserverController(CoreController): "to enhance security and protect outside access to the webinterface and API. \n\n" "This is an advanced setting that should normally " "not be adjusted in regular setups.", - advanced=True, + category="advanced", ), ) diff --git a/music_assistant/server/models/player_provider.py b/music_assistant/server/models/player_provider.py index b869c042..2a4e46f9 100644 --- a/music_assistant/server/models/player_provider.py +++ b/music_assistant/server/models/player_provider.py @@ -12,6 +12,8 @@ from music_assistant.common.models.config_entries import ( CONF_ENTRY_ANNOUNCE_VOLUME_STRATEGY, CONF_ENTRY_AUTO_PLAY, CONF_ENTRY_HIDE_PLAYER, + CONF_ENTRY_PLAYER_ICON, + CONF_ENTRY_PLAYER_ICON_GROUP, CONF_ENTRY_TTS_PRE_ANNOUNCE, CONF_ENTRY_VOLUME_NORMALIZATION, CONF_ENTRY_VOLUME_NORMALIZATION_TARGET, @@ -41,6 +43,7 @@ class PlayerProvider(Provider): async def get_player_config_entries(self, player_id: str) -> tuple[ConfigEntry, ...]: """Return all (provider/player specific) Config Entries for the given player (if any).""" entries = ( + CONF_ENTRY_PLAYER_ICON, CONF_ENTRY_VOLUME_NORMALIZATION, CONF_ENTRY_AUTO_PLAY, CONF_ENTRY_VOLUME_NORMALIZATION_TARGET, @@ -69,6 +72,7 @@ class PlayerProvider(Provider): multi_value=True, required=True, ), + CONF_ENTRY_PLAYER_ICON_GROUP, ) return entries diff --git a/music_assistant/server/providers/airplay/__init__.py b/music_assistant/server/providers/airplay/__init__.py index 3655bba2..0bee8177 100644 --- a/music_assistant/server/providers/airplay/__init__.py +++ b/music_assistant/server/providers/airplay/__init__.py @@ -76,7 +76,7 @@ PLAYER_CONFIG_ENTRIES = ( label="Enable encryption", description="Enable encrypted communication with the player, " "some (3rd party) players require this.", - advanced=True, + category="airplay", ), ConfigEntry( key=CONF_ALAC_ENCODE, @@ -85,7 +85,7 @@ PLAYER_CONFIG_ENTRIES = ( label="Enable compression", description="Save some network bandwidth by sending the audio as " "(lossless) ALAC at the cost of a bit CPU.", - advanced=True, + category="airplay", ), CONF_ENTRY_SYNC_ADJUST, ConfigEntry( @@ -95,7 +95,7 @@ PLAYER_CONFIG_ENTRIES = ( required=False, label="Device password", description="Some devices require a password to connect/play.", - advanced=True, + category="airplay", ), ) BACKOFF_TIME_LOWER_LIMIT = 15 # seconds @@ -561,7 +561,7 @@ class AirplayProvider(PlayerProvider): base_entries = await super().get_player_config_entries(player_id) if player_id not in self._players: # most probably a syncgroup - return base_entries + return (*base_entries, CONF_ENTRY_CROSSFADE, CONF_ENTRY_CROSSFADE_DURATION) return base_entries + PLAYER_CONFIG_ENTRIES async def cmd_stop(self, player_id: str) -> None: diff --git a/music_assistant/server/providers/chromecast/__init__.py b/music_assistant/server/providers/chromecast/__init__.py index 5111b49d..361733a4 100644 --- a/music_assistant/server/providers/chromecast/__init__.py +++ b/music_assistant/server/providers/chromecast/__init__.py @@ -66,7 +66,7 @@ PLAYER_CONFIG_ENTRIES = ( description="Enable a crossfade transition between (queue) tracks. \n\n" "Note that Cast does not natively support crossfading so you need to enable " "the 'flow mode' workaround to use crossfading with Cast players.", - advanced=False, + category="audio", depends_on=CONF_FLOW_MODE, ), CONF_ENTRY_FLOW_MODE, diff --git a/music_assistant/server/providers/dlna/__init__.py b/music_assistant/server/providers/dlna/__init__.py index 2181d78d..96bdb8d9 100644 --- a/music_assistant/server/providers/dlna/__init__.py +++ b/music_assistant/server/providers/dlna/__init__.py @@ -89,7 +89,7 @@ PLAYER_CONFIG_ENTRIES = ( description="Enable a crossfade transition between (queue) tracks. \n\n" "Note that DLNA does not natively support crossfading so you need to enable " "the 'flow mode' workaround to use crossfading with DLNA players.", - advanced=False, + category="audio", depends_on=CONF_FLOW_MODE, ), CONF_ENTRY_FLOW_MODE, diff --git a/music_assistant/server/providers/filesystem_local/base.py b/music_assistant/server/providers/filesystem_local/base.py index e29735f0..c8544c81 100644 --- a/music_assistant/server/providers/filesystem_local/base.py +++ b/music_assistant/server/providers/filesystem_local/base.py @@ -68,7 +68,6 @@ CONF_ENTRY_MISSING_ALBUM_ARTIST = ConfigEntry( description="Music Assistant prefers information stored in ID3 tags and only uses" " online sources for additional metadata. This means that the ID3 tags need to be " "accurate, preferably tagged with MusicBrainz Picard.", - advanced=False, required=False, options=( ConfigValueOption("Skip track and log warning", "skip"), diff --git a/music_assistant/server/providers/filesystem_smb/__init__.py b/music_assistant/server/providers/filesystem_smb/__init__.py index d61f35db..dbdb53d8 100644 --- a/music_assistant/server/providers/filesystem_smb/__init__.py +++ b/music_assistant/server/providers/filesystem_smb/__init__.py @@ -112,7 +112,7 @@ async def get_config_entries( type=ConfigEntryType.STRING, label="Mount options", required=False, - advanced=True, + category="advanced", default_value="noserverino,file_mode=0775,dir_mode=0775,uid=0,gid=0", description="[optional] Any additional mount options you " "want to pass to the mount command if needed for your particular setup.", diff --git a/music_assistant/server/providers/fully_kiosk/__init__.py b/music_assistant/server/providers/fully_kiosk/__init__.py index 2c296b2a..54bffd91 100644 --- a/music_assistant/server/providers/fully_kiosk/__init__.py +++ b/music_assistant/server/providers/fully_kiosk/__init__.py @@ -79,7 +79,7 @@ async def get_config_entries( default_value="2323", label="Port to use to connect to the Fully Kiosk API (default is 2323).", required=True, - advanced=True, + category="advanced", ), ) @@ -160,7 +160,7 @@ class FullyKioskProvider(PlayerProvider): description="By default, Music Assistant sends lossless, high quality audio " "to all players. Some devices can not deal with that and require " "the stream to be packed into a lossy mp3 codec. Only enable when needed.", - advanced=True, + category="advanced", ), ) diff --git a/music_assistant/server/providers/hass/__init__.py b/music_assistant/server/providers/hass/__init__.py index 60f527cb..463b75d0 100644 --- a/music_assistant/server/providers/hass/__init__.py +++ b/music_assistant/server/providers/hass/__init__.py @@ -143,7 +143,7 @@ async def get_config_entries( "'authenticate' button to generate a token for you with logging in.", depends_on=CONF_URL, value=values.get(CONF_AUTH_TOKEN) if values else None, - advanced=True, + category="advanced", ), ) diff --git a/music_assistant/server/providers/hass_players/__init__.py b/music_assistant/server/providers/hass_players/__init__.py index dd726857..f8ef8e21 100644 --- a/music_assistant/server/providers/hass_players/__init__.py +++ b/music_assistant/server/providers/hass_players/__init__.py @@ -99,7 +99,7 @@ PLAYER_CONFIG_ENTRIES = ( description="Enable a crossfade transition between (queue) tracks. \n\n" "Note that you need to enable the 'flow mode' workaround to use " "crossfading with Home Assistant players.", - advanced=False, + category="audio", depends_on=CONF_FLOW_MODE, ), CONF_ENTRY_FLOW_MODE, @@ -113,7 +113,7 @@ PLAYER_CONFIG_ENTRIES = ( "to all players. Some players can not deal with that and require the stream to be packed " "into a lossy mp3 codec. \n\n " "Only enable when needed. Saves some bandwidth at the cost of audio quality.", - advanced=True, + category="audio", ), ) diff --git a/music_assistant/server/providers/slimproto/__init__.py b/music_assistant/server/providers/slimproto/__init__.py index d89f76c3..3fbd2db2 100644 --- a/music_assistant/server/providers/slimproto/__init__.py +++ b/music_assistant/server/providers/slimproto/__init__.py @@ -112,7 +112,7 @@ CONF_ENTRY_DISPLAY = ConfigEntry( required=False, label="Enable display support", description="Enable/disable native display support on squeezebox or squeezelite32 hardware.", - advanced=True, + category="advanced", ) CONF_ENTRY_VISUALIZATION = ConfigEntry( key=CONF_VISUALIZATION, @@ -126,7 +126,7 @@ CONF_ENTRY_VISUALIZATION = ConfigEntry( label="Visualization type", description="The type of visualization to show on the display " "during playback if the device supports this.", - advanced=True, + category="advanced", depends_on=CONF_DISPLAY, ) @@ -168,7 +168,7 @@ async def get_config_entries( "player compatibility, so security risks are minimized to practically zero." "You may safely disable this option if you have no players that rely on this feature " "or you dont care about the additional metadata.", - advanced=True, + category="advanced", ), ConfigEntry( key=CONF_CLI_JSON_PORT, @@ -184,7 +184,7 @@ async def get_config_entries( "it on a different port. Set to 0 to disable this functionality.\n\n" "You may safely disable this option if you have no players that rely on this feature " "or you dont care about the additional metadata.", - advanced=True, + category="advanced", ), ConfigEntry( key=CONF_DISCOVERY, @@ -195,7 +195,7 @@ async def get_config_entries( "discover and connect to this server. \n\n" "You may want to disable this feature if you are running multiple slimproto servers " "on your network and/or you don't want clients to auto connect to this server.", - advanced=True, + category="advanced", ), ConfigEntry( key=CONF_PORT, @@ -206,7 +206,7 @@ async def get_config_entries( "The default is 3483 and using a different port is not supported by " "hardware squeezebox players. Only adjust this port if you want to " "use other slimproto based servers side by side with (squeezelite) software players.", - advanced=True, + category="advanced", ), ) @@ -261,6 +261,9 @@ class SlimprotoProvider(PlayerProvider): async def get_player_config_entries(self, player_id: str) -> tuple[ConfigEntry]: """Return all (provider/player specific) Config Entries for the given player (if any).""" base_entries = await super().get_player_config_entries(player_id) + if not self.slimproto.get_player(player_id): + # most probably a syncgroup + return (*base_entries, CONF_ENTRY_CROSSFADE, CONF_ENTRY_CROSSFADE_DURATION) # create preset entries (for players that support it) preset_entries = () @@ -278,7 +281,7 @@ class SlimprotoProvider(PlayerProvider): label=f"Preset {index}", description="Assign a playable item to the player's preset. " "Only supported on real squeezebox hardware or jive(lite) based emulators.", - advanced=False, + category="presets", required=False, ) for index in range(1, preset_count + 1) diff --git a/music_assistant/server/providers/snapcast/__init__.py b/music_assistant/server/providers/snapcast/__init__.py index ac4daae1..0f0cb81f 100644 --- a/music_assistant/server/providers/snapcast/__init__.py +++ b/music_assistant/server/providers/snapcast/__init__.py @@ -108,7 +108,7 @@ async def get_config_entries( description="Music Assistant by default already includes a Snapserver. \n\n" "Checking this option allows you to connect to your own/external existing Snapserver " "and not use the builtin one provided by Music Assistant.", - advanced=snapserver_present, + category="advanced" if snapserver_present else "generic", ), ConfigEntry( key=CONF_SERVER_HOST, @@ -117,7 +117,7 @@ async def get_config_entries( label="Snapcast server ip", required=False, depends_on=CONF_USE_EXTERNAL_SERVER, - advanced=snapserver_present, + category="advanced" if snapserver_present else "generic", ), ConfigEntry( key=CONF_SERVER_CONTROL_PORT, @@ -126,7 +126,7 @@ async def get_config_entries( label="Snapcast control port", required=False, depends_on=CONF_USE_EXTERNAL_SERVER, - advanced=snapserver_present, + category="advanced" if snapserver_present else "generic", ), ) diff --git a/music_assistant/server/providers/sonos/__init__.py b/music_assistant/server/providers/sonos/__init__.py index 69177341..e6312bd9 100644 --- a/music_assistant/server/providers/sonos/__init__.py +++ b/music_assistant/server/providers/sonos/__init__.py @@ -184,7 +184,7 @@ class SonosPlayerProvider(PlayerProvider): base_entries = await super().get_player_config_entries(player_id) if not (sonos_player := self.sonosplayers.get(player_id)): # most probably a syncgroup - return base_entries + return (*base_entries, CONF_ENTRY_CROSSFADE) return ( *base_entries, CONF_ENTRY_CROSSFADE, @@ -196,7 +196,7 @@ class SonosPlayerProvider(PlayerProvider): value=sonos_player.bass, range=(-10, 10), description="Set the Bass level for the Sonos player", - advanced=True, + category="advanced", ), ConfigEntry( key="sonos_treble", @@ -206,7 +206,7 @@ class SonosPlayerProvider(PlayerProvider): value=sonos_player.treble, range=(-10, 10), description="Set the Treble level for the Sonos player", - advanced=True, + category="advanced", ), ConfigEntry( key="sonos_loudness", @@ -215,7 +215,7 @@ class SonosPlayerProvider(PlayerProvider): default_value=sonos_player.loudness, value=sonos_player.loudness, description="Enable loudness compensation on the Sonos player", - advanced=True, + category="advanced", ), ) diff --git a/music_assistant/server/providers/ugp/__init__.py b/music_assistant/server/providers/ugp/__init__.py index 08d37700..5efa409c 100644 --- a/music_assistant/server/providers/ugp/__init__.py +++ b/music_assistant/server/providers/ugp/__init__.py @@ -113,7 +113,7 @@ class UniversalGroupProvider(PlayerProvider): ), ConfigEntry( key="ugp_note", - type=ConfigEntryType.LABEL, + type=ConfigEntryType.ALERT, label="Please note that although the universal group " "allows you to group any player, it will not enable audio sync " "between players of different ecosystems.", @@ -126,7 +126,7 @@ class UniversalGroupProvider(PlayerProvider): description="Enable a crossfade transition between (queue) tracks. \n\n" "Note that DLNA does not natively support crossfading so you need to enable " "the 'flow mode' workaround to use crossfading with DLNA players.", - advanced=False, + category="audio", ), CONF_ENTRY_CROSSFADE_DURATION, ) -- 2.34.1