From 940c814eaa44ec7d1fb65d9b05fe0beab2e7ade5 Mon Sep 17 00:00:00 2001 From: tim000x3 Date: Mon, 21 Apr 2025 13:02:27 -0400 Subject: [PATCH] Add seekPosition and endPosition parameters to program conversion functions and templates --- dizqueTV/dizquetv.py | 21 +++++++++++++++++---- dizqueTV/helpers.py | 13 ++++++++++++- dizqueTV/models/media.py | 2 ++ dizqueTV/models/templates.py | 4 ++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/dizqueTV/dizquetv.py b/dizqueTV/dizquetv.py index 0f9b993..7f5c3a3 100644 --- a/dizqueTV/dizquetv.py +++ b/dizqueTV/dizquetv.py @@ -114,7 +114,8 @@ def convert_custom_show_to_programs( def convert_plex_item_to_program( - plex_item: Union[Video, Movie, Episode, Track], plex_server: PServer + plex_item: Union[Video, Movie, Episode, Track], plex_server: PServer, + seek_position: int = None, end_position: int = None ) -> Program: """ Convert a PlexAPI Video, Movie, Episode or Track object into a Program @@ -123,12 +124,18 @@ def convert_plex_item_to_program( :type plex_item: Union[plexapi.video.Video, plexapi.video.Movie, plexapi.video.Episode, plexapi.audio.Track] :param plex_server: plexapi.server.PlexServer object :type plex_server: plexapi.server.PlexServer + :param seek_position: Position in milliseconds to start playback from (optional) + :type seek_position: int, optional + :param end_position: Position in milliseconds to end playback at (optional) + :type end_position: int, optional :return: Program object :rtype: Program """ data = helpers._make_program_dict_from_plex_item( - plex_item=plex_item, plex_server=plex_server + plex_item=plex_item, plex_server=plex_server, + seek_position=seek_position, end_position=end_position ) + return Program(data=data, dizque_instance=None, channel_instance=None) @@ -1584,7 +1591,8 @@ def guide_lineup_json(self) -> dict: # Other Functions def convert_plex_item_to_program( - self, plex_item: Union[Video, Movie, Episode, Track], plex_server: PServer + self, plex_item: Union[Video, Movie, Episode, Track], plex_server: PServer, + seek_position: int = None, end_position: int = None ) -> Program: """ Convert a PlexAPI Video, Movie, Episode or Track object into a Program. @@ -1593,11 +1601,16 @@ def convert_plex_item_to_program( :type plex_item: Union[plexapi.video.Video, plexapi.video.Movie, plexapi.video.Episode, plexapi.audio.Track] :param plex_server: plexapi.server.PlexServer object :type plex_server: plexapi.server.PlexServer + :param seek_position: Position in milliseconds to start playback from (optional) + :type seek_position: int, optional + :param end_position: Position in milliseconds to end playback at (optional) + :type end_position: int, optional :return: Program object :rtype: Program """ return convert_plex_item_to_program( - plex_item=plex_item, plex_server=plex_server + plex_item=plex_item, plex_server=plex_server, + seek_position=seek_position, end_position=end_position ) def extract_episodes(self, plex_item: Union[Show, Season]) -> List[Episode]: diff --git a/dizqueTV/helpers.py b/dizqueTV/helpers.py index ed2d482..c3984ee 100644 --- a/dizqueTV/helpers.py +++ b/dizqueTV/helpers.py @@ -274,7 +274,8 @@ def _object_has_attribute(obj: object, attribute_name: str) -> bool: def _make_program_dict_from_plex_item( - plex_item: Union[Video, Movie, Episode, Track], plex_server: PServer + plex_item: Union[Video, Movie, Episode, Track], plex_server: PServer, + seek_position: int = None, end_position: int = None ) -> dict: """ Build a dictionary for a Program using a PlexAPI Video, Movie, Episode or Track object. @@ -283,6 +284,10 @@ def _make_program_dict_from_plex_item( :type plex_item: Union[plexapi.video.Video, plexapi.video.Movie, plexapi.video.Episode, plexapi.audio.Track] :param plex_server: plexapi.server.PlexServer object :type plex_server: plexapi.server.PlexServer + :param seek_position: Position in milliseconds to start playback from (optional) + :type seek_position: int, optional + :param end_position: Position in milliseconds to end playback at (optional) + :type end_position: int, optional :return: dict of Plex item information :rtype: dict """ @@ -337,6 +342,12 @@ def _make_program_dict_from_plex_item( "showIcon" ] = f"{plex_uri}{plex_item.grandparentThumb}?X-Plex-Token={plex_token}" data["icon"] = data["showIcon"] + + if seek_position is not None: + data["seekPosition"] = seek_position + if end_position is not None: + data["endPosition"] = end_position + return data diff --git a/dizqueTV/models/media.py b/dizqueTV/models/media.py index 9fa9976..b75cec6 100644 --- a/dizqueTV/models/media.py +++ b/dizqueTV/models/media.py @@ -68,6 +68,8 @@ def __init__(self, data: dict, dizque_instance, channel_instance): channel_instance=channel_instance, ) self.rating = data.get("rating") + self.seekPosition = data.get("seekPosition") + self.endPosition = data.get("endPosition") def __repr__(self): return f"{self.__class__.__name__}({self.title})" diff --git a/dizqueTV/models/templates.py b/dizqueTV/models/templates.py index f64156f..5370bf5 100644 --- a/dizqueTV/models/templates.py +++ b/dizqueTV/models/templates.py @@ -201,6 +201,8 @@ "episode": int, "season": int, "serverKey": str, + "seekPosition": int, + "endPosition": int, } EPISODE_PROGRAM_TEMPLATE = { @@ -223,6 +225,8 @@ "showIcon": str, "episodeIcon": str, "seasonIcon": str, + "seekPosition": int, + "endPosition": int, } TRACK_PROGRAM_TEMPLATE = {