Enhancement: Use cache categories from constants
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 26 Feb 2025 22:15:13 +0000 (23:15 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 26 Feb 2025 22:15:13 +0000 (23:15 +0100)
music_assistant/constants.py
music_assistant/controllers/media/albums.py
music_assistant/controllers/media/artists.py
music_assistant/controllers/media/base.py
music_assistant/controllers/media/playlists.py
music_assistant/controllers/music.py
music_assistant/controllers/player_queues.py
music_assistant/models/music_provider.py
music_assistant/providers/builtin/__init__.py
music_assistant/providers/tidal/__init__.py

index a11eb2c2aff38ee29891840d2c5f0dc91f72cab1..fce17dac508a7799130c675716185df530976493 100644 (file)
@@ -592,3 +592,21 @@ DEFAULT_PCM_FORMAT = AudioFormat(
     bit_depth=32,
     channels=2,
 )
+
+
+# CACHE categories
+
+CACHE_CATEGORY_DEFAULT: Final[int] = 0
+CACHE_CATEGORY_MUSIC_SEARCH: Final[int] = 1
+CACHE_CATEGORY_MUSIC_ALBUM_TRACKS: Final[int] = 2
+CACHE_CATEGORY_MUSIC_ARTIST_TRACKS: Final[int] = 3
+CACHE_CATEGORY_MUSIC_ARTIST_ALBUMS: Final[int] = 4
+CACHE_CATEGORY_MUSIC_PLAYLIST_TRACKS: Final[int] = 5
+CACHE_CATEGORY_MUSIC_PROVIDER_ITEM: Final[int] = 6
+CACHE_CATEGORY_PLAYER_QUEUE_STATE: Final[int] = 7
+CACHE_CATEGORY_MEDIA_INFO: Final[int] = 8
+CACHE_CATEGORY_LIBRARY_ITEMS: Final[int] = 9
+CACHE_CATEGORY_PLAYERS: Final[int] = 10
+
+# CACHE base keys
+CACHE_KEY_PLAYER_POWER: Final[str] = "player_power"
index 37c9e5f623c46221a450f79bd895c15755e2ba5e..97acf1602832cd67da1e22d788a442cebd9e3f85 100644 (file)
@@ -6,11 +6,17 @@ import contextlib
 from collections.abc import Iterable
 from typing import TYPE_CHECKING, Any
 
-from music_assistant_models.enums import AlbumType, CacheCategory, MediaType, ProviderFeature
+from music_assistant_models.enums import AlbumType, MediaType, ProviderFeature
 from music_assistant_models.errors import InvalidDataError, MediaNotFoundError, MusicAssistantError
 from music_assistant_models.media_items import Album, Artist, ItemMapping, Track, UniqueList
 
-from music_assistant.constants import DB_TABLE_ALBUM_ARTISTS, DB_TABLE_ALBUM_TRACKS, DB_TABLE_ALBUMS
+from music_assistant.constants import (
+    CACHE_CATEGORY_MUSIC_ALBUM_TRACKS,
+    CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
+    DB_TABLE_ALBUM_ARTISTS,
+    DB_TABLE_ALBUM_TRACKS,
+    DB_TABLE_ALBUMS,
+)
 from music_assistant.controllers.media.base import MediaControllerBase
 from music_assistant.helpers.compare import (
     compare_album,
@@ -370,7 +376,7 @@ class AlbumsController(MediaControllerBase[Album]):
         if prov is None:
             return []
         # prefer cache items (if any) - for streaming providers only
-        cache_category = CacheCategory.MUSIC_ALBUM_TRACKS
+        cache_category = CACHE_CATEGORY_MUSIC_ALBUM_TRACKS
         cache_base_key = prov.lookup_key
         cache_key = item_id
         if (
@@ -402,7 +408,7 @@ class AlbumsController(MediaControllerBase[Album]):
                 await self.mass.cache.set(
                     f"track.{item_id}",
                     item.to_dict(),
-                    category=CacheCategory.MUSIC_PROVIDER_ITEM,
+                    category=CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
                     base_key=prov.lookup_key,
                 )
         return items
index 576c227a04f778e8996def45c171f50876097ef0..f13aa0400b422a28191441c755a0861b600f549d 100644 (file)
@@ -6,7 +6,7 @@ import asyncio
 import contextlib
 from typing import TYPE_CHECKING, Any
 
-from music_assistant_models.enums import AlbumType, CacheCategory, MediaType, ProviderFeature
+from music_assistant_models.enums import AlbumType, MediaType, ProviderFeature
 from music_assistant_models.errors import (
     MediaNotFoundError,
     MusicAssistantError,
@@ -15,6 +15,9 @@ from music_assistant_models.errors import (
 from music_assistant_models.media_items import Album, Artist, ItemMapping, Track, UniqueList
 
 from music_assistant.constants import (
+    CACHE_CATEGORY_MUSIC_ARTIST_ALBUMS,
+    CACHE_CATEGORY_MUSIC_ARTIST_TRACKS,
+    CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
     DB_TABLE_ALBUM_ARTISTS,
     DB_TABLE_ARTISTS,
     DB_TABLE_TRACK_ARTISTS,
@@ -208,7 +211,7 @@ class ArtistsController(MediaControllerBase[Artist]):
         if prov is None:
             return []
         # prefer cache items (if any) - for streaming providers
-        cache_category = CacheCategory.MUSIC_ARTIST_TRACKS
+        cache_category = CACHE_CATEGORY_MUSIC_ARTIST_TRACKS
         cache_base_key = prov.lookup_key
         cache_key = item_id
         if (
@@ -231,7 +234,7 @@ class ArtistsController(MediaControllerBase[Artist]):
                     await self.mass.cache.set(
                         f"track.{item_id}",
                         item.to_dict(),
-                        category=CacheCategory.MUSIC_PROVIDER_ITEM,
+                        category=CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
                         base_key=prov.lookup_key,
                     )
         else:
@@ -281,7 +284,7 @@ class ArtistsController(MediaControllerBase[Artist]):
         if prov is None:
             return []
         # prefer cache items (if any)
-        cache_category = CacheCategory.MUSIC_ARTIST_ALBUMS
+        cache_category = CACHE_CATEGORY_MUSIC_ARTIST_ALBUMS
         cache_base_key = prov.lookup_key
         cache_key = item_id
         if (
index 1265aaab76649fc5ab1f4230b7d829a2dc8bc1b5..723b5cf68245d1da3c7e1df6b1b23e3176bcb758 100644 (file)
@@ -9,13 +9,7 @@ from collections.abc import Iterable
 from contextlib import suppress
 from typing import TYPE_CHECKING, Any, Generic, TypeVar
 
-from music_assistant_models.enums import (
-    CacheCategory,
-    EventType,
-    ExternalID,
-    MediaType,
-    ProviderFeature,
-)
+from music_assistant_models.enums import EventType, ExternalID, MediaType, ProviderFeature
 from music_assistant_models.errors import MediaNotFoundError, ProviderUnavailableError
 from music_assistant_models.media_items import (
     Album,
@@ -26,7 +20,13 @@ from music_assistant_models.media_items import (
     Track,
 )
 
-from music_assistant.constants import DB_TABLE_PLAYLOG, DB_TABLE_PROVIDER_MAPPINGS, MASS_LOGGER_NAME
+from music_assistant.constants import (
+    CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
+    CACHE_CATEGORY_MUSIC_SEARCH,
+    DB_TABLE_PLAYLOG,
+    DB_TABLE_PROVIDER_MAPPINGS,
+    MASS_LOGGER_NAME,
+)
 from music_assistant.helpers.compare import compare_media_item, create_safe_string
 from music_assistant.helpers.json import json_loads, serialize_to_json
 
@@ -317,7 +317,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
             return []
 
         # prefer cache items (if any)
-        cache_category = CacheCategory.MUSIC_SEARCH
+        cache_category = CACHE_CATEGORY_MUSIC_SEARCH
         cache_base_key = prov.lookup_key
         cache_key = f"{search_query}.{limit}.{self.media_type.value}"
         if (
@@ -536,7 +536,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
         if not (provider := self.mass.get_provider(provider_instance_id_or_domain)):
             raise ProviderUnavailableError(f"{provider_instance_id_or_domain} is not available")
 
-        cache_category = CacheCategory.MUSIC_PROVIDER_ITEM
+        cache_category = CACHE_CATEGORY_MUSIC_PROVIDER_ITEM
         cache_base_key = provider.lookup_key
         cache_key = f"{self.media_type.value}.{item_id}"
         if not force_refresh and (
index c0fa264022fe7dbb8e7fe511a224ffe4fdbcf3a5..da2257b5c91df3110a2bb017498f33b799f8e31e 100644 (file)
@@ -6,7 +6,7 @@ import time
 from collections.abc import AsyncGenerator
 from typing import Any
 
-from music_assistant_models.enums import CacheCategory, MediaType, ProviderFeature
+from music_assistant_models.enums import MediaType, ProviderFeature
 from music_assistant_models.errors import (
     InvalidDataError,
     MediaNotFoundError,
@@ -14,7 +14,11 @@ from music_assistant_models.errors import (
 )
 from music_assistant_models.media_items import Playlist, Track
 
-from music_assistant.constants import DB_TABLE_PLAYLISTS
+from music_assistant.constants import (
+    CACHE_CATEGORY_MUSIC_PLAYLIST_TRACKS,
+    CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
+    DB_TABLE_PLAYLISTS,
+)
 from music_assistant.helpers.compare import create_safe_string
 from music_assistant.helpers.json import serialize_to_json
 from music_assistant.helpers.uri import create_uri, parse_uri
@@ -375,7 +379,7 @@ class PlaylistController(MediaControllerBase[Playlist]):
         if not provider:
             return []
         # prefer cache items (if any)
-        cache_category = CacheCategory.MUSIC_PLAYLIST_TRACKS
+        cache_category = CACHE_CATEGORY_MUSIC_PLAYLIST_TRACKS
         cache_base_key = provider.lookup_key
         cache_key = f"{item_id}.{page}"
         if (
@@ -410,7 +414,7 @@ class PlaylistController(MediaControllerBase[Playlist]):
                 await self.mass.cache.set(
                     f"track.{item_id}",
                     item.to_dict(),
-                    category=CacheCategory.MUSIC_PROVIDER_ITEM,
+                    category=CACHE_CATEGORY_MUSIC_PROVIDER_ITEM,
                     base_key=provider.lookup_key,
                 )
         return items
index 8bf9ca9754929b1b853c19f78856e87c9ef21172..775f7ec9454dee49a3bf936559ba6109edd82a5e 100644 (file)
@@ -14,7 +14,6 @@ from typing import TYPE_CHECKING, Final, cast
 
 from music_assistant_models.config_entries import ConfigEntry, ConfigValueType
 from music_assistant_models.enums import (
-    CacheCategory,
     ConfigEntryType,
     EventType,
     MediaType,
@@ -40,6 +39,7 @@ from music_assistant_models.provider import SyncTask
 from music_assistant_models.unique_list import UniqueList
 
 from music_assistant.constants import (
+    CACHE_CATEGORY_MUSIC_SEARCH,
     DB_TABLE_ALBUM_ARTISTS,
     DB_TABLE_ALBUM_TRACKS,
     DB_TABLE_ALBUMS,
@@ -369,7 +369,7 @@ class MusicController(CoreController):
 
         # prefer cache items (if any)
         media_types_str = ",".join(media_types)
-        cache_category = CacheCategory.MUSIC_SEARCH
+        cache_category = CACHE_CATEGORY_MUSIC_SEARCH
         cache_base_key = prov.lookup_key
         cache_key = f"{search_query}.{limit}.{media_types_str}"
 
index c5ae487e1fb2ebf487ca948250532abd509bf6cb..e582b2cba94e597b9cb20cac09d4ff83495fa377 100644 (file)
@@ -21,7 +21,6 @@ from typing import TYPE_CHECKING, Any, TypedDict, cast
 
 from music_assistant_models.config_entries import ConfigEntry, ConfigValueOption, ConfigValueType
 from music_assistant_models.enums import (
-    CacheCategory,
     ConfigEntryType,
     ContentType,
     EventType,
@@ -56,6 +55,7 @@ from music_assistant_models.player_queue import PlayerQueue
 from music_assistant_models.queue_item import QueueItem
 
 from music_assistant.constants import (
+    CACHE_CATEGORY_PLAYER_QUEUE_STATE,
     CONF_CROSSFADE,
     CONF_FLOW_MODE,
     MASS_LOGO_ONLINE,
@@ -872,14 +872,14 @@ class PlayerQueuesController(CoreController):
         queue = None
         # try to restore previous state
         if prev_state := await self.mass.cache.get(
-            "state", category=CacheCategory.PLAYER_QUEUE_STATE, base_key=queue_id
+            "state", category=CACHE_CATEGORY_PLAYER_QUEUE_STATE, base_key=queue_id
         ):
             try:
                 queue = PlayerQueue.from_cache(prev_state)
                 prev_items = await self.mass.cache.get(
                     "items",
                     default=[],
-                    category=CacheCategory.PLAYER_QUEUE_STATE,
+                    category=CACHE_CATEGORY_PLAYER_QUEUE_STATE,
                     base_key=queue_id,
                 )
                 queue_items = [QueueItem.from_cache(x) for x in prev_items]
@@ -1166,7 +1166,7 @@ class PlayerQueuesController(CoreController):
                 self.mass.cache.set(
                     "items",
                     [x.to_cache() for x in self._queue_items[queue_id]],
-                    category=CacheCategory.PLAYER_QUEUE_STATE,
+                    category=CACHE_CATEGORY_PLAYER_QUEUE_STATE,
                     base_key=queue_id,
                 )
             )
@@ -1177,7 +1177,7 @@ class PlayerQueuesController(CoreController):
             self.mass.cache.set(
                 "state",
                 queue.to_cache(),
-                category=CacheCategory.PLAYER_QUEUE_STATE,
+                category=CACHE_CATEGORY_PLAYER_QUEUE_STATE,
                 base_key=queue_id,
             )
         )
index d0ebcfb5b73e69581db8fc55dffdcdba8ca7f514..a668b38774cca1809815b79f11b748a54af987d2 100644 (file)
@@ -6,7 +6,7 @@ import asyncio
 from collections.abc import Sequence
 from typing import TYPE_CHECKING, cast
 
-from music_assistant_models.enums import CacheCategory, MediaType, ProviderFeature
+from music_assistant_models.enums import MediaType, ProviderFeature
 from music_assistant_models.errors import (
     MediaNotFoundError,
     MusicAssistantError,
@@ -27,6 +27,8 @@ from music_assistant_models.media_items import (
     Track,
 )
 
+from music_assistant.constants import CACHE_CATEGORY_LIBRARY_ITEMS
+
 from .provider import Provider
 
 if TYPE_CHECKING:
@@ -422,7 +424,7 @@ class MusicProvider(Provider):
         if subpath == "artists":
             library_item_ids = await self.mass.cache.get(
                 "artist",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -438,7 +440,7 @@ class MusicProvider(Provider):
         if subpath == "albums":
             library_item_ids = await self.mass.cache.get(
                 "album",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -452,7 +454,7 @@ class MusicProvider(Provider):
         if subpath == "tracks":
             library_item_ids = await self.mass.cache.get(
                 "track",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -466,7 +468,7 @@ class MusicProvider(Provider):
         if subpath == "radios":
             library_item_ids = await self.mass.cache.get(
                 "radio",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -480,7 +482,7 @@ class MusicProvider(Provider):
         if subpath == "playlists":
             library_item_ids = await self.mass.cache.get(
                 "playlist",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -494,7 +496,7 @@ class MusicProvider(Provider):
         if subpath == "audiobooks":
             library_item_ids = await self.mass.cache.get(
                 "audiobook",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -508,7 +510,7 @@ class MusicProvider(Provider):
         if subpath == "podcasts":
             library_item_ids = await self.mass.cache.get(
                 "podcast",
-                category=CacheCategory.LIBRARY_ITEMS,
+                category=CACHE_CATEGORY_LIBRARY_ITEMS,
                 base_key=self.instance_id,
             )
             if not library_item_ids:
@@ -679,7 +681,7 @@ class MusicProvider(Provider):
                 )
 
         # process deletions (= no longer in library)
-        cache_category = CacheCategory.LIBRARY_ITEMS
+        cache_category = CACHE_CATEGORY_LIBRARY_ITEMS
         cache_base_key = self.instance_id
 
         prev_library_items: list[int] | None
index 8a84b4bd41c61cb1033738063025151ea1c18b3a..b1fdfe65c755e0e750cc27cac0a0a23642c912c9 100644 (file)
@@ -12,7 +12,6 @@ import aiofiles
 import shortuuid
 from music_assistant_models.config_entries import ConfigEntry
 from music_assistant_models.enums import (
-    CacheCategory,
     ConfigEntryType,
     ContentType,
     ImageType,
@@ -39,7 +38,7 @@ from music_assistant_models.media_items import (
 )
 from music_assistant_models.streamdetails import StreamDetails
 
-from music_assistant.constants import MASS_LOGO, VARIOUS_ARTISTS_FANART
+from music_assistant.constants import CACHE_CATEGORY_MEDIA_INFO, MASS_LOGO, VARIOUS_ARTISTS_FANART
 from music_assistant.helpers.tags import AudioTags, async_parse_tags
 from music_assistant.helpers.uri import parse_uri
 from music_assistant.models.music_provider import MusicProvider
@@ -534,7 +533,7 @@ class BuiltinProvider(MusicProvider):
 
     async def _get_media_info(self, url: str, force_refresh: bool = False) -> AudioTags:
         """Retrieve mediainfo for url."""
-        cache_category = CacheCategory.MEDIA_INFO
+        cache_category = CACHE_CATEGORY_MEDIA_INFO
         cache_base_key = self.lookup_key
         # do we have some cached info for this url ?
         cached_info = await self.mass.cache.get(
index 20661290e85c891deb4a109f2e67bb3e5134f9ef..05bd51c9235e4bb76a32ab8fa59bb952c81db035 100644 (file)
@@ -14,7 +14,6 @@ from typing import TYPE_CHECKING, ParamSpec, TypeVar, cast
 from music_assistant_models.config_entries import ConfigEntry, ConfigValueOption, ConfigValueType
 from music_assistant_models.enums import (
     AlbumType,
-    CacheCategory,
     ConfigEntryType,
     ContentType,
     ExternalID,
@@ -46,6 +45,7 @@ from tidalapi import Session as TidalSession
 from tidalapi import Track as TidalTrack
 from tidalapi import exceptions as tidal_exceptions
 
+from music_assistant.constants import CACHE_CATEGORY_DEFAULT, CACHE_CATEGORY_MEDIA_INFO
 from music_assistant.helpers.auth import AuthenticationHelper
 from music_assistant.helpers.tags import AudioTags, async_parse_tags
 from music_assistant.helpers.throttle_retry import ThrottlerManager, throttle_with_retries
@@ -733,7 +733,7 @@ class TidalProvider(MusicProvider):
         # Try to get from cache first
         cache_key = f"isrc_map_{item_id}"
         cached_track_id = await self.mass.cache.get(
-            cache_key, category=CacheCategory.DEFAULT, base_key=self.lookup_key
+            cache_key, category=CACHE_CATEGORY_DEFAULT, base_key=self.lookup_key
         )
 
         if cached_track_id:
@@ -745,7 +745,7 @@ class TidalProvider(MusicProvider):
             except MediaNotFoundError:
                 # Track no longer exists, invalidate cache
                 await self.mass.cache.delete(
-                    cache_key, category=CacheCategory.DEFAULT, base_key=self.lookup_key
+                    cache_key, category=CACHE_CATEGORY_DEFAULT, base_key=self.lookup_key
                 )
 
         # Lookup by ISRC if no cache or cached track not found
@@ -773,7 +773,7 @@ class TidalProvider(MusicProvider):
 
         # Cache the mapping for future use
         await self.mass.cache.set(
-            cache_key, tracks[0].id, category=CacheCategory.DEFAULT, base_key=self.lookup_key
+            cache_key, tracks[0].id, category=CACHE_CATEGORY_DEFAULT, base_key=self.lookup_key
         )
 
         return tracks[0]
@@ -1001,7 +1001,7 @@ class TidalProvider(MusicProvider):
         self, item_id: str, url: str, force_refresh: bool = False
     ) -> AudioTags:
         """Retrieve (cached) mediainfo for track."""
-        cache_category = CacheCategory.MEDIA_INFO
+        cache_category = CACHE_CATEGORY_MEDIA_INFO
         cache_base_key = self.lookup_key
         # do we have some cached info for this url ?
         cached_info = await self.mass.cache.get(