Support MPD_NOW_PLAYABLE_CACHE setting (Redis or Memcached)

This commit is contained in:
Danielle McLean 2024-05-14 13:25:13 +10:00
parent c7773bf324
commit 55d82c72c3
Signed by: 00dani
GPG key ID: 6854781A0488421C
7 changed files with 118 additions and 36 deletions

View file

@ -1,30 +1,16 @@
from dataclasses import dataclass
from __future__ import annotations
from aiocache import Cache
from typing import TypedDict
from ..async_tools import run_background_task
from ..cache import Cache, make_cache
from .types import CurrentSongResponse, MpdStateHandler
CACHE_TTL = 60 * 10 # ten minutes
@dataclass(frozen=True)
class HasArt:
data: bytes
@dataclass(frozen=True)
class HasNoArt:
data = None
ArtCacheEntry = HasArt | HasNoArt
def make_cache_entry(art: bytes | None) -> ArtCacheEntry:
if art is None:
return HasNoArt()
return HasArt(art)
class ArtCacheEntry(TypedDict):
data: bytes | None
def calc_album_key(song: CurrentSongResponse) -> str:
@ -39,18 +25,18 @@ def calc_track_key(song: CurrentSongResponse) -> str:
class MpdArtworkCache:
mpd: MpdStateHandler
album_cache: "Cache[ArtCacheEntry]"
track_cache: "Cache[ArtCacheEntry]"
album_cache: Cache[ArtCacheEntry]
track_cache: Cache[ArtCacheEntry]
def __init__(self, mpd: MpdStateHandler):
def __init__(self, mpd: MpdStateHandler, cache_url: str = "memory://"):
self.mpd = mpd
self.album_cache = Cache()
self.track_cache = Cache()
self.album_cache = make_cache(cache_url, "album")
self.track_cache = make_cache(cache_url, "track")
async def get_cached_artwork(self, song: CurrentSongResponse) -> bytes | None:
art = await self.track_cache.get(calc_track_key(song))
if art:
return art.data
return art["data"]
# If we don't have track artwork cached, go find some.
run_background_task(self.cache_artwork(song))
@ -58,12 +44,12 @@ class MpdArtworkCache:
# Even if we don't have cached track art, we can try looking for cached album art.
art = await self.album_cache.get(calc_album_key(song))
if art:
return art.data
return art["data"]
return None
async def cache_artwork(self, song: CurrentSongResponse) -> None:
art = make_cache_entry(await self.mpd.readpicture(song["file"]))
art = ArtCacheEntry(data=await self.mpd.readpicture(song["file"]))
try:
await self.album_cache.add(calc_album_key(song), art, ttl=CACHE_TTL)
except ValueError: