Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for Ombi."""
2 
3 import logging
4 
5 import pyombi
6 import voluptuous as vol
7 
8 from homeassistant.const import (
9  ATTR_NAME,
10  CONF_API_KEY,
11  CONF_HOST,
12  CONF_PASSWORD,
13  CONF_PORT,
14  CONF_SSL,
15  CONF_USERNAME,
16  Platform,
17 )
18 from homeassistant.core import HomeAssistant, ServiceCall
20 from homeassistant.helpers.discovery import load_platform
21 from homeassistant.helpers.typing import ConfigType
22 
23 from .const import (
24  ATTR_SEASON,
25  CONF_URLBASE,
26  DEFAULT_PORT,
27  DEFAULT_SEASON,
28  DEFAULT_SSL,
29  DEFAULT_URLBASE,
30  DOMAIN,
31  SERVICE_MOVIE_REQUEST,
32  SERVICE_MUSIC_REQUEST,
33  SERVICE_TV_REQUEST,
34 )
35 
36 _LOGGER = logging.getLogger(__name__)
37 
38 
39 def urlbase(value) -> str:
40  """Validate and transform urlbase."""
41  if value is None:
42  raise vol.Invalid("string value is None")
43  value = str(value).strip("/")
44  if not value:
45  return value
46  return f"{value}/"
47 
48 
49 SUBMIT_MOVIE_REQUEST_SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_NAME): cv.string})
50 
51 SUBMIT_MUSIC_REQUEST_SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_NAME): cv.string})
52 
53 SUBMIT_TV_REQUEST_SERVICE_SCHEMA = vol.Schema(
54  {
55  vol.Required(ATTR_NAME): cv.string,
56  vol.Optional(ATTR_SEASON, default=DEFAULT_SEASON): vol.In(
57  ["first", "latest", "all"]
58  ),
59  }
60 )
61 
62 CONFIG_SCHEMA = vol.Schema(
63  {
64  DOMAIN: vol.All(
65  vol.Schema(
66  {
67  vol.Required(CONF_HOST): cv.string,
68  vol.Required(CONF_USERNAME): cv.string,
69  vol.Exclusive(CONF_API_KEY, "auth"): cv.string,
70  vol.Exclusive(CONF_PASSWORD, "auth"): cv.string,
71  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
72  vol.Optional(CONF_URLBASE, default=DEFAULT_URLBASE): urlbase,
73  vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean,
74  }
75  ),
76  cv.has_at_least_one_key(CONF_API_KEY, CONF_PASSWORD),
77  )
78  },
79  extra=vol.ALLOW_EXTRA,
80 )
81 
82 
83 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
84  """Set up the Ombi component platform."""
85 
86  ombi = pyombi.Ombi(
87  ssl=config[DOMAIN][CONF_SSL],
88  host=config[DOMAIN][CONF_HOST],
89  port=config[DOMAIN][CONF_PORT],
90  urlbase=config[DOMAIN][CONF_URLBASE],
91  username=config[DOMAIN][CONF_USERNAME],
92  password=config[DOMAIN].get(CONF_PASSWORD),
93  api_key=config[DOMAIN].get(CONF_API_KEY),
94  )
95 
96  try:
97  ombi.authenticate()
98  ombi.test_connection()
99  except pyombi.OmbiError as err:
100  _LOGGER.warning("Unable to setup Ombi: %s", err)
101  return False
102 
103  hass.data[DOMAIN] = {"instance": ombi}
104 
105  def submit_movie_request(call: ServiceCall) -> None:
106  """Submit request for movie."""
107  name = call.data[ATTR_NAME]
108  movies = ombi.search_movie(name)
109  if movies:
110  movie = movies[0]
111  ombi.request_movie(movie["theMovieDbId"])
112  else:
113  raise Warning("No movie found.")
114 
115  def submit_tv_request(call: ServiceCall) -> None:
116  """Submit request for TV show."""
117  name = call.data[ATTR_NAME]
118  tv_shows = ombi.search_tv(name)
119 
120  if tv_shows:
121  season = call.data[ATTR_SEASON]
122  show = tv_shows[0]["id"]
123  if season == "first":
124  ombi.request_tv(show, request_first=True)
125  elif season == "latest":
126  ombi.request_tv(show, request_latest=True)
127  elif season == "all":
128  ombi.request_tv(show, request_all=True)
129  else:
130  raise Warning("No TV show found.")
131 
132  def submit_music_request(call: ServiceCall) -> None:
133  """Submit request for music album."""
134  name = call.data[ATTR_NAME]
135  music = ombi.search_music_album(name)
136  if music:
137  ombi.request_music(music[0]["foreignAlbumId"])
138  else:
139  raise Warning("No music album found.")
140 
141  hass.services.register(
142  DOMAIN,
143  SERVICE_MOVIE_REQUEST,
144  submit_movie_request,
145  schema=SUBMIT_MOVIE_REQUEST_SERVICE_SCHEMA,
146  )
147  hass.services.register(
148  DOMAIN,
149  SERVICE_MUSIC_REQUEST,
150  submit_music_request,
151  schema=SUBMIT_MUSIC_REQUEST_SERVICE_SCHEMA,
152  )
153  hass.services.register(
154  DOMAIN,
155  SERVICE_TV_REQUEST,
156  submit_tv_request,
157  schema=SUBMIT_TV_REQUEST_SERVICE_SCHEMA,
158  )
159  load_platform(hass, Platform.SENSOR, DOMAIN, {}, config)
160 
161  return True
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
bool setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:83
None load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)
Definition: discovery.py:137