-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathombi_functions.py
executable file
·122 lines (102 loc) · 4.55 KB
/
ombi_functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python
import os
import requests
def request(f):
r = f().json()
if r["isError"]:
raise OmbiError(r["errorMessage"])
return r
class OmbiError(Exception):
pass
class Ombi():
"""A class for handling connections with an Ombi instance."""
def __init__(self, host, username=None, password=None, api_key=None, urlbase="/ombi", ssl=True):
if api_key is None and password is None:
raise TypeError('Username/Password or API key must be set')
if 'https://' in host and ssl:
self._base_url = f'{host}{urlbase}/api/v1/'
elif 'http://' in host and ssl is False:
self._base_url = f'{host}{urlbase}/api/v1/'
elif ssl is False:
self._base_url = f'http://{host}{urlbase}/api/v1/'
else:
self._base_url = f'https://{host}{urlbase}/api/v1/'
if 'https://http' in self._base_url:
raise TypeError(f'URL is invalid: {self._base_url}')
if api_key:
self._api_key = api_key
self._auth = {"ApiKey": self._api_key}
elif username:
self._username = username
self._password = password
def test_connection(self):
res = self._request_connection(path="Status")
if res.ok:
return 'ok'
def _request_connection(self, path, post_data=None, put_data=None, auth=True):
url = f"{self._base_url}{path}"
if auth:
headers = self._auth
try:
if post_data is None and put_data is None:
res = requests.get(url=url, headers=headers, timeout=10)
elif put_data:
res = requests.put(url=url, headers=headers, json=put_data, timeout=10)
else:
res = requests.post(url=url, headers=headers, json=post_data, timeout=10)
res.raise_for_status()
res.json()
return res
except TypeError:
raise OmbiError("No authentication type set.")
except requests.exceptions.Timeout:
raise OmbiError("Request timed out. Check port configuration.")
except requests.exceptions.ConnectionError:
raise OmbiError("Connection error. Check host configuration.")
except requests.exceptions.TooManyRedirects:
raise OmbiError("Too many redirects.")
except requests.exceptions.HTTPError as err:
status = err.response.status_code
if status == 401:
raise OmbiError("Unauthorized error. Check authentication credentials.")
else:
raise OmbiError(f"HTTP Error {status}. Check SSL configuration.")
except ValueError:
raise OmbiError("ValueError. Check urlbase configuration.")
def search_movie(self, query):
return self._request_connection(f"Search/movie/{query}").json()
def search_tv(self, query):
return self._request_connection(f"Search/tv/{query}").json()
def request_movie(self, movie_id):
data = {"theMovieDbId": movie_id, "languageCode": "en"}
request(lambda: self._request_connection(path="Request/movie", post_data=data))
def request_tv(self, tv_id, season, episode, request_all=False, request_latest=False, request_first=False):
data = {
"tvDbId": tv_id,
"latestSeason": request_latest,
"requestAll": request_all,
"firstSeason": request_first,
"seasons": [{
"seasonNumber": season,
"episodes": [{
"episodeNumber": episode
}]
}]
}
request(lambda: self._request_connection(path="Request/tv", post_data=data))
def get_movie_requests(self):
return self._request_connection("Request/movie").json()
def get_tv_requests(self):
return self._request_connection("Request/tv").json()
def approve_movie_request(self, id):
data = {"id": id}
request(lambda: self._request_connection(path="Request/movie/approve", post_data=data))
def approve_tv_request(self, id):
data = {"id": id}
request(lambda: self._request_connection(path="Request/tv/approve", post_data=data))
def deny_tv_request(self, id, reason="Not now"):
data = {"id": id, "reason": reason}
request(lambda: self._request_connection(path="Request/tv/deny", put_data=data))
def deny_movie_request(self, id, reason="Not now"):
data = {"id": id, "reason": reason}
request(lambda: self._request_connection(path="Request/movie/deny", put_data=data))