From 6eeb01edc4549da4c525886b4d161d966c919062 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Wed, 11 Sep 2019 13:21:08 -0500 Subject: [PATCH] Remove default host for Plex config (#26583) * Remove default host, allow config with token(+server) * Require one of host or token * Oops * Adjust schema * Fix schema * Add self as codeowner * Update CODEOWNERS --- CODEOWNERS | 1 + homeassistant/components/plex/__init__.py | 37 ++++++++++++--------- homeassistant/components/plex/const.py | 4 +-- homeassistant/components/plex/manifest.json | 4 ++- homeassistant/components/plex/server.py | 20 ++++++++++- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 7a84eeac13b..18218bbf68e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -212,6 +212,7 @@ homeassistant/components/philips_js/* @elupus homeassistant/components/pi_hole/* @fabaff homeassistant/components/plaato/* @JohNan homeassistant/components/plant/* @ChristianKuehnel +homeassistant/components/plex/* @jjlawren homeassistant/components/plugwise/* @laetificat @CoMPaTech homeassistant/components/point/* @fredrike homeassistant/components/ps4/* @ktnrg45 diff --git a/homeassistant/components/plex/__init__.py b/homeassistant/components/plex/__init__.py index 846f3e3f53c..69e77c8854f 100644 --- a/homeassistant/components/plex/__init__.py +++ b/homeassistant/components/plex/__init__.py @@ -20,9 +20,9 @@ from homeassistant.helpers import discovery from homeassistant.util.json import load_json, save_json from .const import ( + CONF_SERVER, CONF_USE_EPISODE_ART, CONF_SHOW_ALL_CONTROLS, - DEFAULT_HOST, DEFAULT_PORT, DEFAULT_SSL, DEFAULT_VERIFY_SSL, @@ -42,14 +42,18 @@ MEDIA_PLAYER_SCHEMA = vol.Schema( ) SERVER_CONFIG_SCHEMA = vol.Schema( - { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_TOKEN): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional(MP_DOMAIN, default={}): MEDIA_PLAYER_SCHEMA, - } + vol.All( + { + vol.Optional(CONF_HOST): cv.string, + vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + vol.Optional(CONF_TOKEN): cv.string, + vol.Optional(CONF_SERVER): cv.string, + vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + vol.Optional(MP_DOMAIN, default={}): MEDIA_PLAYER_SCHEMA, + }, + cv.has_at_least_one_key(CONF_HOST, CONF_TOKEN), + ) ) CONFIG_SCHEMA = vol.Schema({PLEX_DOMAIN: SERVER_CONFIG_SCHEMA}, extra=vol.ALLOW_EXTRA) @@ -73,12 +77,14 @@ def setup(hass, config): """Return assembled server_config dict.""" json_file = hass.config.path(PLEX_CONFIG_FILE) file_config = load_json(json_file) + host_and_port = None if config: server_config = config - host_and_port = ( - f"{server_config.pop(CONF_HOST)}:{server_config.pop(CONF_PORT)}" - ) + if CONF_HOST in server_config: + host_and_port = ( + f"{server_config.pop(CONF_HOST)}:{server_config.pop(CONF_PORT)}" + ) if MP_DOMAIN in server_config: hass.data[PLEX_MEDIA_PLAYER_OPTIONS] = server_config.pop(MP_DOMAIN) elif file_config: @@ -95,9 +101,10 @@ def setup(hass, config): discovery.listen(hass, SERVICE_PLEX, server_discovered) return True - use_ssl = server_config.get(CONF_SSL, DEFAULT_SSL) - http_prefix = "https" if use_ssl else "http" - server_config[CONF_URL] = f"{http_prefix}://{host_and_port}" + if host_and_port: + use_ssl = server_config.get(CONF_SSL, DEFAULT_SSL) + http_prefix = "https" if use_ssl else "http" + server_config[CONF_URL] = f"{http_prefix}://{host_and_port}" plex_server = PlexServer(server_config) try: diff --git a/homeassistant/components/plex/const.py b/homeassistant/components/plex/const.py index bf8c2387e4d..6f19623c809 100644 --- a/homeassistant/components/plex/const.py +++ b/homeassistant/components/plex/const.py @@ -2,7 +2,6 @@ DOMAIN = "plex" NAME_FORMAT = "Plex {}" -DEFAULT_HOST = "localhost" DEFAULT_PORT = 32400 DEFAULT_SSL = False DEFAULT_VERIFY_SSL = True @@ -14,7 +13,6 @@ PLEX_CONFIG_FILE = "plex.conf" PLEX_MEDIA_PLAYER_OPTIONS = "plex_mp_options" PLEX_SERVER_CONFIG = "server_config" +CONF_SERVER = "server" CONF_USE_EPISODE_ART = "use_episode_art" CONF_SHOW_ALL_CONTROLS = "show_all_controls" -CONF_REMOVE_UNAVAILABLE_CLIENTS = "remove_unavailable_clients" -CONF_CLIENT_REMOVE_INTERVAL = "client_remove_interval" diff --git a/homeassistant/components/plex/manifest.json b/homeassistant/components/plex/manifest.json index 32ddb83476c..4269400dc24 100644 --- a/homeassistant/components/plex/manifest.json +++ b/homeassistant/components/plex/manifest.json @@ -6,5 +6,7 @@ "plexapi==3.0.6" ], "dependencies": ["configurator"], - "codeowners": [] + "codeowners": [ + "@jjlawren" + ] } diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index c778588752a..962e074996f 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -1,12 +1,13 @@ """Shared class to maintain Plex server instances.""" import logging +import plexapi.myplex import plexapi.server from requests import Session from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL -from .const import DEFAULT_VERIFY_SSL +from .const import CONF_SERVER, DEFAULT_VERIFY_SSL _LOGGER = logging.getLogger(__package__) @@ -19,11 +20,25 @@ class PlexServer: self._plex_server = None self._url = server_config.get(CONF_URL) 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) def connect(self): """Connect to a Plex server directly, obtaining direct URL if necessary.""" + def _set_missing_url(): + account = plexapi.myplex.MyPlexAccount(token=self._token) + available_servers = [ + x.name for x in account.resources() if "server" in x.provides + ] + server_choice = ( + self._server_name if self._server_name else available_servers[0] + ) + connections = account.resource(server_choice).connections + 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(): session = None if self._url.startswith("https") and not self._verify_ssl: @@ -34,6 +49,9 @@ class PlexServer: ) _LOGGER.debug("Connected to: %s (%s)", self.friendly_name, self.url_in_use) + if self._token and not self._url: + _set_missing_url() + _connect_with_url() def clients(self):