From b8bcdc5a834facb28155436ff25f0b3cf824e9fe Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Tue, 23 Jul 2024 13:12:06 +1000 Subject: [PATCH] Wrap MPD's state into a transfer struct before finalising the Song --- src/mpd_now_playable/mpd/listener.py | 19 +++++++++++-------- src/mpd_now_playable/mpd/types.py | 8 ++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/mpd_now_playable/mpd/listener.py b/src/mpd_now_playable/mpd/listener.py index 1743bbb..b3c400b 100644 --- a/src/mpd_now_playable/mpd/listener.py +++ b/src/mpd_now_playable/mpd/listener.py @@ -9,16 +9,17 @@ from yarl import URL from ..config.model import MpdConfig from ..player import Player -from ..song import Artwork, PlaybackState, Song, to_artwork, to_brainz +from ..song import PlaybackState, Song, to_artwork, to_brainz from ..song_receiver import Receiver from ..tools.types import option_fmap, un_maybe_plural from .artwork_cache import MpdArtworkCache -from .types import CurrentSongResponse, StatusResponse +from .types import MpdState -def mpd_current_to_song( - status: StatusResponse, current: CurrentSongResponse, art: Artwork -) -> Song: + +def mpd_state_to_song(mpd: MpdState) -> Song: + status = mpd.status + current = mpd.current return Song( state=PlaybackState(status["state"]), queue_index=int(current["pos"]), @@ -34,8 +35,8 @@ def mpd_current_to_song( disc=option_fmap(int, current.get("disc")), duration=float(status["duration"]), elapsed=float(status["elapsed"]), - musicbrainz=to_brainz(current), - art=art, + musicbrainz=to_brainz(mpd.current), + art=to_artwork(mpd.art), ) @@ -77,6 +78,7 @@ class MpdStateListener(Player): status, current = await asyncio.gather( self.client.status(), self.client.currentsong() ) + state = MpdState(status, current) if starting_idle_count != self.idle_count: return @@ -90,7 +92,8 @@ class MpdStateListener(Player): if starting_idle_count != self.idle_count: return - song = mpd_current_to_song(status, current, to_artwork(art)) + state = MpdState(status, current, art) + song = mpd_state_to_song(state) rprint(song) await self.update(song) diff --git a/src/mpd_now_playable/mpd/types.py b/src/mpd_now_playable/mpd/types.py index 4183e5d..98f6612 100644 --- a/src/mpd_now_playable/mpd/types.py +++ b/src/mpd_now_playable/mpd/types.py @@ -1,3 +1,4 @@ +from dataclasses import dataclass from typing import Literal, NotRequired, Protocol, TypedDict from ..song.musicbrainz import MusicBrainzTags @@ -76,3 +77,10 @@ class CurrentSongResponse(CurrentSongTags): ReadPictureResponse = TypedDict("ReadPictureResponse", {"binary": bytes}) + + +@dataclass +class MpdState: + status: StatusResponse + current: CurrentSongResponse + art: bytes | None = None