kickass.py 2.0 KB

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