106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
from settings import settings
|
|
from jellyfin_apiclient_python import JellyfinClient
|
|
from getmac import get_mac_address
|
|
from jellyfin.models import JellyfinMediaItem, JellyfinMediaType
|
|
from datetime import datetime
|
|
import logging
|
|
import os
|
|
|
|
class JellyfinApiClient:
|
|
def __init__(self):
|
|
machine_name = os.uname().nodename
|
|
unique_id = get_mac_address(hostname="localhost")
|
|
|
|
self.logger = logging.getLogger('JellyfinApiClient')
|
|
|
|
self.logger.info("Connecting to Jellyfin server...")
|
|
self.client = JellyfinClient()
|
|
self.client.config.app('jellydisc', '0.0.1', machine_name, unique_id)
|
|
self.client.config.data['auth.ssl'] = True
|
|
|
|
self.client.auth.connect_to_address(settings.jellyfin_server_url)
|
|
self.client.auth.login(
|
|
settings.jellyfin_server_url,
|
|
settings.jellyfin_username,
|
|
settings.jellyfin_password
|
|
)
|
|
|
|
self.logger.info("Connected to Jellyfin server.")
|
|
|
|
def get_current_playback(self) -> JellyfinMediaItem | None:
|
|
self.logger.info("Fetching current playback information...")
|
|
sessions = self.client.jellyfin.get_sessions()
|
|
|
|
if not sessions:
|
|
self.logger.info("No active playback found.")
|
|
return None
|
|
|
|
for session in sessions:
|
|
if session.get('NowPlayingItem'):
|
|
self.logger.info("Current playback information fetched.")
|
|
return self.to_model(session['NowPlayingItem'])
|
|
|
|
self.logger.info("No active playback found.")
|
|
return None
|
|
|
|
def get_image_url(self, media_id: str) -> str:
|
|
server_address = settings.jellyfin_server_url.rstrip('/')
|
|
return f"{server_address}/Items/{media_id}/Images/Primary?maxWidth=300&maxHeight=300"
|
|
|
|
def to_model(self, item: dict) -> JellyfinMediaItem:
|
|
media_type = item.get('Type')
|
|
|
|
if media_type == 'Audio':
|
|
return self.to_music_model(item)
|
|
elif media_type == 'Episode':
|
|
return self.to_episode_model(item)
|
|
elif media_type == 'Movie':
|
|
return self.to_movie_model(item)
|
|
|
|
raise ValueError(f"Unsupported media type: {media_type}")
|
|
|
|
def to_music_model(self, item: dict) -> JellyfinMediaItem:
|
|
media_id = item.get('Id')
|
|
|
|
return JellyfinMediaItem(
|
|
id=media_id,
|
|
name=item.get('Name'),
|
|
type=JellyfinMediaType.AUDIO,
|
|
image_url=self.get_image_url(media_id),
|
|
metadata={
|
|
'artist': item.get('AlbumArtist'),
|
|
}
|
|
)
|
|
|
|
def to_movie_model(self, item: dict) -> JellyfinMediaItem:
|
|
media_id = item.get('Id')
|
|
premiere_date = item.get('PremiereDate')
|
|
|
|
return JellyfinMediaItem(
|
|
id=media_id,
|
|
name=item.get('Name'),
|
|
type=JellyfinMediaType.MOVIE,
|
|
image_url=self.get_image_url(media_id),
|
|
metadata={
|
|
'date': datetime.fromisoformat(premiere_date).strftime('%d/%m/%Y') if premiere_date else None
|
|
}
|
|
)
|
|
|
|
def to_episode_model(self, item: dict) -> JellyfinMediaItem:
|
|
media_id = item.get('Id')
|
|
seris_name = item.get('SeriesName')
|
|
season_number = item.get('ParentIndexNumber')
|
|
episode_number = item.get('IndexNumber')
|
|
|
|
subtitle=f"S{season_number:02}E{episode_number:02} of {seris_name}"
|
|
|
|
return JellyfinMediaItem(
|
|
id=media_id,
|
|
name=item.get('Name'),
|
|
type=JellyfinMediaType.EPISODE,
|
|
image_url=self.get_image_url(media_id),
|
|
metadata={
|
|
'subtitle': subtitle,
|
|
}
|
|
)
|