# VERSION: 1.3 # AUTHORS: LightDestory (https://github.com/LightDestory) import re import urllib.parse from helpers import retrieve_url, download_file from novaprinter import prettyPrinter class yourbittorrent(object): url = "https://yourbittorrent.com/" name = "YourBittorrent" supported_categories = { "all": "0", "movies": "1", "tv": "3", "music": "2", "games": "4", "anime": "6", "software": "5", } # YourBittorrent's page navigation is broken, we can fetch only 50 torrent. Use specific query class HTMLParser: def __init__(self, url): self.url = url self.noTorrents = False def feed(self, html): self.noTorrents = False torrents = self.__findTorrents(html) resultSize = len(torrents) if resultSize == 0: self.noTorrents = True return for torrent in range(resultSize): data = { "link": torrents[torrent][0], "name": torrents[torrent][1], "size": torrents[torrent][2], "seeds": torrents[torrent][3], "leech": torrents[torrent][4], "engine_url": self.url, "desc_link": urllib.parse.unquote(torrents[torrent][0]), } prettyPrinter(data) def __findTorrents(self, html): torrents = [] html = re.findall( r"
.+?
", html )[1] trs = re.findall(r".+?", html) for tr in trs: # Extract from the A node all the needed information url_titles = re.search( r".+?href=\"(.+?)\".+?title=\"(.+?)\".+?([0-9\.\,]+ (TB|GB|MB|kB)).+?sd\">([0-9,]+)<.+?pr\">([0-9,]+)<", tr, ) if url_titles: torrents.append( [ urllib.parse.quote( "{0}{1}".format(self.url, url_titles.group(1)) ), url_titles.group(2) .replace("", "") .replace("", "") .replace("", "") .replace("", ""), url_titles.group(3).replace(",", ""), url_titles.group(5).replace(",", ""), url_titles.group(6).replace(",", ""), ] ) return torrents def download_torrent(self, info): torrent_page = retrieve_url(urllib.parse.unquote(info)) file_link = re.search(r"(down/.+?\.torrent)", torrent_page) if file_link and file_link.groups(): print(download_file(self.url + file_link.groups()[0])) else: raise Exception("Error, please fill a bug report!") def search(self, what, cat="all"): what = what.replace("%20", "-") parser = self.HTMLParser(self.url) category = "" if cat == "all" else f"&c={self.supported_categories[cat]}" url = "{0}?q={1}{2}".format(self.url, what, category) # Some replacements to format the html source html = re.sub(r"\s+", " ", retrieve_url(url)).strip() parser.feed(html)