# VERSION: 1.1
# AUTHORS: LightDestory (https://github.com/LightDestory)
import re
from time import sleep
from helpers import retrieve_url
from novaprinter import prettyPrinter
class kickasstorrents(object):
url = 'https://katcr.to/'
name = 'Kickasstorrents'
supported_categories = {'all': '', 'movies': 'movies', 'tv': 'tv', 'music': 'music', 'games': 'games', 'anime': 'anime', 'software': 'apps'}
class HTMLParser:
def __init__(self, url):
self.url = url
self.noTorrents = False
def feed(self, html):
self.noTorrents = False
torrents = self.__findTorrents(html)
if len(torrents) == 0:
self.noTorrents = True
return
def __findTorrents(self, html):
# Find all TR nodes with class odd or even
trs = re.findall(r'
.*?
', html)
for tr in trs:
url_titles = re.search(
r'.+?torrentname.+?href=\"(.+?)\".+?cellMainLink\">(.+?)<.+?nobr.+?>([0-9\.\,]+ (TB|GB|MB|KB)).+?green.+?>([0-9,]+).+?red.+?>([0-9,]+)',
tr)
if url_titles:
detail_link = '{0}{1}'.format(self.url, url_titles.group(1))
download_link = self.__retrieve_download_link(detail_link)
data = {
'link': download_link,
'name': url_titles.group(2),
'size': url_titles.group(3).replace(",", ""),
'seeds': url_titles.group(5).replace(",", ""),
'leech': url_titles.group(6).replace(",", ""),
'engine_url': self.url,
'desc_link': detail_link,
}
prettyPrinter(data)
sleep(1)
return trs
def __retrieve_download_link(self, detail_link):
torrent_page = retrieve_url(detail_link)
magnet_match = re.search(r'\"(magnet:.*?)\"', torrent_page)
if magnet_match and magnet_match.groups():
return str(magnet_match.groups()[0])
else:
return "NotFound"
def search(self, what, cat='all'):
parser = self.HTMLParser(self.url)
category = "" if cat == "all" else 'category/{0}/'.format(self.supported_categories[cat])
counter: int = 0
while True:
url = '{0}search/{1}/{2}{3}/'.format(self.url, what, category, counter)
# Some replacements to format the html source
html = retrieve_url(url).replace(" ", "").replace("\n", "").replace("\r", "")\
.replace("", "").replace("", "")
parser.feed(html)
if parser.noTorrents:
break
counter += 1