diff --git a/data/interfaces/default/js/tables/logs.js b/data/interfaces/default/js/tables/logs.js index 626fabf4..f9abf837 100644 --- a/data/interfaces/default/js/tables/logs.js +++ b/data/interfaces/default/js/tables/logs.js @@ -19,11 +19,13 @@ var log_table_options = { "columnDefs": [ { "targets": [0], - "width": "15%" + "width": "15%", + "className": "no-wrap" }, { "targets": [1], - "width": "10%" + "width": "10%", + "className": "no-wrap" }, { "targets": [2], diff --git a/data/interfaces/default/js/tables/plex_logs.js b/data/interfaces/default/js/tables/plex_logs.js index 46e7792f..efc8137d 100644 --- a/data/interfaces/default/js/tables/plex_logs.js +++ b/data/interfaces/default/js/tables/plex_logs.js @@ -19,11 +19,13 @@ var plex_log_table_options = { "columnDefs": [ { "targets": [0], - "width": "15%" + "width": "15%", + "className": "no-wrap" }, { "targets": [1], - "width": "10%" + "width": "10%", + "className": "no-wrap" }, { "targets": [2], diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 5fccea03..c7a4a1d2 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -29,7 +29,7 @@ import uuid from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.interval import IntervalTrigger -from plexpy import versioncheck, logger, monitor +from plexpy import versioncheck, logger, monitor, plextv import plexpy.config PROG_DIR = None @@ -162,6 +162,10 @@ def initialize(config_file): else: LATEST_VERSION = CURRENT_VERSION + # Refresh the users list on startup + if CONFIG.PMS_TOKEN: + plextv.refresh_users() + # Store the original umask UMASK = os.umask(0) os.umask(UMASK) @@ -249,16 +253,21 @@ def initialize_scheduler(): # Check if scheduler should be started start_jobs = not len(SCHED.get_jobs()) - #Update check + # Update check if CONFIG.CHECK_GITHUB_INTERVAL: minutes = CONFIG.CHECK_GITHUB_INTERVAL else: minutes = 0 schedule_job(versioncheck.checkGithub, 'Check GitHub for updates', hours=0, minutes=minutes) + # Start checking for new sessions every minute if CONFIG.PMS_IP: schedule_job(monitor.check_active_sessions, 'Check for active sessions', hours=0, minutes=0, seconds=60) + # Refresh the users list every 12 hours (we will make this configurable later) + if CONFIG.PMS_TOKEN: + schedule_job(plextv.refresh_users, 'Refresh users list', hours=12, minutes=0, seconds=0) + # Start scheduler if start_jobs and len(SCHED.get_jobs()): try: diff --git a/plexpy/log_reader.py b/plexpy/log_reader.py index e97a13e6..6aa85ecc 100644 --- a/plexpy/log_reader.py +++ b/plexpy/log_reader.py @@ -32,13 +32,23 @@ def get_log_tail(window=20): return [] log_lines = tail(logfile, window) + + line_error = False clean_lines = [] for i in log_lines: - log_time = i.split(' [')[0] - log_level = i.split('] ', 1)[1].split(' - ',1)[0] - log_msg = i.split('] ', 1)[1].split(' - ',1)[1] - full_line = [log_time, log_level, log_msg] - clean_lines.append(full_line) + try: + log_time = i.split(' [')[0] + log_level = i.split('] ', 1)[1].split(' - ',1)[0] + log_msg = i.split('] ', 1)[1].split(' - ',1)[1] + full_line = [log_time, log_level, log_msg] + clean_lines.append(full_line) + except: + line_error = True + full_line = ['', '', 'Unable to parse log line.'] + clean_lines.append(full_line) + + if line_error: + logger.error('PlexPy was unable to parse some lines of the Plex Media Server log.') return clean_lines diff --git a/plexpy/plextv.py b/plexpy/plextv.py index 7967b3e6..e0f8bb5c 100644 --- a/plexpy/plextv.py +++ b/plexpy/plextv.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, helpers, plexwatch +from plexpy import logger, helpers, plexwatch, db from xml.dom import minidom from httplib import HTTPSConnection @@ -21,6 +21,29 @@ from httplib import HTTPSConnection import base64 import plexpy +def refresh_users(): + logger.info("Requesting users list refresh...") + result = PlexTV().get_full_users_list() + pw_db = db.DBConnection() + + if len(result) > 0: + for item in result: + control_value_dict = {"username": item['username']} + new_value_dict = {"user_id": item['user_id'], + "username": item['username'], + "thumb": item['thumb'], + "email": item['email'], + "is_home_user": item['is_home_user'], + "is_allow_sync": item['is_allow_sync'], + "is_restricted": item['is_restricted'] + } + + pw_db.upsert('plexpy_users', new_value_dict, control_value_dict) + + logger.info("Users list refreshed.") + else: + logger.warn("Unable to refresh users list.") + class PlexTV(object): """ @@ -232,8 +255,10 @@ class PlexTV(object): xml_parse = minidom.parseString(own_account) except Exception, e: logger.warn("Error parsing XML for Plex account details: %s" % e) + return [] except: logger.warn("Error parsing XML for Plex account details.") + return [] xml_head = xml_parse.getElementsByTagName('user') if not xml_head: @@ -286,8 +311,10 @@ class PlexTV(object): xml_parse = minidom.parseString(sync_list) except Exception, e: logger.warn("Error parsing XML for Plex sync lists: %s" % e) + return [] except: logger.warn("Error parsing XML for Plex sync lists.") + return [] xml_head = xml_parse.getElementsByTagName('SyncList') diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 4542d65a..1137cef2 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -903,24 +903,7 @@ class WebInterface(object): @cherrypy.expose def refresh_users_list(self, **kwargs): - plex_tv = plextv.PlexTV() - result = plex_tv.get_full_users_list() - myDB = db.DBConnection() - - for item in result: - control_value_dict = {"username": item['username']} - new_value_dict = {"user_id": item['user_id'], - "username": item['username'], - "thumb": item['thumb'], - "email": item['email'], - "is_home_user": item['is_home_user'], - "is_allow_sync": item['is_allow_sync'], - "is_restricted": item['is_restricted'] - } - - myDB.upsert('plexpy_users', new_value_dict, control_value_dict) - - logger.info("Users list refreshed.") + plextv.refresh_users() raise cherrypy.HTTPRedirect("users") @cherrypy.expose