134 lines
3.5 KiB
Python
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()
|