Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -61,22 +61,28 @@ def procesar_video(video):
|
|
61 |
collage_path = os.path.join(temp_dir, "collage.jpg")
|
62 |
collage.save(collage_path)
|
63 |
|
64 |
-
# Generación del ZIP
|
65 |
base_name = os.path.splitext(original_name)[0]
|
66 |
zip_filename = f"{base_name}.zip"
|
67 |
final_zip_path = os.path.join(temp_dir, zip_filename)
|
68 |
|
69 |
with zipfile.ZipFile(final_zip_path, mode="w") as zipf:
|
70 |
-
# Añadir
|
71 |
for img_path in frame_paths:
|
72 |
zipf.write(img_path, os.path.basename(img_path))
|
73 |
|
74 |
-
#
|
|
|
|
|
|
|
75 |
chain_content = (
|
76 |
-
|
77 |
-
f"
|
78 |
-
f"
|
79 |
-
f"
|
|
|
|
|
|
|
80 |
)
|
81 |
zipf.writestr("cadena_custodia.txt", chain_content)
|
82 |
|
@@ -85,51 +91,24 @@ def procesar_video(video):
|
|
85 |
except Exception as e:
|
86 |
raise gr.Error(f"Error al procesar el video: {str(e)}")
|
87 |
|
88 |
-
|
89 |
-
if temp_dir and os.path.exists(temp_dir):
|
90 |
-
for file in os.listdir(temp_dir):
|
91 |
-
os.remove(os.path.join(temp_dir, file))
|
92 |
-
os.rmdir(temp_dir)
|
93 |
|
94 |
with gr.Blocks(title="Extracción de Fotogramas Forenses") as demo:
|
95 |
-
gr.Markdown("#
|
96 |
gr.Markdown("**Carga un video para extraer TODOS los fotogramas y generar un collage de muestra.**")
|
97 |
gr.Markdown("Desarrollado por José R. Leonett para el Grupo de Peritos Forenses Digitales de Guatemala - [www.forensedigital.gt](https://www.forensedigital.gt)")
|
98 |
|
99 |
with gr.Row():
|
100 |
with gr.Column():
|
101 |
-
|
|
|
|
|
|
|
|
|
|
|
102 |
procesar_btn = gr.Button("Procesar Fotogramas", interactive=False)
|
103 |
with gr.Column():
|
104 |
gallery_output = gr.Image(label="Collage de Muestra")
|
105 |
-
download_file = gr.File(label="Archivo ZIP generado", visible=True)
|
106 |
-
|
107 |
-
temp_dir_state = gr.State(None)
|
108 |
-
zip_path_state = gr.State(None)
|
109 |
-
|
110 |
-
def on_video_change(video):
|
111 |
-
if video:
|
112 |
-
return gr.update(interactive=True)
|
113 |
-
return gr.update(interactive=False)
|
114 |
-
|
115 |
-
video_input.change(
|
116 |
-
fn=on_video_change,
|
117 |
-
inputs=video_input,
|
118 |
-
outputs=[procesar_btn],
|
119 |
-
queue=False
|
120 |
-
)
|
121 |
-
|
122 |
-
def procesar_y_mostrar(video):
|
123 |
-
if temp_dir_state.value:
|
124 |
-
limpiar_cache(temp_dir_state.value)
|
125 |
-
collage_path, zip_path, temp_dir = procesar_video(video)
|
126 |
-
return collage_path, zip_path, temp_dir, zip_path
|
127 |
-
|
128 |
-
procesar_btn.click(
|
129 |
-
fn=procesar_y_mostrar,
|
130 |
-
inputs=video_input,
|
131 |
-
outputs=[gallery_output, download_file, temp_dir_state, zip_path_state],
|
132 |
-
)
|
133 |
|
134 |
-
|
135 |
-
demo.launch()
|
|
|
61 |
collage_path = os.path.join(temp_dir, "collage.jpg")
|
62 |
collage.save(collage_path)
|
63 |
|
64 |
+
# Generación del ZIP con formato mejorado
|
65 |
base_name = os.path.splitext(original_name)[0]
|
66 |
zip_filename = f"{base_name}.zip"
|
67 |
final_zip_path = os.path.join(temp_dir, zip_filename)
|
68 |
|
69 |
with zipfile.ZipFile(final_zip_path, mode="w") as zipf:
|
70 |
+
# Añadir frames
|
71 |
for img_path in frame_paths:
|
72 |
zipf.write(img_path, os.path.basename(img_path))
|
73 |
|
74 |
+
# Cadena de custodia con formato mejorado
|
75 |
+
with open(video_path, "rb") as f:
|
76 |
+
video_hash = hashlib.md5(f.read()).hexdigest()
|
77 |
+
|
78 |
chain_content = (
|
79 |
+
"=== CADENA DE CUSTODIA ===\r\n\r\n"
|
80 |
+
f"• Nombre del archivo: {original_name}\r\n"
|
81 |
+
f"• Fecha de procesamiento: {timestamp}\r\n"
|
82 |
+
f"• Fotogramas extraídos: {frame_count}\r\n"
|
83 |
+
f"• Hash MD5 del video original: {video_hash}\r\n\r\n"
|
84 |
+
"Firmado digitalmente por:\n"
|
85 |
+
"Sistema de Extracción Forense - Grupo de Peritos Forenses Digitales de Guatemala"
|
86 |
)
|
87 |
zipf.writestr("cadena_custodia.txt", chain_content)
|
88 |
|
|
|
91 |
except Exception as e:
|
92 |
raise gr.Error(f"Error al procesar el video: {str(e)}")
|
93 |
|
94 |
+
# ... (El resto del código permanece igual hasta la interfaz)
|
|
|
|
|
|
|
|
|
95 |
|
96 |
with gr.Blocks(title="Extracción de Fotogramas Forenses") as demo:
|
97 |
+
gr.Markdown("# Herramienta de Extracción de Fotogramas Forenses")
|
98 |
gr.Markdown("**Carga un video para extraer TODOS los fotogramas y generar un collage de muestra.**")
|
99 |
gr.Markdown("Desarrollado por José R. Leonett para el Grupo de Peritos Forenses Digitales de Guatemala - [www.forensedigital.gt](https://www.forensedigital.gt)")
|
100 |
|
101 |
with gr.Row():
|
102 |
with gr.Column():
|
103 |
+
# Video input sin webcam
|
104 |
+
video_input = gr.Video(
|
105 |
+
label="Subir Video",
|
106 |
+
interactive=True,
|
107 |
+
sources=["upload"] # Solo permite subir archivos
|
108 |
+
)
|
109 |
procesar_btn = gr.Button("Procesar Fotogramas", interactive=False)
|
110 |
with gr.Column():
|
111 |
gallery_output = gr.Image(label="Collage de Muestra")
|
112 |
+
download_file = gr.File(label="Archivo ZIP generado", visible=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
|
114 |
+
# ... (El resto del código permanece igual)
|
|