random fixes

This commit is contained in:
tyler breese 2023-11-06 23:09:37 -05:00
commit 837d71712e
5 changed files with 61 additions and 63 deletions

View file

@ -490,8 +490,8 @@ def initialize_scheduler():
schedule_job(activity_pinger.connect_server, 'Check for server response', schedule_job(activity_pinger.connect_server, 'Check for server response',
hours=0, minutes=0, seconds=0) hours=0, minutes=0, seconds=0)
# schedule_job(web_socket.send_ping, 'Websocket ping', schedule_job(web_socket.send_ping, 'Websocket ping',
# hours=0, minutes=0, seconds=10 * bool(CONFIG.WEBSOCKET_MONITOR_PING_PONG)) hours=0, minutes=0, seconds=10 * bool(CONFIG.WEBSOCKET_MONITOR_PING_PONG))
else: else:
# Cancel all jobs # Cancel all jobs
@ -2762,8 +2762,7 @@ def shutdown(restart=False, update=False, checkout=False, reset=False):
webstart.stop() webstart.stop()
# Shutdown the websocket connection # Shutdown the websocket connection
if WEBSOCKET: web_socket.shutdown()
web_socket.shutdown()
if SCHED.running: if SCHED.running:
SCHED.shutdown(wait=False) SCHED.shutdown(wait=False)

View file

@ -1143,7 +1143,9 @@ class DataFactory(object):
if (parts[0] not in libraries): if (parts[0] not in libraries):
libraries[parts[0]] = [] libraries[parts[0]] = []
libraries[parts[0]].append(parts[1]) libraries[parts[0]].append(parts[1])
if len(libraries) < 1:
logger.warn("Tautulli DataFactory :: Unable to execute database query for get_library_stats")
return None
try: try:
query = "SELECT ls.id, ls.section_id, ls.section_name, ls.section_type, ls.thumb AS library_thumb, " \ query = "SELECT ls.id, ls.section_id, ls.section_name, ls.section_type, ls.thumb AS library_thumb, " \
"ls.custom_thumb_url AS custom_thumb, ls.art AS library_art, ls.custom_art_url AS custom_art, " \ "ls.custom_thumb_url AS custom_thumb, ls.art AS library_art, ls.custom_art_url AS custom_art, " \
@ -1153,17 +1155,17 @@ class DataFactory(object):
"sh.rating_key, shm.grandparent_rating_key, shm.thumb, shm.grandparent_thumb, " \ "sh.rating_key, shm.grandparent_rating_key, shm.thumb, shm.grandparent_thumb, " \
"sh.user, sh.user_id, sh.player, " \ "sh.user, sh.user_id, sh.player, " \
"shm.art, sh.media_type, shm.content_rating, shm.labels, shm.live, shm.guid, " \ "shm.art, sh.media_type, shm.content_rating, shm.labels, shm.live, shm.guid, " \
"MAX(sh.started) AS last_watch, ls.server_id as server_id " \ "ls.server_id as server_id " \
"FROM library_sections AS ls " \ "FROM library_sections AS ls " \
"LEFT OUTER JOIN session_history AS sh ON ls.section_id = sh.section_id AND ls.server_id = sh.server_id " \ "LEFT OUTER JOIN session_history AS sh ON ls.section_id = sh.section_id AND ls.server_id = sh.server_id " \
"LEFT OUTER JOIN session_history_metadata AS shm ON sh.id = shm.id AND sh.server_id = shm.server_id " "LEFT OUTER JOIN session_history_metadata AS shm ON sh.id = shm.id AND sh.server_id = shm.server_id WHERE "
query_parts = [] query_parts = []
for library in libraries: for library in libraries:
query_parts.append("(ls.section_id IN (" + ",".join(libraries[library]) + ") AND ls.deleted_section = 0 AND ls.server_id = '" + library +"' )") query_parts.append("(ls.section_id IN (" + ",".join(libraries[library]) + ") AND ls.deleted_section = 0 AND ls.server_id = '" + library +"' )")
query +=(" or ").join(query_parts) query +=(" or ").join(query_parts)
query += "ORDER BY ls.section_type, ls.count DESC, ls.parent_count DESC, ls.child_count DESC " query += " GROUP BY ls.section_id, ls.server_id ORDER BY ls.section_type, ls.count DESC, ls.parent_count DESC, ls.child_count DESC "
result = monitor_db.select(query) result = monitor_db.select(query)
except Exception as e: except Exception as e:
logger.warn("Tautulli DataFactory :: Unable to execute database query for get_library_stats: %s." % e) logger.warn("Tautulli DataFactory :: Unable to execute database query for get_library_stats: %s." % e)

View file

@ -2373,7 +2373,7 @@ class PmsConnect(object):
if session_id: if session_id:
logger.info("Tautulli Pmsconnect :: Terminating session %s (session_id %s)." % (session_key, session_id)) logger.info("Tautulli Pmsconnect :: Terminating session %s (session_id %s)." % (session_key, session_id))
response = self.get_sessions_terminate(session_id=session_id, reason=message, server_id=self.server_id) response = self.get_sessions_terminate(session_id=session_id, reason=message)
return response.ok return response.ok
else: else:
msg = 'Missing session_id' msg = 'Missing session_id'

View file

@ -55,13 +55,20 @@ pong_timer = None
pong_count = 0 pong_count = 0
ws_list = [] ws_list = []
def isServerUp(): def isServerUp():
for ws in ws_list: for ws in ws_list:
if ws.WS_CONNECTED: if ws.WS_CONNECTED:
return True return True
return False return False
def shutdown():
for ws in ws_list:
ws.shutdown()
def send_ping():
for ws in ws_list:
ws.send_ping()
def start_threads(): def start_threads():
try: try:
# Check for any existing sessions on start up # Check for any existing sessions on start up
@ -80,15 +87,13 @@ def start_threads():
for owned_server in owned_servers: for owned_server in owned_servers:
for server in plex_servers: for server in plex_servers:
if owned_server.server_id == server['pms_identifier']: if owned_server.server_id == server['pms_identifier']:
for connection in server['connections']: wss=WebSocketServer(server['connections'], owned_server.server_id)
if connection['local']: ws_list.append(wss)
wss=WebSocketServer(connection, owned_server.server_id) thread = threading.Thread(target=wss.run)
ws_list.append(wss) thread.daemon = True
thread = threading.Thread(target=wss.run) thread.start()
thread.daemon = True
thread.start() continue
break
break
class WebSocketServer(object): class WebSocketServer(object):
@ -193,53 +198,45 @@ class WebSocketServer(object):
def run(self): def run(self):
# try local first
if self.server:
for connection in self.server:
if plexpy.CONFIG.PMS_SSL:
uri = connection['uri'].replace('https://', 'wss://') + '/:/websockets/notifications'
secure = 'secure '
if plexpy.CONFIG.VERIFY_SSL_CERT:
sslopt = {'ca_certs': certifi.where()}
else:
sslopt = {'cert_reqs': ssl.CERT_NONE}
else:
uri = 'ws://%s:%s/:/websockets/notifications' % (
connection['address'],
connection['port']
)
secure = ''
sslopt = None
if plexpy.CONFIG.PMS_SSL: # Set authentication token (if one is available)
uri = "" if plexpy.CONFIG.PMS_TOKEN:
if self.server: header = {"X-Plex-Token": plexpy.CONFIG.PMS_TOKEN}
uri = self.server['uri'].replace('https://', 'wss://') + '/:/websockets/notifications' else:
else: header = None
uri = plexpy.CONFIG.PMS_URL.replace('https://', 'wss://') + '/:/websockets/notifications'
secure = 'secure '
if plexpy.CONFIG.VERIFY_SSL_CERT:
sslopt = {'ca_certs': certifi.where()}
else:
sslopt = {'cert_reqs': ssl.CERT_NONE}
else:
uri = ""
if self.server:
uri = 'ws://%s:%s/:/websockets/notifications' % (
self.server['address'],
self.server['port']
)
else:
uri = 'ws://%s:%s/:/websockets/notifications' % (
plexpy.CONFIG.PMS_IP,
plexpy.CONFIG.PMS_PORT
)
secure = ''
sslopt = None
# Set authentication token (if one is available) timeout = plexpy.CONFIG.PMS_TIMEOUT
if plexpy.CONFIG.PMS_TOKEN:
header = {"X-Plex-Token": plexpy.CONFIG.PMS_TOKEN}
else:
header = None
timeout = plexpy.CONFIG.PMS_TIMEOUT global ws_shutdown
ws_shutdown = False
reconnects = 0
global ws_shutdown # Try an open the websocket connection
ws_shutdown = False logger.info("Tautulli WebSocket :: Opening %swebsocket." % secure)
reconnects = 0 try:
self.WEBSOCKET = create_connection(uri, timeout=timeout, header=header, sslopt=sslopt)
# Try an open the websocket connection logger.info("Tautulli WebSocket :: Ready")
logger.info("Tautulli WebSocket :: Opening %swebsocket." % secure) self.WS_CONNECTED = True
try: break
self.WEBSOCKET = create_connection(uri, timeout=timeout, header=header, sslopt=sslopt) except (websocket.WebSocketException, IOError, Exception) as e:
logger.info("Tautulli WebSocket :: Ready") logger.error("Tautulli WebSocket :: %s.", e)
self.WS_CONNECTED = True
except (websocket.WebSocketException, IOError, Exception) as e:
logger.error("Tautulli WebSocket :: %s.", e)
if self.WS_CONNECTED: if self.WS_CONNECTED:
self.on_connect() self.on_connect()

View file

@ -3375,7 +3375,7 @@ class WebInterface(object):
# Get new server URLs for SSL communications and get new server friendly name # Get new server URLs for SSL communications and get new server friendly name
if server_changed: if server_changed:
plextv.get_server_resources() plextv.get_server_resources()
if plexpy.WS_CONNECTED: if web_socket.isServerUp():
web_socket.reconnect() web_socket.reconnect()
# If first run, start websocket # If first run, start websocket