# -*- coding: utf-8 -*- from requests import get, post from requests.cookies import RequestsCookieJar from Torrent import TorrentFile, MagnetLink, Torrent, TorrentTypes class Qbit(object): def __init__(self, username: str, passwd: str, url: str): self.username = username self.passwd = passwd self.baseurl = url self.cookies = self.__getcookies() def __getcookies(self) -> RequestsCookieJar: creds = { "username": self.username, "password": self.passwd } resp = post(f"{self.baseurl}/api/v2/auth/login", data=creds) cookies = resp.cookies if get(f"{self.baseurl}/api/v2/app/version", cookies=cookies).status_code != 200: raise Exception("Error connecting to QBitTorrentAPI") return cookies def getlist(self) -> list: json = get(f"{self.baseurl}/api/v2/torrents/info?filter=completed,downloading&sort=progress", cookies=self.cookies).json() output = [] for element in json: output.append(TorrentElement(element["name"], element["state"], float(element["progress"]))) return output def __uploadfile(self, torrent: TorrentFile) -> int: with open(torrent.url, "rb") as torrent_binary: torrent_file = {"torrents": (torrent.url, torrent_binary, "application/x-bittorrent")} params = {"savepath": torrent.path} resp = post(url=f"{self.baseurl}/api/v2/torrents/add", cookies=self.cookies, files=torrent_file, data=params) return resp.status_code def __uploadmagnet(self, torrent: MagnetLink) -> int: params = { "urls": torrent.url, "savepath": torrent.path } resp = post(url=f"{self.baseurl}/api/v2/torrents/add", cookies=self.cookies, data=params) return resp.status_code def upload(self, torrent: Torrent) -> None: status = None match torrent.torrent_type: case TorrentTypes.FILE: status = self.__uploadfile(torrent) case TorrentTypes.MAGNET: status = self.__uploadmagnet(torrent) if status != 200: raise Exception("Error downloading torrent") class TorrentElement(object): def __init__(self, name: str, state: str, progress: float): self.name = name self.state = state self.progress = round(progress*100, 1) def __str__(self): return f"{self.name} | {self.state} | {self.progress}%"