Chore: Make provider name consistent
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 22 Feb 2025 10:47:58 +0000 (11:47 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 22 Feb 2025 10:47:58 +0000 (11:47 +0100)
music_assistant/mass.py
music_assistant/models/provider.py
music_assistant/providers/filesystem_local/__init__.py
music_assistant/providers/filesystem_smb/__init__.py
music_assistant/providers/podcastfeed/__init__.py
music_assistant/providers/spotify/__init__.py

index aaf2d6288819d1c323036d0ba421924416909040..31813093e242a88eca6bc39f1f0cf9ea59012a54 100644 (file)
@@ -663,12 +663,19 @@ class MusicAssistant:
         # run async setup
         await provider.handle_async_init()
 
+        # TEMP workaround
+        # cleanup wrong name config value (set to provider name)
+        # remove after 2.4 release
+        if conf.name == prov_manifest.name:
+            self.config.set_raw_provider_config_value(provider.instance_id, "name", None)
+            provider.config.name = None
+
         # if we reach this point, the provider loaded successfully
         self._providers[provider.instance_id] = provider
         LOGGER.info(
             "Loaded %s provider %s",
             provider.type.value,
-            conf.name or conf.domain,
+            provider.name,
         )
         provider.available = True
 
index 1fa038937cb890d20d8e2f55456eebfdc7a768d3..3d579dad14d229aa4fa18616089b4a4415e8602f 100644 (file)
@@ -94,17 +94,30 @@ class Provider:
     def name(self) -> str:
         """Return (custom) friendly name for this provider instance."""
         if self.config.name:
+            # always prefer user-set name from config
             return self.config.name
         return self.default_name
 
     @property
+    @final
     def default_name(self) -> str:
-        """Return a default name for this provider instance."""
-        inst_count = len([x for x in self.mass.music.providers if x.domain == self.domain])
-        if inst_count > 1:
-            postfix = self.instance_id[-8:]
-            return f"{self.manifest.name} {postfix}"
-        return self.manifest.name
+        """Return a default friendly name for this provider instance."""
+        # create default name based on instance count
+        instances = [x.instance_id for x in self.mass.music.providers if x.domain == self.domain]
+        if len(instances) <= 1:
+            # only one instance (or no instances yet at all) - return provider name
+            return self.manifest.name
+        instance_name_postfix = self.instance_name_postfix
+        if not instance_name_postfix:
+            # default implementation - simply use the instance number/index
+            instance_name_postfix = str(instances.index(self.instance_id) + 1)
+        # append instance name to provider name
+        return f"{self.manifest.name} [{self.instance_name_postfix}]"
+
+    @property
+    def instance_name_postfix(self) -> str | None:
+        """Return a (default) instance name postfix for this provider instance."""
+        return None
 
     def update_config_value(self, key: str, value: Any, encrypted: bool = False) -> None:
         """Update a config value."""
@@ -122,6 +135,8 @@ class Provider:
             "type": self.type.value,
             "domain": self.domain,
             "name": self.name,
+            "default_name": self.default_name,
+            "instance_name_postfix": self.instance_name_postfix,
             "instance_id": self.instance_id,
             "lookup_key": self.lookup_key,
             "supported_features": [x.value for x in self.supported_features],
index 8ce96fca496e67adafce62aa9d2d38dfa9154507..f46cc146cc774f528d68e1a967eaee7ac73783f7 100644 (file)
@@ -192,10 +192,9 @@ class LocalFileSystemProvider(MusicProvider):
         return False
 
     @property
-    def default_name(self) -> str:
-        """Return default name for this provider instance."""
-        postfix = self.base_path.split(os.sep)[-1]
-        return f"{self.manifest.name} {postfix}"
+    def instance_name_postfix(self) -> str | None:
+        """Return a (default) instance name postfix for this provider instance."""
+        return self.base_path.split(os.sep)[-1]
 
     async def handle_async_init(self) -> None:
         """Handle async initialization of the provider."""
index 72b2213e644b7bd455500baefffe128b6dbba247..3d762e39b1ac8de9b8cbf6d2ac20da4998e5682d 100644 (file)
@@ -145,17 +145,15 @@ class SMBFileSystemProvider(LocalFileSystemProvider):
     """
 
     @property
-    def default_name(self) -> str:
-        """Return default name for this provider instance."""
+    def instance_name_postfix(self) -> str | None:
+        """Return a (default) instance name postfix for this provider instance."""
         share = str(self.config.get_value(CONF_SHARE))
         subfolder = str(self.config.get_value(CONF_SUBFOLDER))
         if subfolder:
-            postfix = subfolder
+            return subfolder
         elif share:
-            postfix = share
-        else:
-            return super().default_name
-        return f"{self.manifest.name} {postfix}"
+            return share
+        return None
 
     async def handle_async_init(self) -> None:
         """Handle async initialization of the provider."""
index 661676f059b9a4af1d37f576f58b2553f95979fc..836317058ed08ae9b18d8c7b159f4cf54b78fd06 100644 (file)
@@ -127,12 +127,11 @@ class PodcastMusicprovider(MusicProvider):
         return False
 
     @property
-    def default_name(self) -> str:
-        """Return default name for this provider instance."""
+    def instance_name_postfix(self) -> str | None:
+        """Return a (default) instance name postfix for this provider instance."""
         if self.parsed:
-            postfix = self.parsed["title"]
-            return f"{self.manifest.name}: {postfix}"
-        return super().default_name
+            return self.parsed["title"]
+        return None
 
     async def get_library_podcasts(self) -> AsyncGenerator[Podcast, None]:
         """Retrieve library/subscribed podcasts from the provider."""
index dff4ef4091ee07e5ee9d520d71d257765c2f8832..f483508575c30f9a7e283390b9c2cf229867457b 100644 (file)
@@ -288,12 +288,11 @@ class SpotifyProvider(MusicProvider):
         return base
 
     @property
-    def default_name(self) -> str:
-        """Return default name for this provider instance."""
+    def instance_name_postfix(self) -> str | None:
+        """Return a (default) instance name postfix for this provider instance."""
         if self._sp_user:
-            postfix = self._sp_user["display_name"]
-            return f"{self.manifest.name}: {postfix}"
-        return super().default_name
+            return self._sp_user["display_name"]
+        return None
 
     async def search(
         self, search_query: str, media_types=list[MediaType], limit: int = 5