diff --git a/data/interfaces/default/notification_triggers_modal.html b/data/interfaces/default/notification_triggers_modal.html
index 4ae0582a..2ca564fc 100644
--- a/data/interfaces/default/notification_triggers_modal.html
+++ b/data/interfaces/default/notification_triggers_modal.html
@@ -92,6 +92,13 @@ from plexpy import helpers
Trigger notification when the Plex Media Server can be reached externally after being down.
+
If you're using websocket monitoring, any server changes require a restart of PlexPy.
+
+
+ Monitor Plex Updates
+
+
Enable to have PlexPy check if updates are available for the Plex Media Server.
+ Note: The Plex updater is broken on certain Plex Pass version of Plex Media Server. PlexPy will automatically disable checking for Plex updates if one of these versions is found.
+
+
+
+ Monitor Plex Remote Access
+
+
+
Enable to have PlexPy check if remote access to the Plex Media Server goes down.
+
+
@@ -2061,6 +2113,7 @@ $(document).ready(function() {
url: 'get_server_identity',
async: true,
success: function(data) {
+ if (data.version){ $("#pms_version").text(data.version); }
var version = (data.version ? data.version.split('.') : null);
if (version && parseInt(version[0]) >= 0 && parseInt(version[1]) >= 9 && parseInt(version[2]) >= 14) {
$("#debugLogCheck").html("IP address is automatically logged for PMS version 0.9.14 and above.");
@@ -2091,7 +2144,7 @@ $(document).ready(function() {
function checkLogsPath() {
if ($("#pms_logs_folder").val().startsWith("%") || $("#pms_logs_folder").val().startsWith("~")) {
$("#pms-logs-shortcut").css("color", "#eb8600");
- pms_logs = false
+ pms_logs = false;
} else {
$("#pms-logs-shortcut").css("color", "#737373");
pms_logs = ($("#pms_logs_folder").val() == '' ? false : true);
diff --git a/plexpy/__init__.py b/plexpy/__init__.py
index 9e92bc62..2ea4c4db 100644
--- a/plexpy/__init__.py
+++ b/plexpy/__init__.py
@@ -306,6 +306,13 @@ def initialize_scheduler():
schedule_job(activity_pinger.check_recently_added, 'Check for recently added items',
hours=0, minutes=0, seconds=0)
+ if CONFIG.MONITOR_PMS_UPDATES:
+ schedule_job(activity_pinger.check_server_updates, 'Check for Plex updates',
+ hours=0, minutes=0, seconds=10)
+ else:
+ schedule_job(activity_pinger.check_server_updates, 'Check for Plex updates',
+ hours=0, minutes=0, seconds=0)
+
if CONFIG.MONITOR_REMOTE_ACCESS:
schedule_job(activity_pinger.check_server_response, 'Check for Plex remote access',
hours=0, minutes=0, seconds=seconds)
diff --git a/plexpy/activity_pinger.py b/plexpy/activity_pinger.py
index 84474577..a8791032 100644
--- a/plexpy/activity_pinger.py
+++ b/plexpy/activity_pinger.py
@@ -283,4 +283,31 @@ def check_server_response():
if ext_ping_count == 3:
# Fire off notifications
threading.Thread(target=notification_handler.notify_timeline,
- kwargs=dict(notify_action='extdown')).start()
\ No newline at end of file
+ kwargs=dict(notify_action='extdown')).start()
+
+
+def check_server_updates():
+
+ with monitor_lock:
+ logger.info(u"PlexPy Monitor :: Checking for PMS updates...")
+
+ pms_connect = pmsconnect.PmsConnect()
+
+ server_identity = pms_connect.get_server_identity()
+ update_status = pms_connect.get_update_staus()
+
+ if server_identity and update_status:
+ version = server_identity['version']
+ logger.info(u"PlexPy Monitor :: Current PMS version: %s", version)
+
+ if update_status['state'] == 'available':
+ update_version = update_status['version']
+ logger.info(u"PlexPy Monitor :: PMS update available version: %s", update_version)
+
+ # Check if any notification agents have notifications enabled
+ if any(d['on_pmsupdate'] for d in notifiers.available_notification_agents()):
+ # Fire off notifications
+ threading.Thread(target=notification_handler.notify_timeline,
+ kwargs=dict(notify_action='pmsupdate')).start()
+ else:
+ logger.info(u"PlexPy Monitor :: No PMS update available.")
\ No newline at end of file
diff --git a/plexpy/common.py b/plexpy/common.py
index 22716140..9dce4283 100644
--- a/plexpy/common.py
+++ b/plexpy/common.py
@@ -62,6 +62,7 @@ MEDIA_FLAGS_VIDEO = {'avc1': 'h264',
SCHEDULER_LIST = ['Check GitHub for updates',
'Check for active sessions',
'Check for recently added items',
+ 'Check for Plex updates',
'Check for Plex remote access',
'Refresh users list',
'Refresh libraries list',
diff --git a/plexpy/config.py b/plexpy/config.py
index d914ce6b..ccb05c6d 100644
--- a/plexpy/config.py
+++ b/plexpy/config.py
@@ -48,6 +48,7 @@ _CONFIG_DEFINITIONS = {
'BOXCAR_ON_INTDOWN': (int, 'Boxcar', 0),
'BOXCAR_ON_EXTUP': (int, 'Boxcar', 0),
'BOXCAR_ON_INTUP': (int, 'Boxcar', 0),
+ 'BOXCAR_ON_PMSUPDATE': (int, 'Boxcar', 0),
'BUFFER_THRESHOLD': (int, 'Monitoring', 3),
'BUFFER_WAIT': (int, 'Monitoring', 900),
'BACKUP_DIR': (str, 'General', ''),
@@ -81,6 +82,7 @@ _CONFIG_DEFINITIONS = {
'EMAIL_ON_INTDOWN': (int, 'Email', 0),
'EMAIL_ON_EXTUP': (int, 'Email', 0),
'EMAIL_ON_INTUP': (int, 'Email', 0),
+ 'EMAIL_ON_PMSUPDATE': (int, 'Email', 0),
'ENABLE_HTTPS': (int, 'General', 0),
'FACEBOOK_ENABLED': (int, 'Facebook', 0),
'FACEBOOK_REDIRECT_URI': (str, 'Facebook', ''),
@@ -102,6 +104,7 @@ _CONFIG_DEFINITIONS = {
'FACEBOOK_ON_INTDOWN': (int, 'Facebook', 0),
'FACEBOOK_ON_EXTUP': (int, 'Facebook', 0),
'FACEBOOK_ON_INTUP': (int, 'Facebook', 0),
+ 'FACEBOOK_ON_PMSUPDATE': (int, 'Facebook', 0),
'FIRST_RUN_COMPLETE': (int, 'General', 0),
'FREEZE_DB': (int, 'General', 0),
'GET_FILE_SIZES': (int, 'General', 0),
@@ -127,6 +130,7 @@ _CONFIG_DEFINITIONS = {
'GROWL_ON_INTDOWN': (int, 'Growl', 0),
'GROWL_ON_EXTUP': (int, 'Growl', 0),
'GROWL_ON_INTUP': (int, 'Growl', 0),
+ 'GROWL_ON_PMSUPDATE': (int, 'Growl', 0),
'HOME_LIBRARY_CARDS': (list, 'General', ['first_run']),
'HOME_STATS_LENGTH': (int, 'General', 30),
'HOME_STATS_TYPE': (int, 'General', 0),
@@ -160,6 +164,7 @@ _CONFIG_DEFINITIONS = {
'IFTTT_ON_INTDOWN': (int, 'IFTTT', 0),
'IFTTT_ON_EXTUP': (int, 'IFTTT', 0),
'IFTTT_ON_INTUP': (int, 'IFTTT', 0),
+ 'IFTTT_ON_PMSUPDATE': (int, 'IFTTT', 0),
'JOURNAL_MODE': (str, 'Advanced', 'wal'),
'LAUNCH_BROWSER': (int, 'General', 1),
'LOG_DIR': (str, 'General', ''),
@@ -174,6 +179,7 @@ _CONFIG_DEFINITIONS = {
'MUSIC_NOTIFY_ON_START': (int, 'Monitoring', 1),
'MUSIC_NOTIFY_ON_STOP': (int, 'Monitoring', 0),
'MUSIC_NOTIFY_ON_PAUSE': (int, 'Monitoring', 0),
+ 'MONITOR_PMS_UPDATES': (int, 'Monitoring', 0),
'MONITOR_REMOTE_ACCESS': (int, 'Monitoring', 0),
'MONITORING_INTERVAL': (int, 'Monitoring', 60),
'MONITORING_USE_WEBSOCKET': (int, 'Monitoring', 0),
@@ -191,6 +197,7 @@ _CONFIG_DEFINITIONS = {
'NMA_ON_INTDOWN': (int, 'NMA', 0),
'NMA_ON_EXTUP': (int, 'NMA', 0),
'NMA_ON_INTUP': (int, 'NMA', 0),
+ 'NMA_ON_PMSUPDATE': (int, 'NMA', 0),
'NOTIFY_CONSECUTIVE': (int, 'Monitoring', 1),
'NOTIFY_UPLOAD_POSTERS': (int, 'Monitoring', 0),
'NOTIFY_RECENTLY_ADDED': (int, 'Monitoring', 0),
@@ -219,6 +226,8 @@ _CONFIG_DEFINITIONS = {
'NOTIFY_ON_EXTUP_BODY_TEXT': (unicode, 'Monitoring', 'The Plex Media Server remote access is back up.'),
'NOTIFY_ON_INTUP_SUBJECT_TEXT': (unicode, 'Monitoring', 'PlexPy ({server_name})'),
'NOTIFY_ON_INTUP_BODY_TEXT': (unicode, 'Monitoring', 'The Plex Media Server is back up.'),
+ 'NOTIFY_ON_PMSUPDATE_SUBJECT_TEXT': (unicode, 'Monitoring', 'PlexPy ({server_name})'),
+ 'NOTIFY_ON_PMSUPDATE_BODY_TEXT': (unicode, 'Monitoring', 'An update is available for the Plex Media Server (version {update_version}).'),
'NOTIFY_SCRIPTS_ARGS_TEXT': (unicode, 'Monitoring', ''),
'OSX_NOTIFY_APP': (str, 'OSX_Notify', '/Applications/PlexPy'),
'OSX_NOTIFY_ENABLED': (int, 'OSX_Notify', 0),
@@ -233,6 +242,7 @@ _CONFIG_DEFINITIONS = {
'OSX_NOTIFY_ON_INTDOWN': (int, 'OSX_Notify', 0),
'OSX_NOTIFY_ON_EXTUP': (int, 'OSX_Notify', 0),
'OSX_NOTIFY_ON_INTUP': (int, 'OSX_Notify', 0),
+ 'OSX_NOTIFY_ON_PMSUPDATE': (int, 'OSX_Notify', 0),
'PLEX_CLIENT_HOST': (str, 'Plex', ''),
'PLEX_ENABLED': (int, 'Plex', 0),
'PLEX_PASSWORD': (str, 'Plex', ''),
@@ -248,6 +258,7 @@ _CONFIG_DEFINITIONS = {
'PLEX_ON_INTDOWN': (int, 'Plex', 0),
'PLEX_ON_EXTUP': (int, 'Plex', 0),
'PLEX_ON_INTUP': (int, 'Plex', 0),
+ 'PLEX_ON_PMSUPDATE': (int, 'Plex', 0),
'PROWL_ENABLED': (int, 'Prowl', 0),
'PROWL_KEYS': (str, 'Prowl', ''),
'PROWL_PRIORITY': (int, 'Prowl', 0),
@@ -262,6 +273,7 @@ _CONFIG_DEFINITIONS = {
'PROWL_ON_INTDOWN': (int, 'Prowl', 0),
'PROWL_ON_EXTUP': (int, 'Prowl', 0),
'PROWL_ON_INTUP': (int, 'Prowl', 0),
+ 'PROWL_ON_PMSUPDATE': (int, 'Prowl', 0),
'PUSHALOT_APIKEY': (str, 'Pushalot', ''),
'PUSHALOT_ENABLED': (int, 'Pushalot', 0),
'PUSHALOT_ON_PLAY': (int, 'Pushalot', 0),
@@ -275,6 +287,7 @@ _CONFIG_DEFINITIONS = {
'PUSHALOT_ON_INTDOWN': (int, 'Pushalot', 0),
'PUSHALOT_ON_EXTUP': (int, 'Pushalot', 0),
'PUSHALOT_ON_INTUP': (int, 'Pushalot', 0),
+ 'PUSHALOT_ON_PMSUPDATE': (int, 'Pushalot', 0),
'PUSHBULLET_APIKEY': (str, 'PushBullet', ''),
'PUSHBULLET_DEVICEID': (str, 'PushBullet', ''),
'PUSHBULLET_CHANNEL_TAG': (str, 'PushBullet', ''),
@@ -290,6 +303,7 @@ _CONFIG_DEFINITIONS = {
'PUSHBULLET_ON_INTDOWN': (int, 'PushBullet', 0),
'PUSHBULLET_ON_EXTUP': (int, 'PushBullet', 0),
'PUSHBULLET_ON_INTUP': (int, 'PushBullet', 0),
+ 'PUSHBULLET_ON_PMSUPDATE': (int, 'PushBullet', 0),
'PUSHOVER_APITOKEN': (str, 'Pushover', ''),
'PUSHOVER_ENABLED': (int, 'Pushover', 0),
'PUSHOVER_HTML_SUPPORT': (int, 'Pushover', 1),
@@ -307,6 +321,7 @@ _CONFIG_DEFINITIONS = {
'PUSHOVER_ON_INTDOWN': (int, 'Pushover', 0),
'PUSHOVER_ON_EXTUP': (int, 'Pushover', 0),
'PUSHOVER_ON_INTUP': (int, 'Pushover', 0),
+ 'PUSHOVER_ON_PMSUPDATE': (int, 'Pushover', 0),
'REFRESH_LIBRARIES_INTERVAL': (int, 'Monitoring', 12),
'REFRESH_LIBRARIES_ON_STARTUP': (int, 'Monitoring', 1),
'REFRESH_USERS_INTERVAL': (int, 'Monitoring', 12),
@@ -328,6 +343,7 @@ _CONFIG_DEFINITIONS = {
'SLACK_ON_INTDOWN': (int, 'Slack', 0),
'SLACK_ON_EXTUP': (int, 'Slack', 0),
'SLACK_ON_INTUP': (int, 'Slack', 0),
+ 'SLACK_ON_PMSUPDATE': (int, 'Slack', 0),
'SCRIPTS_ENABLED': (int, 'Scripts', 0),
'SCRIPTS_FOLDER': (unicode, 'Scripts', ''),
'SCRIPTS_ON_PLAY': (int, 'Scripts', 0),
@@ -341,6 +357,7 @@ _CONFIG_DEFINITIONS = {
'SCRIPTS_ON_EXTUP': (int, 'Scripts', 0),
'SCRIPTS_ON_INTDOWN': (int, 'Scripts', 0),
'SCRIPTS_ON_INTUP': (int, 'Scripts', 0),
+ 'SCRIPTS_ON_PMSUPDATE': (int, 'Scripts', 0),
'SCRIPTS_ON_PLAY_SCRIPT': (unicode, 'Scripts', ''),
'SCRIPTS_ON_STOP_SCRIPT': (unicode, 'Scripts', ''),
'SCRIPTS_ON_PAUSE_SCRIPT': (unicode, 'Scripts', ''),
@@ -352,6 +369,7 @@ _CONFIG_DEFINITIONS = {
'SCRIPTS_ON_EXTUP_SCRIPT': (unicode, 'Scripts', ''),
'SCRIPTS_ON_INTDOWN_SCRIPT': (unicode, 'Scripts', ''),
'SCRIPTS_ON_INTUP_SCRIPT': (unicode, 'Scripts', ''),
+ 'SCRIPTS_ON_PMSUPDATE_SCRIPT': (unicode, 'Scripts', ''),
'TELEGRAM_BOT_TOKEN': (str, 'Telegram', ''),
'TELEGRAM_ENABLED': (int, 'Telegram', 0),
'TELEGRAM_CHAT_ID': (str, 'Telegram', ''),
@@ -367,6 +385,7 @@ _CONFIG_DEFINITIONS = {
'TELEGRAM_ON_INTDOWN': (int, 'Telegram', 0),
'TELEGRAM_ON_EXTUP': (int, 'Telegram', 0),
'TELEGRAM_ON_INTUP': (int, 'Telegram', 0),
+ 'TELEGRAM_ON_PMSUPDATE': (int, 'Telegram', 0),
'TV_LOGGING_ENABLE': (int, 'Monitoring', 1),
'TV_NOTIFY_ENABLE': (int, 'Monitoring', 0),
'TV_NOTIFY_ON_START': (int, 'Monitoring', 1),
@@ -389,6 +408,7 @@ _CONFIG_DEFINITIONS = {
'TWITTER_ON_INTDOWN': (int, 'Twitter', 0),
'TWITTER_ON_EXTUP': (int, 'Twitter', 0),
'TWITTER_ON_INTUP': (int, 'Twitter', 0),
+ 'TWITTER_ON_PMSUPDATE': (int, 'Twitter', 0),
'UPDATE_DB_INTERVAL': (int, 'General', 24),
'UPDATE_SECTION_IDS': (int, 'General', 1),
'VERIFY_SSL_CERT': (bool_int, 'Advanced', 1),
@@ -407,7 +427,8 @@ _CONFIG_DEFINITIONS = {
'XBMC_ON_EXTDOWN': (int, 'XBMC', 0),
'XBMC_ON_INTDOWN': (int, 'XBMC', 0),
'XBMC_ON_EXTUP': (int, 'XBMC', 0),
- 'XBMC_ON_INTUP': (int, 'XBMC', 0)
+ 'XBMC_ON_INTUP': (int, 'XBMC', 0),
+ 'XBMC_ON_PMSUPDATE': (int, 'XBMC', 0)
}
diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py
index 43cc71ea..08520cdd 100644
--- a/plexpy/notification_handler.py
+++ b/plexpy/notification_handler.py
@@ -385,6 +385,24 @@ def notify_timeline(timeline_data=None, notify_action=None):
notify_strings=notify_strings,
metadata={})
+ if agent['on_pmsupdate'] and notify_action == 'pmsupdate':
+ # Build and send notification
+ notify_strings = build_server_notify_text(notify_action=notify_action,
+ agent_id=agent['id'])
+
+ notifiers.send_notification(agent_id=agent['id'],
+ subject=notify_strings[0],
+ body=notify_strings[1],
+ script_args=notify_strings[2],
+ notify_action=notify_action)
+
+ # Set the notification state in the db
+ set_notify_state(session={},
+ notify_action=notify_action,
+ agent_info=agent,
+ notify_strings=notify_strings,
+ metadata={})
+
else:
logger.debug(u"PlexPy NotificationHandler :: Notify timeline called but incomplete data received.")
@@ -452,6 +470,10 @@ def build_notify_text(session=None, timeline=None, notify_action=None, agent_id=
plex_tv = plextv.PlexTV()
server_times = plex_tv.get_server_times()
+ # Get the server version
+ pms_connect = pmsconnect.PmsConnect()
+ server_identity = pms_connect.get_server_identity()
+
if server_times:
updated_at = server_times[0]['updated_at']
server_uptime = helpers.human_duration(int(time.time() - helpers.cast_to_int(updated_at)))
@@ -510,21 +532,21 @@ def build_notify_text(session=None, timeline=None, notify_action=None, agent_id=
on_created_body = strip_tag(re.sub(pattern, '', plexpy.CONFIG.NOTIFY_ON_CREATED_BODY_TEXT), agent_id)
script_args_text = strip_tag(re.sub(pattern, '', plexpy.CONFIG.NOTIFY_SCRIPTS_ARGS_TEXT), agent_id)
else:
- on_start_subject = plexpy.CONFIG.NOTIFY_ON_START_SUBJECT_TEXT
- on_start_body = plexpy.CONFIG.NOTIFY_ON_START_BODY_TEXT
- on_stop_subject = plexpy.CONFIG.NOTIFY_ON_STOP_SUBJECT_TEXT
- on_stop_body = plexpy.CONFIG.NOTIFY_ON_STOP_BODY_TEXT
- on_pause_subject = plexpy.CONFIG.NOTIFY_ON_PAUSE_SUBJECT_TEXT
- on_pause_body = plexpy.CONFIG.NOTIFY_ON_PAUSE_BODY_TEXT
- on_resume_subject = plexpy.CONFIG.NOTIFY_ON_RESUME_SUBJECT_TEXT
- on_resume_body = plexpy.CONFIG.NOTIFY_ON_RESUME_BODY_TEXT
- on_buffer_subject = plexpy.CONFIG.NOTIFY_ON_BUFFER_SUBJECT_TEXT
- on_buffer_body = plexpy.CONFIG.NOTIFY_ON_BUFFER_BODY_TEXT
- on_watched_subject = plexpy.CONFIG.NOTIFY_ON_WATCHED_SUBJECT_TEXT
- on_watched_body = plexpy.CONFIG.NOTIFY_ON_WATCHED_BODY_TEXT
- on_created_subject = plexpy.CONFIG.NOTIFY_ON_CREATED_SUBJECT_TEXT
- on_created_body = plexpy.CONFIG.NOTIFY_ON_CREATED_BODY_TEXT
- script_args_text = plexpy.CONFIG.NOTIFY_SCRIPTS_ARGS_TEXT
+ on_start_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_START_SUBJECT_TEXT, agent_id)
+ on_start_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_START_BODY_TEXT, agent_id)
+ on_stop_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_STOP_SUBJECT_TEXT, agent_id)
+ on_stop_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_STOP_BODY_TEXT, agent_id)
+ on_pause_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_PAUSE_SUBJECT_TEXT, agent_id)
+ on_pause_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_PAUSE_BODY_TEXT, agent_id)
+ on_resume_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_RESUME_SUBJECT_TEXT, agent_id)
+ on_resume_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_RESUME_BODY_TEXT, agent_id)
+ on_buffer_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_BUFFER_SUBJECT_TEXT, agent_id)
+ on_buffer_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_BUFFER_BODY_TEXT, agent_id)
+ on_watched_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_WATCHED_SUBJECT_TEXT, agent_id)
+ on_watched_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_WATCHED_BODY_TEXT, agent_id)
+ on_created_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_CREATED_SUBJECT_TEXT, agent_id)
+ on_created_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_CREATED_BODY_TEXT, agent_id)
+ script_args_text = strip_tag(plexpy.CONFIG.NOTIFY_SCRIPTS_ARGS_TEXT, agent_id)
# Create a title
if metadata['media_type'] == 'episode' or metadata['media_type'] == 'track':
@@ -635,6 +657,7 @@ def build_notify_text(session=None, timeline=None, notify_action=None, agent_id=
available_params = {# Global paramaters
'server_name': server_name,
'server_uptime': server_uptime,
+ 'server_version': server_identity.get('version',''),
'action': notify_action.title(),
'datestamp': arrow.now().format(date_format),
'timestamp': arrow.now().format(time_format),
@@ -910,6 +933,14 @@ def build_server_notify_text(notify_action=None, agent_id=None):
plex_tv = plextv.PlexTV()
server_times = plex_tv.get_server_times()
+ # Get the server version
+ pms_connect = pmsconnect.PmsConnect()
+ server_identity = pms_connect.get_server_identity()
+
+ update_status = {}
+ if notify_action == 'pmsupdate':
+ update_status = pms_connect.get_update_staus()
+
if server_times:
updated_at = server_times[0]['updated_at']
server_uptime = helpers.human_duration(int(time.time() - helpers.cast_to_int(updated_at)))
@@ -919,22 +950,29 @@ def build_server_notify_text(notify_action=None, agent_id=None):
pattern = re.compile('\n*
[^>]+. \n*|\n*
[^>]+. \n*|\n*?
[^>]+. \n*', re.IGNORECASE | re.DOTALL)
- on_extdown_subject = plexpy.CONFIG.NOTIFY_ON_EXTDOWN_SUBJECT_TEXT
- on_extdown_body = plexpy.CONFIG.NOTIFY_ON_EXTDOWN_BODY_TEXT
- on_intdown_subject = plexpy.CONFIG.NOTIFY_ON_INTDOWN_SUBJECT_TEXT
- on_intdown_body = plexpy.CONFIG.NOTIFY_ON_INTDOWN_BODY_TEXT
- on_extup_subject = plexpy.CONFIG.NOTIFY_ON_EXTUP_SUBJECT_TEXT
- on_extup_body = plexpy.CONFIG.NOTIFY_ON_EXTUP_BODY_TEXT
- on_intup_subject = plexpy.CONFIG.NOTIFY_ON_INTUP_SUBJECT_TEXT
- on_intup_body = plexpy.CONFIG.NOTIFY_ON_INTUP_BODY_TEXT
- script_args_text = strip_tag(re.sub(pattern, '', plexpy.CONFIG.NOTIFY_SCRIPTS_ARGS_TEXT))
+ on_extdown_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_EXTDOWN_SUBJECT_TEXT, agent_id)
+ on_extdown_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_EXTDOWN_BODY_TEXT, agent_id)
+ on_intdown_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_INTDOWN_SUBJECT_TEXT, agent_id)
+ on_intdown_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_INTDOWN_BODY_TEXT, agent_id)
+ on_extup_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_EXTUP_SUBJECT_TEXT, agent_id)
+ on_extup_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_EXTUP_BODY_TEXT, agent_id)
+ on_intup_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_INTUP_SUBJECT_TEXT, agent_id)
+ on_intup_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_INTUP_BODY_TEXT, agent_id)
+ on_pmsupdate_subject = strip_tag(plexpy.CONFIG.NOTIFY_ON_PMSUPDATE_SUBJECT_TEXT, agent_id)
+ on_pmsupdate_body = strip_tag(plexpy.CONFIG.NOTIFY_ON_PMSUPDATE_BODY_TEXT, agent_id)
+ script_args_text = strip_tag(re.sub(pattern, '', plexpy.CONFIG.NOTIFY_SCRIPTS_ARGS_TEXT), agent_id)
available_params = {# Global paramaters
'server_name': server_name,
'server_uptime': server_uptime,
+ 'server_version': server_identity.get('version',''),
'action': notify_action.title(),
'datestamp': arrow.now().format(date_format),
- 'timestamp': arrow.now().format(time_format)}
+ 'timestamp': arrow.now().format(time_format),
+ # Update parameters
+ 'update_version': update_status.get('version',''),
+ 'update_url': update_status.get('download_url',''),
+ 'update_changelog': update_status.get('changelog','')}
# Default text
subject_text = 'PlexPy (%s)' % server_name
@@ -1040,6 +1078,29 @@ def build_server_notify_text(notify_action=None, agent_id=None):
else:
return [subject_text, body_text, script_args]
+ elif notify_action == 'pmsupdate':
+ # Default body text
+ body_text = 'An update is available for the Plex Media Server (version {update_version}).'
+
+ if on_pmsupdate_subject and on_pmsupdate_body:
+ try:
+ subject_text = unicode(on_pmsupdate_subject).format(**available_params)
+ except LookupError, e:
+ logger.error(u"PlexPy NotificationHandler :: Unable to parse field %s in notification subject. Using fallback." % e)
+ except:
+ logger.error(u"PlexPy NotificationHandler :: Unable to parse custom notification subject. Using fallback.")
+
+ try:
+ body_text = unicode(on_pmsupdate_body).format(**available_params)
+ except LookupError, e:
+ logger.error(u"PlexPy NotificationHandler :: Unable to parse field %s in notification body. Using fallback." % e)
+ except:
+ logger.error(u"PlexPy NotificationHandler :: Unable to parse custom notification body. Using fallback.")
+
+ return [subject_text, body_text, script_args]
+ else:
+ return [subject_text, body_text, script_args]
+
else:
return None
diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py
index c8bdc78d..17f67142 100644
--- a/plexpy/notifiers.py
+++ b/plexpy/notifiers.py
@@ -75,7 +75,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.GROWL_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.GROWL_ON_INTDOWN,
'on_extup': plexpy.CONFIG.GROWL_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.GROWL_ON_INTUP
+ 'on_intup': plexpy.CONFIG.GROWL_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.GROWL_ON_PMSUPDATE
},
{'name': 'Prowl',
'id': AGENT_IDS['Prowl'],
@@ -92,7 +93,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.PROWL_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.PROWL_ON_INTDOWN,
'on_extup': plexpy.CONFIG.PROWL_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.PROWL_ON_INTUP
+ 'on_intup': plexpy.CONFIG.PROWL_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.PROWL_ON_PMSUPDATE
},
{'name': 'XBMC',
'id': AGENT_IDS['XBMC'],
@@ -109,7 +111,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.XBMC_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.XBMC_ON_INTDOWN,
'on_extup': plexpy.CONFIG.XBMC_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.XBMC_ON_INTUP
+ 'on_intup': plexpy.CONFIG.XBMC_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.XBMC_ON_PMSUPDATE
},
{'name': 'Plex',
'id': AGENT_IDS['Plex'],
@@ -126,7 +129,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.PLEX_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.PLEX_ON_INTDOWN,
'on_extup': plexpy.CONFIG.PLEX_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.PLEX_ON_INTUP
+ 'on_intup': plexpy.CONFIG.PLEX_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.PLEX_ON_PMSUPDATE
},
{'name': 'NotifyMyAndroid',
'id': AGENT_IDS['NMA'],
@@ -143,7 +147,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.NMA_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.NMA_ON_INTDOWN,
'on_extup': plexpy.CONFIG.NMA_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.NMA_ON_INTUP
+ 'on_intup': plexpy.CONFIG.NMA_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.NMA_ON_PMSUPDATE
},
{'name': 'Pushalot',
'id': AGENT_IDS['Pushalot'],
@@ -160,7 +165,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.PUSHALOT_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.PUSHALOT_ON_INTDOWN,
'on_extup': plexpy.CONFIG.PUSHALOT_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.PUSHALOT_ON_INTUP
+ 'on_intup': plexpy.CONFIG.PUSHALOT_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.PUSHALOT_ON_PMSUPDATE
},
{'name': 'Pushbullet',
'id': AGENT_IDS['Pushbullet'],
@@ -177,7 +183,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.PUSHBULLET_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.PUSHBULLET_ON_INTDOWN,
'on_extup': plexpy.CONFIG.PUSHBULLET_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.PUSHBULLET_ON_INTUP
+ 'on_intup': plexpy.CONFIG.PUSHBULLET_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.PUSHBULLET_ON_PMSUPDATE
},
{'name': 'Pushover',
'id': AGENT_IDS['Pushover'],
@@ -194,7 +201,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.PUSHOVER_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.PUSHOVER_ON_INTDOWN,
'on_extup': plexpy.CONFIG.PUSHOVER_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.PUSHOVER_ON_INTUP
+ 'on_intup': plexpy.CONFIG.PUSHOVER_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.PUSHOVER_ON_PMSUPDATE
},
{'name': 'Boxcar2',
'id': AGENT_IDS['Boxcar2'],
@@ -211,7 +219,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.BOXCAR_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.BOXCAR_ON_INTDOWN,
'on_extup': plexpy.CONFIG.BOXCAR_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.BOXCAR_ON_INTUP
+ 'on_intup': plexpy.CONFIG.BOXCAR_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.BOXCAR_ON_PMSUPDATE
},
{'name': 'E-mail',
'id': AGENT_IDS['Email'],
@@ -228,7 +237,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.EMAIL_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.EMAIL_ON_INTDOWN,
'on_extup': plexpy.CONFIG.EMAIL_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.EMAIL_ON_INTUP
+ 'on_intup': plexpy.CONFIG.EMAIL_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.EMAIL_ON_PMSUPDATE
},
{'name': 'Twitter',
'id': AGENT_IDS['Twitter'],
@@ -245,7 +255,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.TWITTER_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.TWITTER_ON_INTDOWN,
'on_extup': plexpy.CONFIG.TWITTER_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.TWITTER_ON_INTUP
+ 'on_intup': plexpy.CONFIG.TWITTER_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.TWITTER_ON_PMSUPDATE
},
{'name': 'IFTTT',
'id': AGENT_IDS['IFTTT'],
@@ -262,7 +273,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.IFTTT_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.IFTTT_ON_INTDOWN,
'on_extup': plexpy.CONFIG.IFTTT_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.IFTTT_ON_INTUP
+ 'on_intup': plexpy.CONFIG.IFTTT_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.IFTTT_ON_PMSUPDATE
},
{'name': 'Telegram',
'id': AGENT_IDS['Telegram'],
@@ -279,7 +291,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.TELEGRAM_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.TELEGRAM_ON_INTDOWN,
'on_extup': plexpy.CONFIG.TELEGRAM_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.TELEGRAM_ON_INTUP
+ 'on_intup': plexpy.CONFIG.TELEGRAM_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.TELEGRAM_ON_PMSUPDATE
},
{'name': 'Slack',
'id': AGENT_IDS['Slack'],
@@ -296,7 +309,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.SLACK_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.SLACK_ON_INTDOWN,
'on_extup': plexpy.CONFIG.SLACK_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.SLACK_ON_INTUP
+ 'on_intup': plexpy.CONFIG.SLACK_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.SLACK_ON_PMSUPDATE
},
{'name': 'Scripts',
'id': AGENT_IDS['Scripts'],
@@ -313,7 +327,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.SCRIPTS_ON_EXTDOWN,
'on_extup': plexpy.CONFIG.SCRIPTS_ON_EXTUP,
'on_intdown': plexpy.CONFIG.SCRIPTS_ON_INTDOWN,
- 'on_intup': plexpy.CONFIG.SCRIPTS_ON_INTUP
+ 'on_intup': plexpy.CONFIG.SCRIPTS_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.SCRIPTS_ON_PMSUPDATE
},
{'name': 'Facebook',
'id': AGENT_IDS['Facebook'],
@@ -330,7 +345,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.FACEBOOK_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.FACEBOOK_ON_INTDOWN,
'on_extup': plexpy.CONFIG.FACEBOOK_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.FACEBOOK_ON_INTUP
+ 'on_intup': plexpy.CONFIG.FACEBOOK_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.FACEBOOK_ON_PMSUPDATE
}
]
@@ -352,7 +368,8 @@ def available_notification_agents():
'on_extdown': plexpy.CONFIG.OSX_NOTIFY_ON_EXTDOWN,
'on_intdown': plexpy.CONFIG.OSX_NOTIFY_ON_INTDOWN,
'on_extup': plexpy.CONFIG.OSX_NOTIFY_ON_EXTUP,
- 'on_intup': plexpy.CONFIG.OSX_NOTIFY_ON_INTUP
+ 'on_intup': plexpy.CONFIG.OSX_NOTIFY_ON_INTUP,
+ 'on_pmsupdate': plexpy.CONFIG.OSX_NOTIFY_ON_PMSUPDATE
})
return agents
@@ -1885,14 +1902,14 @@ class Scripts(object):
elif notify_action == 'resume':
script = plexpy.CONFIG.SCRIPTS_ON_RESUME_SCRIPT
+ elif notify_action == 'watched':
+ script = plexpy.CONFIG.SCRIPTS_ON_WATCHED_SCRIPT
+
elif notify_action == 'buffer':
script = plexpy.CONFIG.SCRIPTS_ON_BUFFER_SCRIPT
- elif notify_action == 'extdown':
- script = plexpy.CONFIG.SCRIPTS_ON_EXTDOWN_SCRIPT
-
- elif notify_action == 'extup':
- script = plexpy.CONFIG.SCRIPTS_ON_EXTUP_SCRIPT
+ elif notify_action == 'created':
+ script = plexpy.CONFIG.SCRIPTS_ON_CREATED_SCRIPT
elif notify_action == 'intdown':
script = plexpy.CONFIG.SCRIPTS_ON_INTDOWN_SCRIPT
@@ -1900,11 +1917,14 @@ class Scripts(object):
elif notify_action == 'intup':
script = plexpy.CONFIG.SCRIPTS_ON_INTUP_SCRIPT
- elif notify_action == 'created':
- script = plexpy.CONFIG.SCRIPTS_ON_CREATED_SCRIPT
+ elif notify_action == 'extdown':
+ script = plexpy.CONFIG.SCRIPTS_ON_EXTDOWN_SCRIPT
- elif notify_action == 'watched':
- script = plexpy.CONFIG.SCRIPTS_ON_WATCHED_SCRIPT
+ elif notify_action == 'extup':
+ script = plexpy.CONFIG.SCRIPTS_ON_EXTUP_SCRIPT
+
+ elif notify_action == 'pmsupdate':
+ script = plexpy.CONFIG.SCRIPTS_ON_PMSUPDATE_SCRIPT
else:
# For manual scripts
@@ -2046,13 +2066,6 @@ class Scripts(object):
'input_type': 'select',
'select_options': self.list_scripts()
},
- {'label': 'Plex Remote Access Down',
- 'value': plexpy.CONFIG.SCRIPTS_ON_EXTDOWN_SCRIPT,
- 'name': 'scripts_on_extdown_script',
- 'description': 'Choose the script for Plex remote access down.',
- 'input_type': 'select',
- 'select_options': self.list_scripts()
- },
{'label': 'Plex Server Down',
'value': plexpy.CONFIG.SCRIPTS_ON_INTDOWN_SCRIPT,
'name': 'scripts_on_intdown_script',
@@ -2060,6 +2073,20 @@ class Scripts(object):
'input_type': 'select',
'select_options': self.list_scripts()
},
+ {'label': 'Plex Server Back Up',
+ 'value': plexpy.CONFIG.SCRIPTS_ON_INTUP_SCRIPT,
+ 'name': 'scripts_on_intup_script',
+ 'description': 'Choose the script for Plex server back up.',
+ 'input_type': 'select',
+ 'select_options': self.list_scripts()
+ },
+ {'label': 'Plex Remote Access Down',
+ 'value': plexpy.CONFIG.SCRIPTS_ON_EXTDOWN_SCRIPT,
+ 'name': 'scripts_on_extdown_script',
+ 'description': 'Choose the script for Plex remote access down.',
+ 'input_type': 'select',
+ 'select_options': self.list_scripts()
+ },
{'label': 'Plex Remote Access Back Up',
'value': plexpy.CONFIG.SCRIPTS_ON_EXTUP_SCRIPT,
'name': 'scripts_on_extup_script',
@@ -2067,10 +2094,10 @@ class Scripts(object):
'input_type': 'select',
'select_options': self.list_scripts()
},
- {'label': 'Plex Server Back Up',
- 'value': plexpy.CONFIG.SCRIPTS_ON_INTUP_SCRIPT,
- 'name': 'scripts_on_intup_script',
- 'description': 'Choose the script for Plex server back up.',
+ {'label': 'Plex Update Available',
+ 'value': plexpy.CONFIG.SCRIPTS_ON_PMSUPDATE_SCRIPT,
+ 'name': 'scripts_on_pmsupdate_script',
+ 'description': 'Choose the script for Plex update available.',
'input_type': 'select',
'select_options': self.list_scripts()
}
diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py
index 05916f88..fc9c70b1 100644
--- a/plexpy/pmsconnect.py
+++ b/plexpy/pmsconnect.py
@@ -389,6 +389,38 @@ class PmsConnect(object):
return request
+ def put_updater(self, output_format=''):
+ """
+ Refresh updater status.
+
+ Optional parameters: output_format { dict, json }
+
+ Output: array
+ """
+ uri = '/updater/check?download=0'
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='PUT',
+ output_format=output_format)
+
+ return request
+
+ def get_updater(self, output_format=''):
+ """
+ Return updater status.
+
+ Optional parameters: output_format { dict, json }
+
+ Output: array
+ """
+ uri = '/updater/status'
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
+
+ return request
+
def get_recently_added_details(self, section_id='', count='0'):
"""
Return processed and validated list of recently added items.
@@ -1479,7 +1511,7 @@ class PmsConnect(object):
xml_head = identity.getElementsByTagName('MediaContainer')
except Exception as e:
logger.warn(u"PlexPy Pmsconnect :: Unable to parse XML for get_local_server_identity: %s." % e)
- return []
+ return {}
server_identity = {}
for a in xml_head:
@@ -1995,3 +2027,40 @@ class PmsConnect(object):
}
return server_response
+
+ def get_update_staus(self):
+ # Refresh the Plex updater status first
+ self.put_updater()
+ updater_status = self.get_updater(output_format='xml')
+
+ try:
+ xml_head = updater_status.getElementsByTagName('MediaContainer')
+ except Exception as e:
+ logger.warn(u"PlexPy Pmsconnect :: Unable to parse XML for get_update_staus: %s." % e)
+
+ # Catch the malformed XML on certain PMX version.
+ # XML parser helper returns empty list if there is an error parsing XML
+ if updater_status == []:
+ logger.warn(u"Plex API updater XML is broken on the current PMS version. Please update your PMS manually.")
+ logger.info(u"PlexPy is unable to check for Plex updates. Disabling check for Plex updates.")
+
+ # Disable check for Plex updates
+ plexpy.CONFIG.MONITOR_PMS_UPDATES = 0
+ plexpy.initialize_scheduler()
+ plexpy.CONFIG.write()
+
+ return {}
+
+ updater_info = {}
+ for a in xml_head:
+ if a.getElementsByTagName('Release'):
+ release = a.getElementsByTagName('Release')
+ for item in release:
+ updater_info = {'can_install': helpers.get_xml_attr(a, 'canInstall'),
+ 'download_url': helpers.get_xml_attr(a, 'downloadURL'),
+ 'version': helpers.get_xml_attr(item, 'version'),
+ 'state': helpers.get_xml_attr(item, 'state'),
+ 'changelog': helpers.get_xml_attr(item, 'fixed')
+ }
+
+ return updater_info
\ No newline at end of file
diff --git a/plexpy/webserve.py b/plexpy/webserve.py
index 2e120524..4cf0ca23 100644
--- a/plexpy/webserve.py
+++ b/plexpy/webserve.py
@@ -1179,6 +1179,7 @@ class WebInterface(object):
"tv_notify_on_pause": checked(plexpy.CONFIG.TV_NOTIFY_ON_PAUSE),
"movie_notify_on_pause": checked(plexpy.CONFIG.MOVIE_NOTIFY_ON_PAUSE),
"music_notify_on_pause": checked(plexpy.CONFIG.MUSIC_NOTIFY_ON_PAUSE),
+ "monitor_pms_updates": checked(plexpy.CONFIG.MONITOR_PMS_UPDATES),
"monitor_remote_access": checked(plexpy.CONFIG.MONITOR_REMOTE_ACCESS),
"monitoring_interval": plexpy.CONFIG.MONITORING_INTERVAL,
"monitoring_use_websocket": checked(plexpy.CONFIG.MONITORING_USE_WEBSOCKET),
@@ -1220,6 +1221,8 @@ class WebInterface(object):
"notify_on_extup_body_text": plexpy.CONFIG.NOTIFY_ON_EXTUP_BODY_TEXT,
"notify_on_intup_subject_text": plexpy.CONFIG.NOTIFY_ON_INTUP_SUBJECT_TEXT,
"notify_on_intup_body_text": plexpy.CONFIG.NOTIFY_ON_INTUP_BODY_TEXT,
+ "notify_on_pmsupdate_subject_text": plexpy.CONFIG.NOTIFY_ON_PMSUPDATE_SUBJECT_TEXT,
+ "notify_on_pmsupdate_body_text": plexpy.CONFIG.NOTIFY_ON_PMSUPDATE_BODY_TEXT,
"notify_scripts_args_text": plexpy.CONFIG.NOTIFY_SCRIPTS_ARGS_TEXT,
"home_stats_length": plexpy.CONFIG.HOME_STATS_LENGTH,
"home_stats_type": checked(plexpy.CONFIG.HOME_STATS_TYPE),
@@ -1247,7 +1250,8 @@ class WebInterface(object):
"refresh_libraries_on_startup", "refresh_users_on_startup",
"ip_logging_enable", "movie_logging_enable", "tv_logging_enable", "music_logging_enable",
"pms_is_remote", "home_stats_type", "group_history_tables", "notify_consecutive", "notify_upload_posters",
- "notify_recently_added", "notify_recently_added_grandparent", "monitor_remote_access", "get_file_sizes"
+ "notify_recently_added", "notify_recently_added_grandparent",
+ "monitor_pms_updates", "monitor_remote_access", "get_file_sizes"
]
for checked_config in checked_configs:
if checked_config not in kwargs:
@@ -1276,6 +1280,7 @@ class WebInterface(object):
kwargs.get('refresh_libraries_interval') != str(plexpy.CONFIG.REFRESH_LIBRARIES_INTERVAL) or \
kwargs.get('refresh_users_interval') != str(plexpy.CONFIG.REFRESH_USERS_INTERVAL) or \
kwargs.get('notify_recently_added') != str(plexpy.CONFIG.NOTIFY_RECENTLY_ADDED) or \
+ kwargs.get('monitor_pms_updates') != str(plexpy.CONFIG.MONITOR_PMS_UPDATES) or \
kwargs.get('monitor_remote_access') != str(plexpy.CONFIG.MONITOR_REMOTE_ACCESS):
reschedule = True
@@ -2185,3 +2190,9 @@ class WebInterface(object):
a = Api()
a.checkParams(*args, **kwargs)
return a.fetchData()
+
+ @cherrypy.expose
+ def check_pms_updater(self):
+ pms_connect = pmsconnect.PmsConnect()
+ result = pms_connect.get_update_staus()
+ return json.dumps(result)
\ No newline at end of file