0

optimizeimages: code style fixes

Now PEP8 compliant!
This commit is contained in:
Nicolas F
2017-03-16 14:58:41 +01:00
parent f1909e9684
commit 5c44084332

View File

@@ -18,6 +18,7 @@ import subprocess
import shlex import shlex
import logging import logging
class Optimizer: class Optimizer:
binaryname = "" binaryname = ""
binarynames = [] binarynames = []
@@ -27,15 +28,16 @@ class Optimizer:
def optimize(self, img): def optimize(self, img):
raise NotImplementedError("I can't let you do that, Dave.") raise NotImplementedError("I can't let you do that, Dave.")
def fire_and_forget(self, args): def fire_and_forget(self, args):
subprocess.check_call(args) subprocess.check_call(args)
def check_availability(self): def check_availability(self):
path = os.environ.get("PATH").split(os.pathsep) path = os.environ.get("PATH").split(os.pathsep)
def exists_in_path(prog): def exists_in_path(prog):
result = filter(lambda x: os.path.exists(os.path.join(x, prog)), path) result = filter(lambda x: os.path.exists(os.path.join(x, prog)),
path)
return len(result) != 0 return len(result) != 0
binaries = self.binarynames + [x + ".exe" for x in self.binarynames] binaries = self.binarynames + [x + ".exe" for x in self.binarynames]
@@ -44,12 +46,15 @@ class Optimizer:
self.binaryname = b self.binaryname = b
break break
else: else:
raise Exception("Optimization programs '%s' were not found!" % binaries) raise Exception("Optimization programs '%s' were not found!" %
binaries)
def is_crusher(self): def is_crusher(self):
"""Should return True if the optimization is lossless, i.e. none of the actual image data will be changed.""" """Should return True if the optimization is lossless, i.e. none of the
raise NotImplementedError("I'm so abstract I can't even say whether I'm a crusher.") actual image data will be changed."""
raise NotImplementedError("I'm so abstract I can't even say whether "
"I'm a crusher.")
class NonAtomicOptimizer(Optimizer): class NonAtomicOptimizer(Optimizer):
def cleanup(self, img): def cleanup(self, img):
@@ -60,34 +65,37 @@ class NonAtomicOptimizer(Optimizer):
subprocess.check_call(args) subprocess.check_call(args)
self.cleanup(img) self.cleanup(img)
class PNGOptimizer: class PNGOptimizer:
def __init__(self): def __init__(self):
raise NotImplementedError("I can't let you do that, Dave.") raise NotImplementedError("I can't let you do that, Dave.")
class JPEGOptimizer: class JPEGOptimizer:
def __init__(self): def __init__(self):
raise NotImplementedError("I can't let you do that, Dave.") raise NotImplementedError("I can't let you do that, Dave.")
class pngnq(NonAtomicOptimizer, PNGOptimizer): class pngnq(NonAtomicOptimizer, PNGOptimizer):
binarynames = ["pngnq-s9", "pngnq"] binarynames = ["pngnq-s9", "pngnq"]
def __init__(self, sampling=3, dither="n"): def __init__(self, sampling=3, dither="n"):
if sampling < 1 or sampling > 10: if sampling < 1 or sampling > 10:
raise Exception("Invalid sampling value '%d' for pngnq!" % sampling) raise Exception("Invalid sampling value '%d' for pngnq!" %
sampling)
if dither not in ["n", "f"]: if dither not in ["n", "f"]:
raise Exception("Invalid dither method '%s' for pngnq!" % dither) raise Exception("Invalid dither method '%s' for pngnq!" % dither)
self.sampling = sampling self.sampling = sampling
self.dither = dither self.dither = dither
def optimize(self, img): def optimize(self, img):
if img.endswith(".tmp"): if img.endswith(".tmp"):
extension = ".tmp" extension = ".tmp"
else: else:
extension = ".png.tmp" extension = ".png.tmp"
args = [self.binaryname, "-s", str(self.sampling), "-f", "-e", extension, img] args = [self.binaryname, "-s", str(self.sampling), "-f", "-e",
extension, img]
# Workaround for poopbuntu 12.04 which ships an old broken pngnq # Workaround for poopbuntu 12.04 which ships an old broken pngnq
if self.dither != "n": if self.dither != "n":
args.insert(1, "-Q") args.insert(1, "-Q")
@@ -98,16 +106,18 @@ class pngnq(NonAtomicOptimizer, PNGOptimizer):
def is_crusher(self): def is_crusher(self):
return False return False
class pngcrush(NonAtomicOptimizer, PNGOptimizer): class pngcrush(NonAtomicOptimizer, PNGOptimizer):
binarynames = ["pngcrush"] binarynames = ["pngcrush"]
# really can't be bothered to add some interface for all # really can't be bothered to add some interface for all
# the pngcrush options, it sucks anyway # the pngcrush options, it sucks anyway
def __init__(self, brute=False): def __init__(self, brute=False):
self.brute = brute self.brute = brute
def optimize(self, img): def optimize(self, img):
args = [self.binaryname, img, img + ".tmp"] args = [self.binaryname, img, img + ".tmp"]
if self.brute == True: # Was the user an idiot? if self.brute: # Was the user an idiot?
args.insert(1, "-brute") args.insert(1, "-brute")
NonAtomicOptimizer.fire_and_forget(self, args, img) NonAtomicOptimizer.fire_and_forget(self, args, img)
@@ -115,18 +125,21 @@ class pngcrush(NonAtomicOptimizer, PNGOptimizer):
def is_crusher(self): def is_crusher(self):
return True return True
class optipng(Optimizer, PNGOptimizer): class optipng(Optimizer, PNGOptimizer):
binarynames = ["optipng"] binarynames = ["optipng"]
def __init__(self, olevel=2): def __init__(self, olevel=2):
self.olevel = olevel self.olevel = olevel
def optimize(self, img): def optimize(self, img):
Optimizer.fire_and_forget(self, [self.binaryname, "-o" + str(self.olevel), "-quiet", img]) Optimizer.fire_and_forget(self, [self.binaryname, "-o" +
str(self.olevel), "-quiet", img])
def is_crusher(self): def is_crusher(self):
return True return True
class advpng(Optimizer, PNGOptimizer): class advpng(Optimizer, PNGOptimizer):
binarynames = ["advpng"] binarynames = ["advpng"]
crusher = True crusher = True
@@ -135,21 +148,24 @@ class advpng(Optimizer, PNGOptimizer):
self.olevel = olevel self.olevel = olevel
def optimize(self, img): def optimize(self, img):
Optimizer.fire_and_forget(self, [self.binaryname, "-z" + str(self.olevel), "-q", img]) Optimizer.fire_and_forget(self, [self.binaryname, "-z" +
str(self.olevel), "-q", img])
def is_crusher(self): def is_crusher(self):
return True return True
class jpegoptim(Optimizer, JPEGOptimizer): class jpegoptim(Optimizer, JPEGOptimizer):
binarynames = ["jpegoptim"] binarynames = ["jpegoptim"]
crusher = True crusher = True
quality = None quality = None
target_size = None target_size = None
def __init__(self, quality = None, target_size = None): def __init__(self, quality=None, target_size=None):
if quality is not None: if quality is not None:
if quality < 0 or quality > 100: if quality < 0 or quality > 100:
raise Exception("Invalid target quality %d for jpegoptim" % quality) raise Exception("Invalid target quality %d for jpegoptim" %
quality)
self.quality = quality self.quality = quality
if target_size is not None: if target_size is not None:
@@ -175,7 +191,6 @@ class jpegoptim(Optimizer, JPEGOptimizer):
else: else:
return True return True
def optimize_image(imgpath, imgformat, optimizers): def optimize_image(imgpath, imgformat, optimizers):
for opt in optimizers: for opt in optimizers: