m
def download_file_by_link(link, output_path, progress_callback=None, part_size=5242880, proxies=None):
response = requests.head(link, allow_redirects=True, proxies=proxies)
filesize = int(response.headers.get('content-length', 0))
parts = filesize // part_size
with io.open(output_path, mode='wb') as f:
for part in range(parts + 1):
if part == parts + 1:
headers = {"Range": "bytes={0}-{1}".format(part * part_size, filesize)}
else:
headers = {"Range": "bytes={0}-{1}".format(part * part_size, (part + 1) * part_size - 1)}
# print(headers)
response = requests.get(link, headers=headers, stream=True)
if response.status_code == 200 or 206:
for chunk in response:
f.write(chunk)
# else:
# raise Exception
if progress_callback:
progress_callback(part * part_size, filesize)
# time.sleep(0.005)
return filesize