FFMpeg-Compressor: Copy unprocessed files while running

This commit is contained in:
OleSTEEP 2024-01-06 14:25:01 +03:00
parent 6698db5fef
commit 27efc155b9
3 changed files with 46 additions and 41 deletions

View file

@ -71,7 +71,4 @@ if __name__ == "__main__":
except FileNotFoundError: except FileNotFoundError:
pass pass
if configloader.config['FFMPEG']['CopyUnprocessed']:
printer.info("Copying unprocessed files...")
utils.add_unprocessed_files(orig_folder)
utils.get_compression_status(orig_folder) utils.get_compression_status(orig_folder)

View file

@ -30,13 +30,15 @@ def compress_audio(folder, file, target_folder, extension):
try: try:
(ffmpeg (ffmpeg
.input(f'{folder}/{file}') .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) .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 utils.errors_count += 1
if not configloader.config['FFMPEG']['HideErrors']: 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}' return f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'
@ -47,33 +49,39 @@ def compress_video(folder, file, target_folder, extension):
try: try:
(ffmpeg (ffmpeg
.input(f'{folder}/{file}') .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) .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 utils.errors_count += 1
if not configloader.config['FFMPEG']['HideErrors']: 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}' return f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'
def compress_image(folder, file, target_folder, extension): def compress_image(folder, file, target_folder, extension):
quality = configloader.config['IMAGE']['Quality'] 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}%") printer.files(file, os.path.splitext(file)[0], extension, f"{quality}%")
image.save(f"{target_folder}/{os.path.splitext(file)[0]}.{extension}", try:
optimize=True, image = Image.open(f'{folder}/{file}')
lossless=configloader.config['IMAGE']['Lossless'],
quality=quality, if (extension == "jpg" or extension == "jpeg" or extension == "avif" or
minimize_size=True) (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}' 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}') .output(f'{target_folder}/{file}')
.run(quiet=True) .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 utils.errors_count += 1
if not configloader.config['FFMPEG']['HideErrors']: 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}' return f'{target_folder}/{file}'

View file

@ -53,22 +53,21 @@ def get_compression_status(orig_folder):
get_compression(orig_folder, f"{orig_folder}_compressed") get_compression(orig_folder, f"{orig_folder}_compressed")
def add_unprocessed_files(orig_folder): def add_unprocessed_file(orig_folder, new_folder):
for folder, folders, files in os.walk(orig_folder): if configloader.config['FFMPEG']['CopyUnprocessed']:
for file in files: filename = orig_folder.split().pop()
new_folder = f"{folder}".replace(orig_folder, f"{orig_folder}_compressed") copyfile(orig_folder, new_folder)
if len(glob(f"{folder}/{os.path.splitext(file)[0]}.*")) > 1: printer.info(f"File {filename} copied to compressed folder.")
if len(glob(f"{new_folder}/{file}")):
copyfile(f"{folder}/{file}", f"{new_folder}/{file} (copy)")
printer.warning( def check_duplicates(new_folder):
f'Duplicate file has been found! Check manually this files - "{file}", "{file} (copy)"') filename = new_folder.split().pop()
else: if os.path.exists(new_folder):
copyfile(f"{folder}/{file}", f"{new_folder}/{file}") printer.warning(
printer.info(f"File {file} copied to compressed folder.") f'Duplicate file has been found! Check manually this files - "{filename}", '
else: f'"{os.path.splitext(filename)[0] + "(copy)" + os.path.splitext(filename)[1]}"')
if not len(glob(f"{new_folder}/{os.path.splitext(file)[0]}.*")): return os.path.splitext(new_folder)[0] + "(copy)" + os.path.splitext(new_folder)[1]
copyfile(f"{folder}/{file}", f"{new_folder}/{file}") return new_folder
printer.info(f"File {file} copied to compressed folder.")
def help_message(): def help_message():