Skip to content

Commit 8364768

Browse files
committed
progress bar refactored to a class
1 parent 7a064a8 commit 8364768

File tree

2 files changed

+49
-22
lines changed

2 files changed

+49
-22
lines changed

bdfr/downloader.py

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,14 @@
1414
import praw.exceptions
1515
import praw.models
1616
import prawcore
17-
from tqdm import tqdm
18-
from tqdm.contrib.logging import logging_redirect_tqdm
1917

2018
from bdfr import exceptions as errors
2119
from bdfr.configuration import Configuration
2220
from bdfr.connector import RedditConnector
21+
from bdfr.progress_bar import Progress
2322
from bdfr.site_downloaders.download_factory import DownloadFactory
2423

2524
logger = logging.getLogger(__name__)
26-
logger_progress_bar = logging.getLogger("progress_bar")
2725

2826

2927
def _calc_hash(existing_file: Path):
@@ -45,28 +43,16 @@ def __init__(self, args: Configuration):
4543
self.master_hash_list = self.scan_existing_files(self.download_directory)
4644

4745
def download(self):
48-
if self.args.progress_bar:
49-
with logging_redirect_tqdm():
50-
for generator in tqdm(self.reddit_lists, desc="Subreddits", unit="subreddit", colour="red"):
51-
desc = generator.url if isinstance(generator, praw.models.ListingGenerator) else "Posts"
52-
for submission in tqdm(list(generator), desc=desc, unit="post", colour="green", leave=False):
53-
title_short = submission.title[:60] + (submission.title[60:] and "...")
54-
log_str = f"{submission.score:5d}🔼 {title_short}"
55-
try:
56-
if self._download_submission(submission):
57-
logger_progress_bar.info(f"✅ {log_str}")
58-
else:
59-
logger_progress_bar.info(f"❌ {log_str}")
60-
except prawcore.PrawcoreException as e:
61-
logger.error(f"Submission {submission.id} failed to download due to a PRAW exception: {e}")
62-
logger_progress_bar.info(f"❌ {log_str}")
63-
else:
64-
for generator in self.reddit_lists:
65-
for submission in generator:
46+
progress = Progress(self.args.progress_bar)
47+
with progress.context():
48+
for generator in progress.wrap_subreddit_iter(self.reddit_lists):
49+
for submission in progress.wrap_post_iter(generator):
6650
try:
67-
self._download_submission(submission)
51+
status = self._download_submission(submission)
52+
progress.post_log(submission, status)
6853
except prawcore.PrawcoreException as e:
6954
logger.error(f"Submission {submission.id} failed to download due to a PRAW exception: {e}")
55+
progress.post_log(submission, False)
7056

7157
def _download_submission(self, submission: praw.models.Submission):
7258
if submission.id in self.excluded_submission_ids:

bdfr/progress_bar.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import logging
2+
from contextlib import nullcontext
3+
4+
from tqdm import tqdm
5+
from tqdm.contrib.logging import logging_redirect_tqdm
6+
7+
logger_progress_bar = logging.getLogger("progress_bar")
8+
9+
10+
class Progress:
11+
def __init__(self, progress_bar: bool):
12+
self.progress_bar = progress_bar
13+
14+
def context(self):
15+
if self.progress_bar:
16+
return logging_redirect_tqdm()
17+
else:
18+
return nullcontext()
19+
20+
def wrap_subreddit_iter(self, iterator):
21+
if self.progress_bar:
22+
return tqdm(iterator, desc="Subreddits", unit="subreddit", colour="red")
23+
else:
24+
return iterator
25+
26+
def wrap_post_iter(self, generator):
27+
if self.progress_bar:
28+
try:
29+
desc = generator.url
30+
except:
31+
desc = "Posts"
32+
return tqdm(list(generator), desc=desc, unit="post", colour="green", leave=False)
33+
else:
34+
return generator
35+
36+
def post_log(self, submission, success: bool):
37+
if self.progress_bar:
38+
title_short = submission.title[:60] + (submission.title[60:] and "...")
39+
log_str = f"{submission.score:5d}🔼 {title_short}"
40+
icon = "✅" if success else "❌"
41+
logger_progress_bar.info(f"{icon} {log_str}")

0 commit comments

Comments
 (0)