kickass.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Kickass Torrent (Videos, Music, Files)"""
  4. import random
  5. from operator import itemgetter
  6. from urllib.parse import quote
  7. from lxml import html
  8. from searx.utils import (
  9. eval_xpath,
  10. eval_xpath_getindex,
  11. eval_xpath_list,
  12. extract_text,
  13. get_torrent_size,
  14. int_or_zero,
  15. )
  16. about = {
  17. "website": 'https://kickasstorrents.to',
  18. "wikidata_id": 'Q17062285',
  19. "official_api_documentation": None,
  20. "use_official_api": False,
  21. "require_api_key": False,
  22. "results": 'HTML',
  23. }
  24. categories = ['files']
  25. paging = True
  26. # base_url can be overwritten by a list of URLs in the settings.yml
  27. base_url = 'https://kickasstorrents.to'
  28. def request(query, params):
  29. params['base_url'] = random.choice(base_url) if isinstance(base_url, list) else base_url
  30. params['url'] = params['base_url'] + f'/usearch/{quote(query)}/{params["pageno"]}/'
  31. return params
  32. def response(resp):
  33. results = []
  34. dom = html.fromstring(resp.text)
  35. search_res = eval_xpath_list(dom, '//table[contains(@class, "data")]//tr', None)
  36. if search_res is None:
  37. return []
  38. for tag in search_res[1:]:
  39. result = {'template': 'torrent.html'}
  40. url = eval_xpath_getindex(tag, './/a[contains(@class, "cellMainLink")]/@href', 0, None)
  41. result['url'] = resp.search_params['base_url'] + url
  42. result['title'] = extract_text(eval_xpath(tag, './/a[contains(@class, "cellMainLink")]'))
  43. result['content'] = extract_text(eval_xpath(tag, './/span[@class="font11px lightgrey block"]'))
  44. result['seed'] = int_or_zero(extract_text(eval_xpath(tag, './/td[contains(@class, "green")]')))
  45. result['leech'] = int_or_zero(extract_text(eval_xpath(tag, './/td[contains(@class, "red")]')))
  46. result['filesize'] = get_torrent_size(*extract_text(eval_xpath(tag, './/td[contains(@class, "nobr")]')).split())
  47. results.append(result)
  48. # results sorted by seeder count
  49. return sorted(results, key=itemgetter('seed'), reverse=True)