FOSSology  4.5.1
Open Source License Compliance by Open Source Software
Downloader.py
1 #!/usr/bin/env python3
2 
3 # SPDX-FileContributor: © Rajul Jha <rajuljha49@gmail.com>
4 
5 # SPDX-License-Identifier: GPL-2.0-only
6 
7 import os
8 import re
9 import requests
10 import concurrent.futures
11 import zipfile
12 import tarfile
13 
14 
15 class Downloader:
16  """
17  Class for parallely downloading dependencies from download urls.
18  """
19 
20  def __download_package(self, package_name: str, download_url: str,\
21  save_dir: str) -> str:
22  response = requests.get(download_url)
23  package_folder = os.path.join(save_dir, package_name)
24  if not os.path.exists(package_folder):
25  os.makedirs(package_folder)
26 
27  match = re.search(r'\.tar\.gz$|\.tar\.bz2$|\.tar\.xz$|\.zip$|\.whl$|\.tar$',\
28  download_url)
29  file_extension = match.group(0) if match else os.path.splitext(download_url)[1]
30  file_path = os.path.join(package_folder, package_name + file_extension)
31 
32  with open(file_path, 'wb') as f:
33  f.write(response.content)
34 
35  print(f"Downloaded {package_name} to {file_path}")
36 
37  # Unpack the file based on its extension
38  if file_extension == ".zip":
39  with zipfile.ZipFile(file_path, 'r') as zip_ref:
40  zip_ref.extractall(package_folder)
41  elif file_extension in [".tar.gz", ".tgz", ".tar"]:
42  with tarfile.open(file_path, 'r:*') as tar_ref:
43  tar_ref.extractall(package_folder)
44  else:
45  print(f"Unsupported file format: {file_extension}")
46  return None
47  os.remove(file_path)
48  print(f"Exported {package_name} to {package_folder}")
49 
50  return file_path
51 
52  def download_concurrently(self, download_list: list[tuple[str,str]], \
53  save_dir: str):
54  """
55  Download files concurrently from a list of urls
56  """
57  with concurrent.futures.ThreadPoolExecutor() as executor:
58  futures = [
59  executor.submit(self.__download_package__download_package, name, url, save_dir)
60  for name, url in download_list
61  ]
62 
63  for future in concurrent.futures.as_completed(futures):
64  try:
65  future.result()
66  except Exception as e:
67  print(f"Error downloading package: {e}")
68  return f"Packages downloaded in the folder {save_dir}"
def download_concurrently(self, list[tuple[str, str]] download_list, str save_dir)
Definition: Downloader.py:53
str __download_package(self, str package_name, str download_url, str save_dir)
Definition: Downloader.py:21