170 lines
5.6 KiB
Python
170 lines
5.6 KiB
Python
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))
|
|
|