From e7003e354fdfbab98d635dd15c3f52c3d1f52460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 6 Jan 2024 03:11:23 +0200 Subject: [PATCH 1/6] Pass total to Syncing show ratings progressbar --- plextraktsync/plan/Walker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plextraktsync/plan/Walker.py b/plextraktsync/plan/Walker.py index ef10e4eddc..9102078f1e 100644 --- a/plextraktsync/plan/Walker.py +++ b/plextraktsync/plan/Walker.py @@ -109,7 +109,7 @@ def find_episodes(self): def walk_shows(self, shows: set[Media], title="Processing Shows"): if not shows: return - yield from self.progressbar(shows, desc=title) + yield from self.progressbar(shows, desc=title, total=len(shows)) def get_plex_episodes(self, episodes: list[Episode]) -> Generator[Media, Any, None]: it = self.progressbar(episodes, desc="Processing episodes") From 9a0677c979b4a3a592f98af3fe5a29b4bc00220f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 6 Jan 2024 02:03:35 +0200 Subject: [PATCH 2/6] Add ProgressBar class --- plextraktsync/rich/RichProgressBar.py | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 plextraktsync/rich/RichProgressBar.py diff --git a/plextraktsync/rich/RichProgressBar.py b/plextraktsync/rich/RichProgressBar.py new file mode 100644 index 0000000000..3a79ce1307 --- /dev/null +++ b/plextraktsync/rich/RichProgressBar.py @@ -0,0 +1,32 @@ +from functools import cached_property + + +class RichProgressBar: + def __init__(self, iterable, total, options=None, desc=""): + self.iter = iterable + self.options = options or {} + self.desc = desc + self.total = total + + def __iter__(self): + p = self.progress + task_id = p.add_task(self.desc, total=self.total) + + i = 0 + for it in self.iter: + yield it + i += 1 + p.update(task_id, completed=i) + + def __enter__(self): + self.progress.__enter__() + return self + + def __exit__(self, *exc): + self.progress.__exit__(*exc) + + @cached_property + def progress(self): + from rich.progress import Progress + + return Progress(**self.options) From 0ee1b23a57d1c64734bbfa1e0470dae1adad8edd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 6 Jan 2024 02:09:01 +0200 Subject: [PATCH 3/6] Create Progress the way tqdm.rich made it --- plextraktsync/rich/RichProgressBar.py | 31 ++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/plextraktsync/rich/RichProgressBar.py b/plextraktsync/rich/RichProgressBar.py index 3a79ce1307..991eab38b6 100644 --- a/plextraktsync/rich/RichProgressBar.py +++ b/plextraktsync/rich/RichProgressBar.py @@ -27,6 +27,31 @@ def __exit__(self, *exc): @cached_property def progress(self): - from rich.progress import Progress - - return Progress(**self.options) + from tqdm.rich import FractionColumn, RateColumn + + from rich.progress import (BarColumn, Progress, TimeElapsedColumn, + TimeRemainingColumn) + + args = ( + "[progress.description]{task.description}" + "[progress.percentage]{task.percentage:>4.0f}%", + BarColumn(bar_width=None), + FractionColumn( + unit_scale=False, + unit_divisor=1000, + ), + "[", + TimeElapsedColumn(), + "<", + TimeRemainingColumn(), + ",", + RateColumn( + unit="it", + unit_scale=False, + unit_divisor=1000, + ), + "]" + ) + progress = Progress(*args, **self.options) + + return progress From e50d7aec9db7c8114f2916ee4232ee64d36eb165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 6 Jan 2024 02:10:31 +0200 Subject: [PATCH 4/6] Use RichProgressBar for progressbar --- plextraktsync/util/Factory.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/plextraktsync/util/Factory.py b/plextraktsync/util/Factory.py index bec84bd970..4a4add0c15 100644 --- a/plextraktsync/util/Factory.py +++ b/plextraktsync/util/Factory.py @@ -140,23 +140,11 @@ def progressbar(self): if not self.run_config.progressbar: return None - import warnings from functools import partial - from tqdm import TqdmExperimentalWarning - from tqdm.rich import tqdm + from plextraktsync.rich.RichProgressBar import RichProgressBar - warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) - - # Monkeypatch https://github.com/tqdm/tqdm/pull/1395 - class Tqdm(tqdm): - def close(self): - if self.disable: - return - self.display() - super().close() - - return partial(Tqdm, options={'console': self.console}) + return partial(RichProgressBar, options={'console': self.console}) @cached_property def run_config(self): From 7454cc1facfe5303baabe50d64a4f6273d8323a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 6 Jan 2024 03:50:19 +0200 Subject: [PATCH 5/6] Refactor RichProgressBar to use __next__ --- plextraktsync/rich/RichProgressBar.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/plextraktsync/rich/RichProgressBar.py b/plextraktsync/rich/RichProgressBar.py index 991eab38b6..861fa5780f 100644 --- a/plextraktsync/rich/RichProgressBar.py +++ b/plextraktsync/rich/RichProgressBar.py @@ -7,16 +7,15 @@ def __init__(self, iterable, total, options=None, desc=""): self.options = options or {} self.desc = desc self.total = total + self.i = 0 def __iter__(self): - p = self.progress - task_id = p.add_task(self.desc, total=self.total) + return self - i = 0 - for it in self.iter: - yield it - i += 1 - p.update(task_id, completed=i) + def __next__(self): + res = self.iter.__next__() + self.update() + return res def __enter__(self): self.progress.__enter__() @@ -25,6 +24,14 @@ def __enter__(self): def __exit__(self, *exc): self.progress.__exit__(*exc) + def update(self): + self.i += 1 + self.progress.update(self.task_id, completed=self.i) + + @cached_property + def task_id(self): + return self.progress.add_task(self.desc, total=self.total) + @cached_property def progress(self): from tqdm.rich import FractionColumn, RateColumn From 12a036da27fccd3657a9cb82a2be00ad98f44d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 6 Jan 2024 04:22:07 +0200 Subject: [PATCH 6/6] Always create iterable object --- plextraktsync/rich/RichProgressBar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plextraktsync/rich/RichProgressBar.py b/plextraktsync/rich/RichProgressBar.py index 861fa5780f..077ea12b95 100644 --- a/plextraktsync/rich/RichProgressBar.py +++ b/plextraktsync/rich/RichProgressBar.py @@ -3,7 +3,7 @@ class RichProgressBar: def __init__(self, iterable, total, options=None, desc=""): - self.iter = iterable + self.iter = iter(iterable) self.options = options or {} self.desc = desc self.total = total