diff --git a/jellyfin_kodi/connect.py b/jellyfin_kodi/connect.py index cc535370..641d1f5d 100644 --- a/jellyfin_kodi/connect.py +++ b/jellyfin_kodi/connect.py @@ -119,6 +119,10 @@ class Connect(object): if 'ExchangeToken' not in state['Servers'][0]: self.login() + elif state['State'] == CONNECTION_STATE['Unavailable'] and state['Status_Code'] == 401: + # If the saved credentials don't work, restart the addon to force the password dialog to open + window('jellyfin.restart', clear=True) + elif state['State'] == CONNECTION_STATE['Unavailable']: raise HTTPException('ServerUnreachable', {}) @@ -253,8 +257,9 @@ class Connect(object): client.set_credentials(get_credentials()) manager = client.auth + username = settings('username') try: - self.login_manual(manager=manager) + self.login_manual(user=username, manager=manager) except RuntimeError: return diff --git a/jellyfin_kodi/entrypoint/default.py b/jellyfin_kodi/entrypoint/default.py index fac8581f..b21a71e4 100644 --- a/jellyfin_kodi/entrypoint/default.py +++ b/jellyfin_kodi/entrypoint/default.py @@ -112,6 +112,8 @@ class Events(object): xbmc.executebuiltin('Addon.OpenSettings(plugin.video.jellyfin)') elif mode == 'adduser': add_user() + elif mode == 'updatepassword': + event('UpdatePassword') elif mode == 'thememedia': get_themes() elif mode == 'managelibs': @@ -177,6 +179,7 @@ def listing(): directory(translate(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False) directory(translate(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False) directory(translate(5), "plugin://plugin.video.jellyfin/?mode=settings", False) + directory(translate(33161), "plugin://plugin.video.jellyfin/?mode=updatepassword", False) directory(translate(33058), "plugin://plugin.video.jellyfin/?mode=reset", False) directory(translate(33180), "plugin://plugin.video.jellyfin/?mode=restartservice", False) diff --git a/jellyfin_kodi/entrypoint/service.py b/jellyfin_kodi/entrypoint/service.py index dace0288..8fc8f36e 100644 --- a/jellyfin_kodi/entrypoint/service.py +++ b/jellyfin_kodi/entrypoint/service.py @@ -156,7 +156,7 @@ class Service(xbmc.Monitor): 'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary', 'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer', 'Unauthorized', 'UserConfigurationUpdated', 'ServerRestarting', - 'RemoveServer', 'AddLibrarySelection', 'RemoveLibrarySelection'): + 'RemoveServer', 'UpdatePassword', 'AddLibrarySelection', 'RemoveLibrarySelection'): return data = json.loads(data)[0] @@ -243,6 +243,8 @@ class Service(xbmc.Monitor): self.connect.remove_server(data['Id']) xbmc.executebuiltin("Container.Refresh") + elif method == 'UpdatePassword': + self.connect.setup_login_manual() elif method == 'UserDataChanged' and self.library_thread: if data.get('ServerId') or not window('jellyfin_startup.bool'): return diff --git a/jellyfin_kodi/jellyfin/api.py b/jellyfin_kodi/jellyfin/api.py index 196a7910..2b7ede15 100644 --- a/jellyfin_kodi/jellyfin/api.py +++ b/jellyfin_kodi/jellyfin/api.py @@ -431,7 +431,11 @@ class API(object): headers.update(auth_token_header) response = self.send_request(server['address'], "system/info", headers=headers) - return response.json() if response.status_code == 200 else {} + + if response.status_code == 200: + return response.json() + else: + return { 'Status_Code': response.status_code } def get_public_info(self, server_address): response = self.send_request(server_address, "system/info/public") diff --git a/jellyfin_kodi/jellyfin/connection_manager.py b/jellyfin_kodi/jellyfin/connection_manager.py index d6e87115..f5eb05e5 100644 --- a/jellyfin_kodi/jellyfin/connection_manager.py +++ b/jellyfin_kodi/jellyfin/connection_manager.py @@ -309,7 +309,7 @@ class ConnectionManager(object): elif verify_authentication and server.get('AccessToken'): system_info = self.API.validate_authentication_token(server) - if system_info: + if 'Status_Code' not in system_info: self._update_server_info(server, system_info) self.config.data['auth.user_id'] = server['UserId'] @@ -319,7 +319,8 @@ class ConnectionManager(object): server['UserId'] = None server['AccessToken'] = None - return {'State': CONNECTION_STATE['Unavailable']} + system_info['State'] = CONNECTION_STATE['Unavailable'] + return system_info self._update_server_info(server, system_info) diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 23b7e37c..c4690526 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -801,6 +801,10 @@ msgctxt "#33160" msgid "To avoid errors, please update Jellyfin for Kodi to version: " msgstr "To avoid errors, please update Jellyfin for Kodi to version: " +msgctxt "#33161" +msgid "Update password" +msgstr "Update password" + msgctxt "#33162" msgid "Reset the music library?" msgstr "Reset the music library?" diff --git a/resources/language/resource.language.en_us/strings.po b/resources/language/resource.language.en_us/strings.po index 95daafd6..bf410eca 100644 --- a/resources/language/resource.language.en_us/strings.po +++ b/resources/language/resource.language.en_us/strings.po @@ -801,6 +801,10 @@ msgctxt "#33160" msgid "To avoid errors, please update Jellyfin for Kodi to version: " msgstr "To avoid errors, please update Jellyfin for Kodi to version: " +msgctxt "#33161" +msgid "Update password" +msgstr "Update password" + msgctxt "#33162" msgid "Reset the music library?" msgstr "Reset the music library?"