The idea here is that there are other places that might want to know what's playing, besides MPNowPlayingInfoCenter. For example, to expose the now playing info to Übersicht efficiently, it needs to be available from a web browser, ideally using WebSockets. So there could be a receiver that runs a small WebSockets server and sends out now playing info to anyone who connects. Additionally, I hope to write receivers for MPRIS and for the System Media Transport Controls on Windows, making mpd-now-playable equally useful across all platforms. None of this is implemented yet, of course, but I hope to get the WebSockets receiver done pretty soon! I'm going to keep the default behaviour unchanged. Unless you explicitly configure different receivers in config.toml, mpd-now-playable will just behave as an MPNowPlayingInfoCenter integration as it's always done.
55 lines
1 KiB
Python
55 lines
1 KiB
Python
from dataclasses import dataclass, field
|
|
from enum import StrEnum
|
|
from pathlib import Path
|
|
from typing import Literal
|
|
from uuid import UUID
|
|
|
|
from pydantic.type_adapter import TypeAdapter
|
|
|
|
|
|
class PlaybackState(StrEnum):
|
|
play = "play"
|
|
pause = "pause"
|
|
stop = "stop"
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class HasArtwork:
|
|
data: bytes = field(repr=False)
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class NoArtwork:
|
|
def __bool__(self) -> Literal[False]:
|
|
return False
|
|
|
|
|
|
Artwork = HasArtwork | NoArtwork
|
|
ArtworkSchema: TypeAdapter[Artwork] = TypeAdapter(HasArtwork | NoArtwork)
|
|
|
|
|
|
def to_artwork(art: bytes | None) -> Artwork:
|
|
if art is None:
|
|
return NoArtwork()
|
|
return HasArtwork(art)
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class Song:
|
|
state: PlaybackState
|
|
queue_index: int
|
|
queue_length: int
|
|
file: Path
|
|
musicbrainz_trackid: UUID | None
|
|
musicbrainz_releasetrackid: UUID | None
|
|
title: str | None
|
|
artist: list[str]
|
|
composer: list[str]
|
|
album: list[str]
|
|
album_artist: list[str]
|
|
track: int | None
|
|
disc: int | None
|
|
genre: list[str]
|
|
duration: float
|
|
elapsed: float
|
|
art: Artwork
|