kickass.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """
  2. Kickass Torrent (Videos, Music, Files)
  3. @website https://kickass.so
  4. @provide-api no (nothing found)
  5. @using-api no
  6. @results HTML (using search portal)
  7. @stable yes (HTML can change)
  8. @parse url, title, content, seed, leech, magnetlink
  9. """
  10. from lxml import html
  11. from operator import itemgetter
  12. from urllib.parse import quote, urljoin
  13. from searx.utils import extract_text, get_torrent_size, convert_str_to_int
  14. # engine dependent config
  15. categories = ['videos', 'music', 'files']
  16. paging = True
  17. # search-url
  18. url = 'https://kickass.cd/'
  19. search_url = url + 'search/{search_term}/{pageno}/'
  20. # specific xpath variables
  21. magnet_xpath = './/a[@title="Torrent magnet link"]'
  22. torrent_xpath = './/a[@title="Download torrent file"]'
  23. content_xpath = './/span[@class="font11px lightgrey block"]'
  24. # do search-request
  25. def request(query, params):
  26. params['url'] = search_url.format(search_term=quote(query),
  27. pageno=params['pageno'])
  28. return params
  29. # get response from search-request
  30. def response(resp):
  31. results = []
  32. dom = html.fromstring(resp.text)
  33. search_res = dom.xpath('//table[@class="data"]//tr')
  34. # return empty array if nothing is found
  35. if not search_res:
  36. return []
  37. # parse results
  38. for result in search_res[1:]:
  39. link = result.xpath('.//a[@class="cellMainLink"]')[0]
  40. href = urljoin(url, link.attrib['href'])
  41. title = extract_text(link)
  42. content = extract_text(result.xpath(content_xpath))
  43. seed = extract_text(result.xpath('.//td[contains(@class, "green")]'))
  44. leech = extract_text(result.xpath('.//td[contains(@class, "red")]'))
  45. filesize_info = extract_text(result.xpath('.//td[contains(@class, "nobr")]'))
  46. files = extract_text(result.xpath('.//td[contains(@class, "center")][2]'))
  47. seed = convert_str_to_int(seed)
  48. leech = convert_str_to_int(leech)
  49. filesize, filesize_multiplier = filesize_info.split()
  50. filesize = get_torrent_size(filesize, filesize_multiplier)
  51. if files.isdigit():
  52. files = int(files)
  53. else:
  54. files = None
  55. magnetlink = result.xpath(magnet_xpath)[0].attrib['href']
  56. torrentfile = result.xpath(torrent_xpath)[0].attrib['href']
  57. torrentfileurl = quote(torrentfile, safe="%/:=&?~#+!$,;'@()*")
  58. # append result
  59. results.append({'url': href,
  60. 'title': title,
  61. 'content': content,
  62. 'seed': seed,
  63. 'leech': leech,
  64. 'filesize': filesize,
  65. 'files': files,
  66. 'magnetlink': magnetlink,
  67. 'torrentfile': torrentfileurl,
  68. 'template': 'torrent.html'})
  69. # return results sorted by seeder
  70. return sorted(results, key=itemgetter('seed'), reverse=True)