Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Jellyfin integration."""
2 
3 from typing import Any
4 
5 from homeassistant.config_entries import ConfigEntry
6 from homeassistant.core import HomeAssistant
7 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
8 from homeassistant.helpers import device_registry as dr
9 
10 from .client_wrapper import CannotConnect, InvalidAuth, create_client, validate_input
11 from .const import CONF_CLIENT_DEVICE_ID, DOMAIN, PLATFORMS
12 from .coordinator import JellyfinDataUpdateCoordinator
13 
14 type JellyfinConfigEntry = ConfigEntry[JellyfinDataUpdateCoordinator]
15 
16 
17 async def async_setup_entry(hass: HomeAssistant, entry: JellyfinConfigEntry) -> bool:
18  """Set up Jellyfin from a config entry."""
19  if CONF_CLIENT_DEVICE_ID not in entry.data:
20  entry_data = entry.data.copy()
21  entry_data[CONF_CLIENT_DEVICE_ID] = entry.entry_id
22  hass.config_entries.async_update_entry(entry, data=entry_data)
23 
24  device_id = entry.data[CONF_CLIENT_DEVICE_ID]
25  device_name = ascii(hass.config.location_name)
26 
27  client = create_client(device_id=device_id, device_name=device_name)
28 
29  try:
30  user_id, connect_result = await validate_input(hass, dict(entry.data), client)
31  except CannotConnect as ex:
32  raise ConfigEntryNotReady("Cannot connect to Jellyfin server") from ex
33  except InvalidAuth as ex:
34  raise ConfigEntryAuthFailed(ex) from ex
35 
36  server_info: dict[str, Any] = connect_result["Servers"][0]
37 
38  coordinator = JellyfinDataUpdateCoordinator(hass, client, server_info, user_id)
39 
40  await coordinator.async_config_entry_first_refresh()
41 
42  entry.runtime_data = coordinator
43  entry.async_on_unload(client.stop)
44 
45  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
46 
47  return True
48 
49 
50 async def async_unload_entry(hass: HomeAssistant, entry: JellyfinConfigEntry) -> bool:
51  """Unload a config entry."""
52  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
53 
54 
56  hass: HomeAssistant, config_entry: JellyfinConfigEntry, device_entry: dr.DeviceEntry
57 ) -> bool:
58  """Remove device from a config entry."""
59  coordinator = config_entry.runtime_data
60 
61  return not device_entry.identifiers.intersection(
62  (
63  (DOMAIN, coordinator.server_id),
64  *((DOMAIN, device_id) for device_id in coordinator.device_ids),
65  )
66  )
bool validate_input(HomeAssistant hass, dict[str, Any] data)
Definition: config_flow.py:29
JellyfinClient create_client(str device_id, str|None device_name=None)
bool async_setup_entry(HomeAssistant hass, JellyfinConfigEntry entry)
Definition: __init__.py:17
bool async_unload_entry(HomeAssistant hass, JellyfinConfigEntry entry)
Definition: __init__.py:50
bool async_remove_config_entry_device(HomeAssistant hass, JellyfinConfigEntry config_entry, dr.DeviceEntry device_entry)
Definition: __init__.py:57