121 lines
3.8 KiB
Python
121 lines
3.8 KiB
Python
import requests
|
|
from .models import ServiceSetting
|
|
|
|
class BaseClient:
|
|
def __init__(self, name):
|
|
try:
|
|
self.setting = ServiceSetting.objects.get(name=name, is_active=True)
|
|
self.url = self.setting.url.rstrip('/')
|
|
self.api_key = self.setting.api_key
|
|
except ServiceSetting.DoesNotExist:
|
|
self.setting = None
|
|
self.url = None
|
|
self.api_key = None
|
|
|
|
def is_configured(self):
|
|
return self.url and self.api_key
|
|
|
|
class JellyfinClient(BaseClient):
|
|
def __init__(self):
|
|
super().__init__('jellyfin')
|
|
|
|
def get_info(self):
|
|
if not self.is_configured(): return None
|
|
try:
|
|
headers = {'X-Emby-Token': self.api_key}
|
|
resp = requests.get(f"{self.url}/System/Info", headers=headers, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except:
|
|
pass
|
|
return None
|
|
|
|
def get_recent_items(self, limit=5):
|
|
if not self.is_configured(): return []
|
|
try:
|
|
headers = {'X-Emby-Token': self.api_key}
|
|
# Get latest media
|
|
resp = requests.get(f"{self.url}/Users/Public/Items/Latest?Limit={limit}", headers=headers, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except:
|
|
pass
|
|
return []
|
|
|
|
class RadarrClient(BaseClient):
|
|
def __init__(self):
|
|
super().__init__('radarr')
|
|
|
|
def get_status(self):
|
|
if not self.is_configured(): return None
|
|
try:
|
|
params = {'apikey': self.api_key}
|
|
resp = requests.get(f"{self.url}/api/v3/system/status", params=params, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except:
|
|
pass
|
|
return None
|
|
|
|
def get_queue(self):
|
|
if not self.is_configured(): return []
|
|
try:
|
|
params = {'apikey': self.api_key}
|
|
resp = requests.get(f"{self.url}/api/v3/queue", params=params, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json().get('records', [])
|
|
except:
|
|
pass
|
|
return []
|
|
|
|
class SonarrClient(BaseClient):
|
|
def __init__(self):
|
|
super().__init__('sonarr')
|
|
|
|
def get_status(self):
|
|
if not self.is_configured(): return None
|
|
try:
|
|
params = {'apikey': self.api_key}
|
|
resp = requests.get(f"{self.url}/api/v3/system/status", params=params, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except:
|
|
pass
|
|
return None
|
|
|
|
def get_queue(self):
|
|
if not self.is_configured(): return []
|
|
try:
|
|
params = {'apikey': self.api_key}
|
|
resp = requests.get(f"{self.url}/api/v3/queue", params=params, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json().get('records', [])
|
|
except:
|
|
pass
|
|
return []
|
|
|
|
class JellyseerrClient(BaseClient):
|
|
def __init__(self):
|
|
super().__init__('jellyseerr')
|
|
|
|
def get_status(self):
|
|
if not self.is_configured(): return None
|
|
try:
|
|
headers = {'X-Api-Key': self.api_key}
|
|
resp = requests.get(f"{self.url}/api/v1/status", headers=headers, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json()
|
|
except:
|
|
pass
|
|
return None
|
|
|
|
def get_requests(self, count=5):
|
|
if not self.is_configured(): return []
|
|
try:
|
|
headers = {'X-Api-Key': self.api_key}
|
|
resp = requests.get(f"{self.url}/api/v1/request?take={count}&skip=0&filter=all", headers=headers, timeout=5)
|
|
if resp.status_code == 200:
|
|
return resp.json().get('results', [])
|
|
except:
|
|
pass
|
|
return [] |