diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 000084b0..3adc935e 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -496,6 +496,12 @@ available_notification_agents = notifiers.available_notification_agents()

Set the progress percentage of when a watched notification should be triggered. Minimum 50, Maximum 95.

+
+ +

Disable to prevent consecutive notifications (i.e. both watched & stopped notifications).

+

Custom Notification Messages

diff --git a/plexpy/activity_handler.py b/plexpy/activity_handler.py index 33e72ceb..19cbed7f 100644 --- a/plexpy/activity_handler.py +++ b/plexpy/activity_handler.py @@ -86,7 +86,7 @@ class ActivityHandler(object): # Fire off notifications progress_percent = helpers.get_percent(self.timeline['viewOffset'], db_session['duration']) - if progress_percent < plexpy.CONFIG.NOTIFY_WATCHED_PERCENT: + if plexpy.CONFIG.NOTIFY_CONSECUTIVE or progress_percent < plexpy.CONFIG.NOTIFY_WATCHED_PERCENT: threading.Thread(target=notification_handler.notify, kwargs=dict(stream_data=db_session, notify_action='stop')).start() @@ -117,7 +117,7 @@ class ActivityHandler(object): # Fire off notifications progress_percent = helpers.get_percent(self.timeline['viewOffset'], db_session['duration']) - if progress_percent < 99: + if plexpy.CONFIG.NOTIFY_CONSECUTIVE or progress_percent < 99: threading.Thread(target=notification_handler.notify, kwargs=dict(stream_data=db_session, notify_action='pause')).start() @@ -141,7 +141,7 @@ class ActivityHandler(object): # Fire off notifications progress_percent = helpers.get_percent(self.timeline['viewOffset'], db_session['duration']) - if progress_percent < 99: + if plexpy.CONFIG.NOTIFY_CONSECUTIVE or progress_percent < 99: threading.Thread(target=notification_handler.notify, kwargs=dict(stream_data=db_session, notify_action='resume')).start() diff --git a/plexpy/activity_pinger.py b/plexpy/activity_pinger.py index 18aed8de..5955abe1 100644 --- a/plexpy/activity_pinger.py +++ b/plexpy/activity_pinger.py @@ -61,13 +61,15 @@ 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' and progress_percent < 99: + if session['state'] == 'paused' \ + and (plexpy.CONFIG.NOTIFY_CONSECUTIVE or 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' and progress_percent < 99: + if session['state'] == 'playing' and stream['state'] == 'paused' \ + and (plexpy.CONFIG.NOTIFY_CONSECUTIVE or 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, @@ -132,7 +134,7 @@ 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 progress_percent > plexpy.CONFIG.NOTIFY_WATCHED_PERCENT and session['state'] != 'buffering': + 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, @@ -151,12 +153,12 @@ def check_active_sessions(ws_request=False): progress_percent = None # 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: + if plexpy.CONFIG.NOTIFY_CONSECUTIVE or 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: + if plexpy.CONFIG.NOTIFY_CONSECUTIVE or 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='stop')).start() diff --git a/plexpy/config.py b/plexpy/config.py index c5e1c8a2..6810a693 100644 --- a/plexpy/config.py +++ b/plexpy/config.py @@ -122,6 +122,7 @@ _CONFIG_DEFINITIONS = { 'NMA_ON_RESUME': (int, 'NMA', 0), 'NMA_ON_BUFFER': (int, 'NMA', 0), 'NMA_ON_WATCHED': (int, 'NMA', 0), + 'NOTIFY_CONSECUTIVE': (int, 'Monitoring', 1), 'NOTIFY_WATCHED_PERCENT': (int, 'Monitoring', 85), 'NOTIFY_ON_START_SUBJECT_TEXT': (str, 'Monitoring', 'PlexPy ({server_name})'), 'NOTIFY_ON_START_BODY_TEXT': (str, 'Monitoring', '{user} ({player}) started playing {title}.'), diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 46bb3dc2..3129e493 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -439,6 +439,7 @@ class WebInterface(object): "music_logging_enable": checked(plexpy.CONFIG.MUSIC_LOGGING_ENABLE), "logging_ignore_interval": plexpy.CONFIG.LOGGING_IGNORE_INTERVAL, "pms_is_remote": checked(plexpy.CONFIG.PMS_IS_REMOTE), + "notify_consecutive": checked(plexpy.CONFIG.NOTIFY_CONSECUTIVE), "notify_watched_percent": plexpy.CONFIG.NOTIFY_WATCHED_PERCENT, "notify_on_start_subject_text": plexpy.CONFIG.NOTIFY_ON_START_SUBJECT_TEXT, "notify_on_start_body_text": plexpy.CONFIG.NOTIFY_ON_START_BODY_TEXT, @@ -476,7 +477,7 @@ class WebInterface(object): "tv_notify_on_stop", "movie_notify_on_stop", "music_notify_on_stop", "tv_notify_on_pause", "movie_notify_on_pause", "music_notify_on_pause", "refresh_users_on_startup", "ip_logging_enable", "video_logging_enable", "music_logging_enable", "pms_is_remote", "home_stats_type", - "group_history_tables" + "group_history_tables", "notify_consecutive" ] for checked_config in checked_configs: if checked_config not in kwargs: