diff --git a/src/ptpapi/sites/__init__.py b/src/ptpapi/sites/__init__.py deleted file mode 100644 index 6054603..0000000 --- a/src/ptpapi/sites/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from ptpapi.sites.cg import CGAPI -from ptpapi.sites.kg import KGAPI - - -__all__ = ["CGAPI", "KGAPI"] diff --git a/src/ptpapi/sites/base.py b/src/ptpapi/sites/base.py deleted file mode 100644 index 7651ba6..0000000 --- a/src/ptpapi/sites/base.py +++ /dev/null @@ -1,33 +0,0 @@ -from bs4 import BeautifulSoup - - -class BaseSiteAPI: - Name = "BS" - - def __init__(self): - self.baseURL = None - self.session = None - self.login() - - def login(self, username=None, password=None, passkey=None): - raise NotImplementedError - - def download_to_file(self, ID, dest=None): - raise NotImplementedError - - def find_ptp_movie(self, movie): - raise NotImplementedError - - def bytes_to_site_size(self, byte_num): - raise NotImplementedError - - def _httpRequest(self, url, data=None): - html = self._request(self.baseURL + url, data) - soup = BeautifulSoup(html, "html.parser") - return soup - - def _request(self, url, data=None): - return self.session.get(url, data=data).text - - def _jsonRequest(self, url, data=None): - return self.session.get(url, data=data).json() diff --git a/src/ptpapi/sites/cg.py b/src/ptpapi/sites/cg.py deleted file mode 100644 index b253b27..0000000 --- a/src/ptpapi/sites/cg.py +++ /dev/null @@ -1,98 +0,0 @@ -import logging -import os -import re - -import bencode -import humanize - -from ptpapi.config import config -from ptpapi.session import TokenSession -from ptpapi.sites.base import BaseSiteAPI - - -class CGAPI(BaseSiteAPI): - Name = "CG" - - def __init__(self): - self.baseURL = "https://cinemageddon.net" - self.session = TokenSession(3, 0.5) - self.session.headers.update({"User-Agent": "Wget/1.13.4"}) - super().__init__() - - def login(self, username=None, password=None, passkey=None): - password = password or config.get("CG", "password") - username = username or config.get("CG", "username") - response = self.session.post( - self.baseURL + "/takelogin.php", - data={"username": username, "password": password}, - ) - response.raise_for_status() - if response.text.find('action="takelogin.php"') != -1: - raise CGAPIException("Failed to log in") - - def search(self, search_args): - search_string = "&".join( - ["%s=%s" % (key, value) for (key, value) in search_args.items()] - ) - soup = self._httpRequest("/browse.php?%s" % search_string) - return self.getTorrentListInfo(soup) - - def find_ptp_movie(self, movie): - return self.search({"search": "tt{0}".format(movie["ImdbId"])}) - - def bytes_to_site_size(self, byte_num): - humanized = humanize.naturalsize(byte_num, format="%.2f", binary=True) - if "KiB" in humanized: - humanized = humanize.naturalsize(byte_num, format="%d", binary=True) - return humanized - - def getTorrentListInfo(self, soup): - if not soup.find("table", class_="torrenttable") or not soup.find( - "table", class_="torrenttable" - ).find("tbody"): - return [] - rows = soup.find("table", class_="torrenttable").find("tbody").find_all("tr") - retArray = [] - for r in rows: - data = {} - data["Title"] = r.find("a", href=re.compile(r"details.php\?id=[0-9]+$"))[ - "title" - ] - data["BinaryHumanSize"] = ( - r.find(text=re.compile(r"[0-9]+\.[0-9]+ [kA-Z]B")) - .replace("B", "iB") - .replace("k", "K") - ) - data["Seeders"] = re.match( - r"([0-9]+)", r.find(title=re.compile("[0-9]+ seeders?"))["title"] - ).group(1) - data["ID"] = re.match( - r"details.php\?id=([0-9]+)$", - r.find("a", href=re.compile(r"details.php\?id=[0-9]+$"))["href"], - ).group(1) - retArray.append(data) - return retArray - - def download_to_file(self, ID, dest=None): - logger = logging.getLogger(__name__) - r = self.session.get(self.baseURL + "/download.php", params={"id": ID}) - r.raise_for_status() - if not dest: - name = ( - bencode.bdecode(r.content)["info"]["name"].replace("/", "_") - + ".torrent" - ) - dest = os.path.join(config.get("Main", "downloadDirectory"), name) - logger.debug("Downloading ID {} to {}".format(ID, dest.encode("utf-8"))) - with open(dest, "wb") as fh: - fh.write(r.content) - - -class CGAPIException(Exception): - pass - - -if __name__ == "__main__": - cg = CGAPI() - cg.login() - print(cg.search({"search": "tt0054650"})) diff --git a/src/ptpapi/sites/kg.py b/src/ptpapi/sites/kg.py deleted file mode 100644 index 5ded650..0000000 --- a/src/ptpapi/sites/kg.py +++ /dev/null @@ -1,95 +0,0 @@ -import os -import re - -import humanize - -from ptpapi.config import config -from ptpapi.session import TokenSession -from ptpapi.sites.base import BaseSiteAPI - - -class KGAPI(BaseSiteAPI): - Name = "KG" - - def __init__(self): - self.baseURL = "https://karagarga.in" - self.session = TokenSession(3, 0.5) - self.session.headers.update({"User-Agent": "Wget/1.13.4"}) - super().__init__() - - def login(self, username=None, password=None, passkey=None): - password = password or config.get("KG", "password") - username = username or config.get("KG", "username") - response = self.session.post( - self.baseURL + "/takelogin.php", - data={"username": username, "password": password}, - ).text - if response.find('action="takelogin.php"') != -1: - raise KGAPIException("Failed to log in") - - def search(self, search_args): - search_string = "&".join( - ["%s=%s" % (key, value) for (key, value) in search_args.items()] - ) - soup = self._httpRequest("/browse.php?%s" % search_string) - return self.getTorrentListInfo(soup) - - def getTorrentListInfo(self, soup): - if not soup.find("table", id="browse"): - return [] - retArray = [] - for row in soup.find("table", id="browse").find_all("tr")[1:]: - if "id" in row.find_all("td")[0].attrs: - # Only rows used for displaying extra info have IDs; we don't want them - continue - cells = row.find_all("td") - infoDict = { - "Title": cells[1].b.get_text(), - "Year": cells[3].get_text(), - "Seeders": cells[12].get_text(), - "Leechers": cells[13].get_text(), - "BinaryHumanSize": re.sub( - r"([a-zA-Z])B", r" \1iB", cells[10].get_text() - ).replace("k", "K"), - } - infoDict["ID"] = re.search(r"\d+", cells[1].a["href"]).group(0) - retArray.append(infoDict) - return retArray - - def download(self, ID): - r = self.session.get(self.baseURL + "/down.php/%s/file.torrent" % ID) - downloadName = re.search( - r'filename="(.*)"', r.headers["Content-Disposition"] - ).group(1) - return (downloadName, r.content) - - def download_to_file(self, ID, dest=None): - r = self.session.get(self.baseURL + "/down.php/%s/file.torrent" % ID) - r.raise_for_status() - if not dest: - name = ( - re.search(r'filename="(.*)"', r.headers["Content-Disposition"]) - .group(1) - .replace("/", "_") - ) - dest = os.path.join(config.get("Main", "downloadDirectory"), name) - with open(dest, "wb") as fh: - fh.write(r.content) - - def find_ptp_movie(self, movie): - return self.search({"search_type": "imdb", "search": movie["ImdbId"]}) - - def bytes_to_site_size(self, byte_num): - humanized = humanize.naturalsize(byte_num, format="%.2f", binary=True) - if "MiB" in humanized or "KiB" in humanized: - humanized = humanize.naturalsize(byte_num, format="%d", binary=True) - return humanized - - -class KGAPIException(Exception): - pass - - -if __name__ == "__main__": - kg = KGAPI() - print(kg.search({"search_type": "imdb", "search": "0207295"}))