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(