improve typing

This commit is contained in:
2025-12-10 03:36:34 +01:00
parent d0fcb3e57c
commit 4a33281ca4
4 changed files with 42 additions and 25 deletions

View File

@@ -1,5 +1,6 @@
from pydantic import BaseModel from pydantic import BaseModel
from pypresence.types import ActivityType from pypresence.types import ActivityType
from typing import Optional
class DiscordRPCUpdatePayload(BaseModel): class DiscordRPCUpdatePayload(BaseModel):
@@ -8,6 +9,6 @@ class DiscordRPCUpdatePayload(BaseModel):
subtitle: str subtitle: str
image_url: str image_url: str
details: str details: str
start: int | None start: Optional[int]
end: int | None end: Optional[int]
activity_type: ActivityType activity_type: ActivityType

View File

@@ -1,7 +1,7 @@
from settings import settings from settings import settings
from jellyfin_apiclient_python import JellyfinClient from jellyfin_apiclient_python import JellyfinClient
from getmac import get_mac_address 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 from datetime import datetime
import logging import logging
import time import time
@@ -98,6 +98,10 @@ class JellyfinApiClient:
premiere_year = datetime.fromisoformat( premiere_year = datetime.fromisoformat(
premiere_date).year if premiere_date else None 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) (start, end) = self.get_playback_info(item)
return JellyfinMediaItem( return JellyfinMediaItem(
@@ -107,15 +111,16 @@ class JellyfinApiClient:
image_url=self.get_image_url(parent_id), image_url=self.get_image_url(parent_id),
start=start, start=start,
end=end, end=end,
metadata={ metadata=metadata
'artist': item.get('AlbumArtist'), )
'album': f"{
item.get('Album')} ({premiere_year})" if premiere_date else item.get('Album')})
def to_movie_model(self, item: dict) -> JellyfinMediaItem: def to_movie_model(self, item: dict) -> JellyfinMediaItem:
media_id = item.get('Id') media_id = item.get('Id')
premiere_date = item.get('PremiereDate') 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) (start, end) = self.get_playback_info(item)
return JellyfinMediaItem( return JellyfinMediaItem(
@@ -125,9 +130,7 @@ class JellyfinApiClient:
image_url=self.get_image_url(media_id), image_url=self.get_image_url(media_id),
start=start, start=start,
end=end, end=end,
metadata={ metadata=metadata
'date': datetime.fromisoformat(premiere_date).strftime('%d/%m/%Y') if premiere_date else None
}
) )
def to_episode_model(self, item: dict) -> JellyfinMediaItem: def to_episode_model(self, item: dict) -> JellyfinMediaItem:
@@ -138,7 +141,10 @@ class JellyfinApiClient:
season_number = item.get('ParentIndexNumber') season_number = item.get('ParentIndexNumber')
episode_number = item.get('IndexNumber') 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) (start, end) = self.get_playback_info(item)
@@ -149,7 +155,5 @@ class JellyfinApiClient:
image_url=self.get_image_url(parent_id), image_url=self.get_image_url(parent_id),
start=start, start=start,
end=end, end=end,
metadata={ metadata=metadata
'subtitle': subtitle,
}
) )

View File

@@ -1,5 +1,6 @@
from pydantic import BaseModel from pydantic import BaseModel
from enum import Enum from enum import Enum
from typing import Optional, Union
class JellyfinMediaType(str, Enum): class JellyfinMediaType(str, Enum):
@@ -8,11 +9,26 @@ class JellyfinMediaType(str, Enum):
EPISODE = 'Episode' 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): class JellyfinMediaItem(BaseModel):
id: str id: str
name: str name: str
type: JellyfinMediaType type: JellyfinMediaType
image_url: str image_url: str
start: int | None start: Optional[int]
end: int | None end: Optional[int]
metadata: dict metadata: Union[JellyfinMusicMediaMetadata,
JellyfinMovieMediaMetadata,
JellyfinEpisodeMediaMetadata]

View File

@@ -10,13 +10,9 @@ def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload:
title=f"Listening to { title=f"Listening to {
media_item.name}", media_item.name}",
subtitle=f"by { subtitle=f"by {
media_item.metadata.get( media_item.metadata.artist}",
'artist',
'Unknown Artist')}",
image_url=media_item.image_url, image_url=media_item.image_url,
details=media_item.metadata.get( details=media_item.metadata.album,
'album',
'Unknown Album'),
activity_type=ActivityType.LISTENING, activity_type=ActivityType.LISTENING,
start=media_item.start, start=media_item.start,
end=media_item.end) end=media_item.end)
@@ -24,7 +20,7 @@ def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload:
return DiscordRPCUpdatePayload( return DiscordRPCUpdatePayload(
id=media_item.id, id=media_item.id,
title=f"Watching {media_item.name}", title=f"Watching {media_item.name}",
subtitle=media_item.metadata.get('date'), subtitle=media_item.metadata.date,
image_url=media_item.image_url, image_url=media_item.image_url,
details=media_item.name, details=media_item.name,
activity_type=ActivityType.WATCHING, activity_type=ActivityType.WATCHING,
@@ -35,7 +31,7 @@ def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload:
return DiscordRPCUpdatePayload( return DiscordRPCUpdatePayload(
id=media_item.id, id=media_item.id,
title=f"Watching {media_item.name}", title=f"Watching {media_item.name}",
subtitle=media_item.metadata.get('subtitle'), subtitle=media_item.metadata.subtitle,
image_url=media_item.image_url, image_url=media_item.image_url,
details=media_item.name, details=media_item.name,
activity_type=ActivityType.WATCHING, activity_type=ActivityType.WATCHING,