Files
usk_schedule_downloader/lib/sonarr.py
2026-03-30 13:43:29 +07:00

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))