summaryrefslogtreecommitdiffstats
path: root/gallery_dl/downloader
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-10-05 23:30:05 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2021-10-05 23:30:05 -0400
commit34ba2951b8c523713425c98addb9256ea05c946f (patch)
tree6ec7e96d0c6e6f6e94b6b97ecd8c0a414ceef93d /gallery_dl/downloader
parent3f5483df9075ae526f4c54f4cbe80edeabf6d4cc (diff)
New upstream version 1.19.0.upstream/1.19.0
Diffstat (limited to 'gallery_dl/downloader')
-rw-r--r--gallery_dl/downloader/http.py46
-rw-r--r--gallery_dl/downloader/ytdl.py18
2 files changed, 49 insertions, 15 deletions
diff --git a/gallery_dl/downloader/http.py b/gallery_dl/downloader/http.py
index 78d8d34..d2efd3f 100644
--- a/gallery_dl/downloader/http.py
+++ b/gallery_dl/downloader/http.py
@@ -31,6 +31,7 @@ class HttpDownloader(DownloaderBase):
self.downloading = False
self.adjust_extension = self.config("adjust-extensions", True)
+ self.progress = self.config("progress", 3.0)
self.headers = self.config("headers")
self.minsize = self.config("filesize-min")
self.maxsize = self.config("filesize-max")
@@ -63,6 +64,8 @@ class HttpDownloader(DownloaderBase):
self.receive = self._receive_rate
else:
self.log.warning("Invalid rate limit (%r)", self.rate)
+ if self.progress is not None:
+ self.receive = self._receive_rate
def download(self, url, pathfmt):
try:
@@ -202,6 +205,7 @@ class HttpDownloader(DownloaderBase):
with pathfmt.open(mode) as fp:
if file_header:
fp.write(file_header)
+ offset += len(file_header)
elif offset:
if adjust_extension and \
pathfmt.extension in FILE_SIGNATURES:
@@ -210,7 +214,7 @@ class HttpDownloader(DownloaderBase):
self.out.start(pathfmt.path)
try:
- self.receive(fp, content)
+ self.receive(fp, content, size, offset)
except (RequestException, SSLError, OpenSSLError) as exc:
msg = str(exc)
print()
@@ -234,28 +238,42 @@ class HttpDownloader(DownloaderBase):
return True
@staticmethod
- def receive(fp, content):
+ def receive(fp, content, bytes_total, bytes_downloaded):
write = fp.write
for data in content:
write(data)
- def _receive_rate(self, fp, content):
- rt = self.rate
- t1 = time.time()
+ def _receive_rate(self, fp, content, bytes_total, bytes_downloaded):
+ rate = self.rate
+ progress = self.progress
+ bytes_start = bytes_downloaded
+ write = fp.write
+ t1 = tstart = time.time()
for data in content:
- fp.write(data)
+ write(data)
t2 = time.time() # current time
- actual = t2 - t1 # actual elapsed time
- expected = len(data) / rt # expected elapsed time
+ elapsed = t2 - t1 # elapsed time
+ num_bytes = len(data)
+
+ if progress is not None:
+ bytes_downloaded += num_bytes
+ tdiff = t2 - tstart
+ if tdiff >= progress:
+ self.out.progress(
+ bytes_total, bytes_downloaded,
+ int((bytes_downloaded - bytes_start) / tdiff),
+ )
- if actual < expected:
- # sleep if less time elapsed than expected
- time.sleep(expected - actual)
- t1 = time.time()
- else:
- t1 = t2
+ if rate:
+ expected = num_bytes / rate # expected elapsed time
+ if elapsed < expected:
+ # sleep if less time elapsed than expected
+ time.sleep(expected - elapsed)
+ t2 = time.time()
+
+ t1 = t2
def _find_extension(self, response):
"""Get filename extension from MIME type"""
diff --git a/gallery_dl/downloader/ytdl.py b/gallery_dl/downloader/ytdl.py
index b1e1d58..86e247b 100644
--- a/gallery_dl/downloader/ytdl.py
+++ b/gallery_dl/downloader/ytdl.py
@@ -42,6 +42,10 @@ class YoutubeDLDownloader(DownloaderBase):
if raw_options:
options.update(raw_options)
+ self.progress = self.config("progress", 3.0)
+ if self.progress is not None:
+ options["progress_hooks"] = (self._progress_hook,)
+
if self.config("logging", True):
options["logger"] = self.log
self.forward_cookies = self.config("forward-cookies", False)
@@ -56,7 +60,10 @@ class YoutubeDLDownloader(DownloaderBase):
kwdict = pathfmt.kwdict
ytdl = kwdict.pop("_ytdl_instance", None)
- if not ytdl:
+ if ytdl:
+ if self.progress is not None and not ytdl._progress_hooks:
+ ytdl.add_progress_hook(self._progress_hook)
+ else:
ytdl = self.ytdl
if self.forward_cookies:
set_cookie = ytdl.cookiejar.set_cookie
@@ -126,6 +133,15 @@ class YoutubeDLDownloader(DownloaderBase):
ytdl.process_info(entry)
return True
+ def _progress_hook(self, info):
+ if info["status"] == "downloading" and \
+ info["elapsed"] >= self.progress:
+ self.out.progress(
+ info["total_bytes"],
+ info["downloaded_bytes"],
+ int(info["speed"]),
+ )
+
@staticmethod
def _set_outtmpl(ytdl, outtmpl):
try: