From 795d7d0a93e95faf93fa0d98cea3c4b8f19477e9 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Tue, 1 Mar 2016 21:04:57 -0800 Subject: [PATCH] Add ability to get notified of PMS updates --- .../default/notification_triggers_modal.html | 7 ++ data/interfaces/default/settings.html | 73 ++++++++++-- plexpy/__init__.py | 7 ++ plexpy/activity_pinger.py | 29 ++++- plexpy/common.py | 1 + plexpy/config.py | 23 +++- plexpy/notification_handler.py | 111 ++++++++++++++---- plexpy/notifiers.py | 101 ++++++++++------ plexpy/pmsconnect.py | 71 ++++++++++- plexpy/webserve.py | 13 +- 10 files changed, 360 insertions(+), 76 deletions(-) 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.

+
+ +

Trigger notification when an update for the Plex Media Server is available.

+
diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 75bbe41e..e883e17f 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -43,7 +43,7 @@ available_notification_agents = sorted(notifiers.available_notification_agents()
  • Plex Media Server
  • Plex.tv Account
  • Extra Settings
  • -
  • Monitoring
  • +
  • Activity Monitoring
  • Notifications
  • Notification Agents
  • @@ -437,9 +437,24 @@ available_notification_agents = sorted(notifiers.available_notification_agents()
    -

    Plex Media Server

    +

    Plex Media Server Version unknown

    If you're using websocket monitoring, any server changes require a restart of PlexPy.

    +
    + +

    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.

    +
    +
    + + +

    Enable to have PlexPy check if remote access to the Plex Media Server goes down.

    +
    +
    @@ -613,13 +628,6 @@ available_notification_agents = sorted(notifiers.available_notification_agents()

    Instead of polling the server at regular intervals let the server tell PlexPy when something happens.

    -
    - - -

    Enable to have PlexPy check if remote access to the Plex Media Server goes down.

    -

    History Logging

    @@ -971,6 +979,23 @@ available_notification_agents = sorted(notifiers.available_notification_agents() +
  • + + +
    • @@ -1368,6 +1393,10 @@ available_notification_agents = sorted(notifiers.available_notification_agents() {server_uptime} The uptime (in days, hours, mins, secs) of your Plex Server. + + {server_version} + The current version of your Plex Server. + {action} The action that triggered the notification. @@ -1699,6 +1728,29 @@ available_notification_agents = sorted(notifiers.available_notification_agents() + + + + + + + + + + + + + + + + + + + + +
      + Plex Update Available +
      {update_version}The available update version for your Plex Server.
      {update_url}The available update download URL.
      {update_changelog}The changelog for the available update.
    @@ -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