Fix image proxy URL
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 4 Dec 2025 10:45:52 +0000 (11:45 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 4 Dec 2025 10:45:52 +0000 (11:45 +0100)
music_assistant/controllers/metadata.py
music_assistant/controllers/player_queues.py
music_assistant/models/player.py

index f37ffc6ebb7dc67341d6acdbab30bf61ba029a6f..d7ed45a64dd21419fe5ee0f733660ed68c6da98d 100644 (file)
@@ -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
index 9780d2fa51b81104a3ad92020410183584261254..41a4a3d23837ba9328cdf0749acc1ed521ba959b 100644 (file)
@@ -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]:
index 98f2ba022014f6d85198e98abfa025dd87dcd962..2f42cca375b993c05a73d23c687967fafe17b2bc 100644 (file)
@@ -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
             )