solidtorrents.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """SolidTorrents
  4. """
  5. from datetime import datetime
  6. from urllib.parse import urlencode
  7. import random
  8. from lxml import html
  9. from searx.utils import (
  10. extract_text,
  11. eval_xpath,
  12. eval_xpath_getindex,
  13. get_torrent_size,
  14. )
  15. about = {
  16. "website": 'https://www.solidtorrents.net/',
  17. "wikidata_id": None,
  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 = ''
  26. base_url_rand = ''
  27. def request(query, params):
  28. global base_url_rand # pylint: disable=global-statement
  29. if isinstance(base_url, list):
  30. base_url_rand = random.choice(base_url)
  31. else:
  32. base_url_rand = base_url
  33. search_url = base_url_rand + '/search?{query}'
  34. page = (params['pageno'] - 1) * 20
  35. query = urlencode({'q': query, 'page': page})
  36. params['url'] = search_url.format(query=query)
  37. return params
  38. def response(resp):
  39. results = []
  40. dom = html.fromstring(resp.text)
  41. for result in eval_xpath(dom, '//div[contains(@class, "search-result")]'):
  42. a = eval_xpath_getindex(result, './div/h5/a', 0, None)
  43. if a is None:
  44. continue
  45. title = extract_text(a)
  46. url = eval_xpath_getindex(a, '@href', 0, None)
  47. stats = eval_xpath(result, './div//div[contains(@class, "stats")]/div')
  48. n, u = extract_text(stats[1]).split()
  49. filesize = get_torrent_size(n, u)
  50. leech = extract_text(stats[2])
  51. seed = extract_text(stats[3])
  52. magnet = eval_xpath_getindex(result, './div//a[contains(@class, "dl-magnet")]/@href', 0, None)
  53. params = {
  54. 'seed': seed,
  55. 'leech': leech,
  56. 'title': title,
  57. 'url': base_url_rand + url,
  58. 'filesize': filesize,
  59. 'magnetlink': magnet,
  60. 'template': "torrent.html",
  61. }
  62. date_str = extract_text(stats[4])
  63. try:
  64. params['publishedDate'] = datetime.strptime(date_str, '%b %d, %Y')
  65. except ValueError:
  66. pass
  67. results.append(params)
  68. return results