Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for YouTube."""
2 
3 from __future__ import annotations
4 
5 from aiohttp.client_exceptions import ClientError, ClientResponseError
6 
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.const import Platform
9 from homeassistant.core import HomeAssistant
10 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
12  OAuth2Session,
13  async_get_config_entry_implementation,
14 )
16 
17 from .api import AsyncConfigEntryAuth
18 from .const import AUTH, COORDINATOR, DOMAIN
19 from .coordinator import YouTubeDataUpdateCoordinator
20 
21 PLATFORMS = [Platform.SENSOR]
22 
23 
24 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
25  """Set up YouTube from a config entry."""
26  implementation = await async_get_config_entry_implementation(hass, entry)
27  session = OAuth2Session(hass, entry, implementation)
28  auth = AsyncConfigEntryAuth(hass, session)
29  try:
30  await auth.check_and_refresh_token()
31  except ClientResponseError as err:
32  if 400 <= err.status < 500:
34  "OAuth session is not valid, reauth required"
35  ) from err
36  raise ConfigEntryNotReady from err
37  except ClientError as err:
38  raise ConfigEntryNotReady from err
39  coordinator = YouTubeDataUpdateCoordinator(hass, auth)
40 
41  await coordinator.async_config_entry_first_refresh()
42 
43  await delete_devices(hass, entry, coordinator)
44 
45  hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {
46  COORDINATOR: coordinator,
47  AUTH: auth,
48  }
49  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
50 
51  return True
52 
53 
54 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
55  """Unload a config entry."""
56 
57  if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
58  hass.data[DOMAIN].pop(entry.entry_id)
59  return unload_ok
60 
61 
62 async def delete_devices(
63  hass: HomeAssistant, entry: ConfigEntry, coordinator: YouTubeDataUpdateCoordinator
64 ) -> None:
65  """Delete all devices created by integration."""
66  channel_ids = list(coordinator.data)
67  device_registry = dr.async_get(hass)
68  dev_entries = dr.async_entries_for_config_entry(device_registry, entry.entry_id)
69  for dev_entry in dev_entries:
70  if any(identifier[1] in channel_ids for identifier in dev_entry.identifiers):
71  device_registry.async_update_device(
72  dev_entry.id, remove_config_entry_id=entry.entry_id
73  )
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:54
None delete_devices(HomeAssistant hass, ConfigEntry entry, YouTubeDataUpdateCoordinator coordinator)
Definition: __init__.py:64
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:24
AbstractOAuth2Implementation async_get_config_entry_implementation(HomeAssistant hass, config_entries.ConfigEntry config_entry)