| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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})
|