from pydantic import BaseModel, HttpUrl, NonNegativeInt from enum import StrEnum from typing import Optional, Union from discord.models import DiscordRPCUpdatePayload from pypresence.types import ActivityType class JellyfinMediaType(StrEnum): AUDIO = 'Audio' MOVIE = 'Movie' EPISODE = 'Episode' class JellyfinMusicMediaMetadata(BaseModel): artist: Optional[str] album: Optional[str] class JellyfinMovieMediaMetadata(BaseModel): date: Optional[str] class JellyfinEpisodeMediaMetadata(BaseModel): subtitle: str class JellyfinMediaItem(BaseModel): id: str name: str type: JellyfinMediaType image_url: HttpUrl start: Optional[NonNegativeInt] end: Optional[NonNegativeInt] metadata: Union[JellyfinMusicMediaMetadata, JellyfinMovieMediaMetadata, JellyfinEpisodeMediaMetadata] def to_rpc_payload(self) -> DiscordRPCUpdatePayload: """ Converts a JellyfinMediaItem to a DiscordRPCUpdatePayload. Returns: DiscordRPCUpdatePayload: The converted Discord RPC update payload. """ if self.type == JellyfinMediaType.AUDIO: return DiscordRPCUpdatePayload( id=self.id, title=f"Listening to { self.name}", subtitle=f"by { self.metadata.artist}", image_url=str(self.image_url), details=self.metadata.album, activity_type=ActivityType.LISTENING, start=self.start, end=self.end) elif self.type == JellyfinMediaType.MOVIE: return DiscordRPCUpdatePayload( id=self.id, title=f"Watching {self.name}", subtitle=self.metadata.date, image_url=str(self.image_url), details=self.name, activity_type=ActivityType.WATCHING, start=self.start, end=self.end ) elif self.type == JellyfinMediaType.EPISODE: return DiscordRPCUpdatePayload( id=self.id, title=f"Watching {self.name}", subtitle=self.metadata.subtitle, image_url=str(self.image_url), details=self.name, activity_type=ActivityType.WATCHING, start=self.start, end=self.end )