in tools/ami-creator/scripts/win2019_cuda114_installer.py [0:0]
def download(url, dest=None, progress=False) -> str:
from urllib.request import urlopen
from urllib.parse import (urlparse, urlunparse)
import progressbar
import http.client
class ProgressCB():
def __init__(self):
self.pbar = None
def __call__(self, block_num, block_size, total_size):
if not self.pbar and total_size > 0:
self.pbar = progressbar.bar.ProgressBar(max_value=total_size)
downloaded = block_num * block_size
if self.pbar:
if downloaded < total_size:
self.pbar.update(downloaded)
else:
self.pbar.finish()
if dest and os.path.isdir(dest):
local_file = os.path.split(urlparse(url).path)[1]
local_path = os.path.normpath(os.path.join(dest, local_file))
else:
local_path = dest
with urlopen(url) as c:
content_length = c.getheader('content-length')
length = int(content_length) if content_length and isinstance(c, http.client.HTTPResponse) else None
if length and local_path and os.path.exists(local_path) and os.stat(local_path).st_size == length:
log.debug(f"download('{url}'): Already downloaded.")
return local_path
log.debug(f"download({url}, {local_path}): downloading {length} bytes")
if local_path:
with tempfile.NamedTemporaryFile(delete=False) as tmpfd:
urllib.request.urlretrieve(url, filename=tmpfd.name, reporthook=ProgressCB() if progress else None)
shutil.move(tmpfd.name, local_path)
else:
(local_path, _) = urllib.request.urlretrieve(url, reporthook=ProgressCB())
log.debug(f"download({url}, {local_path}'): done.")
return local_path