diff --git a/jellyfin/api_client.py b/jellyfin/api_client.py index 2b73460..3cafbd4 100644 --- a/jellyfin/api_client.py +++ b/jellyfin/api_client.py @@ -7,7 +7,7 @@ from jellyfin.models import ( JellyfinMovieMediaMetadata, JellyfinEpisodeMediaMetadata) from jellyfin.utils.config import configure_client -from datetime import datetime +from jellyfin.utils.playback import get_current_playback from typing import Optional, Tuple import logging import time @@ -109,33 +109,6 @@ class JellyfinApiClient: elif media_type == 'Movie': return self.to_movie_model(item) - def get_playback_info( - self, media: dict) -> Tuple[Optional[int], Optional[int]]: - """ - Extracts playback start and end timestamps from a media item. - - Args: - media (dict): The Jellyfin media item dictionary. - Returns: - Tuple[Optional[int], Optional[int]]: A tuple containing the start and end timestamps in seconds, or (None, None) if the media is paused. - """ - play_state = media.get('PlayState') - is_paused = play_state.get('IsPaused') - - if is_paused: - return (None, None) - - runtime_ticks = media.get('RunTimeTicks') - total_runtime_seconds = runtime_ticks // 10_000_000 - - playback_position_ticks = play_state.get('PositionTicks') - playback_position_seconds = playback_position_ticks // 10_000_000 - - start = int(datetime.now().timestamp()) - playback_position_seconds - end = start + total_runtime_seconds - - return (start, end) - def to_music_model(self, item: dict) -> JellyfinMediaItem: """ Converts a Jellyfin music media item dictionary to a JellyfinMediaItem model. @@ -155,7 +128,7 @@ class JellyfinApiClient: 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) = get_current_playback(item) return JellyfinMediaItem( id=media_id, @@ -182,7 +155,7 @@ class JellyfinApiClient: 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) = get_current_playback(item) return JellyfinMediaItem( id=media_id, @@ -217,7 +190,7 @@ class JellyfinApiClient: subtitle=item.get('Name') ) - (start, end) = self.get_playback_info(item) + (start, end) = get_current_playback(item) return JellyfinMediaItem( id=media_id, diff --git a/jellyfin/utils/playback.py b/jellyfin/utils/playback.py new file mode 100644 index 0000000..aabe907 --- /dev/null +++ b/jellyfin/utils/playback.py @@ -0,0 +1,31 @@ +from datetime import datetime +from typing import Optional, Tuple + +def get_current_playback(media: dict) -> Tuple[Optional[int], Optional[int]]: + """ + Extracts playback start and end positions from a Jellyfin media item dictionary. + + Args: + media (dict): The Jellyfin media item dictionary. + Returns: + Tuple[Optional[int], Optional[int]]: A tuple containing the start and end positions in seconds, or (None, None) if the media is paused. + """ + play_state = media.get('PlayState', {}) + is_paused = play_state.get('IsPaused', False) + + if is_paused: + return (None, None) + + runtime_ticks = media.get('RunTimeTicks', -1) + playback_position_ticks = play_state.get('PositionTicks', -1) + + if runtime_ticks < 0 or playback_position_ticks < 0: + return (None, None) + + total_runtime_seconds = runtime_ticks // 10_000_000 + playback_position_seconds = playback_position_ticks // 10_000_000 + + start = int(datetime.now().timestamp()) - playback_position_seconds + end = start + total_runtime_seconds + + return (start, end)