summaryrefslogtreecommitdiff
path: root/megapixels/app/server/api_task.py
diff options
context:
space:
mode:
Diffstat (limited to 'megapixels/app/server/api_task.py')
-rw-r--r--megapixels/app/server/api_task.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/megapixels/app/server/api_task.py b/megapixels/app/server/api_task.py
new file mode 100644
index 00000000..57ae9f7d
--- /dev/null
+++ b/megapixels/app/server/api_task.py
@@ -0,0 +1,124 @@
+import os
+import re
+import uuid
+import time
+import dlib
+import tempfile
+import simplejson as json
+import numpy as np
+from flask import Blueprint, request, jsonify
+from PIL import Image, ImageOps # todo: try to remove PIL dependency
+
+from celery.result import AsyncResult
+from app.server.tasks import celery
+from app.server.tasks import task_lookup, list_active_tasks
+# from app.models.sql_factory import load_sql_datasets, list_datasets, get_dataset, get_table
+
+api_task = Blueprint('task', __name__)
+
+@api_task.route('/')
+def index():
+ """List active tasks"""
+ return jsonify(list_active_tasks)
+
+@api_task.route('/status/<task_name>/<task_id>')
+def task_status(task_name, task_id):
+ """Return celery image processing status"""
+ if task_name in task_lookup:
+ task = task_lookup[task_name]['task'].AsyncResult(task_id)
+ # task = AsyncResult(task_id, app=celery)
+
+ if task_name not in task_lookup or task.info is None:
+ return jsonify({
+ 'state': 'error',
+ 'percent': 100,
+ 'message': 'Unknown task',
+ })
+ # app.logger.info('task state: {}'.format(task.state))
+ if task.state == 'PENDING':
+ response = {
+ 'state': task.state,
+ 'percent': 0,
+ 'message': 'Pending...',
+ 'data': task.info,
+ }
+ elif task.state != 'FAILURE':
+ response = {
+ 'state': task.state,
+ 'percent': task.info.get('percent', 0),
+ 'uuid': task.info.get('uuid', 0),
+ 'message': task.info.get('message', ''),
+ 'data': task.info,
+ }
+ if 'result' in task.info:
+ response['result'] = task.info['result']
+ else:
+ # something went wrong in the background job
+ response = {
+ 'state': task.state,
+ 'percent': 100,
+ 'message': str(task.info), # this is the exception raised
+ 'data': task.info,
+ }
+ return jsonify(response)
+
+@api_task.route('/upload/sleep', methods=['GET', 'POST'])
+def sleep_test():
+ """
+ Test the Celery system using a task that sleeps.
+ """
+ async_task = task_lookup['sleep']['task'].apply_async(args=['sleep_test'])
+ task_url = '/task/status/{}/{}'.format('sleep', async_task.id)
+ return jsonify({
+ 'result': True,
+ 'task_url': task_url,
+ })
+
+@api_task.route('/upload/blur', methods=['POST'])
+def upload():
+ return process('blur')
+
+@api_task.route('/upload/demo', methods=['POST'])
+def demo():
+ return process('demo')
+
+def process(style):
+ """
+ Process an image in a particular style
+ """
+ print('style: {}'.format(style))
+ if style in task_lookup:
+ task = task_lookup[style]['task']
+ print('task', task)
+ else:
+ return jsonify({
+ 'result': False,
+ 'error': 'Unknown task',
+ })
+
+ print('get file...')
+ file = request.files['query_img']
+
+ uuid_str = str(uuid.uuid4())
+
+ print('[+] style: {}'.format(style))
+ print('[+] uuid_name: {}'.format(uuid_str))
+
+ im = Image.open(file.stream).convert('RGB')
+ im = ImageOps.fit(im, (256, 256,))
+
+ tmpfile = tempfile.NamedTemporaryFile(delete=False)
+
+ # Save image to disk
+ print('[+] Save image to temporary file')
+ im.save(tmpfile, 'JPEG', quality=80)
+
+ print('[+] Start celery')
+ async_task = task.apply_async(args=[uuid_str, tmpfile.name])
+ task_url = '/task/status/{}/{}'.format(style, async_task.id)
+
+ return jsonify({
+ 'result': True,
+ 'taskURL': task_url,
+ 'uuid': uuid_str
+ })