summaryrefslogtreecommitdiff
path: root/searx/engines
diff options
context:
space:
mode:
authorasciimoo <asciimoo@gmail.com>2013-10-15 18:19:06 +0200
committerasciimoo <asciimoo@gmail.com>2013-10-15 18:19:06 +0200
commitd5ec0f43e465e1bd016f1c841122fc3c774fc718 (patch)
tree33a0f3f8fc688ef544dc2bc8d95e1443409503c4 /searx/engines
parent2440e74b1eb75832e3a187e4130b4df212a4dc06 (diff)
[mod] search refactor
Diffstat (limited to 'searx/engines')
-rw-r--r--searx/engines/__init__.py39
1 files changed, 38 insertions, 1 deletions
diff --git a/searx/engines/__init__.py b/searx/engines/__init__.py
index 34d88b749..ced673bde 100644
--- a/searx/engines/__init__.py
+++ b/searx/engines/__init__.py
@@ -2,6 +2,7 @@
from os.path import realpath, dirname, splitext, join
from os import listdir
from imp import load_source
+import grequests
engine_dir = dirname(realpath(__file__))
@@ -12,4 +13,40 @@ for filename in listdir(engine_dir):
if filename.startswith('_') or not filename.endswith('.py'):
continue
filepath = join(engine_dir, filename)
- engines.append(load_source(modname, filepath))
+ engine = load_source(modname, filepath)
+ if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
+ continue
+ engines.append(engine)
+
+def default_request_params():
+ return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
+
+def make_callback(results, callback):
+ def process_callback(response, **kwargs):
+ results.extend(callback(response))
+ return process_callback
+
+def search(query, request):
+ global engines
+ requests = []
+ results = []
+ user_agent = request.headers.get('User-Agent', '')
+ for engine in engines:
+ headers = default_request_params()
+ headers['User-Agent'] = user_agent
+ request_params = engine.request(query, headers)
+ callback = make_callback(results, engine.response)
+ if request_params['method'] == 'GET':
+ req = grequests.get(request_params['url']
+ ,headers=headers
+ ,hooks=dict(response=callback)
+ )
+ else:
+ req = grequests.post(request_params['url']
+ ,data=request_params['data']
+ ,headers=headers
+ ,hooks=dict(response=callback)
+ )
+ requests.append(req)
+ grequests.map(requests)
+ return results