def autocompleter(): """Return autocompleter results""" request_data = {} # select request method if request.method == 'POST': request_data = request.form else: request_data = request.args # set blocked engines blocked_engines = get_blocked_engines(engines, request.cookies) # parse query query = Query(request_data.get('q', '').encode('utf-8'), blocked_engines) query.parse_query() # check if search query is set if not query.getSearchQuery(): return '', 400 # get autocompleter completer = autocomplete_backends.get( request.cookies.get('autocomplete', settings['search']['autocomplete'])) # parse searx specific autocompleter results like !bang raw_results = searx_bang(query) # normal autocompletion results only appear if max 3 inner results returned if len(raw_results) <= 3 and completer: # get language from cookie language = request.cookies.get('language') if not language or language == 'all': language = 'en' else: language = language.split('_')[0] # run autocompletion raw_results.extend(completer(query.getSearchQuery(), language)) # parse results (write :language and !engine back to result string) results = [] for result in raw_results: query.changeSearchQuery(result) # add parsed result results.append(query.getFullQuery()) # return autocompleter results if request_data.get('format') == 'x-suggestions': return Response(json.dumps([query.query, results]), mimetype='application/json') return Response(json.dumps(results), mimetype='application/json')
def __init__(self, request): # init vars super(Search, self).__init__() self.query = None self.engines = [] self.categories = [] self.paging = False self.pageno = 1 self.lang = 'all' # set blocked engines self.blocked_engines = request.preferences.engines.get_disabled() self.result_container = ResultContainer() self.request_data = {} # set specific language if set self.lang = request.preferences.get_value('language') # set request method if request.method == 'POST': self.request_data = request.form else: self.request_data = request.args # TODO better exceptions if not self.request_data.get('q'): raise Exception('noquery') # set pagenumber pageno_param = self.request_data.get('pageno', '1') if not pageno_param.isdigit() or int(pageno_param) < 1: pageno_param = 1 self.pageno = int(pageno_param) # parse query, if tags are set, which change # the serch engine or search-language query_obj = Query(self.request_data['q'], self.blocked_engines) query_obj.parse_query() # set query self.query = query_obj.getSearchQuery() # get last selected language in query, if possible # TODO support search with multible languages if len(query_obj.languages): self.lang = query_obj.languages[-1] self.engines = query_obj.engines self.categories = [] # if engines are calculated from query, # set categories by using that informations if self.engines and query_obj.specific: self.categories = list( set(engine['category'] for engine in self.engines)) # otherwise, using defined categories to # calculate which engines should be used else: # set categories/engines load_default_categories = True for pd_name, pd in self.request_data.items(): if pd_name == 'categories': self.categories.extend( categ for categ in map(unicode.strip, pd.split(',')) if categ in categories) elif pd_name == 'engines': pd_engines = [{ 'category': engines[engine].categories[0], 'name': engine } for engine in map(unicode.strip, pd.split(',')) if engine in engines] if pd_engines: self.engines.extend(pd_engines) load_default_categories = False elif pd_name.startswith('category_'): category = pd_name[9:] # if category is not found in list, skip if category not in categories: continue if pd != 'off': # add category to list self.categories.append(category) elif category in self.categories: # remove category from list if property is set to 'off' self.categories.remove(category) if not load_default_categories: if not self.categories: self.categories = list( set(engine['category'] for engine in self.engines)) return # if no category is specified for this search, # using user-defined default-configuration which # (is stored in cookie) if not self.categories: cookie_categories = request.cookies.get('categories', '') cookie_categories = cookie_categories.split(',') for ccateg in cookie_categories: if ccateg in categories: self.categories.append(ccateg) # if still no category is specified, using general # as default-category if not self.categories: self.categories = ['general'] # using all engines for that search, which are # declared under the specific categories for categ in self.categories: self.engines.extend({ 'category': categ, 'name': engine.name } for engine in categories[categ] if (engine.name, categ) not in self.blocked_engines) # remove suspended engines self.engines = [ e for e in self.engines if engines[e['name']].suspend_end_time <= time() ]
def __init__(self, request): # init vars super(Search, self).__init__() self.query = None self.engines = [] self.categories = [] self.paging = False self.pageno = 1 self.lang = 'all' # set blocked engines if request.cookies.get('blocked_engines'): self.blocked_engines = request.cookies['blocked_engines'].split(',') # noqa else: self.blocked_engines = [] self.results = [] self.suggestions = [] self.answers = [] self.infoboxes = [] self.request_data = {} # set specific language if set if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): self.lang = request.cookies['language'] # set request method if request.method == 'POST': self.request_data = request.form else: self.request_data = request.args # TODO better exceptions if not self.request_data.get('q'): raise Exception('noquery') # set pagenumber pageno_param = self.request_data.get('pageno', '1') if not pageno_param.isdigit() or int(pageno_param) < 1: raise Exception('wrong pagenumber') self.pageno = int(pageno_param) # parse query, if tags are set, which change # the serch engine or search-language query_obj = Query(self.request_data['q'], self.blocked_engines) query_obj.parse_query() # set query self.query = query_obj.getSearchQuery() # get last selected language in query, if possible # TODO support search with multible languages if len(query_obj.languages): self.lang = query_obj.languages[-1] self.engines = query_obj.engines self.categories = [] # if engines are calculated from query, # set categories by using that informations if self.engines and query_obj.specific: self.categories = list(set(engine['category'] for engine in self.engines)) # otherwise, using defined categories to # calculate which engines should be used else: # set used categories for pd_name, pd in self.request_data.items(): if pd_name.startswith('category_'): category = pd_name[9:] # if category is not found in list, skip if category not in categories: continue if pd != 'off': # add category to list self.categories.append(category) elif category in self.categories: # remove category from list if property is set to 'off' self.categories.remove(category) # if no category is specified for this search, # using user-defined default-configuration which # (is stored in cookie) if not self.categories: cookie_categories = request.cookies.get('categories', '') cookie_categories = cookie_categories.split(',') for ccateg in cookie_categories: if ccateg in categories: self.categories.append(ccateg) # if still no category is specified, using general # as default-category if not self.categories: self.categories = ['general'] # using all engines for that search, which are # declared under the specific categories for categ in self.categories: self.engines.extend({'category': categ, 'name': x.name} for x in categories[categ] if x.name not in self.blocked_engines)