update rpc from jellyfin
This commit is contained in:
@@ -2,6 +2,7 @@ from pydantic import BaseModel
|
|||||||
from pypresence.types import ActivityType
|
from pypresence.types import ActivityType
|
||||||
|
|
||||||
class DiscordRPCUpdatePayload(BaseModel):
|
class DiscordRPCUpdatePayload(BaseModel):
|
||||||
|
id: str
|
||||||
title: str
|
title: str
|
||||||
subtitle: str
|
subtitle: str
|
||||||
image_url: str
|
image_url: str
|
||||||
|
|||||||
@@ -8,11 +8,16 @@ class DiscordRPC:
|
|||||||
self.logger = logging.getLogger('DiscordRPC')
|
self.logger = logging.getLogger('DiscordRPC')
|
||||||
|
|
||||||
self.logger.info("Connecting to Discord RPC...")
|
self.logger.info("Connecting to Discord RPC...")
|
||||||
|
self.last_update_id = None
|
||||||
self.rpc = Presence(settings.discord_app_id)
|
self.rpc = Presence(settings.discord_app_id)
|
||||||
self.rpc.connect()
|
self.rpc.connect()
|
||||||
self.logger.info("Connected to Discord RPC.")
|
self.logger.info("Connected to Discord RPC.")
|
||||||
|
|
||||||
def update(self, payload: DiscordRPCUpdatePayload):
|
def update(self, payload: DiscordRPCUpdatePayload):
|
||||||
|
if self.last_update_id == payload.id:
|
||||||
|
self.logger.debug("No update needed for Discord RPC presence.")
|
||||||
|
return
|
||||||
|
|
||||||
self.logger.info("Updating Discord RPC presence...")
|
self.logger.info("Updating Discord RPC presence...")
|
||||||
self.rpc.update(
|
self.rpc.update(
|
||||||
activity_type=payload.activity_type,
|
activity_type=payload.activity_type,
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ class JellyfinApiClient:
|
|||||||
media_id = item.get('Id')
|
media_id = item.get('Id')
|
||||||
|
|
||||||
return JellyfinMediaItem(
|
return JellyfinMediaItem(
|
||||||
|
id=media_id,
|
||||||
name=item.get('Name'),
|
name=item.get('Name'),
|
||||||
type=JellyfinMediaType.AUDIO,
|
type=JellyfinMediaType.AUDIO,
|
||||||
image_url=self.get_image_url(media_id),
|
image_url=self.get_image_url(media_id),
|
||||||
@@ -74,6 +75,7 @@ class JellyfinApiClient:
|
|||||||
media_id = item.get('Id')
|
media_id = item.get('Id')
|
||||||
|
|
||||||
return JellyfinMediaItem(
|
return JellyfinMediaItem(
|
||||||
|
id=media_id,
|
||||||
name=item.get('Name'),
|
name=item.get('Name'),
|
||||||
type=JellyfinMediaType.MOVIE,
|
type=JellyfinMediaType.MOVIE,
|
||||||
image_url=self.get_image_url(media_id),
|
image_url=self.get_image_url(media_id),
|
||||||
@@ -84,6 +86,7 @@ class JellyfinApiClient:
|
|||||||
media_id = item.get('Id')
|
media_id = item.get('Id')
|
||||||
|
|
||||||
return JellyfinMediaItem(
|
return JellyfinMediaItem(
|
||||||
|
id=media_id,
|
||||||
name=item.get('Name'),
|
name=item.get('Name'),
|
||||||
type=JellyfinMediaType.EPISODE,
|
type=JellyfinMediaType.EPISODE,
|
||||||
image_url=self.get_image_url(media_id),
|
image_url=self.get_image_url(media_id),
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ class JellyfinMediaType(str, Enum):
|
|||||||
EPISODE = 'Episode'
|
EPISODE = 'Episode'
|
||||||
|
|
||||||
class JellyfinMediaItem(BaseModel):
|
class JellyfinMediaItem(BaseModel):
|
||||||
|
id: str
|
||||||
name: str
|
name: str
|
||||||
type: JellyfinMediaType
|
type: JellyfinMediaType
|
||||||
image_url: str
|
image_url: str
|
||||||
|
|||||||
38
jellyfin/utils.py
Normal file
38
jellyfin/utils.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from discord.models import DiscordRPCUpdatePayload
|
||||||
|
from jellyfin.models import JellyfinMediaItem, JellyfinMediaType
|
||||||
|
from pypresence.types import ActivityType
|
||||||
|
|
||||||
|
def to_rpc_payload(media_item: JellyfinMediaItem) -> DiscordRPCUpdatePayload:
|
||||||
|
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.get('artist', 'Unknown Artist')}",
|
||||||
|
image_url=media_item.image_url,
|
||||||
|
details=media_item.name,
|
||||||
|
activity_type=ActivityType.LISTENING
|
||||||
|
)
|
||||||
|
elif media_item.type == JellyfinMediaType.MOVIE:
|
||||||
|
return DiscordRPCUpdatePayload(
|
||||||
|
id=media_item.id,
|
||||||
|
title=f"Watching {media_item.name}",
|
||||||
|
subtitle="🍿",
|
||||||
|
image_url=media_item.image_url,
|
||||||
|
details=media_item.name,
|
||||||
|
activity_type=ActivityType.WATCHING
|
||||||
|
)
|
||||||
|
elif media_item.type == JellyfinMediaType.EPISODE:
|
||||||
|
series_name = media_item.metadata.get('series', 'Unknown Series')
|
||||||
|
season = media_item.metadata.get('season', '?')
|
||||||
|
episode = media_item.metadata.get('episode', '?')
|
||||||
|
|
||||||
|
subtitle = f"S{season:02}E{episode:02} of {series_name}"
|
||||||
|
|
||||||
|
return DiscordRPCUpdatePayload(
|
||||||
|
id=media_item.id,
|
||||||
|
title=f"Watching {media_item.name}",
|
||||||
|
subtitle=subtitle,
|
||||||
|
image_url=media_item.image_url,
|
||||||
|
details=media_item.name,
|
||||||
|
activity_type=ActivityType.WATCHING
|
||||||
|
)
|
||||||
16
main.py
16
main.py
@@ -1,6 +1,8 @@
|
|||||||
from discord.rpc import DiscordRPC
|
from discord.rpc import DiscordRPC
|
||||||
from jellyfin.api_client import JellyfinApiClient
|
from jellyfin.api_client import JellyfinApiClient
|
||||||
|
from jellyfin.utils import to_rpc_payload
|
||||||
import logging
|
import logging
|
||||||
|
import time
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
@@ -9,4 +11,16 @@ logging.basicConfig(
|
|||||||
discordRPC = DiscordRPC()
|
discordRPC = DiscordRPC()
|
||||||
jellyfinApiClient = JellyfinApiClient()
|
jellyfinApiClient = JellyfinApiClient()
|
||||||
|
|
||||||
print(jellyfinApiClient.get_current_playback())
|
def main():
|
||||||
|
while True:
|
||||||
|
media_item = jellyfinApiClient.get_current_playback()
|
||||||
|
if not media_item:
|
||||||
|
discordRPC.clear()
|
||||||
|
time.sleep(15)
|
||||||
|
continue
|
||||||
|
|
||||||
|
discordRPC.update(to_rpc_payload(media_item))
|
||||||
|
time.sleep(15)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user