|
|
@ -233,7 +233,7 @@ index 3e5f3b7..8eeaeda 100644
|
|
|
|
return (fb,lb)
|
|
|
|
return (fb,lb)
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/urlgrabber/grabber.py b/urlgrabber/grabber.py
|
|
|
|
diff --git a/urlgrabber/grabber.py b/urlgrabber/grabber.py
|
|
|
|
index e090e90..83823ea 100644
|
|
|
|
index e090e90..bdcdfe3 100644
|
|
|
|
--- a/urlgrabber/grabber.py
|
|
|
|
--- a/urlgrabber/grabber.py
|
|
|
|
+++ b/urlgrabber/grabber.py
|
|
|
|
+++ b/urlgrabber/grabber.py
|
|
|
|
@@ -49,7 +49,7 @@ GENERAL ARGUMENTS (kwargs)
|
|
|
|
@@ -49,7 +49,7 @@ GENERAL ARGUMENTS (kwargs)
|
|
|
@ -1185,7 +1185,7 @@ index e090e90..83823ea 100644
|
|
|
|
|
|
|
|
|
|
|
|
#####################################################################
|
|
|
|
#####################################################################
|
|
|
|
# DEPRECATED FUNCTIONS
|
|
|
|
# DEPRECATED FUNCTIONS
|
|
|
|
@@ -1621,6 +1908,442 @@ def retrygrab(url, filename=None, copy_local=0, close_connection=0,
|
|
|
|
@@ -1621,6 +1908,445 @@ def retrygrab(url, filename=None, copy_local=0, close_connection=0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#####################################################################
|
|
|
|
#####################################################################
|
|
|
@ -1368,6 +1368,9 @@ index e090e90..83823ea 100644
|
|
|
|
+ def perform(self):
|
|
|
|
+ def perform(self):
|
|
|
|
+ ret = []
|
|
|
|
+ ret = []
|
|
|
|
+ for fd, event in self.epoll.poll():
|
|
|
|
+ for fd, event in self.epoll.poll():
|
|
|
|
|
|
|
|
+ if event & select.EPOLLHUP:
|
|
|
|
|
|
|
|
+ if DEBUG: DEBUG.info('downloader died')
|
|
|
|
|
|
|
|
+ raise KeyboardInterrupt
|
|
|
|
+ assert event & select.EPOLLIN
|
|
|
|
+ assert event & select.EPOLLIN
|
|
|
|
+ done = self.running[fd].perform()
|
|
|
|
+ done = self.running[fd].perform()
|
|
|
|
+ if not done: continue
|
|
|
|
+ if not done: continue
|
|
|
@ -1560,7 +1563,7 @@ index e090e90..83823ea 100644
|
|
|
|
+ if filename and _TH.dirty is None:
|
|
|
|
+ if filename and _TH.dirty is None:
|
|
|
|
+ try:
|
|
|
|
+ try:
|
|
|
|
+ for line in open(filename):
|
|
|
|
+ for line in open(filename):
|
|
|
|
+ host, speed, fail, ts = line.split(' ', 3)
|
|
|
|
+ host, speed, fail, ts = line.rsplit(' ', 3)
|
|
|
|
+ _TH.hosts[host] = int(speed), int(fail), int(ts)
|
|
|
|
+ _TH.hosts[host] = int(speed), int(fail), int(ts)
|
|
|
|
+ except IOError: pass
|
|
|
|
+ except IOError: pass
|
|
|
|
+ _TH.dirty = False
|
|
|
|
+ _TH.dirty = False
|
|
|
@ -1707,7 +1710,7 @@ index dad410b..ac78b34 100644
|
|
|
|
def urlopen(self, url, **kwargs):
|
|
|
|
def urlopen(self, url, **kwargs):
|
|
|
|
kw = dict(kwargs)
|
|
|
|
kw = dict(kwargs)
|
|
|
|
diff --git a/urlgrabber/progress.py b/urlgrabber/progress.py
|
|
|
|
diff --git a/urlgrabber/progress.py b/urlgrabber/progress.py
|
|
|
|
index dd07c6a..4c126c5 100644
|
|
|
|
index dd07c6a..5a02707 100644
|
|
|
|
--- a/urlgrabber/progress.py
|
|
|
|
--- a/urlgrabber/progress.py
|
|
|
|
+++ b/urlgrabber/progress.py
|
|
|
|
+++ b/urlgrabber/progress.py
|
|
|
|
@@ -211,6 +211,21 @@ def text_meter_total_size(size, downloaded=0):
|
|
|
|
@@ -211,6 +211,21 @@ def text_meter_total_size(size, downloaded=0):
|
|
|
@ -1796,7 +1799,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
self._do_end(now)
|
|
|
|
self._do_end(now)
|
|
|
|
|
|
|
|
|
|
|
|
def _do_end(self, now):
|
|
|
|
def _do_end(self, now):
|
|
|
|
@@ -466,11 +483,20 @@ class MultiFileMeter:
|
|
|
|
@@ -466,11 +483,21 @@ class MultiFileMeter:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
class TextMultiFileMeter(MultiFileMeter):
|
|
|
@ -1805,6 +1808,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
self.fo = fo
|
|
|
|
self.fo = fo
|
|
|
|
- MultiFileMeter.__init__(self)
|
|
|
|
- MultiFileMeter.__init__(self)
|
|
|
|
+ MultiFileMeter.__init__(self, threaded)
|
|
|
|
+ MultiFileMeter.__init__(self, threaded)
|
|
|
|
|
|
|
|
+ self.index_time = self.index = 0
|
|
|
|
|
|
|
|
|
|
|
|
# files: ###/### ###% data: ######/###### ###% time: ##:##:##/##:##:##
|
|
|
|
# files: ###/### ###% data: ######/###### ###% time: ##:##:##/##:##:##
|
|
|
|
+# New output, like TextMeter output...
|
|
|
|
+# New output, like TextMeter output...
|
|
|
@ -1819,7 +1823,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
def _do_update_meter(self, meter, now):
|
|
|
|
def _do_update_meter(self, meter, now):
|
|
|
|
self._lock.acquire()
|
|
|
|
self._lock.acquire()
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
@@ -480,7 +506,7 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
@@ -480,7 +507,7 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
tf = self.numfiles or 1
|
|
|
|
tf = self.numfiles or 1
|
|
|
|
pf = 100 * float(df)/tf + 0.49
|
|
|
|
pf = 100 * float(df)/tf + 0.49
|
|
|
|
dd = self.re.last_amount_read
|
|
|
|
dd = self.re.last_amount_read
|
|
|
@ -1828,7 +1832,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
pd = 100 * (self.re.fraction_read() or 0) + 0.49
|
|
|
|
pd = 100 * (self.re.fraction_read() or 0) + 0.49
|
|
|
|
dt = self.re.elapsed_time()
|
|
|
|
dt = self.re.elapsed_time()
|
|
|
|
rt = self.re.remaining_time()
|
|
|
|
rt = self.re.remaining_time()
|
|
|
|
@@ -491,9 +517,33 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
@@ -491,9 +518,39 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
ftd = format_number(td) + 'B'
|
|
|
|
ftd = format_number(td) + 'B'
|
|
|
|
fdt = format_time(dt, 1)
|
|
|
|
fdt = format_time(dt, 1)
|
|
|
|
ftt = format_time(tt, 1)
|
|
|
|
ftt = format_time(tt, 1)
|
|
|
@ -1838,9 +1842,15 @@ index dd07c6a..4c126c5 100644
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ frac = self.re.fraction_read() or 0
|
|
|
|
+ frac = self.re.fraction_read() or 0
|
|
|
|
+ ave_dl = format_number(self.re.average_rate())
|
|
|
|
+ ave_dl = format_number(self.re.average_rate())
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+ # cycle through active meters
|
|
|
|
|
|
|
|
+ if now > self.index_time:
|
|
|
|
|
|
|
|
+ self.index_time = now + 1.0
|
|
|
|
|
|
|
|
+ self.index = (self.index + 1) % len(self.meters)
|
|
|
|
|
|
|
|
+ meter = self.meters[self.index]
|
|
|
|
+ text = meter.text or meter.basename
|
|
|
|
+ text = meter.text or meter.basename
|
|
|
|
+ if tf > 1:
|
|
|
|
+ if tf > 1:
|
|
|
|
+ text = '(%u/%u): %s' % (df+1, tf, text)
|
|
|
|
+ text = '(%u/%u): %s' % (df+1+self.index, tf, text)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ # Include text + ui_rate in minimal
|
|
|
|
+ # Include text + ui_rate in minimal
|
|
|
|
+ tl = TerminalLine(8, 8+1+8)
|
|
|
|
+ tl = TerminalLine(8, 8+1+8)
|
|
|
@ -1865,7 +1875,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
self.fo.flush()
|
|
|
|
self.fo.flush()
|
|
|
|
finally:
|
|
|
|
finally:
|
|
|
|
self._lock.release()
|
|
|
|
self._lock.release()
|
|
|
|
@@ -502,18 +552,30 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
@@ -502,18 +559,30 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
self._lock.acquire()
|
|
|
|
self._lock.acquire()
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
format = "%-30.30s %6.6s %8.8s %9.9s"
|
|
|
|
format = "%-30.30s %6.6s %8.8s %9.9s"
|
|
|
@ -1902,7 +1912,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
|
|
|
|
|
|
|
|
def _do_failure_meter(self, meter, message, now):
|
|
|
|
def _do_failure_meter(self, meter, message, now):
|
|
|
|
self._lock.acquire()
|
|
|
|
self._lock.acquire()
|
|
|
|
@@ -536,15 +598,6 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
@@ -536,15 +605,6 @@ class TextMultiFileMeter(MultiFileMeter):
|
|
|
|
pass
|
|
|
|
pass
|
|
|
|
finally:
|
|
|
|
finally:
|
|
|
|
self._lock.release()
|
|
|
|
self._lock.release()
|
|
|
@ -1918,7 +1928,7 @@ index dd07c6a..4c126c5 100644
|
|
|
|
|
|
|
|
|
|
|
|
######################################################################
|
|
|
|
######################################################################
|
|
|
|
# support classes and functions
|
|
|
|
# support classes and functions
|
|
|
|
@@ -658,6 +711,8 @@ def format_time(seconds, use_hours=0):
|
|
|
|
@@ -658,6 +718,8 @@ def format_time(seconds, use_hours=0):
|
|
|
|
if seconds is None or seconds < 0:
|
|
|
|
if seconds is None or seconds < 0:
|
|
|
|
if use_hours: return '--:--:--'
|
|
|
|
if use_hours: return '--:--:--'
|
|
|
|
else: return '--:--'
|
|
|
|
else: return '--:--'
|
|
|
|