|
|
|
|
@ -3,22 +3,25 @@ import sys
|
|
|
|
|
import json
|
|
|
|
|
import requests
|
|
|
|
|
from tqdm import tqdm
|
|
|
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
|
|
|
|
|
|
|
def download_file(url: str, filename: str, download_dir: str):
|
|
|
|
|
"""Download a file if it does not already exist."""
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
filepath = os.path.join(download_dir, filename)
|
|
|
|
|
content_length = int(requests.head(url).headers.get("content-length", 0))
|
|
|
|
|
|
|
|
|
|
# If file already exists and size matches, skip download
|
|
|
|
|
if os.path.isfile(filepath) and os.path.getsize(filepath) == content_length:
|
|
|
|
|
print(f"{filepath} already exists. Skipping download.")
|
|
|
|
|
return
|
|
|
|
|
if os.path.isfile(filepath) and os.path.getsize(filepath) != content_length:
|
|
|
|
|
print(f"{filepath} already exists but size does not match. Redownloading.")
|
|
|
|
|
else:
|
|
|
|
|
print(f"Downloading {filename} from {url}")
|
|
|
|
|
# Check if the file already exists and its size matches the remote file
|
|
|
|
|
if os.path.isfile(filepath):
|
|
|
|
|
local_file_size = os.path.getsize(filepath)
|
|
|
|
|
remote_file_size = int(requests.head(url).headers.get("content-length", 0))
|
|
|
|
|
if local_file_size == remote_file_size:
|
|
|
|
|
print(f"{filepath} already exists. Skipping download.")
|
|
|
|
|
return
|
|
|
|
|
else:
|
|
|
|
|
print(f"{filepath} already exists, but its size does not match. Redownloading.")
|
|
|
|
|
|
|
|
|
|
print(f"Downloading {filename} from {url}")
|
|
|
|
|
|
|
|
|
|
# Start download, stream=True allows for progress tracking
|
|
|
|
|
response = requests.get(url, stream=True)
|
|
|
|
|
@ -29,14 +32,14 @@ def download_file(url: str, filename: str, download_dir: str):
|
|
|
|
|
# Create progress bar
|
|
|
|
|
total_size = int(response.headers.get('content-length', 0))
|
|
|
|
|
progress_bar = tqdm(
|
|
|
|
|
total=total_size,
|
|
|
|
|
unit='iB',
|
|
|
|
|
unit_scale=True,
|
|
|
|
|
ncols=70,
|
|
|
|
|
total=total_size,
|
|
|
|
|
unit='iB',
|
|
|
|
|
unit_scale=True,
|
|
|
|
|
ncols=70,
|
|
|
|
|
file=sys.stdout
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Write response content to file
|
|
|
|
|
# Write response content to file using a buffer
|
|
|
|
|
with open(filepath, 'wb') as f:
|
|
|
|
|
for data in response.iter_content(chunk_size=1024):
|
|
|
|
|
f.write(data)
|
|
|
|
|
@ -50,13 +53,23 @@ def download_file(url: str, filename: str, download_dir: str):
|
|
|
|
|
print("ERROR, something went wrong while downloading")
|
|
|
|
|
raise Exception()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"An error occurred: {e}")
|
|
|
|
|
|
|
|
|
|
def download_files_parallel(config, download_dir, num_threads=4):
|
|
|
|
|
"""Download files in parallel using ThreadPoolExecutor."""
|
|
|
|
|
with ThreadPoolExecutor(max_workers=num_threads) as executor:
|
|
|
|
|
futures = []
|
|
|
|
|
|
|
|
|
|
for url, filename in config.items():
|
|
|
|
|
futures.append(executor.submit(download_file, url, filename, download_dir))
|
|
|
|
|
|
|
|
|
|
for future in futures:
|
|
|
|
|
future.result()
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
"""Main function to download files from URLs in a config file."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Get JSON config file path
|
|
|
|
|
script_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
config_file_path = os.path.join(script_dir, "download_models.json")
|
|
|
|
|
@ -69,10 +82,8 @@ def main():
|
|
|
|
|
with open(config_file_path, "r") as f:
|
|
|
|
|
config = json.load(f)
|
|
|
|
|
|
|
|
|
|
# Download each file specified in config
|
|
|
|
|
for url, filename in config.items():
|
|
|
|
|
download_file(url, filename, download_dir)
|
|
|
|
|
|
|
|
|
|
# Download files in parallel
|
|
|
|
|
download_files_parallel(config, download_dir, num_threads=4)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|