From 1caebeb15889440f495498eef12d6bc7cf8f24ed Mon Sep 17 00:00:00 2001 From: OleSTEEP Date: Tue, 1 Aug 2023 17:20:57 +0300 Subject: [PATCH] FFMpeg-Compressor: Compress subfolders & Add progressbar --- FFMpeg-Compressor/main.py | 20 ++++++++------ FFMpeg-Compressor/modules/compressor.py | 26 +++++++++--------- FFMpeg-Compressor/modules/printer.py | 35 ++++++++++++++++++------- FFMpeg-Compressor/modules/utils.py | 24 ++++++++--------- FFMpeg-Compressor/requirements.txt | 2 ++ RenPy-Android-Unpack/unpack.py | 1 - 6 files changed, 63 insertions(+), 45 deletions(-) create mode 100644 FFMpeg-Compressor/requirements.txt diff --git a/FFMpeg-Compressor/main.py b/FFMpeg-Compressor/main.py index c789839..fba5cff 100755 --- a/FFMpeg-Compressor/main.py +++ b/FFMpeg-Compressor/main.py @@ -3,22 +3,26 @@ from modules import compressor from modules import printer from modules import utils +import shutil import sys import os try: orig_folder = sys.argv[1] + printer.orig_folder = sys.argv[1] except IndexError: print(utils.help_message()) exit() -try: - os.mkdir(f"{orig_folder}_compressed") - printer.info(f"Created {orig_folder}_compressed folder") -except OSError: - printer.warning(f"{orig_folder}_compressed already exist!") - pass +printer.bar_init(orig_folder) -printer.info("Compression started!") -compressor.compress(orig_folder) +if os.path.exists(f"{orig_folder}_compressed"): + shutil.rmtree(f"{orig_folder}_compressed") +printer.info("Creating folders...") +for folder, folders, files in os.walk(orig_folder): + if not os.path.exists(folder.replace(orig_folder, f"{orig_folder}_compressed")): + os.mkdir(folder.replace(orig_folder, f"{orig_folder}_compressed")) + + printer.info(f"Compressing \"{folder.replace(orig_folder, orig_folder.split('/').pop())}\" folder...") + compressor.compress(orig_folder, folder) utils.get_compression_status(orig_folder) diff --git a/FFMpeg-Compressor/modules/compressor.py b/FFMpeg-Compressor/modules/compressor.py index 0e83fee..72760cf 100644 --- a/FFMpeg-Compressor/modules/compressor.py +++ b/FFMpeg-Compressor/modules/compressor.py @@ -32,16 +32,16 @@ def has_transparency(img): return False -def compress(folder): +def compress(root_folder, folder): + target_folder = folder.replace(root_folder, f"{root_folder}_compressed") files = len(os.listdir(folder)) - progress = 0 for file in os.listdir(folder): if os.path.isfile(f'{folder}/{file}'): if os.path.splitext(file)[1] in audio_exts: bitrate = config['FFMPEG']['AudioBitRate'] - printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_audio_ext, f"{bitrate}bit/s") - os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} '{folder}_compressed/{os.path.splitext(file)[0]}.{req_audio_ext}'") + printer.files(file, os.path.splitext(file)[0], req_audio_ext, f"{bitrate}bit/s") + os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} '{target_folder}/{os.path.splitext(file)[0]}.{req_audio_ext}'") elif os.path.splitext(file)[1] in image_exts: @@ -49,25 +49,23 @@ def compress(folder): if not has_transparency(Image.open(f'{folder}/{file}')): jpg_comp = config['FFMPEG']['JpegComp'] - printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_image_ext, f"level {jpg_comp}") - os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -q {jpg_comp} '{folder}_compressed/{os.path.splitext(file)[0]}.{req_image_ext}'") + printer.files(file, os.path.splitext(file)[0], req_image_ext, f"level {jpg_comp}") + os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -q {jpg_comp} '{target_folder}/{os.path.splitext(file)[0]}.{req_image_ext}'") else: printer.warning(f"{file} has transparency (.jpg not support it). Skipping...") else: comp_level = config['FFMPEG']['CompLevel'] - printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_image_ext, f"{comp_level}%") - os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -compression_level {comp_level} '{folder}_compressed/{os.path.splitext(file)[0]}.{req_image_ext}'") + printer.files(file, os.path.splitext(file)[0], req_image_ext, f"{comp_level}%") + os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -compression_level {comp_level} '{target_folder}/{os.path.splitext(file)[0]}.{req_image_ext}'") elif os.path.splitext(file)[1] in video_exts: codec = config['FFMPEG']['VideoCodec'] - printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_video_ext, codec) - os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -vcodec {codec} '{folder}_compressed/{os.path.splitext(file)[0]}.{req_video_ext}'") + printer.files(file, os.path.splitext(file)[0], req_video_ext, codec) + os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -vcodec {codec} '{target_folder}/{os.path.splitext(file)[0]}.{req_video_ext}'") else: printer.warning("File extension not recognized. This may affect the quality of the compression.") - print(f"\r[{int((progress/files) * 100)}%] \033[0;33m{file}\033[0m") - os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} '{folder}_compressed/{file}'") - - progress += 1 + printer.unknown_file(file) + os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} '{target_folder}/{file}'") diff --git a/FFMpeg-Compressor/modules/printer.py b/FFMpeg-Compressor/modules/printer.py index 209f813..cd9f2b6 100644 --- a/FFMpeg-Compressor/modules/printer.py +++ b/FFMpeg-Compressor/modules/printer.py @@ -1,21 +1,38 @@ import os +from progress.bar import IncrementalBar + + +# Fill whole string with spaces for cleaning progress bar +def clean_str(string): + return string + " " * (os.get_terminal_size().columns - len(string)) + + +def bar_init(folder): + file_count = 0 + for folder, folders, file in os.walk(folder): + file_count += len(file) + global bar + bar = IncrementalBar('Compressing', max=file_count, suffix='[%(index)d/%(max)d] (%(percent).1f%%) - ETA: %(eta)ds') def info(string): - print(f"[INFO] \033[0;32m{string}\033[0m") + print(clean_str(f"\r\033[0;32m[INFO] \033[0m {string}" + " ")) -def files(progress, source, dest, dest_ext, comment): +def files(source, dest, dest_ext, comment): + source_ext = os.path.splitext(source)[1] - source_name= os.path.splitext(source)[0] + source_name = os.path.splitext(source)[0] - if progress < 10: - progress = f" {progress}" - elif progress < 100: - progress = f" {progress}" + print(clean_str(f"\r[COMP] \033[0;32m{source_name}\033[0m{source_ext}\033[0;32m -> {dest}\033[0m.{dest_ext}\033[0;32m ({comment})\033[0m")) + bar.next() - print(f"[{progress}%] \033[0;32m{source_name}\033[0m{source_ext}\033[0;32m -> {dest}\033[0m.{dest_ext}\033[0;32m ({comment})\033[0m") + +def unknown_file(file): + + print(clean_str(f"\r[COMP] \033[0;33m{file}\033[0m")) + bar.next() def warning(string): - print(f"\033[0;33m[WARNING] {string}\033[0m") \ No newline at end of file + print(clean_str(f"\r\033[0;33m[WARNING] {string}\033[0m")) diff --git a/FFMpeg-Compressor/modules/utils.py b/FFMpeg-Compressor/modules/utils.py index 8cc41e2..567348f 100644 --- a/FFMpeg-Compressor/modules/utils.py +++ b/FFMpeg-Compressor/modules/utils.py @@ -1,21 +1,21 @@ from modules import printer -import glob import os def get_dir_size(directory, files): total_size = 0 - for f in files: - fp = glob.glob(f'{directory}/{f}*')[0] - if not os.path.islink(fp): - total_size += os.path.getsize(fp) + for folder, folders, files in os.walk(directory): + for file in files: + if not os.path.islink(f"{folder}/{file}"): + total_size += os.path.getsize(f"{folder}/{file}") return total_size def get_compression(orig, comp): processed_files = [] - for file in os.listdir(comp): - processed_files.append(os.path.splitext(file)[0]) + for folder, folders, files in os.walk(comp): + for file in files: + processed_files.append(file) try: comp = 100 - int((get_dir_size(comp, processed_files) / get_dir_size(orig, processed_files)) * 100) @@ -32,13 +32,11 @@ def get_compression_status(orig_folder): orig_folder_len = 0 comp_folder_len = 0 - for file in os.listdir(orig_folder): - if os.path.isfile(f'{orig_folder}/{file}'): - orig_folder_len += 1 + for folder, folders, file in os.walk(orig_folder): + orig_folder_len += len(file) - for file in os.listdir(f'{orig_folder}_compressed'): - if os.path.isfile(f'{orig_folder}_compressed/{file}'): - comp_folder_len += 1 + for folder, folders, file in os.walk(f'{orig_folder}_compressed'): + comp_folder_len += len(file) if orig_folder_len == comp_folder_len: printer.info("Success!") diff --git a/FFMpeg-Compressor/requirements.txt b/FFMpeg-Compressor/requirements.txt new file mode 100644 index 0000000..290af37 --- /dev/null +++ b/FFMpeg-Compressor/requirements.txt @@ -0,0 +1,2 @@ +Pillow==9.5.0 +progress==1.6 diff --git a/RenPy-Android-Unpack/unpack.py b/RenPy-Android-Unpack/unpack.py index 1a89253..07cc074 100755 --- a/RenPy-Android-Unpack/unpack.py +++ b/RenPy-Android-Unpack/unpack.py @@ -20,7 +20,6 @@ def extract_assets(file): os.rename('assets/res/drawable/icon.png', 'assets/icon.png') - def rename_files(directory): for dir_ in os.walk(directory): for file in dir_[2]: