From 4a33281ca4df3a30b46d164c6c6faa2579abd990 Mon Sep 17 00:00:00 2001 From: Zvonimir Rudinski Date: Wed, 10 Dec 2025 03:36:34 +0100 Subject: [PATCH] improve typing --- discord/models.py | 5 +++-- jellyfin/api_client.py | 28 ++++++++++++++++------------ jellyfin/models.py | 22 +++++++++++++++++++--- jellyfin/utils.py | 12 ++++-------- 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/discord/models.py b/discord/models.py index f611692..66ee378 100644 --- a/discord/models.py +++ b/discord/models.py @@ -1,5 +1,6 @@ from pydantic import BaseModel from pypresence.types import ActivityType +from typing import Optional class DiscordRPCUpdatePayload(BaseModel): @@ -8,6 +9,6 @@ class DiscordRPCUpdatePayload(BaseModel): subtitle: str image_url: str details: str - start: int | None - end: int | None + start: Optional[int] + end: Optional[int] activity_type: ActivityType diff --git a/jellyfin/api_client.py b/jellyfin/api_client.py index 8d724d4..1d22ce7 100644 --- a/jellyfin/api_client.py +++ b/jellyfin/api_client.py @@ -1,7 +1,7 @@ from settings import settings from jellyfin_apiclient_python import JellyfinClient from getmac import get_mac_address -from jellyfin.models import JellyfinMediaItem, JellyfinMediaType +from jellyfin.models import JellyfinMediaItem, JellyfinMediaType, JellyfinMusicMediaMetadata, JellyfinMovieMediaMetadata, JellyfinEpisodeMediaMetadata from datetime import datetime import logging import time @@ -98,6 +98,10 @@ class JellyfinApiClient: premiere_year = datetime.fromisoformat( premiere_date).year if premiere_date else None + metadata = JellyfinMusicMediaMetadata( + artist=item.get('AlbumArtist'), album=f"{ + item.get('Album')} ({premiere_year})" if premiere_date else item.get('Album')) + (start, end) = self.get_playback_info(item) return JellyfinMediaItem( @@ -107,15 +111,16 @@ class JellyfinApiClient: image_url=self.get_image_url(parent_id), start=start, end=end, - metadata={ - 'artist': item.get('AlbumArtist'), - 'album': f"{ - item.get('Album')} ({premiere_year})" if premiere_date else item.get('Album')}) + metadata=metadata + ) def to_movie_model(self, item: dict) -> JellyfinMediaItem: media_id = item.get('Id') premiere_date = item.get('PremiereDate') + metadata = JellyfinMovieMediaMetadata(date=datetime.fromisoformat( + premiere_date).strftime('%d/%m/%Y') if premiere_date else None) + (start, end) = self.get_playback_info(item) return JellyfinMediaItem( @@ -125,9 +130,7 @@ class JellyfinApiClient: image_url=self.get_image_url(media_id), start=start, end=end, - metadata={ - 'date': datetime.fromisoformat(premiere_date).strftime('%d/%m/%Y') if premiere_date else None - } + metadata=metadata ) def to_episode_model(self, item: dict) -> JellyfinMediaItem: @@ -138,7 +141,10 @@ class JellyfinApiClient: season_number = item.get('ParentIndexNumber') episode_number = item.get('IndexNumber') - subtitle = f"S{season_number:02}E{episode_number:02} of {series_name}" + metadata = JellyfinEpisodeMediaMetadata( + subtitle=f"S{ + season_number:02}E{ + episode_number:02} of {series_name}") (start, end) = self.get_playback_info(item) @@ -149,7 +155,5 @@ class JellyfinApiClient: image_url=self.get_image_url(parent_id), start=start, end=end, - metadata={ - 'subtitle': subtitle, - } + metadata=metadata ) diff --git a/jellyfin/models.py b/jellyfin/models.py index 1229ce1..31c9ba8 100644 --- a/jellyfin/models.py +++ b/jellyfin/models.py @@ -1,5 +1,6 @@ from pydantic import BaseModel from enum import Enum +from typing import Optional, Union class JellyfinMediaType(str, Enum): @@ -8,11 +9,26 @@ class JellyfinMediaType(str, Enum): 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: str - start: int | None - end: int | None - metadata: dict + start: Optional[int] + end: Optional[int] + metadata: Union[JellyfinMusicMediaMetadata, + JellyfinMovieMediaMetadata, + JellyfinEpisodeMediaMetadata] diff --git a/jellyfin/utils.py b/jellyfin/utils.py index 12f11f3..a6c8bde 100644 --- a/jellyfin/utils.py +++ b/jellyfin/utils.py @@ -10,13 +10,9 @@ def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload: title=f"Listening to { media_item.name}", subtitle=f"by { - media_item.metadata.get( - 'artist', - 'Unknown Artist')}", + media_item.metadata.artist}", image_url=media_item.image_url, - details=media_item.metadata.get( - 'album', - 'Unknown Album'), + details=media_item.metadata.album, activity_type=ActivityType.LISTENING, start=media_item.start, end=media_item.end) @@ -24,7 +20,7 @@ def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload: return DiscordRPCUpdatePayload( id=media_item.id, title=f"Watching {media_item.name}", - subtitle=media_item.metadata.get('date'), + subtitle=media_item.metadata.date, image_url=media_item.image_url, details=media_item.name, activity_type=ActivityType.WATCHING, @@ -35,7 +31,7 @@ def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload: return DiscordRPCUpdatePayload( id=media_item.id, title=f"Watching {media_item.name}", - subtitle=media_item.metadata.get('subtitle'), + subtitle=media_item.metadata.subtitle, image_url=media_item.image_url, details=media_item.name, activity_type=ActivityType.WATCHING,