aboutsummaryrefslogtreecommitdiff
path: root/lib/project/src/voiceforge/progress.py
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-09-07 06:47:47 -0400
committerhistoria <historiavg@proton.me>2026-09-07 06:47:47 -0400
commit84dd2d068317998f6fb59400c534ef5be6b51b53 (patch)
tree025293e9d9229e02960374771ae522d9de2628ce /lib/project/src/voiceforge/progress.py
parent39b0f2bbed74f6487a41b82501ae3c6799e4b5c4 (diff)
downloadproducer-main.tar.gz
slop rewriteHEADmain
Diffstat (limited to 'lib/project/src/voiceforge/progress.py')
-rw-r--r--lib/project/src/voiceforge/progress.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/project/src/voiceforge/progress.py b/lib/project/src/voiceforge/progress.py
new file mode 100644
index 0000000..a8c5476
--- /dev/null
+++ b/lib/project/src/voiceforge/progress.py
@@ -0,0 +1,40 @@
+"""A refresh thread keeps elapsed time moving even during native processing."""
+import time
+
+from rich.console import Console
+from rich.progress import (BarColumn, Progress, SpinnerColumn, TaskProgressColumn,
+ TextColumn, TimeElapsedColumn, TimeRemainingColumn)
+
+
+class Display:
+ def __init__(self):
+ self.console = Console(stderr=True)
+ self.progress = Progress(SpinnerColumn(), TextColumn("{task.description}"),
+ BarColumn(), TaskProgressColumn(), TimeElapsedColumn(),
+ TimeRemainingColumn(), console=self.console,
+ refresh_per_second=5, disable=not self.console.is_terminal)
+ self.task = None
+ self.stage = ""
+ self.started = time.monotonic()
+ self.last_print = 0.0
+
+ def __enter__(self):
+ self.progress.start()
+ return self
+
+ def __exit__(self, *args):
+ self.progress.stop()
+
+ def update(self, stage, completed=None, total=None):
+ changed = stage != self.stage
+ if changed:
+ if self.task is not None:
+ self.progress.remove_task(self.task)
+ self.task = self.progress.add_task(stage, total=total)
+ self.stage = stage
+ self.progress.update(self.task, completed=completed if total else 0, total=total)
+ now = time.monotonic()
+ if not self.console.is_terminal and (changed or now - self.last_print >= 5):
+ fraction = f" {min(100, 100 * (completed or 0) / total):.0f}%" if total else ""
+ self.console.print(f"[{now - self.started:7.1f}s] {stage}{fraction}", markup=False)
+ self.last_print = now