def check_mozjpeg_binary():
    try:
        mozjpeg.check_binary()
        logger.info('mozjpeg binary found.')
    except subprocess.CalledProcessError as e:
        logger.error('mozjpeg binary not found.')
        exit(1)
def check_working_directory(directory):
    if os.path.exists(directory) and os.path.isdir(directory):
        logger.info('Working directory: %s' % directory)
    elif os.path.isfile(directory):
        logger.error('Working directory is not a valid directory (%s)' %
                     directory)
        exit(2)
    else:
        logger.error('Working directory does not exist (%s)' % directory)
        exit(2)
def _list_filenames(directory):
    logger.info('Listing files...')

    filenames = glob.glob('%s/*.*' % directory, recursive=True)
    filenames = sorted(filenames)

    after_filename = parse_args().after

    if after_filename:
        after_filename = '%s/%s' % (directory, after_filename)

        try:
            after_filename_position = filenames.index(after_filename)
            filenames = filenames[after_filename_position + 1:]
        except ValueError:
            logger.error('Filename « %s » do not exists.' % after_filename)
            exit(1)

    return filenames
def optimize_images_from_directory(directory):
    handled_images = 0
    handled_images_success = 0
    handled_images_errors = 0

    filenames = _list_filenames(directory)
    filenames_len = len(filenames)

    for filename in filenames:
        handled_images += 1

        try:
            _optimize_image(filename)
            handled_images_success += 1
        except Exception:
            logger.exception('An error occurred during optimization')
            handled_images_errors += 1

        logger.info('Handled %d images on %d, with %d success and %d fails' %
                    (handled_images, filenames_len, handled_images_success,
                     handled_images_errors))
def _optimize_non_jpeg_image(filename):
    logger.info('Optimizing « %s » with Pillow...' % filename)

    pillow.optimize(filename)
    fix_permissions(filename)
def _optimize_jpeg(filename):
    logger.info('Optimizing « %s » with mozjpeg...' % filename)

    mozjpeg.optimize(filename)
    fix_permissions(filename)