From 1624271289b32f6bda609a952a08b56d964e1c16 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Wed, 26 Feb 2025 23:15:13 +0100 Subject: [PATCH] Enhancement: Use cache categories from constants --- music_assistant/constants.py | 18 +++++++++++++++++ music_assistant/controllers/media/albums.py | 14 +++++++++---- music_assistant/controllers/media/artists.py | 11 ++++++---- music_assistant/controllers/media/base.py | 20 +++++++++---------- .../controllers/media/playlists.py | 12 +++++++---- music_assistant/controllers/music.py | 4 ++-- music_assistant/controllers/player_queues.py | 10 +++++----- music_assistant/models/music_provider.py | 20 ++++++++++--------- music_assistant/providers/builtin/__init__.py | 5 ++--- music_assistant/providers/tidal/__init__.py | 10 +++++----- 10 files changed, 78 insertions(+), 46 deletions(-) diff --git a/music_assistant/constants.py b/music_assistant/constants.py index a11eb2c2..fce17dac 100644 --- a/music_assistant/constants.py +++ b/music_assistant/constants.py @@ -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" diff --git a/music_assistant/controllers/media/albums.py b/music_assistant/controllers/media/albums.py index 37c9e5f6..97acf160 100644 --- a/music_assistant/controllers/media/albums.py +++ b/music_assistant/controllers/media/albums.py @@ -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 diff --git a/music_assistant/controllers/media/artists.py b/music_assistant/controllers/media/artists.py index 576c227a..f13aa040 100644 --- a/music_assistant/controllers/media/artists.py +++ b/music_assistant/controllers/media/artists.py @@ -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 ( diff --git a/music_assistant/controllers/media/base.py b/music_assistant/controllers/media/base.py index 1265aaab..723b5cf6 100644 --- a/music_assistant/controllers/media/base.py +++ b/music_assistant/controllers/media/base.py @@ -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 ( diff --git a/music_assistant/controllers/media/playlists.py b/music_assistant/controllers/media/playlists.py index c0fa2640..da2257b5 100644 --- a/music_assistant/controllers/media/playlists.py +++ b/music_assistant/controllers/media/playlists.py @@ -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 diff --git a/music_assistant/controllers/music.py b/music_assistant/controllers/music.py index 8bf9ca97..775f7ec9 100644 --- a/music_assistant/controllers/music.py +++ b/music_assistant/controllers/music.py @@ -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}" diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index c5ae487e..e582b2cb 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -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, ) ) diff --git a/music_assistant/models/music_provider.py b/music_assistant/models/music_provider.py index d0ebcfb5..a668b387 100644 --- a/music_assistant/models/music_provider.py +++ b/music_assistant/models/music_provider.py @@ -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 diff --git a/music_assistant/providers/builtin/__init__.py b/music_assistant/providers/builtin/__init__.py index 8a84b4bd..b1fdfe65 100644 --- a/music_assistant/providers/builtin/__init__.py +++ b/music_assistant/providers/builtin/__init__.py @@ -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( diff --git a/music_assistant/providers/tidal/__init__.py b/music_assistant/providers/tidal/__init__.py index 20661290..05bd51c9 100644 --- a/music_assistant/providers/tidal/__init__.py +++ b/music_assistant/providers/tidal/__init__.py @@ -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( -- 2.34.1