From: Marcel van der Veldt Date: Wed, 28 Aug 2024 14:52:20 +0000 (+0200) Subject: add config options for icy meta X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=78d065bbb05d82194c184d0760a6bc3d8ffdcdff;p=music-assistant-server.git add config options for icy meta --- diff --git a/music_assistant/common/models/config_entries.py b/music_assistant/common/models/config_entries.py index d4826fd4..064ca3be 100644 --- a/music_assistant/common/models/config_entries.py +++ b/music_assistant/common/models/config_entries.py @@ -21,6 +21,7 @@ from music_assistant.constants import ( CONF_AUTO_PLAY, CONF_CROSSFADE, CONF_CROSSFADE_DURATION, + CONF_ENABLE_ICY_METADATA, CONF_ENFORCE_MP3, CONF_EQ_BASS, CONF_EQ_MID, @@ -620,6 +621,24 @@ CONF_ENTRY_HTTP_PROFILE_FORCED_2 = ConfigEntry.from_dict( {**CONF_ENTRY_HTTP_PROFILE.to_dict(), "default_value": "no_content_length", "hidden": True} ) +CONF_ENTRY_ENABLE_ICY_METADATA = ConfigEntry( + key=CONF_ENABLE_ICY_METADATA, + type=ConfigEntryType.STRING, + options=( + ConfigValueOption("Disabled - do not send ICY metadata", "disabled"), + ConfigValueOption("Profile 1 - basic info", "basic"), + ConfigValueOption("Profile 2 - full info (including image)", "full"), + ), + depends_on=CONF_FLOW_MODE, + default_value="basic", + label="Try to ingest metadata into stream (ICY)", + category="advanced", + description="Try to ingest metadata into the stream (ICY) to show track info on the player, " + "even when flow mode is enabled.\n\nThis is called ICY metadata and its what is also used by " + "online radio station to inform you what is playing. \n\nBe aware that not all players support " + "this correctly. If you experience issues with playback, try to disable this setting.", +) + def create_sample_rates_config_entry( max_sample_rate: int, diff --git a/music_assistant/constants.py b/music_assistant/constants.py index 3442884d..3f76d6c4 100644 --- a/music_assistant/constants.py +++ b/music_assistant/constants.py @@ -70,6 +70,7 @@ CONF_BYPASS_NORMALIZATION_RADIO: Final[str] = "bypass_normalization_radio" CONF_BYPASS_NORMALIZATION_SHORT: Final[str] = "bypass_normalization_short" CONF_PREVENT_SYNC_LEADER_OFF: Final[str] = "prevent_sync_leader_off" CONF_SYNCGROUP_DEFAULT_ON: Final[str] = "syncgroup_default_on" +CONF_ENABLE_ICY_METADATA: Final[str] = "enable_icy_metadata" # 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 6a62ef67..e3231a0c 100644 --- a/music_assistant/server/controllers/players.py +++ b/music_assistant/server/controllers/players.py @@ -928,7 +928,7 @@ class PlayerController(CoreController): changed_values = get_changed_values( prev_state, new_state, - ignore_keys=["elapsed_time", "elapsed_time_last_updated", "seq_no"], + ignore_keys=["elapsed_time", "elapsed_time_last_updated", "seq_no", "last_poll"], ) self._prev_states[player_id] = new_state diff --git a/music_assistant/server/controllers/streams.py b/music_assistant/server/controllers/streams.py index 1ab5e2c2..6e4e36fe 100644 --- a/music_assistant/server/controllers/streams.py +++ b/music_assistant/server/controllers/streams.py @@ -36,6 +36,7 @@ from music_assistant.constants import ( CONF_BYPASS_NORMALIZATION_SHORT, CONF_CROSSFADE, CONF_CROSSFADE_DURATION, + CONF_ENABLE_ICY_METADATA, CONF_HTTP_PROFILE, CONF_OUTPUT_CHANNELS, CONF_PUBLISH_IP, @@ -375,10 +376,11 @@ class StreamsController(CoreController): default_sample_rate=flow_pcm_format.sample_rate, default_bit_depth=flow_pcm_format.bit_depth, ) - # play it safe: only allow icy metadata for mp3 and aac - enable_icy = request.headers.get( - "Icy-MetaData", "" - ) == "1" and output_format.content_type in (ContentType.MP3, ContentType.AAC) + # work out ICY metadata support + icy_preference = self.mass.config.get_raw_player_config_value( + queue_id, CONF_ENABLE_ICY_METADATA, "basic" + ) + enable_icy = request.headers.get("Icy-MetaData", "") == "1" and icy_preference != "disabled" icy_meta_interval = 16384 # prepare request, add some DLNA/UPNP compatible headers @@ -446,6 +448,8 @@ class StreamsController(CoreController): else: title = "Music Assistant" metadata = f"StreamTitle='{title}';".encode() + if icy_preference == "full" and current_item and current_item.image: + metadata += f"StreamURL='{current_item.image.path}'".encode() while len(metadata) % 16 != 0: metadata += b"\x00" length = len(metadata) diff --git a/music_assistant/server/providers/dlna/__init__.py b/music_assistant/server/providers/dlna/__init__.py index 9446245e..94901754 100644 --- a/music_assistant/server/providers/dlna/__init__.py +++ b/music_assistant/server/providers/dlna/__init__.py @@ -26,6 +26,7 @@ from async_upnp_client.search import async_search from music_assistant.common.models.config_entries import ( CONF_ENTRY_CROSSFADE_DURATION, CONF_ENTRY_CROSSFADE_FLOW_MODE_REQUIRED, + CONF_ENTRY_ENABLE_ICY_METADATA, CONF_ENTRY_ENFORCE_MP3, CONF_ENTRY_HTTP_PROFILE, ConfigEntry, @@ -81,6 +82,7 @@ PLAYER_CONFIG_ENTRIES = ( CONF_ENTRY_CROSSFADE_DURATION, CONF_ENTRY_ENFORCE_MP3, CONF_ENTRY_HTTP_PROFILE, + CONF_ENTRY_ENABLE_ICY_METADATA, create_sample_rates_config_entry(192000, 24, 96000, 24), ) diff --git a/music_assistant/server/providers/hass_players/__init__.py b/music_assistant/server/providers/hass_players/__init__.py index 713f31cc..708bb711 100644 --- a/music_assistant/server/providers/hass_players/__init__.py +++ b/music_assistant/server/providers/hass_players/__init__.py @@ -15,6 +15,7 @@ from music_assistant.common.helpers.datetime import from_iso_string from music_assistant.common.models.config_entries import ( CONF_ENTRY_CROSSFADE_DURATION, CONF_ENTRY_CROSSFADE_FLOW_MODE_REQUIRED, + CONF_ENTRY_ENABLE_ICY_METADATA, CONF_ENTRY_ENFORCE_MP3_DEFAULT_ENABLED, CONF_ENTRY_FLOW_MODE_DEFAULT_ENABLED, CONF_ENTRY_HTTP_PROFILE, @@ -96,6 +97,7 @@ PLAYER_CONFIG_ENTRIES = ( CONF_ENTRY_CROSSFADE_DURATION, CONF_ENTRY_ENFORCE_MP3_DEFAULT_ENABLED, CONF_ENTRY_HTTP_PROFILE, + CONF_ENTRY_ENABLE_ICY_METADATA, )