From 0c242f15f4a1e671a13ca94c059763e42d76a343 Mon Sep 17 00:00:00 2001 From: Zvonimir Rudinski Date: Wed, 10 Dec 2025 03:59:29 +0100 Subject: [PATCH] replace jellyfin utils with class method --- changelog/0.1.1.md | 1 + jellyfin/api_client.py | 3 ++- jellyfin/models.py | 44 ++++++++++++++++++++++++++++++++++++++ jellyfin/utils.py | 48 ------------------------------------------ main.py | 3 +-- 5 files changed, 48 insertions(+), 51 deletions(-) delete mode 100644 jellyfin/utils.py diff --git a/changelog/0.1.1.md b/changelog/0.1.1.md index 4db91e7..bf47f08 100644 --- a/changelog/0.1.1.md +++ b/changelog/0.1.1.md @@ -7,3 +7,4 @@ - Removed caching of last fetched items to ensure the most up-to-date information is always displayed in Discord Rich Presence - Handle paused state correctly by checking the `PlayState` property from Jellyfin and updating Discord Rich Presence accordingly - Set the `auth.ssl` configuration option in Jellyfin Client dynamically based on the `jellyfin_server_url` +- Removed `to_rpc_payload` function in favor of a class method within the `JellyfinMediaItem` class for better encapsulation and organization of code diff --git a/jellyfin/api_client.py b/jellyfin/api_client.py index f6dae89..9ae4d6f 100644 --- a/jellyfin/api_client.py +++ b/jellyfin/api_client.py @@ -26,7 +26,8 @@ class JellyfinApiClient: self.logger.info("Connecting to Jellyfin server...") self.client = JellyfinClient() self.client.config.app('jellydisc', '0.1.1', machine_name, unique_id) - self.client.config.data['auth.ssl'] = settings.jellyfin_server_url.startswith('https://') + self.client.config.data['auth.ssl'] = settings.jellyfin_server_url.startswith( + 'https://') self.last_auth_time = None self.authenticate() diff --git a/jellyfin/models.py b/jellyfin/models.py index 31c9ba8..9f58d2f 100644 --- a/jellyfin/models.py +++ b/jellyfin/models.py @@ -1,6 +1,8 @@ from pydantic import BaseModel from enum import Enum from typing import Optional, Union +from discord.models import DiscordRPCUpdatePayload +from pypresence.types import ActivityType class JellyfinMediaType(str, Enum): @@ -32,3 +34,45 @@ class JellyfinMediaItem(BaseModel): 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=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=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=self.image_url, + details=self.name, + activity_type=ActivityType.WATCHING, + start=self.start, + end=self.end + ) diff --git a/jellyfin/utils.py b/jellyfin/utils.py deleted file mode 100644 index 2d53d1c..0000000 --- a/jellyfin/utils.py +++ /dev/null @@ -1,48 +0,0 @@ -from discord.models import DiscordRPCUpdatePayload -from jellyfin.models import JellyfinMediaItem, JellyfinMediaType -from pypresence.types import ActivityType - - -def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload: - """ - Converts a JellyfinMediaItem to a DiscordRPCUpdatePayload. - - Args: - media_item (JellyfinMediaItem): The Jellyfin media item to convert. - Returns: - DiscordRPCUpdatePayload: The converted Discord RPC update payload. - """ - if media_item.type == JellyfinMediaType.AUDIO: - return DiscordRPCUpdatePayload( - id=media_item.id, - title=f"Listening to { - media_item.name}", - subtitle=f"by { - media_item.metadata.artist}", - image_url=media_item.image_url, - details=media_item.metadata.album, - activity_type=ActivityType.LISTENING, - start=media_item.start, - end=media_item.end) - elif media_item.type == JellyfinMediaType.MOVIE: - return DiscordRPCUpdatePayload( - id=media_item.id, - title=f"Watching {media_item.name}", - subtitle=media_item.metadata.date, - image_url=media_item.image_url, - details=media_item.name, - activity_type=ActivityType.WATCHING, - start=media_item.start, - end=media_item.end - ) - elif media_item.type == JellyfinMediaType.EPISODE: - return DiscordRPCUpdatePayload( - id=media_item.id, - title=f"Watching {media_item.name}", - subtitle=media_item.metadata.subtitle, - image_url=media_item.image_url, - details=media_item.name, - activity_type=ActivityType.WATCHING, - start=media_item.start, - end=media_item.end - ) diff --git a/main.py b/main.py index 689177c..a9a8475 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,5 @@ from discord.rpc import DiscordRPC from jellyfin.api_client import JellyfinApiClient -from jellyfin.utils import to_rpc_payload from settings import settings import coloredlogs import logging @@ -23,7 +22,7 @@ def main(): time.sleep(settings.poll_interval) continue - discordRPC.update(to_rpc_payload(media_item)) + discordRPC.update(media_item.to_rpc_payload()) time.sleep(settings.poll_interval) except KeyboardInterrupt: logging.info("Shutting down...")