From 23f7e5ec670d24682d934e4e598e5a855acdc237 Mon Sep 17 00:00:00 2001 From: OleSTEEP Date: Fri, 19 Jul 2024 02:17:04 +0300 Subject: [PATCH] FFMpeg-Compressor: Implement multiple FIFO workers --- FFMpeg-Compressor/README.md | 4 ++-- FFMpeg-Compressor/ffmpeg-comp.toml | 1 + FFMpeg-Compressor/main.py | 20 ++++++++++++++++---- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/FFMpeg-Compressor/README.md b/FFMpeg-Compressor/README.md index 496d47c..40b37d8 100644 --- a/FFMpeg-Compressor/README.md +++ b/FFMpeg-Compressor/README.md @@ -36,5 +36,5 @@ Python utility uses ffmpeg to compress Visual Novel Resources * [x] Recreate whole game directory with compressed files * [x] Cross-platform (Easy Windows usage and binaries, macOS binaries) * [x] Use ffmpeg python bindings instead of cli commands -* [ ] Reorganize code -* [ ] Multithread \ No newline at end of file +* [x] Multithread +* [ ] Reorganize code \ No newline at end of file diff --git a/FFMpeg-Compressor/ffmpeg-comp.toml b/FFMpeg-Compressor/ffmpeg-comp.toml index 7005024..15551da 100644 --- a/FFMpeg-Compressor/ffmpeg-comp.toml +++ b/FFMpeg-Compressor/ffmpeg-comp.toml @@ -4,6 +4,7 @@ ForceCompress = false MimicMode = true HideErrors = true WebpRGBA = true +Workers = 16 [AUDIO] Extension = "opus" diff --git a/FFMpeg-Compressor/main.py b/FFMpeg-Compressor/main.py index d8bdd21..7c05dc5 100755 --- a/FFMpeg-Compressor/main.py +++ b/FFMpeg-Compressor/main.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +from concurrent.futures import ThreadPoolExecutor, as_completed +from modules.configloader import config from modules import compressor from modules import printer from modules import utils @@ -21,6 +23,11 @@ def get_args(): exit() +def compress_worker(folder, file, target_folder, req_folder): + if os.path.isfile(f'{folder}/{file}'): + compressor.compress_file(folder, file, target_folder, req_folder) + + if __name__ == "__main__": start_time = datetime.now() printer.win_ascii_esc() @@ -38,10 +45,15 @@ if __name__ == "__main__": printer.info(f"Compressing \"{folder.replace(req_folder, req_folder.split('/').pop())}\" folder...") target_folder = folder.replace(req_folder, f"{req_folder}_compressed") - for file in files: - if os.path.isfile(f'{folder}/{file}'): - compressor.compress_file(folder, file, target_folder, req_folder) + + with ThreadPoolExecutor(max_workers=config["FFMPEG"]["Workers"]) as executor: + futures = [ + executor.submit(compress_worker, folder, file, target_folder, req_folder) + for file in files + ] + for future in as_completed(futures): + future.result() utils.get_compression_status(req_folder) utils.sys_pause() - print(f"Time taken: {datetime.now() - start_time}") + print(f"Time taken: {datetime.now() - start_time}") \ No newline at end of file