Store runtime data inside the config entry in VLC telnet (#116803)

store runtime data inside the config entry
This commit is contained in:
Michael 2024-05-04 21:52:53 +02:00 committed by GitHub
parent 64b5881652
commit 65120e5789
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 27 deletions

View File

@ -1,5 +1,7 @@
"""The VLC media player Telnet integration."""
from dataclasses import dataclass
from aiovlc.client import Client
from aiovlc.exceptions import AuthError, ConnectError
@ -8,12 +10,22 @@ from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from .const import DATA_AVAILABLE, DATA_VLC, DOMAIN, LOGGER
from .const import LOGGER
PLATFORMS = [Platform.MEDIA_PLAYER]
VlcConfigEntry = ConfigEntry["VlcData"]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
@dataclass
class VlcData:
"""Runtime data definition."""
vlc: Client
available: bool
async def async_setup_entry(hass: HomeAssistant, entry: VlcConfigEntry) -> bool:
"""Set up VLC media player Telnet from a config entry."""
config = entry.data
@ -31,15 +43,24 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
LOGGER.warning("Failed to connect to VLC: %s. Trying again", err)
available = False
async def _disconnect_vlc() -> None:
"""Disconnect from VLC."""
LOGGER.debug("Disconnecting from VLC")
try:
await vlc.disconnect()
except ConnectError as err:
LOGGER.warning("Connection error: %s", err)
if available:
try:
await vlc.login()
except AuthError as err:
await disconnect_vlc(vlc)
await _disconnect_vlc()
raise ConfigEntryAuthFailed from err
domain_data = hass.data.setdefault(DOMAIN, {})
domain_data[entry.entry_id] = {DATA_VLC: vlc, DATA_AVAILABLE: available}
entry.runtime_data = VlcData(vlc, available)
entry.async_on_unload(_disconnect_vlc)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
@ -48,21 +69,4 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unload_ok:
entry_data = hass.data[DOMAIN].pop(entry.entry_id)
vlc = entry_data[DATA_VLC]
await disconnect_vlc(vlc)
return unload_ok
async def disconnect_vlc(vlc: Client) -> None:
"""Disconnect from VLC."""
LOGGER.debug("Disconnecting from VLC")
try:
await vlc.disconnect()
except ConnectError as err:
LOGGER.warning("Connection error: %s", err)
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)

View File

@ -25,7 +25,8 @@ from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
import homeassistant.util.dt as dt_util
from .const import DATA_AVAILABLE, DATA_VLC, DEFAULT_NAME, DOMAIN, LOGGER
from . import VlcConfigEntry
from .const import DEFAULT_NAME, DOMAIN, LOGGER
MAX_VOLUME = 500
@ -34,13 +35,13 @@ _P = ParamSpec("_P")
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
hass: HomeAssistant, entry: VlcConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the vlc platform."""
# CONF_NAME is only present in imported YAML.
name = entry.data.get(CONF_NAME) or DEFAULT_NAME
vlc = hass.data[DOMAIN][entry.entry_id][DATA_VLC]
available = hass.data[DOMAIN][entry.entry_id][DATA_AVAILABLE]
vlc = entry.runtime_data.vlc
available = entry.runtime_data.available
async_add_entities([VlcDevice(entry, vlc, name, available)], True)