diff --git a/FFMpeg-Compressor/main.py b/FFMpeg-Compressor/main.py index 84d86df..8e68e42 100755 --- a/FFMpeg-Compressor/main.py +++ b/FFMpeg-Compressor/main.py @@ -71,7 +71,4 @@ if __name__ == "__main__": except FileNotFoundError: pass - if configloader.config['FFMPEG']['CopyUnprocessed']: - printer.info("Copying unprocessed files...") - utils.add_unprocessed_files(orig_folder) utils.get_compression_status(orig_folder) diff --git a/FFMpeg-Compressor/modules/compressor.py b/FFMpeg-Compressor/modules/compressor.py index 71f571c..b1d22ea 100644 --- a/FFMpeg-Compressor/modules/compressor.py +++ b/FFMpeg-Compressor/modules/compressor.py @@ -30,13 +30,15 @@ def compress_audio(folder, file, target_folder, extension): try: (ffmpeg .input(f'{folder}/{file}') - .output(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}', audio_bitrate=bitrate) + .output(utils.check_duplicates(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'), + audio_bitrate=bitrate) .run(quiet=True) ) - except ffmpeg._run.Error: + except ffmpeg._run.Error as e: + utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') utils.errors_count += 1 if not configloader.config['FFMPEG']['HideErrors']: - printer.error(f"File {file} can't be processed! Maybe it is ffmpeg error or unsupported file.") + printer.error(f"File {file} can't be processed! Error: {e}") return f'{target_folder}/{os.path.splitext(file)[0]}.{extension}' @@ -47,33 +49,39 @@ def compress_video(folder, file, target_folder, extension): try: (ffmpeg .input(f'{folder}/{file}') - .output(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}', vcodec=codec) + .output(utils.check_duplicates(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'), vcodec=codec) .run(quiet=True) ) - except ffmpeg._run.Error: + except ffmpeg._run.Error as e: + utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') utils.errors_count += 1 if not configloader.config['FFMPEG']['HideErrors']: - printer.error(f"File {file} can't be processed! Maybe it is ffmpeg error or unsupported file.") + printer.error(f"File {file} can't be processed! Error: {e}") return f'{target_folder}/{os.path.splitext(file)[0]}.{extension}' def compress_image(folder, file, target_folder, extension): quality = configloader.config['IMAGE']['Quality'] - - image = Image.open(f'{folder}/{file}') - - if (extension == "jpg" or extension == "jpeg" or extension == "avif" or - (extension == "webp" and not configloader.config['FFMPEG']['WebpRGBA'])): - if has_transparency(image): - printer.warning(f"{file} has transparency. Changing to fallback...") - extension = configloader.config['IMAGE']['FallBackExtension'] - printer.files(file, os.path.splitext(file)[0], extension, f"{quality}%") - image.save(f"{target_folder}/{os.path.splitext(file)[0]}.{extension}", - optimize=True, - lossless=configloader.config['IMAGE']['Lossless'], - quality=quality, - minimize_size=True) + try: + image = Image.open(f'{folder}/{file}') + + if (extension == "jpg" or extension == "jpeg" or extension == "avif" or + (extension == "webp" and not configloader.config['FFMPEG']['WebpRGBA'])): + if has_transparency(image): + printer.warning(f"{file} has transparency. Changing to fallback...") + extension = configloader.config['IMAGE']['FallBackExtension'] + + image.save(utils.check_duplicates(f"{target_folder}/{os.path.splitext(file)[0]}.{extension}"), + optimize=True, + lossless=configloader.config['IMAGE']['Lossless'], + quality=quality, + minimize_size=True) + except Exception as e: + utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') + utils.errors_count += 1 + if not configloader.config['FFMPEG']['HideErrors']: + printer.error(f"File {file} can't be processed! Error: {e}") return f'{target_folder}/{os.path.splitext(file)[0]}.{extension}' @@ -85,8 +93,9 @@ def compress(folder, file, target_folder): .output(f'{target_folder}/{file}') .run(quiet=True) ) - except ffmpeg._run.Error: + except ffmpeg._run.Error as e: + utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') utils.errors_count += 1 if not configloader.config['FFMPEG']['HideErrors']: - printer.error(f"File {file} can't be processed! Maybe it is ffmpeg error or unsupported file.") + printer.error(f"File {file} can't be processed! Error: {e}") return f'{target_folder}/{file}' diff --git a/FFMpeg-Compressor/modules/utils.py b/FFMpeg-Compressor/modules/utils.py index ffd6cff..226ecb5 100644 --- a/FFMpeg-Compressor/modules/utils.py +++ b/FFMpeg-Compressor/modules/utils.py @@ -53,22 +53,21 @@ def get_compression_status(orig_folder): get_compression(orig_folder, f"{orig_folder}_compressed") -def add_unprocessed_files(orig_folder): - for folder, folders, files in os.walk(orig_folder): - for file in files: - new_folder = f"{folder}".replace(orig_folder, f"{orig_folder}_compressed") - if len(glob(f"{folder}/{os.path.splitext(file)[0]}.*")) > 1: - if len(glob(f"{new_folder}/{file}")): - copyfile(f"{folder}/{file}", f"{new_folder}/{file} (copy)") - printer.warning( - f'Duplicate file has been found! Check manually this files - "{file}", "{file} (copy)"') - else: - copyfile(f"{folder}/{file}", f"{new_folder}/{file}") - printer.info(f"File {file} copied to compressed folder.") - else: - if not len(glob(f"{new_folder}/{os.path.splitext(file)[0]}.*")): - copyfile(f"{folder}/{file}", f"{new_folder}/{file}") - printer.info(f"File {file} copied to compressed folder.") +def add_unprocessed_file(orig_folder, new_folder): + if configloader.config['FFMPEG']['CopyUnprocessed']: + filename = orig_folder.split().pop() + copyfile(orig_folder, new_folder) + printer.info(f"File {filename} copied to compressed folder.") + + +def check_duplicates(new_folder): + filename = new_folder.split().pop() + if os.path.exists(new_folder): + printer.warning( + f'Duplicate file has been found! Check manually this files - "{filename}", ' + f'"{os.path.splitext(filename)[0] + "(copy)" + os.path.splitext(filename)[1]}"') + return os.path.splitext(new_folder)[0] + "(copy)" + os.path.splitext(new_folder)[1] + return new_folder def help_message():