From abb0873d10e81848bf0171ba12a9cbc5bd65f158 Mon Sep 17 00:00:00 2001
From: goymann <philipp.goymann@mpi-bn.mpg.de>
Date: Fri, 2 Jun 2023 19:34:03 +0000
Subject: [PATCH] add progress bar to downlaod

---
 loosolab_s3/cmd.py          |  2 +-
 loosolab_s3/s3_functions.py | 42 ++++++++++++++++++++++++++++++-------
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/loosolab_s3/cmd.py b/loosolab_s3/cmd.py
index dd4c581..3a9089e 100644
--- a/loosolab_s3/cmd.py
+++ b/loosolab_s3/cmd.py
@@ -61,7 +61,7 @@ def run_s3_functions():
         else:    
             utils.check_argparser(args, ['secret', "key", "files", "bucketname"])
         
-        s3.download_s3_objects( args.bucketname, args.files, destination=os.getcwd())
+        s3.download_s3_objects( bucketname, files, destination=os.getcwd(), download_bar=True)
 #--------------------------------------------------------------------------------------------------------#
 # parse command line arguments:
 def argparsefunc():
diff --git a/loosolab_s3/s3_functions.py b/loosolab_s3/s3_functions.py
index b18966f..0fa36f3 100644
--- a/loosolab_s3/s3_functions.py
+++ b/loosolab_s3/s3_functions.py
@@ -85,8 +85,15 @@ class Loosolab_s3:
 					aws_secret_access_key=credentials["secret"],
 					endpoint_url=credentials["endpoint"]
 				)
-
+			client = boto3.client(
+					's3',
+					config=Config(signature_version=credentials["signature"]),
+					aws_access_key_id=credentials["key"],
+					aws_secret_access_key=credentials["secret"],
+					endpoint_url=credentials["endpoint"]
+				)
 			self.session = session
+			self.client = client
 			self.check_s3_credentials()
 		except Exception as e:
 			self.__exception_log__("Problem with input!",e) 	
@@ -208,13 +215,13 @@ class Loosolab_s3:
 				local_tag = self.etag_checksum(local_file_name)
 			else:	
 				local_tag = hashlib.md5(open(local_file_name).read().encode('utf-8')).hexdigest()	
-			
+			print('\n')
 			self.logger.info('local e-tag of ' + local_file_name +' is : ' + local_tag)
 			self.logger.info('s3 e-tag of ' + file_name +' is : ' + s3_e_tag)
 
 			modBool = local_tag == s3_e_tag
 			if modBool:
-				self.logger.info("Files are not changed!" + str(file_name))
+				self.logger.info("Files are not changed! " + str(file_name))
 			return modBool
 
 		except Exception as e:
@@ -457,7 +464,7 @@ class Loosolab_s3:
 		return True
 
 	#--------------------------------------------------------------------------------------------------------#
-	def download_s3_objects(self, bucket_name, file_list, destination=os.getcwd(), compare=True):
+	def download_s3_objects(self, bucket_name, file_list, destination=os.getcwd(), compare=True, download_bar=False):
 		""" Download files from bucket
 		Parameter:
 		----------
@@ -478,11 +485,13 @@ class Loosolab_s3:
 				modBool = self.compare_s3_etag(bucket_name, file_name, file_path)
 			if self.check_s3_object_ex(bucket_name, file_name) and not modBool:
 				if not os.path.exists(os.path.dirname(file_path)):
-					print(file_path)
 					os.makedirs(os.path.dirname(file_path))
 					self.logger.info('Created directory: ' + os.path.dirname(file_path))
-				if self.multipart_upload:
+				if self.multipart_upload and not download_bar:
 					bucket.download_file(file_name, file_path)
+				elif download_bar:
+					
+					self.download(file_path,bucket_name,  file_name)
 				else:
 					bucket.download_file(file_name, file_path, Config=self.transfer)
 		try:
@@ -500,4 +509,23 @@ class Loosolab_s3:
 					else:
 						bucket.download_file(file_name, file_path, Config=self.transfer)
 		except Exception as e:
-			self.__exception_log__("Could not download file " + file_name , e)
\ No newline at end of file
+			self.__exception_log__("Could not download file " + file_name , e)
+
+#--------------------------------------------------------------------------------------------------------#
+
+	def download(self, local_file_name, s3_bucket, s3_object_key):
+
+		meta_data = self.client.head_object(Bucket=s3_bucket, Key=s3_object_key)
+		total_length = int(meta_data.get('ContentLength', 0))
+		downloaded = 0
+
+		def progress(chunk):
+			nonlocal downloaded
+			downloaded += chunk
+			done = int(50 * downloaded / total_length)
+			sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) )
+			sys.stdout.flush()
+
+		self.logger.info(f'Downloading {s3_object_key}')
+		with open(local_file_name, 'wb') as f:
+			self.client.download_fileobj(s3_bucket, s3_object_key, f, Callback=progress)  
\ No newline at end of file
-- 
GitLab