Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Provides the NZBGet DataUpdateCoordinator."""
2 
3 import asyncio
4 from collections.abc import Mapping
5 from datetime import timedelta
6 import logging
7 from typing import Any
8 
9 from pynzbgetapi import NZBGetAPI, NZBGetAPIException
10 
11 from homeassistant.const import (
12  CONF_HOST,
13  CONF_PASSWORD,
14  CONF_PORT,
15  CONF_SSL,
16  CONF_USERNAME,
17  CONF_VERIFY_SSL,
18 )
19 from homeassistant.core import HomeAssistant
20 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
21 
22 from .const import DOMAIN
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 
28  """Class to manage fetching NZBGet data."""
29 
30  def __init__(
31  self,
32  hass: HomeAssistant,
33  *,
34  config: Mapping[str, Any],
35  ) -> None:
36  """Initialize global NZBGet data updater."""
37  self.nzbgetnzbget = NZBGetAPI(
38  config[CONF_HOST],
39  config.get(CONF_USERNAME),
40  config.get(CONF_PASSWORD),
41  config[CONF_SSL],
42  config[CONF_VERIFY_SSL],
43  config[CONF_PORT],
44  )
45 
46  self._completed_downloads_init_completed_downloads_init = False
47  self._completed_downloads_completed_downloads = set[tuple]()
48 
49  super().__init__(
50  hass, _LOGGER, name=DOMAIN, update_interval=timedelta(seconds=5)
51  )
52 
53  def _check_completed_downloads(self, history):
54  """Check history for newly completed downloads."""
55  actual_completed_downloads = {
56  (x["Name"], x["Category"], x["Status"]) for x in history
57  }
58 
59  if self._completed_downloads_init_completed_downloads_init:
60  tmp_completed_downloads = list(
61  actual_completed_downloads.difference(self._completed_downloads_completed_downloads)
62  )
63 
64  for download in tmp_completed_downloads:
65  self.hasshass.bus.fire(
66  "nzbget_download_complete",
67  {
68  "name": download[0],
69  "category": download[1],
70  "status": download[2],
71  },
72  )
73 
74  self._completed_downloads_completed_downloads = actual_completed_downloads
75  self._completed_downloads_init_completed_downloads_init = True
76 
77  async def _async_update_data(self) -> dict:
78  """Fetch data from NZBGet."""
79 
80  def _update_data() -> dict:
81  """Fetch data from NZBGet via sync functions."""
82  status = self.nzbgetnzbget.status()
83  history = self.nzbgetnzbget.history()
84 
85  self._check_completed_downloads_check_completed_downloads(history)
86 
87  return {
88  "status": status,
89  "downloads": history,
90  }
91 
92  try:
93  async with asyncio.timeout(4):
94  return await self.hasshass.async_add_executor_job(_update_data)
95  except NZBGetAPIException as error:
96  raise UpdateFailed(f"Invalid response from API: {error}") from error
None __init__(self, HomeAssistant hass, *Mapping[str, Any] config)
Definition: coordinator.py:35
_ItemT _update_data(self, _ItemT item, dict update_data)
Definition: collection.py:296