summaryrefslogtreecommitdiff
path: root/pb/generate.py
diff options
context:
space:
mode:
authoryo mama <pepper@scannerjammer.com>2015-05-01 14:32:07 -0700
committeryo mama <pepper@scannerjammer.com>2015-05-01 14:32:07 -0700
commite6e2eaeaa12cbc1db19aa76e3f610d0713a7d75a (patch)
tree38c6dadff1c2a6e99ccfb791077b2943e73e95d6 /pb/generate.py
parented134d6412c3ee32357f0582ee095f61210d637b (diff)
looking good
Diffstat (limited to 'pb/generate.py')
-rwxr-xr-xpb/generate.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/pb/generate.py b/pb/generate.py
new file mode 100755
index 0000000..bfac4b2
--- /dev/null
+++ b/pb/generate.py
@@ -0,0 +1,221 @@
+#!/usr/bin/python2.7
+import sys
+import os
+
+from pb.config import *
+import pb.lib.utils as utils
+
+#FIXME these guys can do stuff wider than 1000
+LIKE_A_BOSS = "ryz pepper seamonkey JAMES".split(" ")
+DEFAULT_FINALFORMAT = "gif"
+DEFAULT_TAG = "im";
+
+GRAVITY_PARAMS = ["NorthWest","North","NorthEast","West","Center","East","SouthWest","South","SouthEast"]
+GRAVITY_DEFAULT = "center"
+FORMAT_PARAMS = ["jpg", "gif", "png"]
+COMPOSE_PARAMS = [ "Over", "ATop", "Dst_Over", "Dst_In", "Dst_Out", "Multiply",
+ "Screen", "Divide", "Plus", "Difference", "Exclusion",
+ "Lighten", "Darken", "Overlay", "Hard_Light", "Soft_Light",
+ "Linear_Dodge", "Linear_Burn", "Color_Dodge", "Color_Burn" ]
+DISPOSE_PARAMS = ["None","Previous","Background"]
+DISPOSE_DEFAULT = "None"
+
+class Generate():
+ def __init__(self, **kwargs):
+ self.params = {}
+ self.now = utils.now()
+ self.files_created = []
+ self.commands = [];
+ self._required_keys = [
+#{{{ required_keys
+ #IMAGES
+ "url",
+ "background",
+
+ #BOOLS
+ "coalesce",
+ "dispose",
+ "nearest",
+ "merge_early",
+ "flip",
+ "flop",
+ "tile",
+ "transparent",
+
+ #COLORS
+ "black",
+ "white",
+ "subtract",
+
+ #INTS
+ "fuzz",
+ "width",
+ "height",
+ "brightness",
+ "contrast",
+ "saturation",
+ "rotate",
+ "hue",
+
+ #ENUMS
+ "compose",
+ "gravity",
+ "format",
+
+ #STRINGS
+ "name",
+ "callback",
+#}}}
+ ]
+ for k in self._required_keys:
+ if k in kwargs:
+ if k in [ 'url', 'background' ] and utils.bool_correct(kwargs[k]):
+ self.params[k] = {
+ 'url' : kwargs[k],
+ 'filename' : self._make_tempname(k),
+ 'path' : os.path.join(WORKING_DIR, self._make_tempname(k)) ,
+ }
+ try:
+ utils.download(self.params[k]['url'], self.params[k]['path'])
+ self.files_created.append(self.params[k]['path'])
+ self.params[k]['mimetype'] = utils.get_mimetype(self.params[k]['path'])
+ except Exception as e:
+ sys.stderr.write(str(e))
+ raise Exception ("BAD PARAMS");
+ elif k in [ 'black', 'white', 'subtract' ]:
+ try:
+ self.params[k] = utils.is_color(kwargs[k])
+ except Exception:
+ raise Exception("Unable to process color for:\n{}".format(k))
+ elif k in [
+ "coalesce", "dispose", "nearest", "merge_early",
+ "flip", "flop", "tile", "transparent",
+ ]:
+ self.params[k] = utils.bool_correct(utils.sanitize(kwargs[k]))
+ elif k == 'gravity' and self._test_enum(kwargs[k], GRAVITY_PARAMS):
+ self.params[k] = kwargs[k]
+ elif k == 'format' and self._test_enum(kwargs[k], FORMAT_PARAMS):
+ self.params[k] = kwargs[k]
+ elif k == 'compose' and self._test_enum(kwargs[k], COMPOSE_PARAMS):
+ self.params[k] = kwargs[k]
+ elif k == 'dispose' and self._test_enum(kwargs[k], DISPOSE_PARAMS):
+ self.params[k] = kwargs[k]
+ elif k in [ "fuzz", "width", "height", "brightness", "contrast", "saturation", "rotate", "hue" ]:
+ self.params[k] = str(int(kwargs[k]))
+ else:
+ self.params[k] = utils.sanitize(kwargs[k])
+
+ if self.params.get('background'):
+ self.tag = self.params.get('compose')
+ else:
+ self.tag = self.params.get('transparent', DEFAULT_TAG)
+
+ self.basename = self._get_filename();
+ self.filename = "{}.{}".format(self.basename, self.params.get('format', DEFAULT_FINALFORMAT))
+ self.filepath = os.path.join(WORKING_DIR, self.filename)
+
+ def _make_tempname(self, s):
+ return "PBTMP{}{}".format(self.now, s);
+
+ def _test_enum(self, e, arr):
+ if e in arr: return True
+ raise Exception ("Bad value: {}".format(e))
+
+ def _get_filename(self):
+ return "{}_{}_{}".format(
+ self.tag,
+ self.now,
+ self.params.get('username',"")
+ );
+
+ def _call_cmd(self, cmd):
+ try:
+ utils.call_cmd(cmd)
+ self.commands.append(" ".join(cmd));
+ except Exception:
+ raise Exception("Unable to call cmd {}".format(str(cmd)))
+
+ def _cleanup(self):
+ if not len(self.files_created):
+ pass
+ cmd = ["rm", "-f"] + self.files_created
+ self._call_cmd(cmd)
+
+ def _composite (self):
+ cmd = [
+ BIN_CONVERT, self.params['background']['path'],
+ "null:", self.filepath, "-matte",
+ "-dispose", self.params.get('dispose', DISPOSE_DEFAULT),
+ "-gravity", self.params.get("gravity",GRAVITY_DEFAULT),
+ "-compose", self.params['compose'], "-layers", "composite",
+ self.filepath ]
+ self._call_cmd(cmd);
+
+ def _convert(self):
+ cmd = [BIN_CONVERT, self.params['url']['path'] ]
+ if self.params.get('rotate'): cmd += ["-rotate", self.params['rotate'] ]
+ if self.params.get('flip'): cmd += ["-flip"]
+ if self.params.get('flop'): cmd += ["-flop"]
+ if self.params.get('transparent'):
+ if self.params.get('fuzz'):
+ cmd += ["-fuzz", "{}%".format(self.params['fuzz']) ]
+ cmd += [ "-transparent", self.params.get('subtract', "white") ]
+ if self.params.get('width') or self.params.get('height'):
+ if self.params.get('nearest'):
+ if self.params.get('format') == "gif":
+ cmd += [ "-coalesce","+map","-interpolate","Nearest","-interpolative-resize" ]
+ else:
+ cmd.append("-resize")
+ cmd.append("{}x{}".format(self.params.get('width') or "", self.params.get('height') or ""))
+ if self.params.get('black') != "black" or self.params.get('white') != 'white':
+ cmd += [ "+level-colors" , "{},{}".format(self.params.get('black','black'), self.params.get('white', 'white')) ]
+ if self.params.get('contrast'): cmd += [ '-contrast-stretch', self.params['contrast'] ]
+ if any( e in self.params.keys() for e in ['brightness', 'saturation', 'hue' ]):
+ cmd += [
+ "-modulate", "{},{},{}".format(
+ self.params.get('brightness', 100),
+ self.params.get('contrast', 100),
+ self.params.get('hue', 100)
+ )]
+ cmd.append("-coalesce"); #why? #FIXME
+ cmd += [ self.filepath ];
+ self._call_cmd(cmd);
+
+ def create(self):
+ self._convert()
+ if self.params.get('background'):
+ self._composite()
+ self._cleanup();
+
+if __name__ == "__main__":
+
+ TEST_PARAMS = {
+ 'nearest': 'true',
+# 'height': None,
+ 'compose': 'Soft_Light',
+ 'coalesce': 'true',
+ 'dispose': 'None',
+ 'gravity': 'Center',
+ 'width': '200',
+ 'black': 'black',
+ 'tile': 'true',
+ 'white': 'white',
+ 'contrast': '100',
+ 'hue': '90',
+ 'saturation': '100',
+ 'merge_early': 'true',
+ 'format': 'gif',
+ 'background': 'http://i.asdf.us/im/bc/new_1430440747.gif',
+ 'subtract': '#EE7AE9',
+ 'transparent': 'true',
+# 'rotate': None,
+ 'name': 'yo',
+# 'brightness': None,
+ 'url': 'http://asdf.us/im/new.gif',
+ 'flop': 'true',
+ 'flip': 'false',
+ 'callback': 'jsonp1430442384162',
+ 'fuzz': '5'
+ }
+ g = Generate(**TEST_PARAMS);
+ g.create()