kopia lustrzana https://github.com/Michael-K-Stein/SpotiFile
75 wiersze
2.2 KiB
Python
75 wiersze
2.2 KiB
Python
|
import os
|
||
|
from zipfile import ZipFile
|
||
|
import time
|
||
|
import sys
|
||
|
|
||
|
|
||
|
class ZipUtilities:
|
||
|
|
||
|
def toZip(self, files, filename):
|
||
|
zip_file = ZipFile(filename, 'w')
|
||
|
for file in files:
|
||
|
if os.path.isfile(file):
|
||
|
zip_file.write(file)
|
||
|
else:
|
||
|
self.addFolderToZip(zip_file, file)
|
||
|
zip_file.close()
|
||
|
|
||
|
def addFolderToZip(self, zip_file, folder):
|
||
|
print(f'Adding folder {folder} to archive {zip_file}')
|
||
|
for file in os.listdir(folder):
|
||
|
full_path = os.path.join(folder, file)
|
||
|
if os.path.isfile(full_path):
|
||
|
print('File added: ' + str(full_path))
|
||
|
zip_file.write(full_path)
|
||
|
elif os.path.isdir(full_path):
|
||
|
print('Entering folder: ' + str(full_path))
|
||
|
self.addFolderToZip(zip_file, full_path)
|
||
|
|
||
|
|
||
|
def get_directory_size(start_path = '.'):
|
||
|
total_size = 0
|
||
|
for dirpath, dirnames, filenames in os.walk(start_path):
|
||
|
for f in filenames:
|
||
|
fp = os.path.join(dirpath, f)
|
||
|
# skip if it is symbolic link
|
||
|
if not os.path.islink(fp):
|
||
|
total_size += os.path.getsize(fp)
|
||
|
|
||
|
return total_size
|
||
|
|
||
|
|
||
|
def get_zip_name() -> str:
|
||
|
return f'{sys.argv[2]}/Download_{str(time.time())}.zip'
|
||
|
|
||
|
|
||
|
def zip_dirs(dir_list:list) -> str:
|
||
|
zname = get_zip_name()
|
||
|
utilities = ZipUtilities()
|
||
|
utilities.toZip(dir_list, zname)
|
||
|
|
||
|
|
||
|
def zip_bunches(start_path:str='music', max_zip_size:int=3813764863):
|
||
|
current_bunch = []
|
||
|
current_bunch_size = 0
|
||
|
for dir_name in os.listdir(start_path):
|
||
|
dir_path = os.path.join(start_path, dir_name)
|
||
|
dir_size = get_directory_size(dir_path)
|
||
|
print(f'Dir: {dir_path} of size {dir_size}')
|
||
|
if current_bunch_size + dir_size < max_zip_size:
|
||
|
current_bunch.append(dir_path)
|
||
|
current_bunch_size += dir_size
|
||
|
else:
|
||
|
zip_dirs(current_bunch)
|
||
|
current_bunch.clear()
|
||
|
current_bunch_size = 0
|
||
|
zip_dirs(current_bunch)
|
||
|
current_bunch.clear()
|
||
|
current_bunch_size = 0
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if len(sys.argv) == 1:
|
||
|
zip_bunches()
|
||
|
else:
|
||
|
zip_bunches(sys.argv[1])
|