From 3b3454af5119a834d011e7b627cb6dffceeb7bce Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sat, 20 Dec 2025 01:22:39 +0100 Subject: [PATCH] Fix issues with cached streamdetails --- music_assistant/controllers/player_queues.py | 5 +++-- music_assistant/helpers/api.py | 4 ++++ music_assistant/providers/podcast_index/provider.py | 1 - music_assistant/providers/podcastfeed/__init__.py | 1 - music_assistant/providers/soundcloud/__init__.py | 1 - 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index 6bcbbe8e..288c10af 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -1059,9 +1059,10 @@ class PlayerQueuesController(CoreController): if queue.enqueued_media_items: # we need to restore the MediaItem objects for the enqueued media items # Items from cache may be dicts that need deserialization - restored_enqueued_items: list[MediaItemType] = [] - cached_items: list[Any] = cast("list[Any]", queue.enqueued_media_items) + cached_items: list[dict[str, Any] | MediaItemType] = cast( + "list[dict[str, Any] | MediaItemType]", queue.enqueued_media_items + ) for item in cached_items: if isinstance(item, dict): restored_item = media_from_dict(item) diff --git a/music_assistant/helpers/api.py b/music_assistant/helpers/api.py index ddd240f9..83e30b5f 100644 --- a/music_assistant/helpers/api.py +++ b/music_assistant/helpers/api.py @@ -13,6 +13,7 @@ from types import NoneType, UnionType from typing import Any, TypeVar, Union, get_args, get_origin, get_type_hints from mashumaro.exceptions import MissingField +from music_assistant_models.media_items.media_item import MediaItem from music_assistant.helpers.util import try_parse_bool @@ -340,9 +341,12 @@ def parse_value( # noqa: PLR0911 return value if isinstance(value, dict) and hasattr(value_type, "from_dict"): + # Only validate media_type for actual MediaItem subclasses, not for other classes + # like StreamDetails that have a media_type field for a different purpose if ( "media_type" in value and value_type.__name__ != "ItemMapping" + and issubclass(value_type, MediaItem) and value["media_type"] != value_type.media_type ): msg = "Invalid MediaType" diff --git a/music_assistant/providers/podcast_index/provider.py b/music_assistant/providers/podcast_index/provider.py index 413b3ef4..d39265b8 100644 --- a/music_assistant/providers/podcast_index/provider.py +++ b/music_assistant/providers/podcast_index/provider.py @@ -314,7 +314,6 @@ class PodcastIndexProvider(MusicProvider): raise MediaNotFoundError(f"Episode {prov_episode_id} not found") - @use_cache(86400) async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails: """ Get stream details for a podcast episode. diff --git a/music_assistant/providers/podcastfeed/__init__.py b/music_assistant/providers/podcastfeed/__init__.py index 039590d7..d97b95c0 100644 --- a/music_assistant/providers/podcastfeed/__init__.py +++ b/music_assistant/providers/podcastfeed/__init__.py @@ -170,7 +170,6 @@ class PodcastMusicprovider(MusicProvider): if mass_episode := self._parse_episode(episode, idx): yield mass_episode - @use_cache(3600) # Cache for 1 hour async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails: """Get streamdetails for a track/radio.""" for episode in self.parsed_podcast["episodes"]: diff --git a/music_assistant/providers/soundcloud/__init__.py b/music_assistant/providers/soundcloud/__init__.py index 955d1755..ddc59a61 100644 --- a/music_assistant/providers/soundcloud/__init__.py +++ b/music_assistant/providers/soundcloud/__init__.py @@ -367,7 +367,6 @@ class SoundcloudMusicProvider(MusicProvider): return tracks - @use_cache(3600 * 3) # Cache for 3 hours async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails: """Return the content details for the given track when it will be streamed.""" url: str = await self._soundcloud.get_stream_url(track_id=item_id, presets=["mp3"]) -- 2.34.1