import json import uuid from flask import Blueprint from flask import request from db import db from db.task import Task from pool.thread_pool import submit from route.util import make_response from service.photo_analyzer import StandingPhotoAnalyzer from service.video_analyzer import * # from service.video_analyzer import BaseVideoAnalyzer, CrunchVideoAnalyzer, HighKneesVideoAnalyzer, \ # PlankVideoAnalyzer, SquatVideoAnalyzer, StandingLongJumpVideoAnalyzer, JuanfuAnalyzer # from service.video.Video3DAnalyzer import Video3DAnalyzer logging.basicConfig(format='%(asctime)s - %(name)s[line:%(lineno)d] - %(levelname)s: %(message)s', level=logging.DEBUG) bp = Blueprint("analyze", __name__, url_prefix='/') def callback_generator(task_uuid): def callback(status, **kwargs): try: from app import app with app.app_context(): task = Task.query.get(task_uuid) task.status = status if status == 'RUNNING': task.progress = kwargs['progress'] if status == 'FINISHED': task.result = json.dumps(kwargs['result']) if status == 'ERROR': logging.error("error analyzing: ", exc_info=kwargs['error']) db.session.commit() logging.debug("calling to " + status) except Exception as e: logging.debug("nmsl", exc_info=e) raise e return callback @bp.route("analysis", methods=['POST']) def analysis(): req = request.get_json() types = { "PHOTO_STANDING": StandingPhotoAnalyzer, "VIDEO_HIGHKNEES": GaotaituiVideoAnalyzer, "VIDEO_CRUNCH": JuanfuVideoAnalyzer, "VIDEO_STANDINGLONGJUMP": JumpVideoAnalyzer, "VIDEO_MULTIJUMP": JumpwithbothVideoAnalyzer, "VIDEO_SITANDREACH": SitforwardVideoAnalyzer, "VIDEO_RUNBACKANDFORTH": TurnaroundVideoAnalyzer, "VIDEO_TENNISTHROW": TennisthrowVideoAnalyzer, "VIDEO_BALANCEBEAM": BalancebeamVideoAnalyzer, "VIDEO_SINGLELEGSTAND": StandingVideoAnalyzer, "VIDEO_PLANK": PingbanVideoAnalyzer, "VIDEO_SQUAT": ShendunVideoAnalyzer } ana_type = types.get(req.get('type')) if ana_type is None: return make_response(400, "invalid type", {}) try: ana = ana_type(req.get('data')) except Exception as e: return make_response(400, str(e), {}) with __import__("app").app.app_context(): task_uuid = str(uuid.uuid4()) new_task = Task(task_uuid, req.get('type')) db.session.add(new_task) db.session.commit() logging.debug("task created.") submit(ana.analyze, callback_generator(task_uuid)) logging.debug("task submited") return make_response(201, "success", {'task_uuid': task_uuid})