analyze.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import json
  2. import uuid
  3. from flask import Blueprint
  4. from flask import request
  5. from db import db
  6. from db.task import Task
  7. from pool.thread_pool import submit
  8. from route.util import make_response
  9. from service.photo_analyzer import StandingPhotoAnalyzer
  10. from service.video_analyzer import *
  11. # from service.video_analyzer import BaseVideoAnalyzer, CrunchVideoAnalyzer, HighKneesVideoAnalyzer, \
  12. # PlankVideoAnalyzer, SquatVideoAnalyzer, StandingLongJumpVideoAnalyzer, JuanfuAnalyzer
  13. # from service.video.Video3DAnalyzer import Video3DAnalyzer
  14. logging.basicConfig(format='%(asctime)s - %(name)s[line:%(lineno)d] - %(levelname)s: %(message)s',
  15. level=logging.DEBUG)
  16. bp = Blueprint("analyze", __name__, url_prefix='/')
  17. def callback_generator(task_uuid):
  18. def callback(status, **kwargs):
  19. try:
  20. from app import app
  21. with app.app_context():
  22. task = Task.query.get(task_uuid)
  23. task.status = status
  24. if status == 'RUNNING':
  25. task.progress = kwargs['progress']
  26. if status == 'FINISHED':
  27. task.result = json.dumps(kwargs['result'])
  28. if status == 'ERROR':
  29. logging.error("error analyzing: ", exc_info=kwargs['error'])
  30. db.session.commit()
  31. logging.debug("calling to " + status)
  32. except Exception as e:
  33. logging.debug("nmsl", exc_info=e)
  34. raise e
  35. return callback
  36. @bp.route("analysis", methods=['POST'])
  37. def analysis():
  38. req = request.get_json()
  39. types = {
  40. "PHOTO_STANDING": StandingPhotoAnalyzer,
  41. "VIDEO_HIGHKNEES": GaotaituiVideoAnalyzer,
  42. "VIDEO_CRUNCH": JuanfuVideoAnalyzer,
  43. "VIDEO_STANDINGLONGJUMP": JumpVideoAnalyzer,
  44. "VIDEO_MULTIJUMP": JumpwithbothVideoAnalyzer,
  45. "VIDEO_SITANDREACH": SitforwardVideoAnalyzer,
  46. "VIDEO_RUNBACKANDFORTH": TurnaroundVideoAnalyzer,
  47. "VIDEO_TENNISTHROW": TennisthrowVideoAnalyzer,
  48. "VIDEO_BALANCEBEAM": BalancebeamVideoAnalyzer,
  49. "VIDEO_SINGLELEGSTAND": StandingVideoAnalyzer,
  50. "VIDEO_PLANK": PingbanVideoAnalyzer,
  51. "VIDEO_SQUAT": ShendunVideoAnalyzer
  52. }
  53. ana_type = types.get(req.get('type'))
  54. if ana_type is None:
  55. return make_response(400, "invalid type", {})
  56. try:
  57. ana = ana_type(req.get('data'))
  58. except Exception as e:
  59. return make_response(400, str(e), {})
  60. with __import__("app").app.app_context():
  61. task_uuid = str(uuid.uuid4())
  62. new_task = Task(task_uuid, req.get('type'))
  63. db.session.add(new_task)
  64. db.session.commit()
  65. logging.debug("task created.")
  66. submit(ana.analyze, callback_generator(task_uuid))
  67. logging.debug("task submited")
  68. return make_response(201, "success", {'task_uuid': task_uuid})