forked from kencoken/imsearch-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
imsearch_http_service.py
143 lines (120 loc) · 5.64 KB
/
imsearch_http_service.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python
import sys
from flask import Flask, request, Response, url_for
from gevent.wsgi import WSGIServer
from flask import json
from imsearchtools import http_service_helper
import logging
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG)
DEFAULT_SERVER_PORT = 8157
SUPPORTED_ENGINES = ['bing_api', 'google_old_api', 'google_api', 'google_web', 'flickr_api']
zmq_context = None # used to store zmq context created by init_zmq_context function
app = Flask(__name__)
app.debug = True
@app.route('/')
def index():
return "imsearch HTTP service is running"
@app.route('/callback_test')
def callback_test():
http_service_helper.test_callback()
return 'Done!'
@app.route('/query')
def query():
# parse GET args
query = request.args['q']
engine = request.args.get('engine', 'google_web')
query_params = dict()
for param_nm in ['size', 'style']:
if param_nm in request.args:
query_params[param_nm] = request.args[param_nm]
if 'num_results' in request.args:
query_params['num_results'] = int(request.args['num_results'])
# execute query
query_res_list = http_service_helper.imsearch_query(query, engine, query_params)
return Response(json.dumps(query_res_list), mimetype='application/json')
@app.route('/download', methods=['POST'])
def download():
# parse POST data
query_res_list = request.json
if not query_res_list:
raise ValueError("Input must be 'application/json' encoded list of urls")
# download images
dfiles_list = http_service_helper.imsearch_download_to_static(query_res_list)
# convert pathnames to URL paths
url_dfiles_list = http_service_helper.make_url_dfiles_list(dfiles_list)
return Response(json.dumps(url_dfiles_list), mimetype='application/json')
@app.route('/get_postproc_module_list')
def get_postproc_module_list():
return json.dumps(http_service_helper.get_postproc_modules())
@app.route('/get_engine_list')
def get_engine_list():
return json.dumps(SUPPORTED_ENGINES)
@app.route('/init_zmq_context')
def init_zmq_context():
global zmq_context
if not zmq_context:
import zmq
zmq_context = zmq.Context()
return 'Success'
@app.route('/exec_pipeline', methods=['POST'])
def exec_pipeline():
# parse POST form args
query = request.form['q']
engine = request.form.get('engine', 'google_web')
postproc_module = request.form.get('postproc_module', None) # default to no postproc module
postproc_extra_prms = request.form.get('postproc_extra_prms', None)
if postproc_extra_prms:
postproc_extra_prms = json.loads(postproc_extra_prms)
custom_local_path = request.form.get('custom_local_path', None)
# < default to returning list only if not using postproc module >
return_dfiles_list = request.form.get('return_dfiles_list', (postproc_module == None))
return_dfiles_list = (int(return_dfiles_list) == 1)
# prepare query params
query_timeout = request.form.get('query_timeout', -1.0)
query_timeout = float(query_timeout)
query_params = dict()
for param_nm in ['size', 'style']:
if param_nm in request.form:
query_params[param_nm] = request.form[param_nm]
if 'num_results' in request.form:
query_params['num_results'] = int(request.form['num_results'])
# execute query
query_res_list = http_service_helper.imsearch_query(query, engine,
query_params, query_timeout)
print 'Query for %s completed: %d results retrieved' % (query, len(query_res_list))
#query_res_list = query_res_list[:5] # DEBUG CODE
# prepare download params
imgetter_params = dict()
for param_nm in ['improc_timeout', 'per_image_timeout']:
if param_nm in request.form:
imgetter_params[param_nm] = float(request.form[param_nm])
for param_nm in ['resize_width', 'resize_height']:
if param_nm in request.form:
imgetter_params[param_nm] = int(request.form[param_nm])
# download images
print 'Downloading for %s started: %d sec improc_timeout, %d sec per_image_timeout' % (query,
imgetter_params['improc_timeout'] if imgetter_params['improc_timeout'] else -1,
imgetter_params['per_image_timeout'] if imgetter_params['per_image_timeout'] else -1)
dfiles_list = http_service_helper.imsearch_download_to_static(query_res_list,
postproc_module,
postproc_extra_prms,
custom_local_path,
imgetter_params,
zmq_context)
print 'Downloading for %s completed: %d images retrieved' % (query, len(dfiles_list))
# convert pathnames to URL paths (if not running locally and specifying
# a custom path)
if not custom_local_path:
dfiles_list = http_service_helper.make_url_dfiles_list(dfiles_list)
if return_dfiles_list:
return Response(json.dumps(dfiles_list), mimetype='application/json')
else:
return 'DONE'
if __name__ == '__main__':
if len(sys.argv)>1:
SERVER_PORT = int(sys.argv[1])
else:
SERVER_PORT = DEFAULT_SERVER_PORT
print "Starting imsearch_http_service on port", SERVER_PORT
http_server = WSGIServer(('', SERVER_PORT), app)
http_server.serve_forever()