Skip to content

Commit b077258

Browse files
committed
Add stadists
1 parent 57ba347 commit b077258

1 file changed

Lines changed: 138 additions & 30 deletions

File tree

compress.py

Lines changed: 138 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,53 @@
44
from dotenv import load_dotenv
55
import requests
66
import send2trash
7+
import time
8+
9+
# Variables globales para almacenar las estadísticas de compresión
10+
total_videos = 0
11+
total_compression_time = 0
12+
total_original_size = 0
13+
total_compressed_size = 0
14+
15+
def get_all_videos(directory):
16+
"""
17+
Esta función toma una ruta de directorio como entrada y devuelve una lista de todas las rutas de video en ese directorio y sus subdirectorios.
18+
"""
19+
# Lista para almacenar las rutas de los videos
20+
videos = []
21+
22+
# Recorre todos los archivos en el directorio y sus subdirectorios
23+
for root, dirs, files in os.walk(directory):
24+
for file in files:
25+
# Si el archivo es un video, añade su ruta a la lista
26+
if file.endswith(('.mp4', '.avi', '.mkv', '.flv', '.mov')):
27+
videos.append(os.path.join(root, file))
28+
29+
return videos
730

831

932
def shutdown_option():
1033
"""
1134
Esta función pregunta al usuario si desea que el Mac se apague cuando finalice el proceso de compresión.
1235
"""
36+
print("¡Gracias por usar Compress MP4, sus archivos se guardarán en el mismo directorio que los archivos de origen!")
37+
1338
# Pregunta al usuario si desea que el Mac se apague al finalizar la compresión
1439
shutdown = input("¿Desea que el Mac se apague cuando finalice el proceso de compresión? \n [1] SI apagar \n [2] NO apagar \n : ").strip()
1540

1641
# Si el usuario eligió apagar el Mac, verifica si el script se está ejecutando con permisos de superusuario
1742
if shutdown == '1':
1843
if os.geteuid() != 0:
19-
print("Para apagar el Mac al finalizar la compresión, debes ejecutar este script como superusuario. Intenta ejecutar el script con 'sudo'.")
44+
print("Para apagar el Mac debes ejecutar este script como superusuario. Intenta ejecutar el script con 'sudo'.")
2045
sys.exit()
2146

22-
return shutdown
47+
# Pregunta al usuario si desea comprimir videos individuales o todos los videos en un directorio
48+
compression_option = input("¿Cómo desea comprimir los videos? \n [1] Ingresar rutas de videos individuales \n [2] Ingresar ruta de un directorio con videos \n : ").strip()
49+
50+
return shutdown, compression_option
2351

2452
# Llama a la función de opción de apagado al inicio del script y guarda la elección del usuario
25-
shutdown = shutdown_option()
53+
shutdown, compression_option = shutdown_option()
2654

2755
def comprimir_video(ruta_origen, ruta_destino):
2856
"""
@@ -32,17 +60,40 @@ def comprimir_video(ruta_origen, ruta_destino):
3260
ruta_origen -- Ruta al archivo de video original.
3361
ruta_destino -- Ruta donde se guardará el video comprimido, es la misma de Origen.
3462
"""
63+
64+
global total_videos
65+
global total_compression_time
66+
global total_original_size
67+
global total_compressed_size
68+
69+
# Incrementa el total de videos
70+
total_videos += 1
3571

3672
# Reemplaza las barras invertidas en las rutas de los archivos
3773
ruta_origen = ruta_origen.replace('\\', '')
3874
ruta_destino = ruta_destino.replace('\\', '')
75+
76+
# Obtiene el tamaño del video antes de la compresión
77+
original_size = os.path.getsize(ruta_origen)
78+
total_original_size += original_size
79+
80+
# Registra el tiempo de inicio de la compresión
81+
start_time = time.time()
3982

4083
# Comando para comprimir el video
4184
comando = ['/Applications/HandBrakeCLI', '-i', f'"{ruta_origen}"', '-o', f'"{ruta_destino}"', '-f', 'mp4', '--optimize', '-e', 'x264', '-q', '25.5', '-r', '30', '-E', 'ca_aac', '-B', '96', '-w', '1920']
4285

4386
# Ejecuta el comando
4487
subprocess.run(' '.join(comando), shell=True)
4588

89+
# Obtiene el tamaño del video después de la compresión
90+
compressed_size = os.path.getsize(ruta_destino)
91+
total_compressed_size += compressed_size
92+
93+
# Calcula el tiempo que tomó la compresión en segundos
94+
compression_time_seconds = time.time() - start_time
95+
total_compression_time += compression_time_seconds
96+
4697
# Mueve el archivo original a la papelera
4798
send2trash.send2trash(ruta_origen)
4899

@@ -51,10 +102,34 @@ def alert_success():
51102
Esta función se ejecuta cuando el script finaliza la compresión.
52103
Genera un sonido de alerta en caso de éxito y envía un correo electrónico.
53104
"""
105+
global total_videos
106+
global total_compression_time
107+
global total_original_size
108+
global total_compressed_size
109+
110+
# Convierte el tiempo de compresión a horas y minutos
111+
compression_time_minutes, compression_time_seconds = divmod(total_compression_time, 60)
112+
compression_time_hours, compression_time_minutes = divmod(compression_time_minutes, 60)
113+
114+
# Calcula el porcentaje de espacio ganado y el espacio ganado en GB
115+
space_saved = total_original_size - total_compressed_size
116+
percent_space_saved = (space_saved / total_original_size) * 100
117+
space_saved_gb = space_saved / (1024 ** 3)
118+
54119
# Genera un sonido de alerta en caso de éxito
55120
os.system('afplay ok-notification-alert.wav')
56-
# Envía un correo electrónico al finalizar el proceso
57-
send_email("Compresión exitosa", "La compresión de sus videos se realizó satisfactoriamente.", "SUCORREO@gmail.com")
121+
122+
# Prepara el mensaje del correo electrónico
123+
email_message = (
124+
f"La compresión de sus videos se realizó satisfactoriamente. Aquí están las estadísticas de la compresión:\n\n"
125+
f"Cantidad de videos comprimidos: {total_videos}\n"
126+
f"Tiempo total de compresión: {int(compression_time_hours)} hr: {int(compression_time_minutes)} min\n"
127+
f"Porcentaje de compresión: {percent_space_saved:.2f}%\n"
128+
f"Espacio ganado: {space_saved_gb:.2f} GB"
129+
)
130+
131+
# Envía el correo electrónico
132+
send_email("Compresión exitosa", email_message, "SUCORREO@gmail.com")
58133

59134
def send_email(subject, text, to):
60135
"""
@@ -88,31 +163,64 @@ def send_email(subject, text, to):
88163
print("Error al enviar el correo electrónico.")
89164
return False
90165

91-
print("¡Gracias por usar Compress MP4, sus archivos se guardarán en el mismo directorio que los archivos de origen!")
92-
# Solicita la cantidad de videos a comprimir
93-
cantidad_videos = int(input("Ingrese la cantidad de videos a comprimir: ").strip())
94-
95-
# Lista para almacenar las rutas de los videos
96-
rutas_videos = []
97-
98-
for i in range(cantidad_videos):
99-
# Solicita la ruta del archivo de origen convirtiendo la ruta en relativa para que acepte espacios en el nombre del archivo o en la ruta del directorio que lo contiene
100-
ruta_origen = input(f"Ingrese la ruta del archivo de origen {i+1}: ").strip()
101-
rutas_videos.append(ruta_origen)
102-
103-
# Procesa cada video
104-
for ruta_origen in rutas_videos:
105-
# Obtiene la ruta del directorio del archivo de origen
106-
ruta_directorio = os.path.dirname(ruta_origen)
107-
108-
# Crea la ruta del archivo de destino en el mismo directorio que el archivo de origen
109-
nombre_archivo = os.path.basename(ruta_origen)
110-
nombre_base, extension = os.path.splitext(nombre_archivo)
111-
nombre_archivo_comprimido = f"{nombre_base}_compressed{extension}"
112-
ruta_destino = os.path.join(ruta_directorio, nombre_archivo_comprimido)
113-
114-
# Uso de la función
115-
comprimir_video(ruta_origen, ruta_destino)
166+
if compression_option == '1':
167+
# Solicita la cantidad de videos a comprimir
168+
cantidad_videos = int(input("Ingrese la cantidad de videos a comprimir: ").strip())
169+
170+
# Lista para almacenar las rutas de los videos
171+
rutas_videos = []
172+
173+
for i in range(cantidad_videos):
174+
# Solicita la ruta del archivo de origen convirtiendo la ruta en relativa para que acepte espacios en el nombre del archivo o en la ruta del directorio que lo contiene
175+
ruta_origen = input(f"Ingrese la ruta del archivo de origen {i+1}: ").strip()
176+
rutas_videos.append(ruta_origen)
177+
178+
# Procesa cada video
179+
for ruta_origen in rutas_videos:
180+
# Obtiene la ruta del directorio del archivo de origen
181+
ruta_directorio = os.path.dirname(ruta_origen)
182+
183+
# Crea la ruta del archivo de destino en el mismo directorio que el archivo de origen
184+
nombre_archivo = os.path.basename(ruta_origen)
185+
nombre_base, extension = os.path.splitext(nombre_archivo)
186+
nombre_archivo_comprimido = f"{nombre_base}_compressed{extension}"
187+
ruta_destino = os.path.join(ruta_directorio, nombre_archivo_comprimido)
188+
189+
# Uso de la función
190+
comprimir_video(ruta_origen, ruta_destino)
191+
else:
192+
# Solicita la ruta del directorio con los videos
193+
directory = input("Ingrese la ruta del directorio con los videos: ").strip()
194+
195+
# Expande la ruta del directorio y reemplaza las secuencias de escape de barra invertida y espacio con un espacio
196+
directory = directory.replace('\\', '')
197+
198+
# Verifica si el directorio existe
199+
if not os.path.isdir(directory):
200+
print("El directorio ingresado no existe. Por favor, intente de nuevo.")
201+
sys.exit()
202+
203+
# Obtiene todas las rutas de los videos en el directorio
204+
rutas_videos = get_all_videos(directory)
205+
206+
# Verifica si hay videos en el directorio
207+
if not rutas_videos:
208+
print("No se encontraron videos en el directorio ingresado. Por favor, intente de nuevo.")
209+
sys.exit()
210+
211+
# Procesa cada video
212+
for ruta_origen in rutas_videos:
213+
# Obtiene la ruta del directorio del archivo de origen
214+
ruta_directorio = os.path.dirname(ruta_origen)
215+
216+
# Crea la ruta del archivo de destino en el mismo directorio que el archivo de origen
217+
nombre_archivo = os.path.basename(ruta_origen)
218+
nombre_base, extension = os.path.splitext(nombre_archivo)
219+
nombre_archivo_comprimido = f"{nombre_base}_compressed{extension}"
220+
ruta_destino = os.path.join(ruta_directorio, nombre_archivo_comprimido)
221+
222+
# Uso de la función
223+
comprimir_video(ruta_origen, ruta_destino)
116224

117225

118226
# Llama a la función de alerta de éxito al finalizar la compresión de todos los videos

0 commit comments

Comments
 (0)