diff --git a/src/mpd_now_playable/mpd/artwork_cache.py b/src/mpd_now_playable/mpd/artwork_cache.py index 298effe..f99dbf2 100644 --- a/src/mpd_now_playable/mpd/artwork_cache.py +++ b/src/mpd_now_playable/mpd/artwork_cache.py @@ -6,7 +6,7 @@ from ..async_tools import run_background_task from ..cache import Cache, make_cache from .types import CurrentSongResponse, MpdStateHandler -CACHE_TTL = 60 * 60 # seconds = 1 hour +CACHE_TTL = 60 * 60 # seconds = 1 hour class ArtCacheEntry(TypedDict): @@ -49,7 +49,7 @@ class MpdArtworkCache: return None async def cache_artwork(self, song: CurrentSongResponse) -> None: - art = ArtCacheEntry(data=await self.mpd.readpicture(song["file"])) + art = ArtCacheEntry(data=await self.mpd.get_art(song["file"])) try: await self.album_cache.add(calc_album_key(song), art, ttl=CACHE_TTL) except ValueError: diff --git a/src/mpd_now_playable/mpd/listener.py b/src/mpd_now_playable/mpd/listener.py index 9559937..db46f19 100644 --- a/src/mpd_now_playable/mpd/listener.py +++ b/src/mpd_now_playable/mpd/listener.py @@ -95,6 +95,19 @@ class MpdStateListener(Player): print(song) listener.update(song) + async def get_art(self, file: str) -> bytes | None: + picture = await self.readpicture(file) + if picture: + return picture + return await self.albumart(file) + + async def albumart(self, file: str) -> bytes | None: + try: + albumart = await self.client.albumart(file) + return albumart.get("binary") + except CommandError: + return None + async def readpicture(self, file: str) -> bytes | None: try: readpic = await self.client.readpicture(file) diff --git a/src/mpd_now_playable/mpd/types.py b/src/mpd_now_playable/mpd/types.py index 4fe2d25..a5aa8a3 100644 --- a/src/mpd_now_playable/mpd/types.py +++ b/src/mpd_now_playable/mpd/types.py @@ -2,11 +2,9 @@ from typing import Literal, NotRequired, Protocol, TypedDict class MpdStateHandler(Protocol): - async def readpicture(self, file: str) -> bytes | None: - ... + async def get_art(self, file: str) -> bytes | None: ... - async def refresh(self) -> None: - ... + async def refresh(self) -> None: ... BooleanFlag = Literal["0", "1"] diff --git a/stubs/mpd/asyncio.pyi b/stubs/mpd/asyncio.pyi index 221fcf4..6968141 100644 --- a/stubs/mpd/asyncio.pyi +++ b/stubs/mpd/asyncio.pyi @@ -13,6 +13,7 @@ class MPDClient(MPDClientBase): def idle(self, subsystems: Sequence[str] = ...) -> AsyncIterator[Sequence[str]]: ... async def status(self) -> types.StatusResponse: ... async def currentsong(self) -> types.CurrentSongResponse: ... + async def albumart(self, uri: str) -> types.ReadPictureResponse: ... async def readpicture(self, uri: str) -> types.ReadPictureResponse: ... async def play(self) -> None: ... async def pause(self, pause: Literal[1, 0, None] = None) -> None: