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 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 disabled_engines = request.preferences.engines.get_disabled() # parse query query = Query(request_data.get('q', '').encode('utf-8'), disabled_engines) query.parse_query() # check if search query is set if not query.getSearchQuery(): return '', 400 # run autocompleter completer = autocomplete_backends.get(request.preferences.get_value('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.preferences.get_value('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 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 if request.cookies.get('blocked_engines'): blocked_engines = request.cookies['blocked_engines'].split(',') # noqa else: blocked_engines = [] # 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 # run autocompleter completer = autocomplete_backends.get(request.cookies.get('autocomplete')) # check if valid autocompleter is selected if not completer: return # run autocompletion raw_results = completer(query.getSearchQuery()) # parse results (write :language and !engine back to result string) results = [] for result in raw_results: result_query = query result_query.changeSearchQuery(result) # add parsed result results.append(result_query.getFullQuery()) # return autocompleter results if request_data.get('format') == 'x-suggestions': return Response(json.dumps([query.query, results]), mimetype='application/json') else: return Response(json.dumps(results), mimetype='application/json')
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 # run 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: # run autocompletion raw_results.extend(completer(query.getSearchQuery())) # 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 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: 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 # add category to list self.categories.append(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)
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, task): # init vars # super(SearchAPI, self).__init__() self.query = None self.engines = [] self.plugins = [] self.categories = [] self.paging = False self.pageno = 1 self.lang = 'all' # set blocked engines self.blocked_engines = [] # get_blocked_engines(engines, request.cookies) self.results = [] self.suggestions = list() self.answers = list() self.infoboxes = [] self.request_data = {} # set specific language if set if 'language' in task['settings']: self.lang = task['settings']['language'] if 'plugins' in task['settings']: for plugin in task['settings']['plugins']: if plugin['allow']: self.plugins.append(plugin) if task['pageno']: self.pageno = int(task['pageno']) # parse query, if tags are set, which change # the search engine or search-language query_obj = Query(str(task['query']), 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: if 'selected_categories' in task and task['selected_categories']: self.categories = task['selected_categories'] # if still no category is specified, using general # as default-category if not self.categories: self.categories = ['general'] # set categories/engines # load_default_categories = True for engine in task['settings']['engines']: if not engine['disabled']: for categ in engine['categories']: if categ in self.categories: self.engines.append({'category': categ, 'name': engine['name']})
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 = get_blocked_engines(engines, request.cookies) self.result_container = ResultContainer() 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: 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)
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)