import sys
import json
import tempfile
import os
import subprocess
import multiprocessing
from os.path import splitext, exists
def run_mozjpeg(infile, outfile):
mozjpeg_args = ['mozjpeg', '-quality', '85', '-optimize', infile]
with open(outfile, 'w') as f:
subprocess.run(mozjpeg_args, check=True, stdout=f)
def run_webp(infile, outfile):
cwebp_args = ['cwebp', infile, '-o', outfile, '-m', '6', '-q', '85']
subprocess.run(cwebp_args, check=True)
def run_cavif(infile, outfile):
avifenc_args = ['cavif', '--cpu-used', '0', '--crf', '18', '-i', infile, '-o', outfile]
subprocess.run(avifenc_args, check=True)
if len(sys.argv) != 2:
print('Usage: {} file'.format(sys.argv[0]))
print('Creates smaller versions of the original file')
exit(2)
filename = sys.argv[1]
root = splitext(filename)[0]
expected_end = '-orig.jpg'
if not filename.endswith(expected_end):
print("expected file {} to end with {}, but it didn't".format(filename, expected_end))
exit(2)
output_root = root.removesuffix('-orig')
if not exists(filename):
print("I don't see {}, sure that's the right filename?".format(filename))
exit(2)
arg_file = root + '.json'
if not exists(arg_file):
print('I need an argument file with the name {} to work'.format(arg_file))
exit(2)
convert_args = None
with open(arg_file, 'r') as f:
convert_args = json.loads(f.read())
with tempfile.TemporaryDirectory() as tmpdirname:
tmp_file = os.path.join(tmpdirname, 'tmp.png')
convert_args = ['convert', filename, '-resize', convert_args['resize-geometry'], tmp_file]
subprocess.run(convert_args, check=True)
run_mozjpeg(tmp_file, output_root + '.jpg')
jpeg_size = os.path.getsize(output_root + '.jpg')
run_webp(tmp_file, output_root + '.webp')
webp_size = os.path.getsize(output_root + '.webp')
if jpeg_size < webp_size:
print('Will not use {}.webp as it is bigger than the jpg'.format(output_root))
os.remove(output_root + '.webp')
run_cavif(tmp_file, output_root + '.avif')
avif_size = os.path.getsize(output_root + '.avif')
if webp_size < avif_size or jpeg_size < avif_size:
print('Will not use {}.avif as it is either bigger than the jpg/webp version'.format(output_root))
os.remove(output_root + '.avif')