diff --git a/jellyfin_kodi/jellyfin/ws_client.py b/jellyfin_kodi/jellyfin/ws_client.py index 72b81b80..9913fe82 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 @@ -34,6 +35,7 @@ class WSClient(threading.Thread): self.client = client threading.Thread.__init__(self) + self.retry_count = 0 def send(self, message, data=""): @@ -48,23 +50,28 @@ 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) 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 while not self.stop: + time.sleep(self.retry_count * 5) self.wsc.run_forever(ping_interval=10) if not self.stop and monitor.waitForAbort(5): break + # Wait a maximum of 60 seconds before retrying connection + if self.retry_count < 12: + self.retry_count += 1 + LOG.info("---<[ websocket ]") def on_error(self, ws, error): @@ -72,6 +79,23 @@ 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" + ), + }) + # Reinitialize the retry counter after successful connection + self.retry_count = 0 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):