# VERSION: 1.01
# AUTHORS: kjjejones44
from html.parser import HTMLParser
from urllib.parse import urljoin
from helpers import retrieve_url
from novaprinter import prettyPrinter
import json
class bt4g(object):
url = "https://bt4g.org/"
name = "bt4g"
supported_categories = {'all': '', 'movies': 'movie/', 'tv': 'movie/', 'music': 'audio/', 'books': 'doc/', 'software': 'app/'}
class MyHTMLParser(HTMLParser):
def __init__(self):
super().__init__()
self.is_in_container = False
self.is_in_entry = False
self.b_value = ""
self.container_row_count = 0
self.temp_result = {}
self.results = []
def feed(self, feed: str) -> None:
super().feed(feed)
return self.results
def handle_starttag(self, tag, attrs):
attr_dict = {x[0]:x[1] for x in attrs}
if tag == "div":
if not self.is_in_container and attr_dict.get("class", "") == "container":
self.is_in_container = True
elif tag == "a":
if self.is_in_container and all(x in attr_dict for x in ["title", "href"]):
self.is_in_entry = True
self.temp_result.update(attr_dict)
elif tag == "b":
if self.is_in_entry:
classname = attr_dict.get("class", "")
idname = attr_dict.get("id", "")
self.b_value = "filesize" if "cpill" in classname else idname
def handle_endtag(self, tag):
if tag == "div":
self.is_in_entry = False
def handle_data(self, data):
if self.b_value != "":
self.temp_result[self.b_value] = data
if self.b_value == "leechers":
self.results.append(self.temp_result)
self.temp_result = {}
self.b_value = ""
def search(self, term, cat="all"):
pagenumber = 1
while pagenumber <= 10:
result_page = self.search_page(term, pagenumber, cat)
self.pretty_print_results(result_page)
if len(result_page) < 15 or int(result_page[-1]['seeders']) < 1:
break
pagenumber = pagenumber + 1
def search_page(self, term, pagenumber, cat):
try:
query = f"{self.url}{self.supported_categories[cat]}search/{term}/byseeders/{pagenumber}"
parser = self.MyHTMLParser()
return parser.feed(retrieve_url(query))
except Exception as e:
return []
def download_torrent(self, info):
if "trackerlist" not in self.__dict__:
self.trackerlist = json.loads(retrieve_url("https://downloadtorrentfile.com/trackerlist"))
magnet = f"magnet:?xt=urn:btih:{info.split('/')[-1]}&tr=" + "&tr=".join(self.trackerlist)
print(magnet + ' ' + info)
def pretty_print_results(self, results):
for result in results:
temp_result = {
'name': result['title'],
'size': result['filesize'],
'seeds': result['seeders'],
'leech': result['leechers'],
'engine_url': self.url,
'link': urljoin(self.url, result['href'])
}
prettyPrinter(temp_result)
if __name__ == "__main__":
bt4g().search("how", cat="books")