ricardo238costa commited on
Commit
aa0b211
·
verified ·
1 Parent(s): fe0ec2c

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +37 -5
main.py CHANGED
@@ -1,26 +1,36 @@
1
  from fastapi import FastAPI, UploadFile, File
2
  from fastapi.responses import FileResponse
 
3
  import cv2
4
  import subprocess
5
  import uuid
6
  import os
 
 
7
 
8
  app = FastAPI()
9
 
 
 
 
10
  def detect_product_in_frame(frame):
11
  return (100, 50, 400, 400)
12
 
13
  @app.post("/process_video/")
14
  async def process_video(file: UploadFile = File(...)):
15
- input_filename = f"/tmp/input_{uuid.uuid4()}.mp4"
16
- output_filename = f"/tmp/output_{uuid.uuid4()}.mp4"
 
 
17
 
 
18
  with open(input_filename, "wb") as f:
19
  f.write(await file.read())
20
 
21
  cap = cv2.VideoCapture(input_filename)
22
  success, frame = cap.read()
23
  if not success:
 
24
  return {"error": "Não foi possível ler o vídeo."}
25
 
26
  roi_box = detect_product_in_frame(frame)
@@ -35,9 +45,31 @@ async def process_video(file: UploadFile = File(...)):
35
  '-c:a', 'copy',
36
  output_filename
37
  ]
38
- subprocess.run(crop_cmd)
 
 
 
 
39
 
40
- os.remove(input_filename)
41
- return FileResponse(output_filename, media_type="video/mp4", filename="cropped_video.mp4")
 
 
 
 
 
 
42
  else:
 
43
  return {"error": "Não foi possível detectar o produto para realizar o crop."}
 
 
 
 
 
 
 
 
 
 
 
 
1
  from fastapi import FastAPI, UploadFile, File
2
  from fastapi.responses import FileResponse
3
+ from starlette.middleware.base import BaseHTTPMiddleware
4
  import cv2
5
  import subprocess
6
  import uuid
7
  import os
8
+ import shutil
9
+ import tempfile
10
 
11
  app = FastAPI()
12
 
13
+ # Define permissões restritas para os arquivos criados
14
+ os.umask(0o077)
15
+
16
  def detect_product_in_frame(frame):
17
  return (100, 50, 400, 400)
18
 
19
  @app.post("/process_video/")
20
  async def process_video(file: UploadFile = File(...)):
21
+ # Cria um diretório temporário exclusivo para a requisição
22
+ temp_dir = tempfile.mkdtemp()
23
+ input_filename = os.path.join(temp_dir, f"input_{uuid.uuid4()}.mp4")
24
+ output_filename = os.path.join(temp_dir, f"output_{uuid.uuid4()}.mp4")
25
 
26
+ # Salva o vídeo de entrada no diretório temporário
27
  with open(input_filename, "wb") as f:
28
  f.write(await file.read())
29
 
30
  cap = cv2.VideoCapture(input_filename)
31
  success, frame = cap.read()
32
  if not success:
33
+ shutil.rmtree(temp_dir)
34
  return {"error": "Não foi possível ler o vídeo."}
35
 
36
  roi_box = detect_product_in_frame(frame)
 
45
  '-c:a', 'copy',
46
  output_filename
47
  ]
48
+ try:
49
+ subprocess.run(crop_cmd, check=True)
50
+ except subprocess.CalledProcessError:
51
+ shutil.rmtree(temp_dir)
52
+ return {"error": "Erro ao processar o vídeo com FFmpeg."}
53
 
54
+ # Verifica se o arquivo de saída foi criado e prepara a resposta
55
+ if os.path.exists(output_filename):
56
+ response = FileResponse(output_filename, media_type="video/mp4", filename="cropped_video.mp4")
57
+ response.headers["X-Delete-Dir"] = temp_dir
58
+ return response
59
+ else:
60
+ shutil.rmtree(temp_dir)
61
+ return {"error": "O arquivo de saída não foi gerado."}
62
  else:
63
+ shutil.rmtree(temp_dir)
64
  return {"error": "Não foi possível detectar o produto para realizar o crop."}
65
+
66
+ # Middleware para limpar o diretório temporário após a resposta
67
+ class CleanupMiddleware(BaseHTTPMiddleware):
68
+ async def dispatch(self, request, call_next):
69
+ response = await call_next(request)
70
+ temp_dir_to_delete = response.headers.get("X-Delete-Dir")
71
+ if temp_dir_to_delete and os.path.exists(temp_dir_to_delete):
72
+ shutil.rmtree(temp_dir_to_delete)
73
+ return response
74
+
75
+ app.add_middleware(CleanupMiddleware)