From f06ae1fa95a7e6a7f5d8172bd6e365b2a4ef34e5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 27 Jul 2020 19:43:42 -1000 Subject: [PATCH] Prevent kodi from blocking startup (#38257) * Prevent kodi from blocking startup * Update homeassistant/components/kodi/media_player.py * isort * ignore args * adjustments per review * asyncio --- homeassistant/components/kodi/media_player.py | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/kodi/media_player.py b/homeassistant/components/kodi/media_player.py index ac31716b887..81f8696a31a 100644 --- a/homeassistant/components/kodi/media_player.py +++ b/homeassistant/components/kodi/media_player.py @@ -1,5 +1,7 @@ """Support for interfacing with the XBMC/Kodi JSON-RPC API.""" +import asyncio from collections import OrderedDict +from datetime import timedelta from functools import wraps import logging import re @@ -53,6 +55,7 @@ from homeassistant.const import ( from homeassistant.core import callback from homeassistant.helpers import config_validation as cv, script from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.template import Template import homeassistant.util.dt as dt_util from homeassistant.util.yaml import dump @@ -82,6 +85,8 @@ DEPRECATED_TURN_OFF_ACTIONS = { "shutdown": "System.Shutdown", } +WEBSOCKET_WATCHDOG_INTERVAL = timedelta(minutes=3) + # https://github.com/xbmc/xbmc/blob/master/xbmc/media/MediaType.h MEDIA_TYPES = { "music": MEDIA_TYPE_MUSIC, @@ -435,6 +440,26 @@ class KodiDevice(MediaPlayerEntity): # run until the websocket connection is closed. self.hass.loop.create_task(ws_loop_wrapper()) + async def async_added_to_hass(self): + """Connect the websocket if needed.""" + if not self._enable_websocket: + return + + asyncio.create_task(self.async_ws_connect()) + + self.async_on_remove( + async_track_time_interval( + self.hass, + self._async_connect_websocket_if_disconnected, + WEBSOCKET_WATCHDOG_INTERVAL, + ) + ) + + async def _async_connect_websocket_if_disconnected(self, *_): + """Reconnect the websocket if it fails.""" + if not self._ws_server.connected: + await self.async_ws_connect() + async def async_update(self): """Retrieve latest state.""" self._players = await self._get_players() @@ -445,9 +470,6 @@ class KodiDevice(MediaPlayerEntity): self._app_properties = {} return - if self._enable_websocket and not self._ws_server.connected: - self.hass.async_create_task(self.async_ws_connect()) - self._app_properties = await self.server.Application.GetProperties( ["volume", "muted"] )