import os
import os.path as osp
import ssl
import sys
import urllib
from typing import Optional
import fsspec
from torch_geometric.io import fs
[docs]def download_url(
url: str,
folder: str,
log: bool = True,
filename: Optional[str] = None,
):
r"""Downloads the content of an URL to a specific folder.
Args:
url (str): The URL.
folder (str): The folder.
log (bool, optional): If :obj:`False`, will not print anything to the
console. (default: :obj:`True`)
filename (str, optional): The filename of the downloaded file. If set
to :obj:`None`, will correspond to the filename given by the URL.
(default: :obj:`None`)
"""
if filename is None:
filename = url.rpartition('/')[2]
filename = filename if filename[0] == '?' else filename.split('?')[0]
path = osp.join(folder, filename)
if fs.exists(path): # pragma: no cover
if log and 'pytest' not in sys.modules:
print(f'Using existing file {filename}', file=sys.stderr)
return path
if log and 'pytest' not in sys.modules:
print(f'Downloading {url}', file=sys.stderr)
os.makedirs(folder, exist_ok=True)
context = ssl._create_unverified_context()
data = urllib.request.urlopen(url, context=context)
with fsspec.open(path, 'wb') as f:
# workaround for https://bugs.python.org/issue42853
while True:
chunk = data.read(10 * 1024 * 1024)
if not chunk:
break
f.write(chunk)
return path
[docs]def download_google_url(
id: str,
folder: str,
filename: str,
log: bool = True,
):
r"""Downloads the content of a Google Drive ID to a specific folder."""
url = f'https://drive.usercontent.google.com/download?id={id}&confirm=t'
return download_url(url, folder, log, filename)