Código fuente para batch_ffmpeg.parse
"""
Código necesario para parsear la salida de *FFMPEG*.
"""
import re
[documentos]class ffmpeg_parser:
"""
Recibe stderr de *FFMPEG*, línea por línea y obtiene información sobre el
archivo actual.
"""
def __init__(self):
self.file = None
"""
str: Nombre de archivo de entrada actual.
Es None si todavía no es conocido.
"""
self.duration = None
"""
float: Duración del archivo actual, en segundos.
Es None si todavía no es conocido.
"""
self.time = None
"""
float: Tiempo actual en la conversión del archivo actual, en segundos.
Es None si todavía no es conocido.
"""
[documentos] def update(self, line: str):
"""
Actualizarse a partir de una línea.
Args:
line (str): Línea de stdout a parsear.
"""
# línea que contiene al nombre de archivo
# ejemplo:
# Input #0, ogg, from '/home/usuario/cancion ' con comilla.ogg':
if "Input #0, " in line:
_, line = line.split("'", maxsplit=1)
line, _ = line.rsplit("'", maxsplit=1)
self.file = line
self.time = None # porque se supone que cambiamos de archivo
# línea que contiene a la duración
# ejemplo:
# Duration: 00:08:58.12, start: 0.000000, bitrate: 138 kb/s
if re.search(r"Duration:.*, start:.*, bitrate:.*", line):
string = re.search(r"[0-9]+:[0-9]+:[0-9]+.[0-9]+", line).group()
h, m, s = string.split(":")
self.duration = float(s) + int(m) * 60 + int(h) * 3600
self.time = None # porque se supone que cambiamos de archivo
# línea que contiene al tiempo actual
# ejemplo:
# size= 953kB time=00:01:21.26 bitrate= 96.1kbits/s speed=23.2x
if is_progress(line):
string = re.search(r"[0-9]+:[0-9]+:[0-9]+.[0-9]+", line).group()
h, m, s = string.split(":")
self.time = float(s) + int(m) * 60 + int(h) * 3600
[documentos] def get_current_file_progress(self):
"""
Obtener progreso de la conversión en el archivo actual.
Returns:
float: Un número entre 0 y 1.
Puede ser None si no se conoce el progreso actual
"""
if self.duration and self.time:
return self.time / self.duration
else:
return None
[documentos]def is_progress(line):
"""
Devuelve True si la línea dada se corresponde a la información sobre el
progreso actual de *FFMPEG*.
Las líneas que no cumplen son por lo tanto información que puede ser
importante para el usuario.
Las líneas que tienen información del progreso actual se ven así::
size= 953kB time=00:01:21.26 bitrate= 96.1kbits/s speed=23.2x
Returns:
bool: True si la línea se corresponde a la información sobre el progreso
actual de *FFMPEG*.
"""
if re.search(r"size=.*time=.*bitrate=.*speed=.*", line):
return True
else:
return False