analyze.py 2.4 KB

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