4
1
Fork 1

Start writing qBitTorrent API implementation

This commit is contained in:
trueold89 2024-08-03 14:26:19 +03:00
parent e8acbd89c7
commit d8d06eea92
Signed by: trueold89
GPG Key ID: C122E85DD49E6B30
2 changed files with 97 additions and 0 deletions

96
tubot/torrent/apis.py Normal file
View File

@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
########################################
# Torrent Server API's implementations #
########################################
# Imports
from http.cookies import SimpleCookie
from aiohttp import ClientSession, ClientResponse
from tubot.torrent.abc import TorrentAPI
from tubot.torrent.torrents import TorrentFile, TorrentMagnet, TorrentURL
from tubot.torrent.types import ServerTypes, TorrentListBuilder
class qBitTorrent(TorrentAPI):
"""
qBitTorrent API implementation
"""
host: str
username: str
password: str
cookie: SimpleCookie | None
_atype = ServerTypes.qBitTorrent
def __init__(self, host: str, username: str, password: str) -> None:
"""
:param host: qBitTorrent remote server adress
:param username: qBitTorrent remote username
:param password: qBitTorrent remote password
"""
super().__init__()
self.cookie = None
self.host = host
self.username = username
self.password = password
async def _get(
self, api: str, cookie: SimpleCookie | None = None
) -> ClientResponse:
"""
Send get request to Torrent server
:param api: API schema
:param cookie: Cookies for auth
"""
async with ClientSession() as session:
return await session.get(url=f"{self.host}/{api}", cookies=cookie)
async def _post(
self, api: str, cookie: SimpleCookie | None = None, data: dict | None = None
) -> ClientResponse:
"""
Send post request to Torrent server
:param api: API schema
:param cookie: Cookies for auth
:param data: Request data
"""
async with ClientSession() as session:
return await session.get(
url=f"{self.host}/{api}", cookies=cookie, data=data
)
async def auth(self) -> bool:
"""
Generates cookies for auth
"""
creds = {"username": self.username, "password": self.password}
resp = await self._post(api="api/v2/auth/login", data=creds)
if resp.status == 200:
cookies = resp.cookies
resp = await self._get(api="api/v2/app/version", cookie=cookies)
if resp.status != 200:
raise ValueError("Auth error")
self.cookie = cookies
return True
raise ConnectionError()
async def upload_file(self, torrent: TorrentFile) -> None:
...
async def upload_magnet(self, torrent: TorrentMagnet) -> None:
...
async def upload_url(self, torrent: TorrentURL) -> None:
...
@property
async def torrent_list(self) -> str:
lb = TorrentListBuilder()
...
return str(lb)
async def __validate__(self) -> bool:
...

View File

@ -23,6 +23,7 @@ class ServerTypes(Enum):
"""
Types of Torrent servers API's
"""
qBitTorrent = "qBitTorrent Remote API"
class TorrentFromServer(object):