initial
This commit is contained in:
170
lib/sonarr.py
Normal file
170
lib/sonarr.py
Normal file
@@ -0,0 +1,170 @@
|
||||
from dotenv import dotenv_values
|
||||
import requests
|
||||
|
||||
import pytz
|
||||
|
||||
class Sonarr_API:
|
||||
def __init__(self,ip:str,key:str,**kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.ip=ip
|
||||
self.key=key
|
||||
self.tz = pytz.timezone("Asia/Bangkok")
|
||||
|
||||
# self.db= sqlite_db(self.db_path)
|
||||
|
||||
self.calendar_url = f"http://{ip}/feed/v3/calendar/Sonarr.ics?unmonitored=true&apikey={key}"
|
||||
|
||||
def get_episodes(self, folder=None) -> dict:
|
||||
# print(folder)
|
||||
params = {
|
||||
# 'seriesId': id,
|
||||
'folder': folder
|
||||
}
|
||||
|
||||
base_url = f"http://{self.ip}/api/v3/manualimport"
|
||||
headers = {
|
||||
"X-Api-Key": self.key,
|
||||
}
|
||||
|
||||
r = requests.get(base_url, headers=headers,params=params)
|
||||
r.raise_for_status()
|
||||
# print(r.json())
|
||||
|
||||
return r.json()
|
||||
|
||||
def import_episodes(self, entry:dict,title_config:dict, episodes_dict:dict,mode:str="move") -> list[requests.Response]:
|
||||
base_url = f"http://{self.ip}/api/v3/command"
|
||||
headers = {
|
||||
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
||||
'Content-Type': 'application/json',
|
||||
'X-Api-Key': self.key
|
||||
}
|
||||
responses=[]
|
||||
|
||||
for d in episodes_dict:
|
||||
|
||||
if not d.get('path') or not d.get('series') or not d.get('episodes'):
|
||||
continue
|
||||
for e in d['episodes']:
|
||||
season=int(entry['season'])
|
||||
if title_config['absolute_season']:
|
||||
season=int(title_config['season'])+int(title_config['absolute_season'])
|
||||
ep=int(entry['episode'])
|
||||
if title_config['absolute']:
|
||||
ep=int(entry['episode'])+int(title_config['absolute'])
|
||||
if not (str(season) == str(e['seasonNumber']) and str(ep) == str(e['episodeNumber'])\
|
||||
# and str(title_config['ID']) == str(e['seriesId'])\
|
||||
):
|
||||
|
||||
continue
|
||||
# print(title_config['ID'],str(entry['season']), str(e['seasonNumber']), str(entry['episode']), str(e['episodeNumber']))
|
||||
|
||||
|
||||
data = {
|
||||
"name": "ManualImport",
|
||||
"files": [{
|
||||
"path": d['path'],
|
||||
"seriesId": d['series']['id'],
|
||||
"episodeIds": [e['id']],
|
||||
"releaseGroup": d.get('releaseGroup'),
|
||||
"quality": d.get('quality'),
|
||||
"languages": d.get('languages'),
|
||||
"indexerFlags": d.get('indexerFlags')
|
||||
}],
|
||||
"importMode": mode
|
||||
}
|
||||
|
||||
r = requests.post(base_url, headers=headers, json=data)
|
||||
r.raise_for_status()
|
||||
responses.append(r)
|
||||
|
||||
return responses
|
||||
|
||||
def get_episode_detail(self, episodeIds) -> dict:
|
||||
# params = {
|
||||
# 'seriesId': seriesId,
|
||||
# 'episodeIds': episodeIds
|
||||
# }
|
||||
|
||||
base_url = f"http://{self.ip}/api/v3/episode/{episodeIds}"
|
||||
headers = {
|
||||
"X-Api-Key": self.key,
|
||||
}
|
||||
r = requests.get(base_url, headers=headers)
|
||||
r.raise_for_status()
|
||||
# print(r.json())
|
||||
|
||||
return r.json()
|
||||
|
||||
def get_series_detail(self,id):
|
||||
headers = {
|
||||
'Accept': 'application/json',
|
||||
'X-Api-Key': self.key,
|
||||
}
|
||||
|
||||
response = requests.get(f'http://{self.ip}/api/v3/series/{id}', headers=headers)
|
||||
return response.json()
|
||||
|
||||
def get_episode_detail_from_season(self,seriesId,season):
|
||||
response=requests.get(
|
||||
f"http://{self.ip}/api/v3/episode",
|
||||
headers={
|
||||
"Accept": "application/json",
|
||||
"X-Api-Key": self.key
|
||||
},
|
||||
params={
|
||||
"seriesId":seriesId,
|
||||
"seasonNumber":season
|
||||
}
|
||||
)
|
||||
return response.json()
|
||||
|
||||
|
||||
# def get_today_schedule(self) -> list[dict]:
|
||||
# response = requests.get(self.calendar_url)
|
||||
# response.raise_for_status() # Raises an error if the request failed
|
||||
|
||||
# # Parse the calendar
|
||||
# calendar = Calendar(response.text)
|
||||
|
||||
# db_watchlist=self.db.get_watchlist()
|
||||
|
||||
# # List all events
|
||||
# daily_list=[]
|
||||
|
||||
# for event in calendar.events:
|
||||
|
||||
# if date.today() != event.begin.date():
|
||||
# continue
|
||||
|
||||
# title_split = event.name.split(" - ")
|
||||
# title= title_split[0].strip()
|
||||
|
||||
# if not any(x['Title'] == title for x in db_watchlist):
|
||||
# continue
|
||||
|
||||
# ep = title_split[-2].split('x')
|
||||
# season = ep[-2].strip() if ep else "1"
|
||||
# episode = ep[-1].strip() if ep else "1"
|
||||
# episode_name = event.name.split(" - ")[2].strip()
|
||||
# if int(season) < 1 or int(episode) < 1:
|
||||
# continue
|
||||
|
||||
# detail ={
|
||||
# "title": title,
|
||||
# "season": int(season),
|
||||
# "episode": int(episode),
|
||||
# "episode_name": episode_name,
|
||||
# "start_timestamp": int(datetime.fromisoformat(str(event.begin)).astimezone(self.tz).timestamp()),
|
||||
# "end_timestamp": int(datetime.fromisoformat(str(event.end)).astimezone(self.tz).timestamp()),
|
||||
# "sonarr_id": event.uid.split("_")[-1],
|
||||
# }
|
||||
# daily_list.append(detail)
|
||||
|
||||
# return daily_list
|
||||
|
||||
|
||||
if "__main__" == __name__:
|
||||
sonarr=Sonarr_API("media-server.lan:8989",dotenv_values("/root/VT_Schedule_downloader/.env")['sonarr_key'],"/root/VT_Schedule_downloader/app.sqlite")
|
||||
print(sonarr.get_episode_detail(1171,43758))
|
||||
|
||||
Reference in New Issue
Block a user