-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsonarr_backfiller.py
143 lines (116 loc) · 5.15 KB
/
sonarr_backfiller.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python2
# Written for python 2.7
# This script is used for triggering a search in Sonarr for a specific numner of episodes
# Stdlib
import urlparse
import logging
import datetime
# 3rf Party
import yaml
import requests
with open("sonarr_backfiller.yaml", "r") as settings_file:
settings_import = yaml.safe_load(settings_file)
# TODO Add Error Checking
# TODO Add propper logging
def get_queue():
api_endpoint = "/api/queue"
uri_endpoint = urlparse.urljoin(settings_import["sonarr"]["address"], api_endpoint)
headers = {
'X-Api-Key': settings_import["sonarr"]["api_key"]
}
request_response = requests.get(uri_endpoint, headers=headers)
logging.debug('request response url: %s', request_response.url)
logging.debug('request response headers: %s', request_response.headers)
logging.debug('request response encoding: %s', request_response.apparent_encoding)
logging.debug('request response text: %s', request_response.text)
logging.info('request response reason: %s', request_response.reason)
logging.info('request response status code: %s', request_response.status_code)
logging.info('request response time elapsed: %s', request_response.elapsed)
json_response = request_response.json()
download_queue = len(json_response)
return download_queue
def get_wanted():
episode_id_list = []
api_endpoint = "/api/wanted/missing"
uri_endpoint = urlparse.urljoin(settings_import["sonarr"]["address"], api_endpoint)
headers = {
'X-Api-Key': settings_import["sonarr"]["api_key"]
}
query = {"sortKey": "airDateUtc", "sortDir": settings_import["sonarr"]["sort_direction"],
"pageSize": settings_import["sonarr"]["number_of_results"]}
request_response = requests.get(uri_endpoint, params=query, headers=headers)
logging.debug('request response url: %s', request_response.url)
logging.debug('request response headers: %s', request_response.headers)
logging.debug('request response encoding: %s', request_response.apparent_encoding)
logging.debug('request response text: %s', request_response.text)
logging.info('request response reason: %s', request_response.reason)
logging.info('request response status code: %s', request_response.status_code)
logging.info('request response time elapsed: %s', request_response.elapsed)
json_response = request_response.json()
for episode_id in json_response["records"]:
episode_id_list.append(episode_id['id'])
return episode_id_list
def queue_search(episode_list):
api_endpoint = "/api/Command"
uri_endpoint = urlparse.urljoin(settings_import["sonarr"]["address"], api_endpoint)
headers = {
'content-type': 'application/json',
'X-Api-Key': settings_import["sonarr"]["api_key"]
}
payload = episode_list
request_response = requests.post(uri_endpoint, headers=headers, json=payload)
logging.debug('request submit uri %s', uri_endpoint)
logging.debug('request submit headers %s', headers)
logging.debug('request submit payload %s', payload)
logging.debug('request response url: %s', request_response.url)
logging.debug('request response headers: %s', request_response.headers)
logging.debug('request response encoding: %s', request_response.apparent_encoding)
logging.debug('request response text: %s', request_response.text)
logging.debug('request response reason: %s', request_response.json)
logging.info('request response reason: %s', request_response.reason)
logging.info('request response status code: %s', request_response.status_code)
logging.info('request response time elapsed: %s', request_response.elapsed)
request_output = request_response.json()
logging.info("Command ID = %s", request_output["id"])
logging.info("Command State = %s", request_output["state"])
def main():
log_entry_format = ':'.join(
[
'%(asctime)s',
'%(levelname)s',
'%(filename)s',
'%(funcName)s',
'%(lineno)s',
'%(message)s',
]
)
logging.basicConfig(
format=log_entry_format,
level=logging.INFO,
filename=".".join(
[
settings_import["logging_file_name"],
datetime.datetime.now().strftime("%Y-%m-%d"),
"log"
]
)
)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.INFO)
requests_log.propagate = True
queue_length = get_queue()
if queue_length <= settings_import["sonarr"]["queue_minimum"]:
logging.info("Queue length is %s, adding an additional %s items",
queue_length,
settings_import["sonarr"]["number_of_results"]
)
episode_list = {"name": "EpisodeSearch"}
episode_list.update({"EpisodeIds": get_wanted()})
queue_search(episode_list)
else:
logging.info("Queue length is %s, which exceeds limit of %s to add additional items",
queue_length,
settings_import["sonarr"]["number_of_results"]
)
if __name__ == '__main__':
main()