extract playback utils
This commit is contained in:
@@ -7,7 +7,7 @@ from jellyfin.models import (
|
|||||||
JellyfinMovieMediaMetadata,
|
JellyfinMovieMediaMetadata,
|
||||||
JellyfinEpisodeMediaMetadata)
|
JellyfinEpisodeMediaMetadata)
|
||||||
from jellyfin.utils.config import configure_client
|
from jellyfin.utils.config import configure_client
|
||||||
from datetime import datetime
|
from jellyfin.utils.playback import get_current_playback
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
@@ -109,33 +109,6 @@ class JellyfinApiClient:
|
|||||||
elif media_type == 'Movie':
|
elif media_type == 'Movie':
|
||||||
return self.to_movie_model(item)
|
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:
|
def to_music_model(self, item: dict) -> JellyfinMediaItem:
|
||||||
"""
|
"""
|
||||||
Converts a Jellyfin music media item dictionary to a JellyfinMediaItem model.
|
Converts a Jellyfin music media item dictionary to a JellyfinMediaItem model.
|
||||||
@@ -155,7 +128,7 @@ class JellyfinApiClient:
|
|||||||
artist=item.get('AlbumArtist'), album=f"{
|
artist=item.get('AlbumArtist'), album=f"{
|
||||||
item.get('Album')} ({premiere_year})" if premiere_date else item.get('Album'))
|
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(
|
return JellyfinMediaItem(
|
||||||
id=media_id,
|
id=media_id,
|
||||||
@@ -182,7 +155,7 @@ class JellyfinApiClient:
|
|||||||
metadata = JellyfinMovieMediaMetadata(date=datetime.fromisoformat(
|
metadata = JellyfinMovieMediaMetadata(date=datetime.fromisoformat(
|
||||||
premiere_date).strftime('%d/%m/%Y') if premiere_date else None)
|
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(
|
return JellyfinMediaItem(
|
||||||
id=media_id,
|
id=media_id,
|
||||||
@@ -217,7 +190,7 @@ class JellyfinApiClient:
|
|||||||
subtitle=item.get('Name')
|
subtitle=item.get('Name')
|
||||||
)
|
)
|
||||||
|
|
||||||
(start, end) = self.get_playback_info(item)
|
(start, end) = get_current_playback(item)
|
||||||
|
|
||||||
return JellyfinMediaItem(
|
return JellyfinMediaItem(
|
||||||
id=media_id,
|
id=media_id,
|
||||||
|
|||||||
31
jellyfin/utils/playback.py
Normal file
31
jellyfin/utils/playback.py
Normal file
@@ -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)
|
||||||
Reference in New Issue
Block a user