diff --git a/searx/engines/kickass.py b/searx/engines/kickass.py new file mode 100644 index 000000000..bd11a3b6b --- /dev/null +++ b/searx/engines/kickass.py @@ -0,0 +1,84 @@ +## Kickass Torrent (Videos, Music, Files) +# +# @website https://kickass.so +# @provide-api no (nothing found) +# +# @using-api no +# @results HTML (using search portal) +# @stable yes (HTML can change) +# @parse url, title, content, seed, leech, magnetlink + +from urlparse import urljoin +from cgi import escape +from urllib import quote +from lxml import html +from operator import itemgetter +from dateutil import parser + +# engine dependent config +categories = ['videos', 'music', 'files'] +paging = True + +# search-url +url = 'https://kickass.so/' +search_url = url + 'search/{search_term}/{pageno}/' + +# specific xpath variables +magnet_xpath = './/a[@title="Torrent magnet link"]' +#content_xpath = './/font[@class="detDesc"]//text()' + + +# do search-request +def request(query, params): + params['url'] = search_url.format(search_term=quote(query), + pageno=params['pageno']) + + return params + + +# get response from search-request +def response(resp): + results = [] + + dom = html.fromstring(resp.text) + + search_res = dom.xpath('//table[@class="data"]//tr') + + # return empty array if nothing is found + if not search_res: + return [] + + # parse results + for result in search_res[1:]: + link = result.xpath('.//a[@class="cellMainLink"]')[0] + href = urljoin(url, link.attrib['href']) + title = ' '.join(link.xpath('.//text()')) + content = escape(html.tostring(result.xpath('.//span[@class="font11px lightgrey block"]')[0], method="text")) + seed = result.xpath('.//td[contains(@class, "green")]/text()')[0] + leech = result.xpath('.//td[contains(@class, "red")]/text()')[0] + + # convert seed to int if possible + if seed.isdigit(): + seed = int(seed) + else: + seed = 0 + + # convert leech to int if possible + if leech.isdigit(): + leech = int(leech) + else: + leech = 0 + + magnetlink = result.xpath(magnet_xpath)[0].attrib['href'] + + # append result + results.append({'url': href, + 'title': title, + 'content': content, + 'seed': seed, + 'leech': leech, + 'magnetlink': magnetlink, + 'template': 'torrent.html'}) + + # return results sorted by seeder + return sorted(results, key=itemgetter('seed'), reverse=True) diff --git a/searx/settings.yml b/searx/settings.yml index 5e9f11202..b51b37f1c 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -99,6 +99,10 @@ engines: # engine : piratebay # shortcut : tpb + - name : kickass + engine : kickass + shortcut : ka + - name : soundcloud engine : soundcloud shortcut : sc diff --git a/searx/static/courgette/img/icon_kickass.ico b/searx/static/courgette/img/icon_kickass.ico new file mode 100644 index 000000000..4aa2c77a5 Binary files /dev/null and b/searx/static/courgette/img/icon_kickass.ico differ diff --git a/searx/static/default/img/icon_kickass.ico b/searx/static/default/img/icon_kickass.ico new file mode 100644 index 000000000..4aa2c77a5 Binary files /dev/null and b/searx/static/default/img/icon_kickass.ico differ diff --git a/searx/static/oscar/img/icons/kickass.png b/searx/static/oscar/img/icons/kickass.png new file mode 100644 index 000000000..59e809104 Binary files /dev/null and b/searx/static/oscar/img/icons/kickass.png differ diff --git a/searx/webapp.py b/searx/webapp.py index 541975573..a2a135e9a 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -70,7 +70,7 @@ babel = Babel(app) #TODO configurable via settings.yml favicons = ['wikipedia', 'youtube', 'vimeo', 'dailymotion', 'soundcloud', - 'twitter', 'stackoverflow', 'github', 'deviantart'] + 'twitter', 'stackoverflow', 'github', 'deviantart', 'kickass'] cookie_max_age = 60 * 60 * 24 * 365 * 23 # 23 years