updated to support Radarr and Sonarr V3 Api

This commit is contained in:
Robin 2021-09-17 22:55:02 +00:00
parent c6b8dde29a
commit 57028cd26c
3 changed files with 198 additions and 70 deletions

View file

@ -2,7 +2,7 @@ from logging import getLogger
from requests import Session, Request
from datetime import datetime, timezone, date, timedelta
from varken.structures import Queue, SonarrTVShow
from varken.structures import SonarrEpisode, SonarrQueue, QueuePages, SonarrTVShow
from varken.helpers import hashit, connection_handler
@ -18,9 +18,33 @@ class SonarrAPI(object):
def __repr__(self):
return f"<sonarr-{self.server.id}>"
def get_series(self, id):
endpoint = '/api/v3/series/'
req = self.session.prepare_request(Request('GET', self.server.url + endpoint + str(id)))
get = connection_handler(self.session, req, self.server.verify_ssl)
if not get:
return
return SonarrTVShow(**get)
def get_episode(self, id):
endpoint = '/api/v3/episode'
params = {'episodeIds': id}
req = self.session.prepare_request(Request('GET', self.server.url + endpoint,params = params))
get = connection_handler(self.session, req, self.server.verify_ssl)
if not get:
return
return SonarrEpisode(**get[0])
def get_calendar(self, query="Missing"):
endpoint = '/api/calendar/'
endpoint = '/api/v3/calendar/'
today = str(date.today())
last_days = str(date.today() - timedelta(days=self.server.missing_days))
future = str(date.today() + timedelta(days=self.server.future_days))
@ -42,22 +66,23 @@ class SonarrAPI(object):
tv_shows = []
for show in get:
try:
tv_shows.append(SonarrTVShow(**show))
tv_shows.append(SonarrEpisode(**show))
except TypeError as e:
self.logger.error('TypeError has occurred : %s while creating SonarrTVShow structure for show. Data '
self.logger.error('TypeError has occurred : %s while creating SonarrEpisode structure for show. Data '
'attempted is: %s', e, show)
for show in tv_shows:
sxe = f'S{show.seasonNumber:0>2}E{show.episodeNumber:0>2}'
if show.hasFile:
for episode in tv_shows:
tvShow = self.get_series(episode.seriesId)
sxe = f'S{episode.seasonNumber:0>2}E{episode.episodeNumber:0>2}'
if episode.hasFile:
downloaded = 1
else:
downloaded = 0
if query == "Missing":
if show.monitored and not downloaded:
missing.append((show.series['title'], downloaded, sxe, show.title, show.airDateUtc, show.id))
if episode.monitored and not downloaded:
missing.append((tvShow.title, downloaded, sxe, episode.title, episode.airDateUtc, episode.seriesId))
else:
air_days.append((show.series['title'], downloaded, sxe, show.title, show.airDateUtc, show.id))
air_days.append((tvShow.title, downloaded, sxe, episode.title, episode.airDateUtc, episode.seriesId))
for series_title, dl_status, sxe, episode_title, air_date_utc, sonarr_id in (air_days or missing):
hash_id = hashit(f'{self.server.id}{series_title}{sxe}')
@ -85,41 +110,59 @@ class SonarrAPI(object):
def get_queue(self):
influx_payload = []
endpoint = '/api/queue'
endpoint = '/api/v3/queue'
now = datetime.now(timezone.utc).astimezone().isoformat()
pageSize = 250
params = {'pageSize': pageSize}
queueResponse = []
queue = []
req = self.session.prepare_request(Request('GET', self.server.url + endpoint))
req = self.session.prepare_request(Request('GET', self.server.url + endpoint,params=params))
get = connection_handler(self.session, req, self.server.verify_ssl)
if not get:
return
response = QueuePages(**get)
queueResponse.extend(response.records)
while response.totalRecords > response.page * response.pageSize:
page = response.page + 1
params = {'pageSize': pageSize, 'page': page}
req = self.session.prepare_request(Request('GET', self.server.url + endpoint,params=params))
get = connection_handler(self.session, req, self.server.verify_ssl)
if not get:
return
response = QueuePages(**get)
queueResponse.extend(response.records)
download_queue = []
for show in get:
for queueItem in queueResponse:
try:
download_queue.append(Queue(**show))
download_queue.append(SonarrQueue(**queueItem))
except TypeError as e:
self.logger.error('TypeError has occurred : %s while creating Queue structure. Data attempted is: '
'%s', e, show)
'%s', e, queueItem)
if not download_queue:
return
for show in download_queue:
for queueItem in download_queue:
tvShow = self.get_series(queueItem.seriesId)
episode = self.get_episode(queueItem.episodeId)
try:
sxe = f"S{show.episode['seasonNumber']:0>2}E{show.episode['episodeNumber']:0>2}"
sxe = f"S{episode.seasonNumber:0>2}E{episode.episodeNumber:0>2}"
except TypeError as e:
self.logger.error('TypeError has occurred : %s while processing the sonarr queue. \
Remove invalid queue entry. Data attempted is: %s', e, show)
Remove invalid queue entry. Data attempted is: %s', e, queueItem)
continue
if show.protocol.upper() == 'USENET':
if queueItem.protocol.upper() == 'USENET':
protocol_id = 1
else:
protocol_id = 0
queue.append((show.series['title'], show.episode['title'], show.protocol.upper(),
protocol_id, sxe, show.id, show.quality['quality']['name']))
queue.append((tvShow.title, episode.title, queueItem.protocol.upper(),
protocol_id, sxe, queueItem.seriesId, queueItem.quality['quality']['name']))
for series_title, episode_title, protocol, protocol_id, sxe, sonarr_id, quality in queue:
hash_id = hashit(f'{self.server.id}{series_title}{sxe}')