diff --git a/homeassistant/components/plex/__init__.py b/homeassistant/components/plex/__init__.py index a73111793a7..ff36f4f5c32 100644 --- a/homeassistant/components/plex/__init__.py +++ b/homeassistant/components/plex/__init__.py @@ -175,7 +175,7 @@ async def async_setup_entry(hass, entry): unsub = async_dispatcher_connect( hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id), - plex_server.update_platforms, + plex_server.async_update_platforms, ) hass.data[PLEX_DOMAIN][DISPATCHERS].setdefault(server_id, []) hass.data[PLEX_DOMAIN][DISPATCHERS][server_id].append(unsub) diff --git a/homeassistant/components/plex/media_player.py b/homeassistant/components/plex/media_player.py index 00d1b6084ad..fd61dfce26f 100644 --- a/homeassistant/components/plex/media_player.py +++ b/homeassistant/components/plex/media_player.py @@ -494,7 +494,6 @@ class PlexMediaPlayer(MediaPlayerDevice): if self.device and "playback" in self._device_protocol_capabilities: self.device.setVolume(int(volume * 100), self._active_media_plexapi_type) self._volume_level = volume # store since we can't retrieve - self.plex_server.update_platforms() @property def volume_level(self): @@ -533,31 +532,26 @@ class PlexMediaPlayer(MediaPlayerDevice): """Send play command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.play(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_pause(self): """Send pause command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.pause(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_stop(self): """Send stop command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.stop(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_next_track(self): """Send next track command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.skipNext(self._active_media_plexapi_type) - self.plex_server.update_platforms() def media_previous_track(self): """Send previous track command.""" if self.device and "playback" in self._device_protocol_capabilities: self.device.skipPrevious(self._active_media_plexapi_type) - self.plex_server.update_platforms() def play_media(self, media_type, media_id, **kwargs): """Play a piece of media.""" @@ -594,8 +588,6 @@ class PlexMediaPlayer(MediaPlayerDevice): except requests.exceptions.ConnectTimeout: _LOGGER.error("Timed out playing on %s", self.name) - self.plex_server.update_platforms() - def _get_music_media(self, library_name, src): """Find music media and return a Plex media object.""" artist_name = src["artist_name"] diff --git a/homeassistant/components/plex/server.py b/homeassistant/components/plex/server.py index 80e7c92640a..a7b66c3a3ba 100644 --- a/homeassistant/components/plex/server.py +++ b/homeassistant/components/plex/server.py @@ -12,7 +12,7 @@ import requests.exceptions from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL -from homeassistant.helpers.dispatcher import dispatcher_send +from homeassistant.helpers.dispatcher import async_dispatcher_send, dispatcher_send from homeassistant.helpers.event import async_call_later from .const import ( @@ -51,10 +51,10 @@ def debounce(func): """Handle call_later callback.""" nonlocal unsub unsub = None - await self.hass.async_add_executor_job(func, self) + await func(self) @wraps(func) - def wrapper(self): + async def wrapper(self): """Schedule async callback.""" nonlocal unsub if unsub: @@ -186,8 +186,12 @@ class PlexServer: session, ) + def _fetch_platform_data(self): + """Fetch all data from the Plex server in a single method.""" + return (self._plex_server.clients(), self._plex_server.sessions()) + @debounce - def update_platforms(self): + async def async_update_platforms(self): """Update the platform entities.""" _LOGGER.debug("Updating devices") @@ -209,8 +213,9 @@ class PlexServer: monitored_users.add(new_user) try: - devices = self._plex_server.clients() - sessions = self._plex_server.sessions() + devices, sessions = await self.hass.async_add_executor_job( + self._fetch_platform_data + ) except ( plexapi.exceptions.BadRequest, requests.exceptions.RequestException, @@ -271,13 +276,13 @@ class PlexServer: self._known_idle.add(client_id) if new_entity_configs: - dispatcher_send( + async_dispatcher_send( self.hass, PLEX_NEW_MP_SIGNAL.format(self.machine_identifier), new_entity_configs, ) - dispatcher_send( + async_dispatcher_send( self.hass, PLEX_UPDATE_SENSOR_SIGNAL.format(self.machine_identifier), sessions,