added resume progress bar

This commit is contained in:
Chunxiao Li 2020-07-24 17:30:07 +08:00
parent d741e3d8b5
commit ae64508a1e
4 changed files with 29 additions and 29 deletions

BIN
pyatmos/.DS_Store vendored

Binary file not shown.

@ -19,8 +19,6 @@ from datetime import datetime,timedelta
from os import path,makedirs,remove from os import path,makedirs,remove
from pathlib import Path from pathlib import Path
from urllib.request import urlretrieve from urllib.request import urlretrieve
from colorama import Fore
from .tqdmupto import TqdmUpTo
# =================== download and update sw data =================== # # =================== download and update sw data =================== #
@ -58,21 +56,15 @@ def download_sw(direc=None):
url = 'https://www.celestrak.com/SpaceData/SW-All.txt' url = 'https://www.celestrak.com/SpaceData/SW-All.txt'
if not path.exists(direc): makedirs(direc) if not path.exists(direc): makedirs(direc)
bar_format = "{l_bar}%s{bar}%s{r_bar}" % (Fore.BLUE, Fore.RESET)
if not path.exists(swfile): if not path.exists(swfile):
desc = 'Downloading the latest space weather data from CELESTRAK' desc = 'Downloading the latest space weather data from CELESTRAK'
with TqdmUpTo(unit='B', unit_scale=True, desc=desc,bar_format = bar_format,position=0) as t: tqdm_request(url,direc,'SW-All.txt',desc)
urlretrieve(url, swfile,reporthook=t.update_to)
t.total = t.n
else: else:
modified_time = datetime.fromtimestamp(path.getmtime(swfile)) modified_time = datetime.fromtimestamp(path.getmtime(swfile))
if datetime.now() > modified_time + timedelta(days=1): if datetime.now() > modified_time + timedelta(days=1):
remove(swfile) remove(swfile)
desc = 'Updating the space weather data from CELESTRAK' desc = 'Updating the space weather data from CELESTRAK'
with TqdmUpTo(unit='B', unit_scale=True, desc=desc,bar_format = bar_format,position=0) as t: tqdm_request(url,direc,'SW-All.txt',desc)
urlretrieve(url, swfile,reporthook=t.update_to)
t.total = t.n
else: else:
print('The space weather data in {:s} is already the latest.'.format(direc)) print('The space weather data in {:s} is already the latest.'.format(direc))
return swfile return swfile

@ -1,19 +0,0 @@
from tqdm import tqdm
class TqdmUpTo(tqdm):
'''
Provides `update_to(n)` which uses `tqdm.update(delta_n)`.
For more details, please refer to https://pypi.org/project/tqdm/
'''
def update_to(self, b=1, bsize=1, tsize=None):
'''
b : int, optional
Number of blocks transferred so far [default: 1].
bsize : int, optional
Size of each block (in tqdm units) [default: 1].
tsize : int, optional
Total size (in tqdm units). If [default: None] remains unchanged.
'''
if tsize is not None:
self.total = tsize
self.update(b * bsize - self.n) # will also set self.n = b * bsize

@ -1,3 +1,6 @@
import requests
from tqdm import tqdm
from colorama import Fore
# ------------------------------------------------------------------- # # ------------------------------------------------------------------- #
# ----------------------------- utilities --------------------------- # # ----------------------------- utilities --------------------------- #
# ------------------------------------------------------------------- # # ------------------------------------------------------------------- #
@ -31,3 +34,27 @@ def hms2s(h,m,s):
def hms2h(h,m,s): def hms2h(h,m,s):
return h + m/60 + s/3.6E3 return h + m/60 + s/3.6E3
def tqdm_request(url,dir_to,file,desc):
block_size = 1024
bar_format = "{l_bar}%s{bar}%s{r_bar}" % (Fore.BLUE, Fore.RESET)
for idownload in range(5):
try:
local_file = open(dir_to + file, 'ab')
pos = local_file.tell()
resume_header = {'Range': f'bytes={pos}-'}
res = requests.get(url,stream=True,timeout=100,headers=resume_header)
total_size = int(res.headers.get('content-length', 0))
pbar = tqdm(desc = desc,total=total_size,unit='B',unit_scale=True,bar_format = bar_format,position=0,initial=pos)
for chunk in res.iter_content(block_size):
pbar.update(len(chunk))
local_file.write(chunk)
break
except:
sleep(2)
if idownload == 4:
remove(dir_to + file)
print('No response, skip this file.')
finally:
pbar.close()
local_file.close()