Home Assistant Unofficial Reference 2024.12.1
update.py
Go to the documentation of this file.
1 """Representation of Plex updates."""
2 
3 import logging
4 from typing import Any
5 
6 from plexapi.exceptions import PlexApiException
7 import plexapi.server
8 import requests.exceptions
9 
10 from homeassistant.components.update import UpdateEntity, UpdateEntityFeature
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant
13 from homeassistant.exceptions import HomeAssistantError
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from .const import CONF_SERVER_IDENTIFIER
17 from .helpers import get_plex_server
18 
19 _LOGGER = logging.getLogger(__name__)
20 
21 
23  hass: HomeAssistant,
24  config_entry: ConfigEntry,
25  async_add_entities: AddEntitiesCallback,
26 ) -> None:
27  """Set up Plex update entities from a config entry."""
28  server_id = config_entry.data[CONF_SERVER_IDENTIFIER]
29  server = get_plex_server(hass, server_id)
30  plex_server = server.plex_server
31  can_update = await hass.async_add_executor_job(plex_server.canInstallUpdate)
32  async_add_entities([PlexUpdate(plex_server, can_update)], update_before_add=True)
33 
34 
36  """Representation of a Plex server update entity."""
37 
38  _attr_supported_features = UpdateEntityFeature.RELEASE_NOTES
39  _release_notes: str | None = None
40 
41  def __init__(
42  self, plex_server: plexapi.server.PlexServer, can_update: bool
43  ) -> None:
44  """Initialize the Update entity."""
45  self.plex_serverplex_server = plex_server
46  self._attr_name_attr_name = f"Plex Media Server ({plex_server.friendlyName})"
47  self._attr_unique_id_attr_unique_id = plex_server.machineIdentifier
48  if can_update:
49  self._attr_supported_features_attr_supported_features |= UpdateEntityFeature.INSTALL
50 
51  def update(self) -> None:
52  """Update sync attributes."""
53  self._attr_installed_version_attr_installed_version = self.plex_serverplex_server.version
54  try:
55  if (release := self.plex_serverplex_server.checkForUpdate()) is None:
56  self._attr_latest_version_attr_latest_version = self.installed_versioninstalled_versioninstalled_version
57  return
58  except (requests.exceptions.RequestException, PlexApiException):
59  _LOGGER.debug("Polling update sensor failed, will try again")
60  return
61  self._attr_latest_version_attr_latest_version = release.version
62  if release.fixed:
63  self._release_notes_release_notes = "\n".join(
64  f"* {line}" for line in release.fixed.split("\n")
65  )
66  else:
67  self._release_notes_release_notes = None
68 
69  def release_notes(self) -> str | None:
70  """Return release notes for the available upgrade."""
71  return self._release_notes_release_notes
72 
73  def install(self, version: str | None, backup: bool, **kwargs: Any) -> None:
74  """Install an update."""
75  try:
76  self.plex_serverplex_server.installUpdate()
77  except (requests.exceptions.RequestException, PlexApiException) as exc:
78  raise HomeAssistantError(str(exc)) from exc
None install(self, str|None version, bool backup, **Any kwargs)
Definition: update.py:73
None __init__(self, plexapi.server.PlexServer plex_server, bool can_update)
Definition: update.py:43
PlexServer get_plex_server(HomeAssistant hass, str server_id)
Definition: helpers.py:34
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: update.py:26