Files
PythonInUnreal/tools/progress_display.py
T
2026-10-31 17:03:41 +01:00

64 lines
2.3 KiB
Python

"""Concise console progress; does not depend on Unreal or its log format."""
import json
from pathlib import Path
import time
class ProgressDisplay:
LABELS = {
"starting": "Uruchamianie UE...",
"preparing": "Przygotowywanie sceny i sekwencji...",
"preparing_render": "Przygotowywanie renderu...",
"rendering": "Renderowanie...",
"encoding": "Render zakonczony. Skladanie MP4...",
"closing": "Zamykanie UE...",
}
def __init__(self, events, clock=time.monotonic, emit=print):
self.events = Path(events)
self.clock, self.emit = clock, emit
self.started = self.last_print = clock()
self.position = 0
self.pending = b""
self.state = "starting"
self.details = {}
self.last_count = -1
self.show(self.LABELS[self.state])
def show(self, message):
seconds = int(self.clock() - self.started)
self.emit(f"[{seconds // 60:02d}:{seconds % 60:02d}] {message}", flush=True)
self.last_print = self.clock()
def update(self):
try:
with self.events.open("rb") as stream:
stream.seek(self.position)
self.pending += stream.read()
self.position = stream.tell()
except FileNotFoundError:
pass
while b"\n" in self.pending:
line, self.pending = self.pending.split(b"\n", 1)
try:
event = json.loads(line)
except (ValueError, UnicodeError):
continue
state = event.get("state")
if state in self.LABELS:
self.state, self.details = state, event
self.last_count = -1
self.show(self.LABELS[state])
elapsed = self.clock() - self.last_print
if self.state == "rendering" and elapsed >= 2:
output = self.details.get("output")
total = self.details.get("frames")
if output and total:
count = len(list((Path(output) / "frames").glob("frame_*.png")))
if count != self.last_count and count > 0:
self.last_count = count
self.show(f"Renderowanie: {count}/{total} klatek zapisanych.")
return
if elapsed >= 10:
self.show(self.LABELS[self.state] + " Nadal pracuje.")