diff --git a/homeassistant/components/plex/config_flow.py b/homeassistant/components/plex/config_flow.py index 82a26cfc237..dffbd7a1930 100644 --- a/homeassistant/components/plex/config_flow.py +++ b/homeassistant/components/plex/config_flow.py @@ -246,26 +246,26 @@ class PlexFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """Use selected Plex server.""" config = dict(self.current_login) if user_input is not None: - config[CONF_SERVER] = user_input[CONF_SERVER] + config[CONF_SERVER_IDENTIFIER] = user_input[CONF_SERVER_IDENTIFIER] return await self.async_step_server_validate(config) configured = configured_servers(self.hass) - available_servers = [ - name - for (name, server_id) in self.available_servers + available_servers = { + server_id: f"{name} ({owner})" if owner else name + for (name, server_id, owner) in self.available_servers if server_id not in configured - ] + } if not available_servers: return self.async_abort(reason="all_configured") if len(available_servers) == 1: - config[CONF_SERVER] = available_servers[0] + config[CONF_SERVER_IDENTIFIER] = next(iter(available_servers)) return await self.async_step_server_validate(config) return self.async_show_form( step_id="select_server", data_schema=vol.Schema( - {vol.Required(CONF_SERVER): vol.In(available_servers)} + {vol.Required(CONF_SERVER_IDENTIFIER): vol.In(available_servers)} ), errors={}, ) diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index 4a4fe84096c..c50ad2025b7 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -24,6 +24,7 @@ from .const import ( CONF_IGNORE_PLEX_WEB_CLIENTS, CONF_MONITORED_USERS, CONF_SERVER, + CONF_SERVER_IDENTIFIER, CONF_USE_EPISODE_ART, DEBOUNCE_TIMEOUT, DEFAULT_VERIFY_SSL, @@ -73,7 +74,7 @@ class PlexServer: self._token = server_config.get(CONF_TOKEN) self._server_name = server_config.get(CONF_SERVER) self._verify_ssl = server_config.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL) - self._server_id = known_server_id + self._server_id = known_server_id or server_config.get(CONF_SERVER_IDENTIFIER) self.options = options self.server_choice = None self._accounts = [] @@ -136,19 +137,20 @@ class PlexServer: all_servers = [ x for x in self.account.resources() if "server" in x.provides ] - servers = [x for x in all_servers if x.presence] or all_servers - available_servers = [(x.name, x.clientIdentifier) for x in servers] + available_servers = [ + (x.name, x.clientIdentifier, x.sourceTitle) for x in all_servers + ] - if not available_servers: + if not all_servers: raise NoServersFound - if not self._server_name and len(available_servers) > 1: + if not self._server_id and len(all_servers) > 1: raise ServerNotSpecified(available_servers) - self.server_choice = ( - self._server_name if self._server_name else available_servers[0][0] - ) - self._plex_server = self.account.resource(self.server_choice).connect( - timeout=10 + self.server_choice = self._server_id or available_servers[0][1] + self._plex_server = next( + x.connect(timeout=10) + for x in all_servers + if x.clientIdentifier == self.server_choice ) def _connect_with_url(): diff --git a/tests/components/plex/conftest.py b/tests/components/plex/conftest.py index cdd0d4dff3e..9d3e7a13536 100644 --- a/tests/components/plex/conftest.py +++ b/tests/components/plex/conftest.py @@ -278,20 +278,20 @@ def plextv_account_fixture(): return load_fixture("plex/plextv_account.xml") -@pytest.fixture(name="plextv_resources_base", scope="session") -def plextv_resources_base_fixture(): - """Load base payload for plex.tv resources and return it.""" - return load_fixture("plex/plextv_resources_base.xml") - - @pytest.fixture(name="plextv_resources", scope="session") -def plextv_resources_fixture(plextv_resources_base): - """Load default payload for plex.tv resources and return it.""" - return plextv_resources_base.format(first_server_enabled=1, second_server_enabled=0) +def plextv_resources_fixture(): + """Load single-server payload for plex.tv resources and return it.""" + return load_fixture("plex/plextv_resources_one_server.xml") + + +@pytest.fixture(name="plextv_resources_two_servers", scope="session") +def plextv_resources_two_servers_fixture(): + """Load two-server payload for plex.tv resources and return it.""" + return load_fixture("plex/plextv_resources_two_servers.xml") @pytest.fixture(name="plextv_shared_users", scope="session") -def plextv_shared_users_fixture(plextv_resources_base): +def plextv_shared_users_fixture(): """Load payload for plex.tv shared users and return it.""" return load_fixture("plex/plextv_shared_users.xml") diff --git a/tests/components/plex/fixtures/plextv_resources_one_server.xml b/tests/components/plex/fixtures/plextv_resources_one_server.xml new file mode 100644 index 00000000000..ff2e458ff24 --- /dev/null +++ b/tests/components/plex/fixtures/plextv_resources_one_server.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/components/plex/fixtures/plextv_resources_base.xml b/tests/components/plex/fixtures/plextv_resources_two_servers.xml similarity index 97% rename from tests/components/plex/fixtures/plextv_resources_base.xml rename to tests/components/plex/fixtures/plextv_resources_two_servers.xml index 5802c58d4d4..7da5df4c1df 100644 --- a/tests/components/plex/fixtures/plextv_resources_base.xml +++ b/tests/components/plex/fixtures/plextv_resources_two_servers.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/tests/components/plex/test_config_flow.py b/tests/components/plex/test_config_flow.py index 43df5092435..c22890ebef3 100644 --- a/tests/components/plex/test_config_flow.py +++ b/tests/components/plex/test_config_flow.py @@ -198,7 +198,7 @@ async def test_multiple_servers_with_selection( hass, mock_plex_calls, requests_mock, - plextv_resources_base, + plextv_resources_two_servers, current_request_with_host, ): """Test creating an entry with multiple servers available.""" @@ -210,9 +210,7 @@ async def test_multiple_servers_with_selection( requests_mock.get( "https://plex.tv/api/resources", - text=plextv_resources_base.format( - first_server_enabled=1, second_server_enabled=1 - ), + text=plextv_resources_two_servers, ) with patch("plexauth.PlexAuth.initiate_auth"), patch( "plexauth.PlexAuth.token", return_value=MOCK_TOKEN @@ -231,7 +229,9 @@ async def test_multiple_servers_with_selection( result = await hass.config_entries.flow.async_configure( result["flow_id"], - user_input={CONF_SERVER: MOCK_SERVERS[0][CONF_SERVER]}, + user_input={ + CONF_SERVER_IDENTIFIER: MOCK_SERVERS[0][CONF_SERVER_IDENTIFIER] + }, ) assert result["type"] == "create_entry" @@ -250,47 +250,11 @@ async def test_multiple_servers_with_selection( assert result["data"][PLEX_SERVER_CONFIG][CONF_TOKEN] == MOCK_TOKEN -async def test_only_non_present_servers( - hass, - mock_plex_calls, - requests_mock, - plextv_resources_base, - current_request_with_host, -): - """Test creating an entry with one server available.""" - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_USER} - ) - assert result["type"] == "form" - assert result["step_id"] == "user" - - requests_mock.get( - "https://plex.tv/api/resources", - text=plextv_resources_base.format( - first_server_enabled=0, second_server_enabled=0 - ), - ) - with patch("plexauth.PlexAuth.initiate_auth"), patch( - "plexauth.PlexAuth.token", return_value=MOCK_TOKEN - ): - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input={} - ) - assert result["type"] == "external" - - result = await hass.config_entries.flow.async_configure(result["flow_id"]) - assert result["type"] == "external_done" - - result = await hass.config_entries.flow.async_configure(result["flow_id"]) - assert result["type"] == "form" - assert result["step_id"] == "select_server" - - async def test_adding_last_unconfigured_server( hass, mock_plex_calls, requests_mock, - plextv_resources_base, + plextv_resources_two_servers, current_request_with_host, ): """Test automatically adding last unconfigured server when multiple servers on account.""" @@ -310,9 +274,7 @@ async def test_adding_last_unconfigured_server( requests_mock.get( "https://plex.tv/api/resources", - text=plextv_resources_base.format( - first_server_enabled=1, second_server_enabled=1 - ), + text=plextv_resources_two_servers, ) with patch("plexauth.PlexAuth.initiate_auth"), patch( @@ -349,7 +311,7 @@ async def test_all_available_servers_configured( entry, requests_mock, plextv_account, - plextv_resources_base, + plextv_resources_two_servers, current_request_with_host, ): """Test when all available servers are already configured.""" @@ -372,9 +334,7 @@ async def test_all_available_servers_configured( requests_mock.get("https://plex.tv/users/account", text=plextv_account) requests_mock.get( "https://plex.tv/api/resources", - text=plextv_resources_base.format( - first_server_enabled=1, second_server_enabled=1 - ), + text=plextv_resources_two_servers, ) with patch("plexauth.PlexAuth.initiate_auth"), patch(