import argparse import logging import os import sys from .files import Directory, FileImgMimetype, FileSizeRange from .optimizer import ImgOptimizer DEFAULT_DEST_DIR = "data" def main(): stdout_handler = logging.StreamHandler(stream=sys.stdout) logging.basicConfig( format="[%(levelname)s] - %(asctime)s - %(message)s", level=logging.INFO, handlers=(stdout_handler,), ) parser = argparse.ArgumentParser( "optimg", description="Optimize JPEG and PNG files from a directory." ) parser.add_argument("src", type=str, help="Directory path to scan.") parser.add_argument( "--mimetype", type=str, choices=FileImgMimetype._member_names_, default=None, help="Filter by mimetype. Default is all.", ) parser.add_argument( "--size", type=str, choices=FileSizeRange._member_names_, default=None, help="Filter by file size. Default is all.", ) parser.add_argument( "--dest", type=str, help="Base destination directory of optimized files.", ) parser.add_argument( "--workers", type=int, default=4, help="Number of workers used to optimize files.", ) parser.add_argument( "--show", action="store_true", default=False, help="Details the directory by mimetypes and quit.", ) parser.add_argument( "--debug", action="store_true", default=False, help="Set log level to debug. Default is info.", ) args = parser.parse_args() if args.debug: logging.root.setLevel(logging.DEBUG) logging.debug("set debug mode on") try: directory = Directory.from_path(args.src) except Exception as e: logging.error(e) exit(1) if args.show: directory.show() exit(0) try: mimetype = ( FileImgMimetype.from_str(args.mimetype) if args.mimetype is not None else None ) size_range = ( FileSizeRange.from_str(args.size) if args.size is not None else None ) except Exception as e: logging.error(f"unexpected error occurred while parsing arguments: {e}") exit(1) nb_workers = args.workers dest_dir = args.dest or DEFAULT_DEST_DIR os.makedirs(dest_dir, exist_ok=True) fg = directory.get_file_group(mimetype, size_range) if not len(fg): logging.info( "no files found for mimetype: %s and file size range: %s", mimetype, size_range, ) exit(0) logging.info( "launching optimization (%d) for type: %s and size range: %s on %d workers...", len(fg), mimetype.value if mimetype is not None else "all", size_range.value if size_range is not None else "all", nb_workers, ) optimizer = ImgOptimizer.init(dest_dir, args.workers) try: result = optimizer.optimize(fg) except KeyboardInterrupt: logging.error("oops, you stopped the optimizer abrutly...") exit(0) except Exception as e: logging.fatal( f"unexpected error occurred while optimizing, err: {e}", exc_info=True ) exit(1) (optimized, percent, size) = result.stats() logging.info( f"total optimization ({optimized}/{len(result.orig)}): {percent:.2f}% -> {size:.2f} Mb" # noqa ) result.check_errors() if __name__ == "__main__": main()