diff options
| author | yo mama <pepper@scannerjammer.com> | 2015-05-01 14:32:07 -0700 |
|---|---|---|
| committer | yo mama <pepper@scannerjammer.com> | 2015-05-01 14:32:07 -0700 |
| commit | e6e2eaeaa12cbc1db19aa76e3f610d0713a7d75a (patch) | |
| tree | 38c6dadff1c2a6e99ccfb791077b2943e73e95d6 /pb/generate.py | |
| parent | ed134d6412c3ee32357f0582ee095f61210d637b (diff) | |
looking good
Diffstat (limited to 'pb/generate.py')
| -rwxr-xr-x | pb/generate.py | 221 |
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() |
