Den ffmpeg Befehl für Subtitle angepasst und im Javascript ebenfalls eine Fehlerbehandlung eingesetzt
90 lines
No EOL
2.7 KiB
Python
90 lines
No EOL
2.7 KiB
Python
import os
|
|
import re
|
|
from datetime import datetime
|
|
|
|
|
|
class Video:
|
|
def __init__(self, path):
|
|
self.id = id(self)
|
|
self.source_file = path
|
|
self.output_file = f"{path.rsplit(".", 1)[0]}.webm"
|
|
self.frame = 0
|
|
self.fps = 0
|
|
self.q = 0
|
|
self.size = 0
|
|
self.time = 0
|
|
self.bitrate = 0
|
|
self.speed = 0
|
|
self.finished = 0
|
|
self.progress = None
|
|
self.duration = 1
|
|
self.loading = 0
|
|
self.error = []
|
|
|
|
def to_dict(self):
|
|
self.calc_loading()
|
|
|
|
return {
|
|
"source": os.path.basename(self.source_file),
|
|
"target": os.path.basename(self.output_file),
|
|
"path": os.path.dirname(self.source_file),
|
|
"id": self.id,
|
|
"frame": self.frame,
|
|
"fps": self.fps,
|
|
"q": self.q,
|
|
"size": self.size,
|
|
"time": self.time,
|
|
"bitrate": self.bitrate,
|
|
"speed": self.speed,
|
|
"finished": self.finished,
|
|
"duration": self.duration,
|
|
"loading": self.loading
|
|
}
|
|
|
|
def extract_convert_data(self, line_decoded):
|
|
frame = re.findall(r"frame=\s*(\d+)", line_decoded)
|
|
self.frame = frame[0] if frame else 0
|
|
|
|
fps = re.findall(r"fps=\s*(\d+.\d+)", line_decoded)
|
|
self.fps = fps[0] if fps else 0
|
|
|
|
q = re.findall(r"q=\s*(\d+.\d+)", line_decoded)
|
|
self.q = q[0] if q else 0
|
|
|
|
size = re.findall(r"size=\s*(\d+)", line_decoded)
|
|
self.size = self.convert_kb_mb(size[0]) if size else 0
|
|
|
|
time = re.findall(r"time=\s*(\d+:\d+:\d+)", line_decoded)
|
|
time_v = time[0] if time else ""
|
|
self.time = self.time_in_sec(time_v)
|
|
|
|
bitrate = re.findall(r"bitrate=\s*(\d+)", line_decoded)
|
|
self.bitrate = self.convert_kb_mb(bitrate[0]) if bitrate else 0
|
|
|
|
speed = re.findall(r"speed=\s*(\d+\.\d+)", line_decoded)
|
|
self.speed = speed[0] if speed else 0
|
|
|
|
@staticmethod
|
|
def is_time_format(s):
|
|
return bool(re.fullmatch(r"\d{2}:\d{2}:\d{2}(\.\d{1,2})?", s))
|
|
|
|
def time_in_sec(self, time_str):
|
|
if self.is_time_format(time_str):
|
|
try:
|
|
t = datetime.strptime(time_str, "%H:%M:%S.%f")
|
|
return t.hour * 3600 + t.minute * 3600 + t.second + t.microsecond / 1_000_000
|
|
except ValueError:
|
|
return None
|
|
|
|
def calc_loading(self):
|
|
if self.duration != 0:
|
|
self.loading = round(self.time / self.duration * 100, None)
|
|
else:
|
|
self.loading = 0
|
|
|
|
@staticmethod
|
|
def convert_kb_mb(digits):
|
|
if digits.isdigit():
|
|
return round(int(digits) / 1024, 2)
|
|
else:
|
|
return 0 |