diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 873b46f0..09c16586 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -657,7 +657,7 @@ def dbcheck(): 'live INTEGER, live_uuid TEXT, channel_call_sign TEXT, channel_identifier TEXT, channel_thumb TEXT, ' 'secure INTEGER, relayed INTEGER, ' 'buffer_count INTEGER DEFAULT 0, buffer_last_triggered INTEGER, last_paused INTEGER, ' - 'watched INTEGER DEFAULT 0, intro INTEGER DEFAULT 0, credits INTEGER DEFAULT 0, ' + 'watched INTEGER DEFAULT 0, intro INTEGER DEFAULT 0, credits INTEGER DEFAULT 0, marker INTEGER DEFAULT 0, ' 'initial_stream INTEGER DEFAULT 1, write_attempts INTEGER DEFAULT 0, raw_stream_info TEXT, ' 'rating_key_websocket TEXT)' ) @@ -1417,6 +1417,15 @@ def dbcheck(): 'ALTER TABLE sessions ADD COLUMN credits INTEGER DEFAULT 0' ) + # Upgrade sessions table from earlier versions + try: + c_db.execute('SELECT marker FROM sessions') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table sessions.") + c_db.execute( + 'ALTER TABLE sessions ADD COLUMN marker INTEGER DEFAULT 0' + ) + # Upgrade session_history table from earlier versions try: c_db.execute('SELECT reference_id FROM session_history') diff --git a/plexpy/activity_handler.py b/plexpy/activity_handler.py index a89ccb98..3b5a283f 100644 --- a/plexpy/activity_handler.py +++ b/plexpy/activity_handler.py @@ -250,16 +250,16 @@ class ActivityHandler(object): self.put_notification('on_change') - def on_intro(self): + def on_intro(self, marker): if self.get_live_session(): logger.debug("Tautulli ActivityHandler :: Session %s intro marker reached." % str(self.get_session_key())) - self.put_notification('on_intro') + self.put_notification('on_intro', marker=marker) - def on_credits(self): + def on_credits(self, marker): if self.get_live_session(): logger.debug("Tautulli ActivityHandler :: Session %s credits marker reached." % str(self.get_session_key())) - self.put_notification('on_credits') + self.put_notification('on_credits', marker=marker) def on_watched(self): logger.debug("Tautulli ActivityHandler :: Session %s watched." % str(self.get_session_key())) @@ -359,37 +359,33 @@ class ActivityHandler(object): # Monitor if the stream has reached the intro or credit marker offsets self.get_metadata() - intro_markers, credits_markers = [], [] - for marker in self.metadata['markers']: - if marker['type'] == 'intro': - intro_markers.append(marker) - elif marker['type'] == 'credits': - credits_markers.append(marker) - - self._check_marker('intro', intro_markers) - self._check_marker('credits', credits_markers) - - def _check_marker(self, marker_type, markers): - if self.db_session[marker_type] < len(markers): - marker = markers[self.db_session[marker_type]] + marker_flag = False + for marker_idx, marker in enumerate(self.metadata['markers'], start=1): # Websocket events only fire every 10 seconds # Check if the marker is within 10 seconds of the current viewOffset if marker['start_time_offset'] - 10000 <= self.timeline['viewOffset'] <= marker['end_time_offset']: - set_func = getattr(self.ap, 'set_{}'.format(marker_type)) - callback_func = getattr(self, 'on_{}'.format(marker_type)) + marker_flag = True - set_func(session_key=self.get_session_key()) + if self.db_session['marker'] != marker_idx: + self.ap.set_marker(session_key=self.get_session_key(), marker_idx=marker_idx, marker_type=marker['type']) + callback_func = getattr(self, 'on_{}'.format(marker['type'])) - if self.timeline['viewOffset'] < marker['start_time_offset']: - # Schedule a callback for the exact offset of the marker - schedule_callback( - 'session_key-{}-{}-{}'.format(self.get_session_key(), marker_type, self.db_session[marker_type]), - func=callback_func, - milliseconds=marker['start_time_offset'] - self.timeline['viewOffset'] - ) - else: - callback_func() + if self.timeline['viewOffset'] < marker['start_time_offset']: + # Schedule a callback for the exact offset of the marker + schedule_callback( + 'session_key-{}-marker-{}'.format(self.get_session_key(), marker_idx), + func=callback_func, + args=[marker], + milliseconds=marker['start_time_offset'] - self.timeline['viewOffset'] + ) + else: + callback_func(marker) + + break + + if not marker_flag: + self.ap.set_marker(session_key=self.get_session_key(), marker_idx=0) def check_watched(self): # Monitor if the stream has reached the watch percentage for notifications diff --git a/plexpy/activity_processor.py b/plexpy/activity_processor.py index e110ea64..c821d23d 100644 --- a/plexpy/activity_processor.py +++ b/plexpy/activity_processor.py @@ -660,15 +660,16 @@ class ActivityProcessor(object): self.db.action('UPDATE sessions SET write_attempts = ? WHERE session_key = ?', [session['write_attempts'] + 1, session_key]) - def set_intro(self, session_key=None): - self.db.action('UPDATE sessions SET intro = intro + 1 ' + def set_marker(self, session_key=None, marker_idx=None, marker_type=None): + if marker_type == 'intro': + args = [1, 0] + elif marker_type == 'credits': + args = [0, 1] + else: + args = [0, 0] + self.db.action('UPDATE sessions SET intro = ?, credits = ?, marker = ? ' 'WHERE session_key = ?', - [session_key]) - - def set_credits(self, session_key=None): - self.db.action('UPDATE sessions SET credits = credits + 1 ' - 'WHERE session_key = ?', - [session_key]) + args + [marker_idx, session_key]) def set_watched(self, session_key=None): self.db.action('UPDATE sessions SET watched = ? '