FFMpeg-Compressor: Compress subfolders & Add progressbar

This commit is contained in:
OleSTEEP 2023-08-01 17:20:57 +03:00
parent 250c4f789a
commit 1caebeb158
6 changed files with 63 additions and 45 deletions

View file

@ -3,22 +3,26 @@
from modules import compressor from modules import compressor
from modules import printer from modules import printer
from modules import utils from modules import utils
import shutil
import sys import sys
import os import os
try: try:
orig_folder = sys.argv[1] orig_folder = sys.argv[1]
printer.orig_folder = sys.argv[1]
except IndexError: except IndexError:
print(utils.help_message()) print(utils.help_message())
exit() exit()
try: printer.bar_init(orig_folder)
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.info("Compression started!") if os.path.exists(f"{orig_folder}_compressed"):
compressor.compress(orig_folder) 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) utils.get_compression_status(orig_folder)

View file

@ -32,16 +32,16 @@ def has_transparency(img):
return False 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)) files = len(os.listdir(folder))
progress = 0
for file in os.listdir(folder): for file in os.listdir(folder):
if os.path.isfile(f'{folder}/{file}'): if os.path.isfile(f'{folder}/{file}'):
if os.path.splitext(file)[1] in audio_exts: if os.path.splitext(file)[1] in audio_exts:
bitrate = config['FFMPEG']['AudioBitRate'] bitrate = config['FFMPEG']['AudioBitRate']
printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_audio_ext, f"{bitrate}bit/s") printer.files(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}'") 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: 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}')): if not has_transparency(Image.open(f'{folder}/{file}')):
jpg_comp = config['FFMPEG']['JpegComp'] jpg_comp = config['FFMPEG']['JpegComp']
printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_image_ext, f"level {jpg_comp}") 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} '{folder}_compressed/{os.path.splitext(file)[0]}.{req_image_ext}'") os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -q {jpg_comp} '{target_folder}/{os.path.splitext(file)[0]}.{req_image_ext}'")
else: else:
printer.warning(f"{file} has transparency (.jpg not support it). Skipping...") printer.warning(f"{file} has transparency (.jpg not support it). Skipping...")
else: else:
comp_level = config['FFMPEG']['CompLevel'] comp_level = config['FFMPEG']['CompLevel']
printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_image_ext, f"{comp_level}%") 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} '{folder}_compressed/{os.path.splitext(file)[0]}.{req_image_ext}'") 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: elif os.path.splitext(file)[1] in video_exts:
codec = config['FFMPEG']['VideoCodec'] codec = config['FFMPEG']['VideoCodec']
printer.files(int((progress / files) * 100), file, os.path.splitext(file)[0], req_video_ext, codec) printer.files(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}'") os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} -vcodec {codec} '{target_folder}/{os.path.splitext(file)[0]}.{req_video_ext}'")
else: else:
printer.warning("File extension not recognized. This may affect the quality of the compression.") 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") printer.unknown_file(file)
os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} '{folder}_compressed/{file}'") os.system(f"ffmpeg -i '{folder}/{file}' {ffmpeg_params} '{target_folder}/{file}'")
progress += 1

View file

@ -1,21 +1,38 @@
import os 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): 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_ext = os.path.splitext(source)[1]
source_name = os.path.splitext(source)[0] source_name = os.path.splitext(source)[0]
if progress < 10: 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"))
progress = f" {progress}" bar.next()
elif progress < 100:
progress = f" {progress}"
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): def warning(string):
print(f"\033[0;33m[WARNING] {string}\033[0m") print(clean_str(f"\r\033[0;33m[WARNING] {string}\033[0m"))

View file

@ -1,21 +1,21 @@
from modules import printer from modules import printer
import glob
import os import os
def get_dir_size(directory, files): def get_dir_size(directory, files):
total_size = 0 total_size = 0
for f in files: for folder, folders, files in os.walk(directory):
fp = glob.glob(f'{directory}/{f}*')[0] for file in files:
if not os.path.islink(fp): if not os.path.islink(f"{folder}/{file}"):
total_size += os.path.getsize(fp) total_size += os.path.getsize(f"{folder}/{file}")
return total_size return total_size
def get_compression(orig, comp): def get_compression(orig, comp):
processed_files = [] processed_files = []
for file in os.listdir(comp): for folder, folders, files in os.walk(comp):
processed_files.append(os.path.splitext(file)[0]) for file in files:
processed_files.append(file)
try: try:
comp = 100 - int((get_dir_size(comp, processed_files) / get_dir_size(orig, processed_files)) * 100) 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 orig_folder_len = 0
comp_folder_len = 0 comp_folder_len = 0
for file in os.listdir(orig_folder): for folder, folders, file in os.walk(orig_folder):
if os.path.isfile(f'{orig_folder}/{file}'): orig_folder_len += len(file)
orig_folder_len += 1
for file in os.listdir(f'{orig_folder}_compressed'): for folder, folders, file in os.walk(f'{orig_folder}_compressed'):
if os.path.isfile(f'{orig_folder}_compressed/{file}'): comp_folder_len += len(file)
comp_folder_len += 1
if orig_folder_len == comp_folder_len: if orig_folder_len == comp_folder_len:
printer.info("Success!") printer.info("Success!")

View file

@ -0,0 +1,2 @@
Pillow==9.5.0
progress==1.6

View file

@ -20,7 +20,6 @@ def extract_assets(file):
os.rename('assets/res/drawable/icon.png', 'assets/icon.png') os.rename('assets/res/drawable/icon.png', 'assets/icon.png')
def rename_files(directory): def rename_files(directory):
for dir_ in os.walk(directory): for dir_ in os.walk(directory):
for file in dir_[2]: for file in dir_[2]: