1 """The Jellyfin integration."""
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
14 type JellyfinConfigEntry = ConfigEntry[JellyfinDataUpdateCoordinator]
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)
24 device_id = entry.data[CONF_CLIENT_DEVICE_ID]
25 device_name = ascii(hass.config.location_name)
27 client =
create_client(device_id=device_id, device_name=device_name)
31 except CannotConnect
as ex:
33 except InvalidAuth
as ex:
36 server_info: dict[str, Any] = connect_result[
"Servers"][0]
40 await coordinator.async_config_entry_first_refresh()
42 entry.runtime_data = coordinator
43 entry.async_on_unload(client.stop)
45 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
51 """Unload a config entry."""
52 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
56 hass: HomeAssistant, config_entry: JellyfinConfigEntry, device_entry: dr.DeviceEntry
58 """Remove device from a config entry."""
59 coordinator = config_entry.runtime_data
61 return not device_entry.identifiers.intersection(
63 (DOMAIN, coordinator.server_id),
64 *((DOMAIN, device_id)
for device_id
in coordinator.device_ids),
bool validate_input(HomeAssistant hass, dict[str, Any] data)
JellyfinClient create_client(str device_id, str|None device_name=None)
bool async_setup_entry(HomeAssistant hass, JellyfinConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, JellyfinConfigEntry entry)
bool async_remove_config_entry_device(HomeAssistant hass, JellyfinConfigEntry config_entry, dr.DeviceEntry device_entry)