From 08bbeb29dabf4dae287377206a92c5b0f414a2e8 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Thu, 4 Dec 2025 11:45:52 +0100 Subject: [PATCH] Fix image proxy URL --- music_assistant/controllers/metadata.py | 18 ++++++++++++++++-- music_assistant/controllers/player_queues.py | 7 ++++++- music_assistant/models/player.py | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/music_assistant/controllers/metadata.py b/music_assistant/controllers/metadata.py index f37ffc6e..d7ed45a6 100644 --- a/music_assistant/controllers/metadata.py +++ b/music_assistant/controllers/metadata.py @@ -226,7 +226,7 @@ class MetaDataController(CoreController): @api_command("metadata/set_default_preferred_language") def set_default_preferred_language(self, lang: str) -> None: """ - Set the (default) preferred language. + Set the default preferred language. Reasoning behind this is that the backend can not make a wise choice for the default, so relies on some external source that knows better to set this info, like the frontend @@ -235,6 +235,16 @@ class MetaDataController(CoreController): """ if self.mass.config.get_raw_core_config_value(self.domain, CONF_LANGUAGE): return # already set + self.set_preferred_language(lang) + + @api_command("metadata/set_preferred_language") + def set_preferred_language(self, lang: str) -> None: + """ + Set the preferred language. + + Note that this will not modify any existing metadata, + but will be used for future lookups. + """ # prefer exact match if lang in LOCALES: self.mass.config.set_raw_core_config_value(self.domain, CONF_LANGUAGE, lang) @@ -385,14 +395,18 @@ class MetaDataController(CoreController): size: int = 0, prefer_proxy: bool = False, image_format: str = "png", + prefer_stream_server: bool = False, ) -> str: """Get (proxied) URL for MediaItemImage.""" if not image.remotely_accessible or prefer_proxy or size: # return imageproxy url for images that need to be resolved # the original path is double encoded encoded_url = urllib.parse.quote_plus(urllib.parse.quote_plus(image.path)) + base_url = ( + self.mass.streams.base_url if prefer_stream_server else self.mass.webserver.base_url + ) return ( - f"{self.mass.streams.base_url}/imageproxy?provider={image.provider}" + f"{base_url}/imageproxy?provider={image.provider}" f"&size={size}&fmt={image_format}&path={encoded_url}" ) return image.path diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index 9780d2fa..41a4a3d2 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -1427,7 +1427,12 @@ class PlayerQueuesController(CoreController): album.name if (album := getattr(queue_item.media_item, "album", None)) else "" ) if queue_item.image: - media.image_url = self.mass.metadata.get_image_url(queue_item.image, size=512) + # the image format needs to be 500x500 jpeg for maximum compatibility with players + # we prefer the imageproxy on the streamserver here because this request is sent + # to the player itself which may not be able to reach the regular webserver + media.image_url = self.mass.metadata.get_image_url( + queue_item.image, size=500, prefer_stream_server=True + ) return media async def get_artist_tracks(self, artist: Artist) -> list[Track]: diff --git a/music_assistant/models/player.py b/music_assistant/models/player.py index 98f2ba02..2f42cca3 100644 --- a/music_assistant/models/player.py +++ b/music_assistant/models/player.py @@ -1332,7 +1332,7 @@ class Player(ABC): if active_queue and (current_item := active_queue.current_item): item_image_url = ( # the image format needs to be 500x500 jpeg for maximum compatibility with players - self.mass.metadata.get_image_url(current_item.image, size=500, image_format="png") + self.mass.metadata.get_image_url(current_item.image, size=500, image_format="jpeg") if current_item.image else None ) -- 2.34.1