search.py 3.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from searx.engines import (
  2. categories, engines, engine_shortcuts
  3. )
  4. from searx.languages import language_codes
  5. class Search(object):
  6. """Search information container"""
  7. def __init__(self, request):
  8. super(Search, self).__init__()
  9. self.query = None
  10. self.engines = []
  11. self.categories = []
  12. query_engines = []
  13. self.paging = False
  14. self.pageno = 1
  15. self.lang = 'all'
  16. if request.cookies.get('blocked_engines'):
  17. self.blocked_engines = request.cookies['blocked_engines'].split(',')
  18. else:
  19. self.blocked_engines = []
  20. self.results = []
  21. self.suggestions = []
  22. self.request_data = {}
  23. if request.cookies.get('language')\
  24. and request.cookies['language'] in (x[0] for x in language_codes):
  25. self.lang = request.cookies['language']
  26. if request.method == 'POST':
  27. self.request_data = request.form
  28. else:
  29. self.request_data = request.args
  30. # TODO better exceptions
  31. if not self.request_data.get('q'):
  32. raise Exception('noquery')
  33. self.query = self.request_data['q']
  34. pageno_param = self.request_data.get('pageno', '1')
  35. if not pageno_param.isdigit() or int(pageno_param) < 1:
  36. raise Exception('wrong pagenumber')
  37. self.pageno = int(pageno_param)
  38. query_parts = self.query.split()
  39. if query_parts[0].startswith('!'):
  40. prefix = query_parts[0][1:].replace('_', ' ')
  41. if prefix in engine_shortcuts\
  42. and not engine_shortcuts[prefix] in self.blocked_engines:
  43. self.engines.append({'category': 'none',
  44. 'name': engine_shortcuts[prefix]})
  45. elif prefix in engines\
  46. and not prefix in self.blocked_engines:
  47. self.engines.append({'category': 'none',
  48. 'name': prefix})
  49. elif prefix in categories:
  50. self.engines.extend({'category': prefix,
  51. 'name': engine.name}
  52. for engine in categories[prefix]
  53. if not engine in self.blocked_engines)
  54. if len(query_engines):
  55. self.query = self.query.replace(query_parts[0], '', 1).strip()
  56. self.categories = []
  57. if len(self.engines):
  58. self.categories = list(set(engine['category']
  59. for engine in self.engines))
  60. else:
  61. for pd_name, pd in self.request_data.items():
  62. if pd_name.startswith('category_'):
  63. category = pd_name[9:]
  64. if not category in categories:
  65. continue
  66. self.categories.append(category)
  67. if not len(self.categories):
  68. cookie_categories = request.cookies.get('categories', '')
  69. cookie_categories = cookie_categories.split(',')
  70. for ccateg in cookie_categories:
  71. if ccateg in categories:
  72. self.categories.append(ccateg)
  73. if not len(self.categories):
  74. self.categories = ['general']
  75. for categ in self.categories:
  76. self.engines.extend({'category': categ,
  77. 'name': x.name}
  78. for x in categories[categ]
  79. if not x.name in self.blocked_engines)