|
import math |
|
import requests |
|
from tqdm import tqdm |
|
|
|
from .misc import sizeof_fmt |
|
|
|
|
|
def download_file_from_google_drive(file_id, save_path): |
|
"""Download files from google drive. |
|
|
|
Ref: |
|
https://stackoverflow.com/questions/25010369/wget-curl-large-file-from-google-drive # noqa E501 |
|
|
|
Args: |
|
file_id (str): File id. |
|
save_path (str): Save path. |
|
""" |
|
|
|
session = requests.Session() |
|
URL = 'https://docs.google.com/uc?export=download' |
|
params = {'id': file_id} |
|
|
|
response = session.get(URL, params=params, stream=True) |
|
token = get_confirm_token(response) |
|
if token: |
|
params['confirm'] = token |
|
response = session.get(URL, params=params, stream=True) |
|
|
|
|
|
response_file_size = session.get( |
|
URL, params=params, stream=True, headers={'Range': 'bytes=0-2'}) |
|
if 'Content-Range' in response_file_size.headers: |
|
file_size = int( |
|
response_file_size.headers['Content-Range'].split('/')[1]) |
|
else: |
|
file_size = None |
|
|
|
save_response_content(response, save_path, file_size) |
|
|
|
|
|
def get_confirm_token(response): |
|
for key, value in response.cookies.items(): |
|
if key.startswith('download_warning'): |
|
return value |
|
return None |
|
|
|
|
|
def save_response_content(response, |
|
destination, |
|
file_size=None, |
|
chunk_size=32768): |
|
if file_size is not None: |
|
pbar = tqdm(total=math.ceil(file_size / chunk_size), unit='chunk') |
|
|
|
readable_file_size = sizeof_fmt(file_size) |
|
else: |
|
pbar = None |
|
|
|
with open(destination, 'wb') as f: |
|
downloaded_size = 0 |
|
for chunk in response.iter_content(chunk_size): |
|
downloaded_size += chunk_size |
|
if pbar is not None: |
|
pbar.update(1) |
|
pbar.set_description(f'Download {sizeof_fmt(downloaded_size)} ' |
|
f'/ {readable_file_size}') |
|
if chunk: |
|
f.write(chunk) |
|
if pbar is not None: |
|
pbar.close() |
|
|