From 3f56bedcc62e5b98d7c2c2f9402dcd976c2b14a7 Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Mon, 28 Sep 2015 13:44:01 -0700 Subject: [PATCH] Change to notify stopped only if less than watched percent * Also fix paused notifications sending at the end of items (right before stopping) --- plexpy/activity_handler.py | 22 +++++++++--------- plexpy/activity_pinger.py | 47 ++++++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/plexpy/activity_handler.py b/plexpy/activity_handler.py index 675eb891..391666e8 100644 --- a/plexpy/activity_handler.py +++ b/plexpy/activity_handler.py @@ -1,4 +1,4 @@ -# This file is part of PlexPy. +# This file is part of PlexPy. # # PlexPy is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -178,6 +178,13 @@ class ActivityHandler(object): last_state = db_session['state'] last_key = str(db_session['rating_key']) + # Monitor if the stream has reached the watch percentage for notifications + # The only purpose of this is for notifications + progress_percent = helpers.get_percent(self.timeline['viewOffset'], db_session['duration']) + if progress_percent >= plexpy.CONFIG.NOTIFY_WATCHED_PERCENT and this_state != 'buffering': + threading.Thread(target=notification_handler.notify, + kwargs=dict(stream_data=db_session, notify_action='watched')).start() + # Make sure the same item is being played if this_key == last_key: # Update the session state and viewOffset @@ -187,11 +194,11 @@ class ActivityHandler(object): view_offset=self.timeline['viewOffset']) # Start our state checks if this_state != last_state: - if this_state == 'paused': + if this_state == 'paused' and progress_percent < 99: self.on_pause() - elif last_state == 'paused' and this_state == 'playing': + elif last_state == 'paused' and this_state == 'playing' and progress_percent < 99: self.on_resume() - elif this_state == 'stopped': + elif this_state == 'stopped' and progress_percent < plexpy.CONFIG.NOTIFY_WATCHED_PERCENT: self.on_stop() elif this_state == 'buffering': self.on_buffer() @@ -202,13 +209,6 @@ class ActivityHandler(object): self.on_stop(force_stop=True) self.on_start() - # Monitor if the stream has reached the watch percentage for notifications - # The only purpose of this is for notifications - progress_percent = helpers.get_percent(self.timeline['viewOffset'], db_session['duration']) - if progress_percent >= plexpy.CONFIG.NOTIFY_WATCHED_PERCENT and this_state != 'buffering': - threading.Thread(target=notification_handler.notify, - kwargs=dict(stream_data=db_session, notify_action='watched')).start() - else: # We don't have this session in our table yet, start a new one. if this_state != 'buffering': diff --git a/plexpy/activity_pinger.py b/plexpy/activity_pinger.py index 1b99cf05..18aed8de 100644 --- a/plexpy/activity_pinger.py +++ b/plexpy/activity_pinger.py @@ -1,4 +1,4 @@ -# This file is part of PlexPy. +# This file is part of PlexPy. # # PlexPy is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -48,6 +48,12 @@ def check_active_sessions(ws_request=False): for stream in db_streams: if any(d['session_key'] == str(stream['session_key']) and d['rating_key'] == str(stream['rating_key']) for d in media_container): + + if stream['view_offset'] and stream['duration']: + progress_percent = helpers.get_percent(stream['view_offset'], stream['duration']) + else: + progress_percent = None + # The user's session is still active for session in media_container: if session['session_key'] == str(stream['session_key']) and \ @@ -55,13 +61,13 @@ def check_active_sessions(ws_request=False): # The user is still playing the same media item # Here we can check the play states if session['state'] != stream['state']: - if session['state'] == 'paused': + if session['state'] == 'paused' and progress_percent < 99: # Push any notifications - # Push it on it's own thread so we don't hold up our db actions threading.Thread(target=notification_handler.notify, kwargs=dict(stream_data=stream, notify_action='pause')).start() - if session['state'] == 'playing' and stream['state'] == 'paused': + if session['state'] == 'playing' and stream['state'] == 'paused' and progress_percent < 99: # Push any notifications - # Push it on it's own thread so we don't hold up our db actions threading.Thread(target=notification_handler.notify, @@ -126,13 +132,11 @@ def check_active_sessions(ws_request=False): # Check if the user has reached the offset in the media we defined as the "watched" percent # Don't trigger if state is buffer as some clients push the progress to the end when # buffering on start. - if session['view_offset'] and session['duration'] and session['state'] != 'buffering': - if helpers.get_percent(session['view_offset'], - session['duration']) > plexpy.CONFIG.NOTIFY_WATCHED_PERCENT: - # Push any notifications - - # Push it on it's own thread so we don't hold up our db actions - threading.Thread(target=notification_handler.notify, - kwargs=dict(stream_data=stream, notify_action='watched')).start() + if progress_percent > plexpy.CONFIG.NOTIFY_WATCHED_PERCENT and session['state'] != 'buffering': + # Push any notifications - + # Push it on it's own thread so we don't hold up our db actions + threading.Thread(target=notification_handler.notify, + kwargs=dict(stream_data=stream, notify_action='watched')).start() else: # The user has stopped playing a stream @@ -141,18 +145,21 @@ def check_active_sessions(ws_request=False): monitor_db.action('DELETE FROM sessions WHERE session_key = ? AND rating_key = ?', [stream['session_key'], stream['rating_key']]) - # Check if the user has reached the offset in the media we defined as the "watched" percent if stream['view_offset'] and stream['duration']: - if helpers.get_percent(stream['view_offset'], - stream['duration']) > plexpy.CONFIG.NOTIFY_WATCHED_PERCENT: - # Push any notifications - - # Push it on it's own thread so we don't hold up our db actions - threading.Thread(target=notification_handler.notify, - kwargs=dict(stream_data=stream, notify_action='watched')).start() + progress_percent = helpers.get_percent(stream['view_offset'], stream['duration']) + else: + progress_percent = None - # Push any notifications - Push it on it's own thread so we don't hold up our db actions - threading.Thread(target=notification_handler.notify, - kwargs=dict(stream_data=stream, notify_action='stop')).start() + # Check if the user has reached the offset in the media we defined as the "watched" percent + if progress_percent > plexpy.CONFIG.NOTIFY_WATCHED_PERCENT: + # Push any notifications - + # Push it on it's own thread so we don't hold up our db actions + threading.Thread(target=notification_handler.notify, + kwargs=dict(stream_data=stream, notify_action='watched')).start() + else: + # Push any notifications - Push it on it's own thread so we don't hold up our db actions + threading.Thread(target=notification_handler.notify, + kwargs=dict(stream_data=stream, notify_action='stop')).start() # Write the item history on playback stop monitor_process.write_session_history(session=stream)