Skip to content

Commit ac38342

Browse files
committed
Change: move progress bar to main thread
1 parent 78f5483 commit ac38342

File tree

4 files changed

+52
-15
lines changed

4 files changed

+52
-15
lines changed

comiccrawler/channel.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
download_ch = Channel()
66
mission_ch = Channel()
77
message_ch = Channel()
8+
request_ch = Channel()

comiccrawler/grabber.py

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#! python3
22

3+
from collections import namedtuple
34
from contextlib import contextmanager
45
from pathlib import Path
56
from threading import Lock
@@ -9,7 +10,6 @@
910
import time
1011
import json
1112

12-
import enlighten
1313
from worker import async_, await_, sleep, Defer
1414
# from urllib3.util import is_fp_closed
1515
from urllib3.exceptions import IncompleteRead
@@ -20,11 +20,11 @@
2020
from .profile import get as profile
2121
from .session_manager import session_manager
2222
from .filename_ext import get_ext
23+
from .channel import request_ch
2324

2425
cooldown = {}
2526
grabber_pool = {}
2627
grabber_pool_lock = Lock()
27-
pb_manager = enlighten.get_manager()
2828

2929
@contextmanager
3030
def get_request_lock(url):
@@ -74,6 +74,8 @@ def grabber_log(obj):
7474
content = time.strftime("%Y-%m-%dT%H:%M:%S%z") + "\n" + json.dumps(obj, indent=2, sort_keys=True) + "\n\n"
7575
content_write(profile("grabber.log"), content, append=True)
7676

77+
inc_request_id = 1
78+
7779
def grabber(url, *, referer=None, retry=False, done=None, proxy=None, **kwargs):
7880
"""Request url, return text or bytes of the content."""
7981
s = session_manager.get(url)
@@ -91,6 +93,10 @@ def grabber(url, *, referer=None, retry=False, done=None, proxy=None, **kwargs):
9193
if done:
9294
done(s, r)
9395

96+
global inc_request_id
97+
r.request_id = inc_request_id
98+
inc_request_id += 1
99+
94100
return r
95101

96102
RETRYABLE_HTTP_CODES = (423, 429, 503)
@@ -149,6 +155,8 @@ def iter_content(r):
149155
"""Iterate the content of the response."""
150156
yield from r.iter_content()
151157

158+
RequestProgress = namedtuple("RequestProgress", "id loaded total hostname", defaults=(None, None, None))
159+
152160
def grabimg(*args, on_opened=None, tempfile=None, headers=None, **kwargs):
153161
"""Grab the image. Return ImgResult"""
154162
kwargs["stream"] = True
@@ -192,23 +200,23 @@ def grabimg(*args, on_opened=None, tempfile=None, headers=None, **kwargs):
192200
def _():
193201
nonlocal loaded
194202
u = urlparse(r.url)
195-
with pb_manager.counter(total=total, unit="b", leave=False, desc=u.hostname) as counter:
196-
counter.update(loaded)
197-
if tempfile:
198-
Path(tempfile).parent.mkdir(parents=True, exist_ok=True)
199-
mode = "ab" if loaded else "wb"
200-
with open(tempfile, mode=mode) as f:
201-
for chunk in iter_content(r):
202-
f.write(chunk)
203-
counter.update(len(chunk))
204-
loaded += len(chunk)
205-
else:
203+
request_ch.pub("REQUEST_START", data=RequestProgress(id=r.request_id, loaded=loaded, total=total, hostname=u.hostname))
204+
if tempfile:
205+
Path(tempfile).parent.mkdir(parents=True, exist_ok=True)
206+
mode = "ab" if loaded else "wb"
207+
with open(tempfile, mode=mode) as f:
206208
for chunk in iter_content(r):
207-
content_list.append(chunk)
208-
counter.update(len(chunk))
209+
f.write(chunk)
209210
loaded += len(chunk)
211+
request_ch.pub("REQUEST_PROGRESS", data=RequestProgress(id=r.request_id, loaded=loaded))
212+
else:
213+
for chunk in iter_content(r):
214+
content_list.append(chunk)
215+
loaded += len(chunk)
216+
request_ch.pub("REQUEST_PROGRESS", data=RequestProgress(id=r.request_id, loaded=loaded))
210217
finally:
211218
# FIXME: is it safe to always close the connection?
219+
request_ch.pub("REQUEST_END", data=RequestProgress(id=r.request_id))
212220
r.close()
213221
if total and loaded < total:
214222
raise IncompleteRead(loaded, total - loaded)

comiccrawler/gui/cli_progress.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import enlighten
2+
from worker import listen
3+
4+
from ..channel import request_ch
5+
6+
class CLIProgress:
7+
def __init__(self):
8+
self.pb_manager = enlighten.get_manager()
9+
self.pb: dict[int, enlighten.Counter] = {}
10+
request_ch.sub()
11+
12+
@listen("REQUEST_START")
13+
def on_request_start(event):
14+
self.pb[event.data.id] = self.pb_manager.counter(total=event.data.total, desc=event.data.hostname, unit="B", leave=False)
15+
self.pb[event.data.id].update(event.data.loaded - self.pb[event.data.id].count)
16+
17+
@listen("REQUEST_PROGRESS")
18+
def on_request_progress(event):
19+
self.pb[event.data.id].update(event.data.loaded - self.pb[event.data.id].count)
20+
21+
@listen("REQUEST_END")
22+
def on_request_end(event):
23+
self.pb[event.data.id].close()
24+
del self.pb[event.data.id]
25+

comiccrawler/gui/main_window.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from .dialog import Dialog
3030
from .core import get_scale, safe_tk, STATE
3131
from .select_episodes import select_episodes
32+
from .cli_progress import CLIProgress
3233

3334
def reselect_episodes(root, mission):
3435
with load_episodes(mission):
@@ -510,6 +511,8 @@ def __init__(self):
510511

511512
self.update_table(mission_manager.view)
512513
self.update_table(mission_manager.library)
514+
515+
self.cli_progress = CLIProgress()
513516

514517
self.save()
515518
self.loop.start()

0 commit comments

Comments
 (0)