From 2427f566fa99397b7feccc375e73e1d4b958ace6 Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 14 Nov 2021 13:37:23 -0500 Subject: [PATCH 1/2] Attempt to reestablished websocket communication if the connection fails --- jellyfin_kodi/jellyfin/ws_client.py | 23 ++++++++++++++++++++++- jellyfin_kodi/monitor.py | 23 ++--------------------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/jellyfin_kodi/jellyfin/ws_client.py b/jellyfin_kodi/jellyfin/ws_client.py index 72b81b80..73e1f11b 100644 --- a/jellyfin_kodi/jellyfin/ws_client.py +++ b/jellyfin_kodi/jellyfin/ws_client.py @@ -5,6 +5,7 @@ from __future__ import division, absolute_import, print_function, unicode_litera import json import threading +import time from kodi_six import xbmc @@ -54,17 +55,22 @@ class WSClient(threading.Thread): LOG.info("Websocket url: %s", wsc_url) self.wsc = websocket.WebSocketApp(wsc_url, + on_open=lambda ws: self.on_open(ws), on_message=lambda ws, message: self.on_message(ws, message), on_error=lambda ws, error: self.on_error(ws, error)) - self.wsc.on_open = self.on_open + retry_count = 0 while not self.stop: + time.sleep(retry_count * 5) self.wsc.run_forever(ping_interval=10) if not self.stop and monitor.waitForAbort(5): break + if retry_count < 12: + retry_count += 1 + LOG.info("---<[ websocket ]") def on_error(self, ws, error): @@ -72,6 +78,21 @@ class WSClient(threading.Thread): def on_open(self, ws): LOG.info("--->[ websocket ]") + self.client.jellyfin.post_capabilities({ + 'PlayableMediaTypes': "Audio,Video", + 'SupportsMediaControl': True, + 'SupportedCommands': ( + "MoveUp,MoveDown,MoveLeft,MoveRight,Select," + "Back,ToggleContextMenu,ToggleFullscreen,ToggleOsdMenu," + "GoHome,PageUp,NextLetter,GoToSearch," + "GoToSettings,PageDown,PreviousLetter,TakeScreenshot," + "VolumeUp,VolumeDown,ToggleMute,SendString,DisplayMessage," + "SetAudioStreamIndex,SetSubtitleStreamIndex," + "SetRepeatMode," + "Mute,Unmute,SetVolume," + "Play,Playstate,PlayNext,PlayMediaSource" + ), + }) def on_message(self, ws, message): diff --git a/jellyfin_kodi/monitor.py b/jellyfin_kodi/monitor.py index 4b2e6bec..760425a5 100644 --- a/jellyfin_kodi/monitor.py +++ b/jellyfin_kodi/monitor.py @@ -160,7 +160,8 @@ class Monitor(xbmc.Monitor): def server_instance(self, server_id=None): server = Jellyfin(server_id).get_client() - self.post_capabilities(server) + session = server.jellyfin.get_device(self.device_id) + server.config.data['app.session'] = session[0]['Id'] if server_id is not None: self.servers.append(server_id) @@ -177,26 +178,6 @@ class Monitor(xbmc.Monitor): self.additional_users(server) - def post_capabilities(self, server): - LOG.info("--[ post capabilities/%s ]", server.auth.server_id) - - server.jellyfin.post_capabilities({ - 'PlayableMediaTypes': "Audio,Video", - 'SupportsMediaControl': True, - 'SupportedCommands': ( - "MoveUp,MoveDown,MoveLeft,MoveRight,Select," - "Back,ToggleContextMenu,ToggleFullscreen,ToggleOsdMenu," - "GoHome,PageUp,NextLetter,GoToSearch," - "GoToSettings,PageDown,PreviousLetter,TakeScreenshot," - "VolumeUp,VolumeDown,ToggleMute,SendString,DisplayMessage," - "SetAudioStreamIndex,SetSubtitleStreamIndex," - "SetRepeatMode," - "Mute,Unmute,SetVolume," - "Play,Playstate,PlayNext,PlayMediaSource" - ), - }) - session = server.jellyfin.get_device(self.device_id) - server.config.data['app.session'] = session[0]['Id'] def additional_users(self, server): From eae01cfec9099300b3be73eb2f22601ee64ff1ab Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 15 Nov 2021 19:20:38 -0500 Subject: [PATCH 2/2] Move retry to class, more accurately target schema replace --- jellyfin_kodi/jellyfin/ws_client.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/jellyfin_kodi/jellyfin/ws_client.py b/jellyfin_kodi/jellyfin/ws_client.py index 73e1f11b..9913fe82 100644 --- a/jellyfin_kodi/jellyfin/ws_client.py +++ b/jellyfin_kodi/jellyfin/ws_client.py @@ -35,6 +35,7 @@ class WSClient(threading.Thread): self.client = client threading.Thread.__init__(self) + self.retry_count = 0 def send(self, message, data=""): @@ -49,7 +50,7 @@ class WSClient(threading.Thread): token = self.client.config.data['auth.token'] device_id = self.client.config.data['app.device_id'] server = self.client.config.data['auth.server'] - server = server.replace('https', "wss") if server.startswith('https') else server.replace('http', "ws") + server = server.replace('https://', 'wss://') if server.startswith('https') else server.replace('http://', 'ws://') wsc_url = "%s/socket?api_key=%s&device_id=%s" % (server, token, device_id) LOG.info("Websocket url: %s", wsc_url) @@ -59,17 +60,17 @@ class WSClient(threading.Thread): on_message=lambda ws, message: self.on_message(ws, message), on_error=lambda ws, error: self.on_error(ws, error)) - retry_count = 0 while not self.stop: - time.sleep(retry_count * 5) + time.sleep(self.retry_count * 5) self.wsc.run_forever(ping_interval=10) if not self.stop and monitor.waitForAbort(5): break - if retry_count < 12: - retry_count += 1 + # Wait a maximum of 60 seconds before retrying connection + if self.retry_count < 12: + self.retry_count += 1 LOG.info("---<[ websocket ]") @@ -93,6 +94,8 @@ class WSClient(threading.Thread): "Play,Playstate,PlayNext,PlayMediaSource" ), }) + # Reinitialize the retry counter after successful connection + self.retry_count = 0 def on_message(self, ws, message):