from logging import getLogger from requests import Session, Request from datetime import datetime, timezone from varken.helpers import connection_handler, hashit from varken.structures import OverseerrRequest, OverseerrRequestCounts class OverseerrAPI(object): def __init__(self, server, dbmanager): self.dbmanager = dbmanager self.server = server # Create session to reduce server web thread load, and globally define pageSize for all requests self.session = Session() self.session.headers = {'X-Api-Key': self.server.api_key} self.logger = getLogger() def __repr__(self): return f"" def get_request_status_counts(self): now = datetime.now(timezone.utc).astimezone().isoformat() endpoint = '/api/v1/request/count' req = self.session.prepare_request(Request('GET', self.server.url + endpoint)) get_req = connection_handler(self.session, req, self.server.verify_ssl) if not get_req: return requests = OverseerrRequestCounts(**get_req) influx_payload = [ { "measurement": "Overseerr", "tags": { "type": "Request_Counts" }, "time": now, "fields": { "pending": requests.pending, "approved": requests.approved, "processing": requests.processing, "available": requests.available, "total": requests.total, "movies": requests.movie, "tv": requests.tv, "declined": requests.declined } } ] self.dbmanager.write_points(influx_payload) def get_latest_requests(self): now = datetime.now(timezone.utc).astimezone().isoformat() endpoint = '/api/v1/request?take=' + str(self.server.num_latest_requests_to_fetch) + '&filter=all&sort=added' movie_endpoint = '/api/v1/movie/' tv_endpoint = '/api/v1/tv/' # GET THE LATEST n REQUESTS req = self.session.prepare_request(Request('GET', self.server.url + endpoint)) get_latest_req = connection_handler(self.session, req, self.server.verify_ssl) # RETURN NOTHING IF NO RESULTS if not get_latest_req: return influx_payload = [] # Request Type: Movie = 1, TV Show = 0 for result in get_latest_req['results']: if result['type'] == 'tv': req = self.session.prepare_request(Request('GET', self.server.url + tv_endpoint + str(result['media']['tmdbId']))) get_tv_req = connection_handler(self.session, req, self.server.verify_ssl) hash_id = hashit(f'{get_tv_req["id"]}{get_tv_req["name"]}') influx_payload.append( { "measurement": "Overseerr", "tags": { "type": "Requests", "server": self.server.id, "request_type": 0, "status": get_tv_req['mediaInfo']['status'], "title": get_tv_req['name'], "requested_user": get_tv_req['mediaInfo']['requests'][0]['requestedBy']['plexUsername'], "requested_date": get_tv_req['mediaInfo']['requests'][0]['media']['createdAt'] }, "time": now, "fields": { "hash": hash_id } } ) if result['type'] == 'movie': req = self.session.prepare_request(Request('GET', self.server.url + movie_endpoint + str(result['media']['tmdbId']))) get_movie_req = connection_handler(self.session, req, self.server.verify_ssl) hash_id = hashit(f'{get_movie_req["id"]}{get_movie_req["title"]}') influx_payload.append( { "measurement": "Overseerr", "tags": { "type": "Requests", "server": self.server.id, "request_type": 1, "status": get_movie_req['mediaInfo']['status'], "title": get_movie_req['title'], "requested_user": get_movie_req['mediaInfo']['requests'][0]['requestedBy']['plexUsername'], "requested_date": get_movie_req['mediaInfo']['requests'][0]['media']['createdAt'] }, "time": now, "fields": { "hash": hash_id } } ) self.dbmanager.write_points(influx_payload)