optimg/src/__main__.py
2025-10-23 17:00:01 +02:00

134 lines
3.5 KiB
Python

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()