|
import urllib.request |
|
from pathlib import Path |
|
|
|
import streamlit as st |
|
|
|
|
|
|
|
def download_file(url, download_to: Path, expected_size=None): |
|
|
|
|
|
if download_to.exists(): |
|
if expected_size: |
|
if download_to.stat().st_size == expected_size: |
|
return |
|
else: |
|
st.info(f"{url} is already downloaded.") |
|
if not st.button("Download again?"): |
|
return |
|
|
|
download_to.parent.mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
weights_warning, progress_bar = None, None |
|
try: |
|
weights_warning = st.warning("Downloading %s..." % url) |
|
progress_bar = st.progress(0) |
|
with open(download_to, "wb") as output_file: |
|
with urllib.request.urlopen(url) as response: |
|
length = int(response.info()["Content-Length"]) |
|
counter = 0.0 |
|
MEGABYTES = 2.0**20.0 |
|
while True: |
|
data = response.read(8192) |
|
if not data: |
|
break |
|
counter += len(data) |
|
output_file.write(data) |
|
|
|
|
|
weights_warning.warning( |
|
"Downloading %s... (%6.2f/%6.2f MB)" |
|
% (url, counter / MEGABYTES, length / MEGABYTES) |
|
) |
|
progress_bar.progress(min(counter / length, 1.0)) |
|
|
|
finally: |
|
if weights_warning is not None: |
|
weights_warning.empty() |
|
if progress_bar is not None: |
|
progress_bar.empty() |
|
|