Typing fixes for the Radio media controller (#2574)
authorOzGav <gavnosp@hotmail.com>
Mon, 3 Nov 2025 00:15:54 +0000 (10:15 +1000)
committerGitHub <noreply@github.com>
Mon, 3 Nov 2025 00:15:54 +0000 (01:15 +0100)
music_assistant/controllers/media/radio.py
pyproject.toml

index 3ceb02ec830f1d38bea67ccba2b507b4f5b05177..f29783bdf7931c75f2f7a986a410bc74eba0555a 100644 (file)
@@ -3,6 +3,7 @@
 from __future__ import annotations
 
 import asyncio
+from typing import TYPE_CHECKING
 
 from music_assistant_models.enums import MediaType
 from music_assistant_models.media_items import Radio, Track
@@ -13,6 +14,9 @@ from music_assistant.helpers.json import serialize_to_json
 
 from .base import MediaControllerBase
 
+if TYPE_CHECKING:
+    from music_assistant import MusicAssistant
+
 
 class RadioController(MediaControllerBase[Radio]):
     """Controller managing MediaItems of type Radio."""
@@ -21,9 +25,9 @@ class RadioController(MediaControllerBase[Radio]):
     media_type = MediaType.RADIO
     item_cls = Radio
 
-    def __init__(self, *args, **kwargs) -> None:
+    def __init__(self, mass: MusicAssistant) -> None:
         """Initialize class."""
-        super().__init__(*args, **kwargs)
+        super().__init__(mass)
         # register (extra) api handlers
         api_base = self.api_base
         self.mass.register_api_command(f"music/{api_base}/radio_versions", self.versions)
@@ -52,10 +56,11 @@ class RadioController(MediaControllerBase[Radio]):
             all_versions.pop(prov_version.item_id, None)
 
         # return the aggregated result
-        return all_versions.values()
+        return list(all_versions.values())
 
-    async def _add_library_item(self, item: Radio) -> int:
+    async def _add_library_item(self, item: Radio, overwrite_existing: bool = False) -> int:
         """Add a new item record to the database."""
+        assert self.mass.music.database is not None  # For type checking
         db_id = await self.mass.music.database.insert(
             self.db_table,
             {
@@ -65,7 +70,9 @@ class RadioController(MediaControllerBase[Radio]):
                 "metadata": serialize_to_json(item.metadata),
                 "external_ids": serialize_to_json(item.external_ids),
                 "search_name": create_safe_string(item.name, True, True),
-                "search_sort_name": create_safe_string(item.sort_name, True, True),
+                "search_sort_name": create_safe_string(
+                    item.sort_name if item.sort_name is not None else "", True, True
+                ),
             },
         )
         # update/set provider_mappings table
@@ -84,6 +91,7 @@ class RadioController(MediaControllerBase[Radio]):
         match = {"item_id": db_id}
         name = update.name if overwrite else cur_item.name
         sort_name = update.sort_name if overwrite else cur_item.sort_name or update.sort_name
+        assert self.mass.music.database is not None  # For type checking
         await self.mass.music.database.update(
             self.db_table,
             match,
@@ -96,7 +104,7 @@ class RadioController(MediaControllerBase[Radio]):
                     update.external_ids if overwrite else cur_item.external_ids
                 ),
                 "search_name": create_safe_string(name, True, True),
-                "search_sort_name": create_safe_string(sort_name, True, True),
+                "search_sort_name": create_safe_string(sort_name or "", True, True),
             },
         )
         # update/set provider_mappings table
index bc92363aa1460e8b87e724ac4bd1867783f8945c..d0cc178e7d227c11a4e5abef3649a3b74c9b51e3 100644 (file)
@@ -132,7 +132,13 @@ enable_error_code = [
 exclude = [
   '^music_assistant/controllers/cache.py$',
   '^music_assistant/controllers/config.py$',
-  '^music_assistant/controllers/media/.*$',
+  '^music_assistant/controllers/media/albums.py*$',
+  '^music_assistant/controllers/media/artists.py*$',
+  '^music_assistant/controllers/media/audiobooks.py*$',
+  '^music_assistant/controllers/media/base.py*$',
+  '^music_assistant/controllers/media/playlists.py*$',
+  '^music_assistant/controllers/media/podcasts.py*$',
+  '^music_assistant/controllers/media/tracks.py*$',
   '^music_assistant/controllers/music.py$',
   '^music_assistant/controllers/player_queues.py$',
   '^music_assistant/controllers/streams.py$',