Use URI provided by Plex for local connections (#27515)

* Use provided URI for local connections

* Use provided plexapi connection method

* Remove unused mock from tests

* Handle potential edge case(s)
This commit is contained in:
jjlawren 2019-10-17 19:31:53 -05:00 committed by Paulus Schoutsen
parent 564789470e
commit 0888098718
3 changed files with 11 additions and 34 deletions

View File

@ -89,9 +89,10 @@ class PlexFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
_LOGGER.error("Invalid credentials provided, config not created") _LOGGER.error("Invalid credentials provided, config not created")
errors["base"] = "faulty_credentials" errors["base"] = "faulty_credentials"
except (plexapi.exceptions.NotFound, requests.exceptions.ConnectionError): except (plexapi.exceptions.NotFound, requests.exceptions.ConnectionError):
_LOGGER.error( server_identifier = (
"Plex server could not be reached: %s", server_config[CONF_URL] server_config.get(CONF_URL) or plex_server.server_choice or "Unknown"
) )
_LOGGER.error("Plex server could not be reached: %s", server_identifier)
errors["base"] = "not_found" errors["base"] = "not_found"
except ServerNotSpecified as available_servers: except ServerNotSpecified as available_servers:

View File

@ -39,11 +39,12 @@ class PlexServer:
self._server_name = server_config.get(CONF_SERVER) self._server_name = server_config.get(CONF_SERVER)
self._verify_ssl = server_config.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL) self._verify_ssl = server_config.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL)
self.options = options self.options = options
self.server_choice = None
def connect(self): def connect(self):
"""Connect to a Plex server directly, obtaining direct URL if necessary.""" """Connect to a Plex server directly, obtaining direct URL if necessary."""
def _set_missing_url(): def _connect_with_token():
account = plexapi.myplex.MyPlexAccount(token=self._token) account = plexapi.myplex.MyPlexAccount(token=self._token)
available_servers = [ available_servers = [
(x.name, x.clientIdentifier) (x.name, x.clientIdentifier)
@ -56,13 +57,10 @@ class PlexServer:
if not self._server_name and len(available_servers) > 1: if not self._server_name and len(available_servers) > 1:
raise ServerNotSpecified(available_servers) raise ServerNotSpecified(available_servers)
server_choice = ( self.server_choice = (
self._server_name if self._server_name else available_servers[0][0] self._server_name if self._server_name else available_servers[0][0]
) )
connections = account.resource(server_choice).connections self._plex_server = account.resource(self.server_choice).connect()
local_url = [x.httpuri for x in connections if x.local]
remote_url = [x.uri for x in connections if not x.local]
self._url = local_url[0] if local_url else remote_url[0]
def _connect_with_url(): def _connect_with_url():
session = None session = None
@ -73,10 +71,10 @@ class PlexServer:
self._url, self._token, session self._url, self._token, session
) )
if self._token and not self._url: if self._url:
_set_missing_url() _connect_with_url()
else:
_connect_with_url() _connect_with_token()
def clients(self): def clients(self):
"""Pass through clients call to plexapi.""" """Pass through clients call to plexapi."""

View File

@ -29,34 +29,12 @@ class MockResource:
] ]
self.provides = ["server"] self.provides = ["server"]
self._mock_plex_server = MockPlexServer(index) self._mock_plex_server = MockPlexServer(index)
self._connections = []
for connection in range(2):
self._connections.append(MockConnection(connection))
@property
def connections(self):
"""Mock the resource connection listing method."""
return self._connections
def connect(self): def connect(self):
"""Mock the resource connect method.""" """Mock the resource connect method."""
return self._mock_plex_server return self._mock_plex_server
class MockConnection: # pylint: disable=too-few-public-methods
"""Mock a single account resource connection object."""
def __init__(self, index, ssl=True):
"""Initialize the object."""
prefix = "https" if ssl else "http"
self.httpuri = (
f"http://{MOCK_SERVERS[index][CONF_HOST]}:{MOCK_SERVERS[index][CONF_PORT]}"
)
self.uri = f"{prefix}://{MOCK_SERVERS[index][CONF_HOST]}:{MOCK_SERVERS[index][CONF_PORT]}"
# Only first server is local
self.local = not bool(index)
class MockPlexAccount: class MockPlexAccount:
"""Mock a PlexAccount instance.""" """Mock a PlexAccount instance."""