diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 2ae60de4..3d78c3e4 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -902,6 +902,10 @@ available_notification_agents = sorted(notifiers.available_notification_agents() {server_name} The name of your Plex Server. + + {server_uptime} + The uptime (in days, hours, mins, secs) of your Plex Server. + {user} The username of the person streaming. diff --git a/plexpy/activity_pinger.py b/plexpy/activity_pinger.py index c1701769..d01b49c1 100644 --- a/plexpy/activity_pinger.py +++ b/plexpy/activity_pinger.py @@ -26,6 +26,8 @@ ping_count = 0 def check_active_sessions(ws_request=False): with monitor_lock: + global ping_count + pms_connect = pmsconnect.PmsConnect() session_list = pms_connect.get_current_activity() monitor_db = database.MonitorDatabase() @@ -33,6 +35,7 @@ def check_active_sessions(ws_request=False): # logger.debug(u"PlexPy Monitor :: Checking for active streams.") if session_list: + ping_count = 0 media_container = session_list['sessions'] # Check our temp table for what we must do with the new streams @@ -164,7 +167,6 @@ def check_active_sessions(ws_request=False): else: logger.debug(u"PlexPy Monitor :: Unable to read session list.") response = pms_connect.get_server_response() - global ping_count if not response: ping_count += 1 diff --git a/plexpy/helpers.py b/plexpy/helpers.py index f81cbd84..fbefaaa1 100644 --- a/plexpy/helpers.py +++ b/plexpy/helpers.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 @@ -144,6 +144,31 @@ def now(): now = datetime.datetime.now() return now.strftime("%Y-%m-%d %H:%M:%S") +def human_duration(s): + + hd = '' + + if str(s).isdigit(): + d = int(s / 84600) + h = int((s % 84600) / 3600) + m = int(((s % 84600) % 3600) / 60) + s = int(((s % 84600) % 3600) % 60) + + hd_list = [] + if d > 0: + hd_list.append(str(d) + ' days') + if h > 0: + hd_list.append(str(h) + ' hrs') + if m > 0: + hd_list.append(str(m) + ' mins') + if s > 0: + hd_list.append(str(s) + ' secs') + + hd = ' '.join(hd_list) + + return hd + else: + return hd def get_age(date): diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index c9db601a..09a3a417 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -13,7 +13,7 @@ # You should have received a copy of the GNU General Public License # along with PlexPy. If not, see . -from plexpy import logger, config, notifiers, database, helpers +from plexpy import logger, config, notifiers, database, helpers, plextv, pmsconnect import plexpy import time @@ -269,12 +269,22 @@ def set_notify_state(session, state, agent_info): def build_notify_text(session=None, timeline=None, state=None): - from plexpy import pmsconnect import re # Get the server name server_name = plexpy.CONFIG.PMS_NAME + # Get the server uptime + plex_tv = plextv.PlexTV() + server_times = plex_tv.get_server_times() + + if server_times: + updated_at = server_times[0]['updated_at'] + server_uptime = helpers.human_duration(int(time.time() - helpers.cast_to_float(updated_at))) + else: + logger.error(u"PlexPy Notifier :: Unable to retrieve server uptime.") + server_uptime = 'N/A' + # Get metadata feed for item if session: rating_key = session['rating_key'] @@ -388,6 +398,7 @@ def build_notify_text(session=None, timeline=None, state=None): progress_percent = helpers.get_percent(view_offset, duration) available_params = {'server_name': server_name, + 'server_uptime': server_uptime, 'user': user, 'platform': platform, 'player': player, @@ -597,10 +608,22 @@ def build_server_notify_text(state=None): # Get the server name server_name = plexpy.CONFIG.PMS_NAME + # Get the server uptime + plex_tv = plextv.PlexTV() + server_times = plex_tv.get_server_times() + + if server_times: + updated_at = server_times[0]['updated_at'] + server_uptime = helpers.human_duration(int(time.time() - helpers.cast_to_float(updated_at))) + else: + logger.error(u"PlexPy Notifier :: Unable to retrieve server uptime.") + server_uptime = 'N/A' + on_down_subject = plexpy.CONFIG.NOTIFY_ON_DOWN_SUBJECT_TEXT on_down_body = plexpy.CONFIG.NOTIFY_ON_DOWN_BODY_TEXT - available_params = {'server_name': server_name} + available_params = {'server_name': server_name, + 'server_uptime': server_uptime} # Default text subject_text = 'PlexPy (%s)' % server_name diff --git a/plexpy/plextv.py b/plexpy/plextv.py index 03372fdc..4610121a 100644 --- a/plexpy/plextv.py +++ b/plexpy/plextv.py @@ -444,3 +444,22 @@ class PlexTV(object): return clean_servers return json.dumps(clean_servers, indent=4) + + def get_server_times(self): + servers = self.get_plextv_server_list(output_format='xml') + server_times = [] + + try: + xml_head = servers.getElementsByTagName('Server') + except: + logger.warn("Error parsing XML for Plex servers.") + return [] + + for a in xml_head: + if helpers.get_xml_attr(a, 'machineIdentifier') == plexpy.CONFIG.PMS_IDENTIFIER: + server_times.append({"created_at": helpers.get_xml_attr(a, 'createdAt'), + "updated_at": helpers.get_xml_attr(a, 'updatedAt') + }) + break + + return server_times