Spaces:
Configuration error
Configuration error
import os | |
import mimetypes | |
import traceback | |
from datetime import datetime | |
from wsgiref.util import FileWrapper | |
from rest_framework import status | |
from rest_framework.decorators import api_view, parser_classes | |
from rest_framework.parsers import MultiPartParser | |
from django.http import StreamingHttpResponse | |
from django.http import JsonResponse | |
from detection.main import exercise_detection | |
from detection.utils import get_static_file_url | |
def stream_video(request): | |
""" | |
Query: video_name | |
Stream video get from query | |
""" | |
video_name = request.GET.get("video_name") | |
if not video_name: | |
return JsonResponse( | |
status=status.HTTP_400_BAD_REQUEST, | |
data={ | |
"message": "File name not given", | |
}, | |
) | |
static_url = get_static_file_url(f"media/{video_name}") | |
if not static_url: | |
return JsonResponse( | |
status=status.HTTP_404_NOT_FOUND, | |
data={ | |
"message": "File not found", | |
}, | |
) | |
# Streamed video as chunked | |
video_size = os.path.getsize(static_url) | |
content_type, _ = mimetypes.guess_type(static_url) | |
content_type = content_type or "application/octet-stream" | |
chunk_size = video_size // 10 | |
response = StreamingHttpResponse( | |
FileWrapper(open(static_url, "rb"), chunk_size), content_type=content_type | |
) | |
response["Content-Length"] = video_size | |
response["Accept-Ranges"] = "bytes" | |
return response | |
def upload_video(request): | |
exercise_type = request.GET.get("type") | |
if not exercise_type: | |
return JsonResponse( | |
status=status.HTTP_400_BAD_REQUEST, | |
data={ | |
"message": "Exercise type has not given", | |
}, | |
) | |
try: | |
if request.method == "POST": | |
video = request.FILES["file"] | |
# Convert any video to .mp4 | |
now = datetime.now() | |
now = int(now.strftime("%Y%m%d%H%M%S")) | |
name_to_save = f"video_{now}.mp4" | |
# Process and Saved Video | |
results, *other_data = exercise_detection( | |
video_file_path=video.temporary_file_path(), | |
video_name_to_save=name_to_save, | |
exercise_type=exercise_type, | |
rescale_percent=40, | |
) | |
# Convert images' path to URL | |
host = request.build_absolute_uri("/") | |
for index, error in enumerate(results): | |
if error["frame"]: | |
results[index]["frame"] = host + f"static/images/{error['frame']}" | |
response_data = { | |
"type": exercise_type, | |
"processed": True, | |
"file_name": name_to_save, | |
"details": results, | |
} | |
# Handle others data | |
if exercise_type in ["squat", "lunge", "bicep_curl"]: | |
response_data["counter"] = other_data[0] | |
return JsonResponse( | |
status=status.HTTP_200_OK, | |
data=response_data, | |
) | |
except Exception as e: | |
print(f"Error Video Processing: {e}") | |
# traceback.print_exc() | |
return JsonResponse( | |
status=status.HTTP_400_BAD_REQUEST, | |
data={ | |
"error": f"Error: {e}", | |
}, | |
) | |