From 0647447c3c6b1796d7170181b7e4504fdb057fc8 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 21 Mar 2020 12:42:25 -0400 Subject: [PATCH] Follow redirects when connecting to server --- jellyfin_kodi/jellyfin/api.py | 13 +++++++++-- jellyfin_kodi/jellyfin/connection_manager.py | 24 +++++++++++--------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/jellyfin_kodi/jellyfin/api.py b/jellyfin_kodi/jellyfin/api.py index db074e28..dae02377 100644 --- a/jellyfin_kodi/jellyfin/api.py +++ b/jellyfin_kodi/jellyfin/api.py @@ -412,7 +412,7 @@ class API(object): return {} except Exception as e: # Find exceptions for likely cases i.e, server timeout, etc - LOG.error(e) + LOG.error(e) return {} @@ -430,4 +430,13 @@ class API(object): def get_public_info(self, server_address): response = self.send_request(server_address, "system/info/public") - return response.json() if response.status_code == 200 else {} \ No newline at end of file + return response.json() if response.status_code == 200 else {} + + def check_redirect(self, server_address): + ''' Checks if the server is redirecting traffic to a new URL and + returns the URL the server prefers to use + ''' + response = self.send_request(server_address, "system/info/public") + url = response.url.replace('/system/info/public', '') + return url + diff --git a/jellyfin_kodi/jellyfin/connection_manager.py b/jellyfin_kodi/jellyfin/connection_manager.py index 72501a8d..67a6c741 100644 --- a/jellyfin_kodi/jellyfin/connection_manager.py +++ b/jellyfin_kodi/jellyfin/connection_manager.py @@ -8,13 +8,13 @@ import logging import socket import time from datetime import datetime -from operator import itemgetter +from operator import itemgetter import urllib3 from .credentials import Credentials from .http import HTTP # noqa: I201,I100 -from .api import API +from .api import API import traceback ################################################################################################# @@ -68,7 +68,7 @@ class ConnectionManager(object): servers = list(credentials['Servers']) # Merges servers we already knew with newly found ones - for found_server in found_servers: + for found_server in found_servers: try: self.credentials.add_update_server(servers, found_server) except KeyError: @@ -93,7 +93,7 @@ class ConnectionManager(object): if not data: LOG.info("Failed to login as `"+username+"`") return {} - + LOG.info("Succesfully logged in as %s" % (username)) # TODO Change when moving to database storage of server details credentials = self.credentials.get() @@ -121,7 +121,7 @@ class ConnectionManager(object): self.credentials.add_update_user(server, info) self.credentials.set_credentials(credentials) - + return data @@ -133,12 +133,13 @@ class ConnectionManager(object): address = self._normalize_address(address) try: - public_info = self.API.get_public_info(address) + response_url = self.API.check_redirect(address) + if address != response_url: + address = response_url LOG.info("connectToAddress %s succeeded", address) server = { 'address': address, } - self._update_server_info(server, public_info) server = self.connect_to_server(server, options) if server is False: LOG.error("connectToAddress %s failed", address) @@ -164,6 +165,7 @@ class ConnectionManager(object): LOG.info("calling onSuccessfulConnection with server %s", server.get('Name')) + self._update_server_info(server, result) credentials = self.credentials.get() return self._after_connect_validated(server, credentials, result, True, options) @@ -310,11 +312,11 @@ class ConnectionManager(object): elif verify_authentication and server.get('AccessToken'): system_info = self.API.validate_authentication_token(server) if system_info: - + self._update_server_info(server, system_info) self.config.data['auth.user_id'] = server['UserId'] self.config.data['auth.token'] = server['AccessToken'] - + return self._after_connect_validated(server, credentials, system_info, False, options) server['UserId'] = None @@ -341,7 +343,7 @@ class ConnectionManager(object): result['State'] = CONNECTION_STATE['SignedIn'] if server.get('AccessToken') else CONNECTION_STATE['ServerSignIn'] # Connected return result - + def _update_server_info(self, server, system_info): if server is None or system_info is None: @@ -351,4 +353,4 @@ class ConnectionManager(object): server['Id'] = system_info['Id'] if system_info.get('address'): - server['address'] = system_info['address'] \ No newline at end of file + server['address'] = system_info['address']