68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
# -*- 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}%"
|