From 3c18dd7e1816e1390f3cedceee9c24b188e9347a Mon Sep 17 00:00:00 2001 From: data Date: Mon, 7 Apr 2025 21:33:51 +0200 Subject: [PATCH] File Statistik eingebaut, Log Rotation --- app/class_file_convert.py | 3 +++ app/class_file_convert_read_out.py | 3 +-- app/class_media_file.py | 30 ++++++++++++++++++++++++++++++ app/class_media_file_stat.py | 26 ++++++++++++++++++++++++++ app/main_server.py | 20 ++++++++++++-------- 5 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 app/class_media_file_stat.py diff --git a/app/class_file_convert.py b/app/class_file_convert.py index daa376f..339d282 100644 --- a/app/class_file_convert.py +++ b/app/class_file_convert.py @@ -2,6 +2,7 @@ import logging import asyncio import time from app.class_file_convert_read_out import Process +from app.class_media_file_stat import Stat class Convert: def __init__(self, websocket, cfg, obj_path): @@ -40,6 +41,7 @@ class Convert: """Startet die Videokonvertierung asynchron.""" obj_process = Process(self.obj_websocket) + obj_stat = Stat(obj) obj.convert_start = time.time() command = self.convert_cmd(obj) @@ -79,6 +81,7 @@ class Convert: self.active_process.discard(obj) self.active_tasks.discard(obj) self.obj_path.save_paths() + obj_stat.save_stat() obj.convert_end = time.time() diff --git a/app/class_file_convert_read_out.py b/app/class_file_convert_read_out.py index 0bfbf97..dac98eb 100644 --- a/app/class_file_convert_read_out.py +++ b/app/class_file_convert_read_out.py @@ -31,8 +31,7 @@ class Process: self.process_line_extract(obj, line_decoded) - # in json umwandeln - #await self.obj_websocket.send_websocket(self.to_dict()) + await self.obj_websocket.send_websocket(self.to_dict()) if self.line_empty > 30: break diff --git a/app/class_media_file.py b/app/class_media_file.py index 48dd70e..e9c423e 100644 --- a/app/class_media_file.py +++ b/app/class_media_file.py @@ -82,6 +82,36 @@ class Media: def to_dict(): return "Fertig mit der Welt" + def to_dict_stat(self): + return {self.id: { + # source + "source_file": self.source_file, + "source_duration": self.source_duration, + "source_size": self.source_size, + "source_frame_rate": self.source_frame_rate, + "source_frames_total": self.source_frames_total, + "source_time": self.source_time, + + # target + "target_file": self.target_file, + "target_size": self.target_size, + + # process + "status": self.status, + "process_start": self.process_start, + "process_end": self.process_end, + "process_time": self.process_time, + "process_size": self.process_size, + "process_frames": self.process_frames, + "process_time_remaining": self.process_time_remaining, + + # statistic + "stat_fps": self.stat_fps, + "stat_bitrate": self.stat_bitrate, + "stat_quantizer": self.stat_quantizer, + "stat_speed": self.stat_speed + }} + @staticmethod def frame_rate(video_streams): var_frame_rate = video_streams[0].get("r_frame_rate", "0/0").split("/") diff --git a/app/class_media_file_stat.py b/app/class_media_file_stat.py new file mode 100644 index 0000000..cd71d11 --- /dev/null +++ b/app/class_media_file_stat.py @@ -0,0 +1,26 @@ +import yaml +import os + +class Stat: + def __init__(self, obj): + self.obj = obj + + def save_stat(self): + pfad = "app/cfg/statistic.yaml" + + # Bestehende Daten laden + if os.path.exists(pfad): + with open(pfad, "r", encoding="utf8") as file: + daten = yaml.safe_load(file) or {} + else: + daten = {} + + # Videosammlung initialisieren, falls nötig + daten.setdefault("videos", {}) + + # Neuen Eintrag hinzufügen + daten["videos"].update(self.obj.to_dict_stat()) + + # Datei mit aktualisierten Daten speichern + with open(pfad, "w", encoding="utf8") as file: + yaml.dump(daten, file, default_flow_style=False, indent=4, allow_unicode=True) \ No newline at end of file diff --git a/app/main_server.py b/app/main_server.py index e6f6827..ac71f9f 100644 --- a/app/main_server.py +++ b/app/main_server.py @@ -1,9 +1,9 @@ -import asyncio - import websockets import json import logging +from websockets import InvalidUpgrade, ConnectionClosed, ConnectionClosedError + from app.class_settings import Settings from app.class_file_path import Path from app.class_file_convert import Convert @@ -12,6 +12,7 @@ var_convert_active = False class Server: def __init__(self): + self.websocket_send = 0 self.websocket = None obj_settings = Settings() obj_settings.set_logging() @@ -22,9 +23,14 @@ class Server: async def send_websocket(self, message): try: - await self.websocket.send(message) + await self.websocket.send(json.dumps(message)) except websockets.exceptions.ConnectionClosed: - logging.warning("No websocket client connected!") + if self.websocket_send == 0: + logging.warning("No websocket client connected!") + self.websocket_send += 1 + + if self.websocket_send == 100: + self.websocket_send = 0 async def handle_client(self, websocket): self.websocket = websocket @@ -51,11 +57,9 @@ class Server: #response = f"Server antwortet: {message.upper()}" #await websocket.send(response) - except websockets.exceptions.ConnectionClosedError: + except (ConnectionClosedError, InvalidUpgrade): pass - except websockets.exceptions.InvalidUpgrade: - pass - except websockets.exceptions.ConnectionClosed: + except ConnectionClosed: print("Server sagt: Client getrennt") @staticmethod