on master help sign in
[mod] add searx/webadapter.py
2dbc0deAlexandre Flament
searx/query.py−20
@@ -178,23 +178,3 @@ class RawTextQuery:
178 def getFullQuery(self):
178 def getFullQuery(self):
179 # get full querry including whitespaces
179 # get full querry including whitespaces
180 return ''.join(self.query_parts)
180 return ''.join(self.query_parts)
181−
182−
183−class SearchQuery:
184− """container for all the search parameters (query, language, etc...)"""
185−
186− def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range,
187− timeout_limit=None, preferences=None, external_bang=None):
188− self.query = query
189− self.engines = engines
190− self.categories = categories
191− self.lang = lang
192− self.safesearch = safesearch
193− self.pageno = pageno
194− self.time_range = None if time_range in ('', 'None', None) else time_range
195− self.timeout_limit = timeout_limit
196− self.preferences = preferences
197− self.external_bang = external_bang
198−
199− def __str__(self):
200− return self.query + ";" + str(self.engines)
searx/search.py+21−165
@@ -16,26 +16,20 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
16'''
16'''
17
17
18import gc
18import gc
19−import sys
20import threading
19import threading
21from time import time
20from time import time
22from uuid import uuid4
21from uuid import uuid4
23from _thread import start_new_thread
22from _thread import start_new_thread
24
23
25−from flask_babel import gettext
26import requests.exceptions
24import requests.exceptions
27import searx.poolrequests as requests_lib
25import searx.poolrequests as requests_lib
28−from searx.engines import (
26+from searx.engines import engines, settings
29− categories, engines, settings
30−)
31from searx.answerers import ask
27from searx.answerers import ask
32from searx.external_bang import get_bang_url
28from searx.external_bang import get_bang_url
33from searx.utils import gen_useragent
29from searx.utils import gen_useragent
34−from searx.query import RawTextQuery, SearchQuery, VALID_LANGUAGE_CODE
35from searx.results import ResultContainer
30from searx.results import ResultContainer
36from searx import logger
31from searx import logger
37from searx.plugins import plugins
32from searx.plugins import plugins
38−from searx.exceptions import SearxParameterException
39
33
40
34
41logger = logger.getChild('search')
35logger = logger.getChild('search')
@@ -53,6 +47,26 @@ else:
53 exit(1)
47 exit(1)
54
48
55
49
50+class SearchQuery:
51+ """container for all the search parameters (query, language, etc...)"""
52+
53+ def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range,
54+ timeout_limit=None, preferences=None, external_bang=None):
55+ self.query = query
56+ self.engines = engines
57+ self.categories = categories
58+ self.lang = lang
59+ self.safesearch = safesearch
60+ self.pageno = pageno
61+ self.time_range = None if time_range in ('', 'None', None) else time_range
62+ self.timeout_limit = timeout_limit
63+ self.preferences = preferences
64+ self.external_bang = external_bang
65+
66+ def __str__(self):
67+ return self.query + ";" + str(self.engines)
68+
69+
56def send_http_request(engine, request_params):
70def send_http_request(engine, request_params):
57 # create dictionary which contain all
71 # create dictionary which contain all
58 # informations about the request
72 # informations about the request
@@ -247,164 +261,6 @@ def default_request_params():
247 }
261 }
248
262
249
263
250−# remove duplicate queries.
251−# FIXME: does not fix "!music !soundcloud", because the categories are 'none' and 'music'
252−def deduplicate_query_engines(query_engines):
253− uniq_query_engines = {q["category"] + '|' + q["name"]: q for q in query_engines}
254− return uniq_query_engines.values()
255−
256−
257−def get_search_query_from_webapp(preferences, form):
258− # no text for the query ?
259− if not form.get('q'):
260− raise SearxParameterException('q', '')
261−
262− # set blocked engines
263− disabled_engines = preferences.engines.get_disabled()
264−
265− # parse query, if tags are set, which change
266− # the serch engine or search-language
267− raw_text_query = RawTextQuery(form['q'], disabled_engines)
268−
269− # set query
270− query = raw_text_query.getQuery()
271−
272− # get and check page number
273− pageno_param = form.get('pageno', '1')
274− if not pageno_param.isdigit() or int(pageno_param) < 1:
275− raise SearxParameterException('pageno', pageno_param)
276− query_pageno = int(pageno_param)
277−
278− # get language
279− # set specific language if set on request, query or preferences
280− # TODO support search with multible languages
281− if len(raw_text_query.languages):
282− query_lang = raw_text_query.languages[-1]
283− elif 'language' in form:
284− query_lang = form.get('language')
285− else:
286− query_lang = preferences.get_value('language')
287−
288− # check language
289− if not VALID_LANGUAGE_CODE.match(query_lang):
290− raise SearxParameterException('language', query_lang)
291−
292− # get safesearch
293− if 'safesearch' in form:
294− query_safesearch = form.get('safesearch')
295− # first check safesearch
296− if not query_safesearch.isdigit():
297− raise SearxParameterException('safesearch', query_safesearch)
298− query_safesearch = int(query_safesearch)
299− else:
300− query_safesearch = preferences.get_value('safesearch')
301−
302− # safesearch : second check
303− if query_safesearch < 0 or query_safesearch > 2:
304− raise SearxParameterException('safesearch', query_safesearch)
305−
306− # get time_range
307− query_time_range = form.get('time_range')
308−
309− # check time_range
310− if query_time_range not in ('None', None, '', 'day', 'week', 'month', 'year'):
311− raise SearxParameterException('time_range', query_time_range)
312−
313− # query_engines
314− query_engines = raw_text_query.engines
315−
316− # timeout_limit
317− query_timeout = raw_text_query.timeout_limit
318− if query_timeout is None and 'timeout_limit' in form:
319− raw_time_limit = form.get('timeout_limit')
320− if raw_time_limit in ['None', '']:
321− raw_time_limit = None
322− else:
323− try:
324− query_timeout = float(raw_time_limit)
325− except ValueError:
326− raise SearxParameterException('timeout_limit', raw_time_limit)
327−
328− # query_categories
329− query_categories = []
330−
331− # if engines are calculated from query,
332− # set categories by using that informations
333− if query_engines and raw_text_query.specific:
334− additional_categories = set()
335− for engine in query_engines:
336− if 'from_bang' in engine and engine['from_bang']:
337− additional_categories.add('none')
338− else:
339− additional_categories.add(engine['category'])
340− query_categories = list(additional_categories)
341−
342− # otherwise, using defined categories to
343− # calculate which engines should be used
344− else:
345− # set categories/engines
346− load_default_categories = True
347− for pd_name, pd in form.items():
348− if pd_name == 'categories':
349− query_categories.extend(categ for categ in map(str.strip, pd.split(',')) if categ in categories)
350− elif pd_name == 'engines':
351− pd_engines = [{'category': engines[engine].categories[0],
352− 'name': engine}
353− for engine in map(str.strip, pd.split(',')) if engine in engines]
354− if pd_engines:
355− query_engines.extend(pd_engines)
356− load_default_categories = False
357− elif pd_name.startswith('category_'):
358− category = pd_name[9:]
359−
360− # if category is not found in list, skip
361− if category not in categories:
362− continue
363−
364− if pd != 'off':
365− # add category to list
366− query_categories.append(category)
367− elif category in query_categories:
368− # remove category from list if property is set to 'off'
369− query_categories.remove(category)
370−
371− if not load_default_categories:
372− if not query_categories:
373− query_categories = list(set(engine['category']
374− for engine in query_engines))
375− else:
376− # if no category is specified for this search,
377− # using user-defined default-configuration which
378− # (is stored in cookie)
379− if not query_categories:
380− cookie_categories = preferences.get_value('categories')
381− for ccateg in cookie_categories:
382− if ccateg in categories:
383− query_categories.append(ccateg)
384−
385− # if still no category is specified, using general
386− # as default-category
387− if not query_categories:
388− query_categories = ['general']
389−
390− # using all engines for that search, which are
391− # declared under the specific categories
392− for categ in query_categories:
393− query_engines.extend({'category': categ,
394− 'name': engine.name}
395− for engine in categories[categ]
396− if (engine.name, categ) not in disabled_engines)
397−
398− query_engines = deduplicate_query_engines(query_engines)
399− external_bang = raw_text_query.external_bang
400−
401− return (SearchQuery(query, query_engines, query_categories,
402− query_lang, query_safesearch, query_pageno,
403− query_time_range, query_timeout, preferences,
404− external_bang=external_bang),
405− raw_text_query)
406−
407−
408class Search:
264class Search:
409 """Search information container"""
265 """Search information container"""
410
266
searx/webadapter.pynew file+162
@@ -0,0 +1,162 @@
1+from searx.exceptions import SearxParameterException
2+from searx.query import RawTextQuery, VALID_LANGUAGE_CODE
3+from searx.engines import categories, engines
4+from searx.search import SearchQuery
5+
6+
7+# remove duplicate queries.
8+# FIXME: does not fix "!music !soundcloud", because the categories are 'none' and 'music'
9+def deduplicate_query_engines(query_engines):
10+ uniq_query_engines = {q["category"] + '|' + q["name"]: q for q in query_engines}
11+ return uniq_query_engines.values()
12+
13+
14+def get_search_query_from_webapp(preferences, form):
15+ # no text for the query ?
16+ if not form.get('q'):
17+ raise SearxParameterException('q', '')
18+
19+ # set blocked engines
20+ disabled_engines = preferences.engines.get_disabled()
21+
22+ # parse query, if tags are set, which change
23+ # the serch engine or search-language
24+ raw_text_query = RawTextQuery(form['q'], disabled_engines)
25+
26+ # set query
27+ query = raw_text_query.getQuery()
28+
29+ # get and check page number
30+ pageno_param = form.get('pageno', '1')
31+ if not pageno_param.isdigit() or int(pageno_param) < 1:
32+ raise SearxParameterException('pageno', pageno_param)
33+ query_pageno = int(pageno_param)
34+
35+ # get language
36+ # set specific language if set on request, query or preferences
37+ # TODO support search with multible languages
38+ if len(raw_text_query.languages):
39+ query_lang = raw_text_query.languages[-1]
40+ elif 'language' in form:
41+ query_lang = form.get('language')
42+ else:
43+ query_lang = preferences.get_value('language')
44+
45+ # check language
46+ if not VALID_LANGUAGE_CODE.match(query_lang):
47+ raise SearxParameterException('language', query_lang)
48+
49+ # get safesearch
50+ if 'safesearch' in form:
51+ query_safesearch = form.get('safesearch')
52+ # first check safesearch
53+ if not query_safesearch.isdigit():
54+ raise SearxParameterException('safesearch', query_safesearch)
55+ query_safesearch = int(query_safesearch)
56+ else:
57+ query_safesearch = preferences.get_value('safesearch')
58+
59+ # safesearch : second check
60+ if query_safesearch < 0 or query_safesearch > 2:
61+ raise SearxParameterException('safesearch', query_safesearch)
62+
63+ # get time_range
64+ query_time_range = form.get('time_range')
65+
66+ # check time_range
67+ if query_time_range not in ('None', None, '', 'day', 'week', 'month', 'year'):
68+ raise SearxParameterException('time_range', query_time_range)
69+
70+ # query_engines
71+ query_engines = raw_text_query.engines
72+
73+ # timeout_limit
74+ query_timeout = raw_text_query.timeout_limit
75+ if query_timeout is None and 'timeout_limit' in form:
76+ raw_time_limit = form.get('timeout_limit')
77+ if raw_time_limit in ['None', '']:
78+ raw_time_limit = None
79+ else:
80+ try:
81+ query_timeout = float(raw_time_limit)
82+ except ValueError:
83+ raise SearxParameterException('timeout_limit', raw_time_limit)
84+
85+ # query_categories
86+ query_categories = []
87+
88+ # if engines are calculated from query,
89+ # set categories by using that informations
90+ if query_engines and raw_text_query.specific:
91+ additional_categories = set()
92+ for engine in query_engines:
93+ if 'from_bang' in engine and engine['from_bang']:
94+ additional_categories.add('none')
95+ else:
96+ additional_categories.add(engine['category'])
97+ query_categories = list(additional_categories)
98+
99+ # otherwise, using defined categories to
100+ # calculate which engines should be used
101+ else:
102+ # set categories/engines
103+ load_default_categories = True
104+ for pd_name, pd in form.items():
105+ if pd_name == 'categories':
106+ query_categories.extend(categ for categ in map(str.strip, pd.split(',')) if categ in categories)
107+ elif pd_name == 'engines':
108+ pd_engines = [{'category': engines[engine].categories[0],
109+ 'name': engine}
110+ for engine in map(str.strip, pd.split(',')) if engine in engines]
111+ if pd_engines:
112+ query_engines.extend(pd_engines)
113+ load_default_categories = False
114+ elif pd_name.startswith('category_'):
115+ category = pd_name[9:]
116+
117+ # if category is not found in list, skip
118+ if category not in categories:
119+ continue
120+
121+ if pd != 'off':
122+ # add category to list
123+ query_categories.append(category)
124+ elif category in query_categories:
125+ # remove category from list if property is set to 'off'
126+ query_categories.remove(category)
127+
128+ if not load_default_categories:
129+ if not query_categories:
130+ query_categories = list(set(engine['category']
131+ for engine in query_engines))
132+ else:
133+ # if no category is specified for this search,
134+ # using user-defined default-configuration which
135+ # (is stored in cookie)
136+ if not query_categories:
137+ cookie_categories = preferences.get_value('categories')
138+ for ccateg in cookie_categories:
139+ if ccateg in categories:
140+ query_categories.append(ccateg)
141+
142+ # if still no category is specified, using general
143+ # as default-category
144+ if not query_categories:
145+ query_categories = ['general']
146+
147+ # using all engines for that search, which are
148+ # declared under the specific categories
149+ for categ in query_categories:
150+ query_engines.extend({'category': categ,
151+ 'name': engine.name}
152+ for engine in categories[categ]
153+ if (engine.name, categ) not in disabled_engines)
154+
155+ query_engines = deduplicate_query_engines(query_engines)
156+ external_bang = raw_text_query.external_bang
157+
158+ return (SearchQuery(query, query_engines, query_categories,
159+ query_lang, query_safesearch, query_pageno,
160+ query_time_range, query_timeout, preferences,
161+ external_bang=external_bang),
162+ raw_text_query)
searx/webapp.py+2−1
@@ -67,10 +67,11 @@ from searx.webutils import (
67 get_static_files, get_result_templates, get_themes,
67 get_static_files, get_result_templates, get_themes,
68 prettify_url, new_hmac
68 prettify_url, new_hmac
69)
69)
70+from searx.webadapter import get_search_query_from_webapp
70from searx.utils import html_to_text, gen_useragent, dict_subset, match_language
71from searx.utils import html_to_text, gen_useragent, dict_subset, match_language
71from searx.version import VERSION_STRING
72from searx.version import VERSION_STRING
72from searx.languages import language_codes as languages
73from searx.languages import language_codes as languages
73−from searx.search import SearchWithPlugins, get_search_query_from_webapp
74+from searx.search import SearchWithPlugins
74from searx.query import RawTextQuery
75from searx.query import RawTextQuery
75from searx.autocomplete import searx_bang, backends as autocomplete_backends
76from searx.autocomplete import searx_bang, backends as autocomplete_backends
76from searx.plugins import plugins
77from searx.plugins import plugins
tests/unit/test_search.py+34−33
@@ -5,6 +5,7 @@ from searx.preferences import Preferences
5from searx.engines import engines
5from searx.engines import engines
6
6
7import searx.search
7import searx.search
8+from searx.search import SearchQuery
8
9
9
10
10SAFESEARCH = 0
11SAFESEARCH = 0
@@ -40,53 +41,53 @@ class SearchTestCase(SearxTestCase):
40
41
41 def test_timeout_simple(self):
42 def test_timeout_simple(self):
42 searx.search.max_request_timeout = None
43 searx.search.max_request_timeout = None
43− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
44+ search_query = SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
44− ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
45+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
45− preferences=Preferences(['oscar'], ['general'], engines, []))
46+ preferences=Preferences(['oscar'], ['general'], engines, []))
46 search = searx.search.Search(search_query)
47 search = searx.search.Search(search_query)
47 search.search()
48 search.search()
48 self.assertEqual(search.actual_timeout, 3.0)
49 self.assertEqual(search.actual_timeout, 3.0)
49
50
50 def test_timeout_query_above_default_nomax(self):
51 def test_timeout_query_above_default_nomax(self):
51 searx.search.max_request_timeout = None
52 searx.search.max_request_timeout = None
52− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
53+ search_query = SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
53− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 5.0,
54+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 5.0,
54− preferences=Preferences(['oscar'], ['general'], engines, []))
55+ preferences=Preferences(['oscar'], ['general'], engines, []))
55 search = searx.search.Search(search_query)
56 search = searx.search.Search(search_query)
56 search.search()
57 search.search()
57 self.assertEqual(search.actual_timeout, 3.0)
58 self.assertEqual(search.actual_timeout, 3.0)
58
59
59 def test_timeout_query_below_default_nomax(self):
60 def test_timeout_query_below_default_nomax(self):
60 searx.search.max_request_timeout = None
61 searx.search.max_request_timeout = None
61− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
62+ search_query = SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
62− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 1.0,
63+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 1.0,
63− preferences=Preferences(['oscar'], ['general'], engines, []))
64+ preferences=Preferences(['oscar'], ['general'], engines, []))
64 search = searx.search.Search(search_query)
65 search = searx.search.Search(search_query)
65 search.search()
66 search.search()
66 self.assertEqual(search.actual_timeout, 1.0)
67 self.assertEqual(search.actual_timeout, 1.0)
67
68
68 def test_timeout_query_below_max(self):
69 def test_timeout_query_below_max(self):
69 searx.search.max_request_timeout = 10.0
70 searx.search.max_request_timeout = 10.0
70− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
71+ search_query = SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
71− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 5.0,
72+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 5.0,
72− preferences=Preferences(['oscar'], ['general'], engines, []))
73+ preferences=Preferences(['oscar'], ['general'], engines, []))
73 search = searx.search.Search(search_query)
74 search = searx.search.Search(search_query)
74 search.search()
75 search.search()
75 self.assertEqual(search.actual_timeout, 5.0)
76 self.assertEqual(search.actual_timeout, 5.0)
76
77
77 def test_timeout_query_above_max(self):
78 def test_timeout_query_above_max(self):
78 searx.search.max_request_timeout = 10.0
79 searx.search.max_request_timeout = 10.0
79− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
80+ search_query = SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
80− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 15.0,
81+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 15.0,
81− preferences=Preferences(['oscar'], ['general'], engines, []))
82+ preferences=Preferences(['oscar'], ['general'], engines, []))
82 search = searx.search.Search(search_query)
83 search = searx.search.Search(search_query)
83 search.search()
84 search.search()
84 self.assertEqual(search.actual_timeout, 10.0)
85 self.assertEqual(search.actual_timeout, 10.0)
85
86
86 def test_query_private_engine_without_token(self):
87 def test_query_private_engine_without_token(self):
87− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
88+ search_query = SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
88− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
89+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
89− preferences=Preferences(['oscar'], ['general'], engines, []))
90+ preferences=Preferences(['oscar'], ['general'], engines, []))
90 search = searx.search.Search(search_query)
91 search = searx.search.Search(search_query)
91 results = search.search()
92 results = search.search()
92 self.assertEqual(results.results_length(), 0)
93 self.assertEqual(results.results_length(), 0)
@@ -94,9 +95,9 @@ class SearchTestCase(SearxTestCase):
94 def test_query_private_engine_with_incorrect_token(self):
95 def test_query_private_engine_with_incorrect_token(self):
95 preferences_with_tokens = Preferences(['oscar'], ['general'], engines, [])
96 preferences_with_tokens = Preferences(['oscar'], ['general'], engines, [])
96 preferences_with_tokens.parse_dict({'tokens': 'bad-token'})
97 preferences_with_tokens.parse_dict({'tokens': 'bad-token'})
97− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
98+ search_query = SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
98− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
99+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
99− preferences=preferences_with_tokens)
100+ preferences=preferences_with_tokens)
100 search = searx.search.Search(search_query)
101 search = searx.search.Search(search_query)
101 results = search.search()
102 results = search.search()
102 self.assertEqual(results.results_length(), 0)
103 self.assertEqual(results.results_length(), 0)
@@ -104,28 +105,28 @@ class SearchTestCase(SearxTestCase):
104 def test_query_private_engine_with_correct_token(self):
105 def test_query_private_engine_with_correct_token(self):
105 preferences_with_tokens = Preferences(['oscar'], ['general'], engines, [])
106 preferences_with_tokens = Preferences(['oscar'], ['general'], engines, [])
106 preferences_with_tokens.parse_dict({'tokens': 'my-token'})
107 preferences_with_tokens.parse_dict({'tokens': 'my-token'})
107− search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
108+ search_query = SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
108− ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
109+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
109− preferences=preferences_with_tokens)
110+ preferences=preferences_with_tokens)
110 search = searx.search.Search(search_query)
111 search = searx.search.Search(search_query)
111 results = search.search()
112 results = search.search()
112 self.assertEqual(results.results_length(), 1)
113 self.assertEqual(results.results_length(), 1)
113
114
114 def test_external_bang(self):
115 def test_external_bang(self):
115− search_query = searx.query.SearchQuery('yes yes',
116+ search_query = SearchQuery('yes yes',
116− [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
117+ [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
117− ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
118+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
118− preferences=Preferences(['oscar'], ['general'], engines, [],),
119+ preferences=Preferences(['oscar'], ['general'], engines, [],),
119− external_bang="yt")
120+ external_bang="yt")
120 search = searx.search.Search(search_query)
121 search = searx.search.Search(search_query)
121 results = search.search()
122 results = search.search()
122 # For checking if the user redirected with the youtube external bang
123 # For checking if the user redirected with the youtube external bang
123 self.assertTrue(results.redirect_url is not None)
124 self.assertTrue(results.redirect_url is not None)
124
125
125− search_query = searx.query.SearchQuery('youtube never gonna give you up',
126+ search_query = SearchQuery('youtube never gonna give you up',
126− [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
127+ [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
127− ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
128+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
128− preferences=Preferences(['oscar'], ['general'], engines, []),)
129+ preferences=Preferences(['oscar'], ['general'], engines, []),)
129
130
130 search = searx.search.Search(search_query)
131 search = searx.search.Search(search_query)
131 results = search.search()
132 results = search.search()
utils/standalone_searx.py+2−1
@@ -31,6 +31,7 @@ import searx.query
31import searx.search
31import searx.search
32import searx.engines
32import searx.engines
33import searx.preferences
33import searx.preferences
34+import searx.webadapter
34import argparse
35import argparse
35
36
36searx.engines.initialize_engines(settings['engines'])
37searx.engines.initialize_engines(settings['engines'])
@@ -64,7 +65,7 @@ form = {
64preferences = searx.preferences.Preferences(['oscar'], searx.engines.categories.keys(), searx.engines.engines, [])
65preferences = searx.preferences.Preferences(['oscar'], searx.engines.categories.keys(), searx.engines.engines, [])
65preferences.key_value_settings['safesearch'].parse(args.safesearch)
66preferences.key_value_settings['safesearch'].parse(args.safesearch)
66
67
67−search_query, raw_text_query = searx.search.get_search_query_from_webapp(preferences, form)
68+search_query, raw_text_query = searx.webadapter.get_search_query_from_webapp(preferences, form)
68search = searx.search.Search(search_query)
69search = searx.search.Search(search_query)
69result_container = search.search()
70result_container = search.search()
70
71