diff options
| author | yo mama <pepper@scannerjammer.com> | 2015-04-30 15:08:01 -0700 |
|---|---|---|
| committer | yo mama <pepper@scannerjammer.com> | 2015-04-30 15:08:01 -0700 |
| commit | 03f45bb4225740f2ebe4adfd8de24f67d33ee0e3 (patch) | |
| tree | f555265c798f7d1dff25315e79eb90055f4bab74 /pattern.py | |
| parent | da8255b0ad5703837c315c082a6f69edc47754a7 (diff) | |
good
Diffstat (limited to 'pattern.py')
| -rwxr-xr-x | pattern.py | 151 |
1 files changed, 27 insertions, 124 deletions
@@ -1,121 +1,21 @@ #!/usr/bin/python2.7 -from subprocess import call, Popen, PIPE -import urllib -import urllib2 import os import sys import random import re -import time -urlencode = urllib.urlencode -urlopen = urllib2.urlopen -Request = urllib2.Request +import urllib +from config import * +import lib.utils as utils import simplejson as json from PIL import Image import uuid -WORKING_DIR = "/tmp" -#WORKING_DIR = "/var/www/cache" -BIN_COMPOSITE = "/usr/bin/composite" -BIN_CONVERT = "/usr/bin/convert" -BIN_IDENTIFY = "/usr/bin/identify" -DEFAULT_FINALFORMAT = "png"; - -MAX_SIZE = 1024 * 1024 * 1.2 * 1.5 - -#FIXME make test params FUSE_MODE="Pin_Light" -TEST_PARAMS = { -# "pattern_url" : "http://asdf.us/impattern/patterns/1.png", - "pattern_data" : '{"matrix":[["0","0","0","0","0","1","0","0","0","0"],["0","0","0","0","1","1","1","0","0","0"],["0","0","1","1","1","0","1","0","0","0"],["0","1","1","0","0","0","0","0","0","0"],["0","1","0","0","1","0","0","0","0","0"],["0","1","0","0","1","0","0","0","1","0"],["0","1","0","0","1","1","0","0","1","0"],["0","1","0","0","0","1","1","1","1","0"],["0","1","1","1","1","0","0","0","0","0"],["0","0","0","0","1","0","0","0","0","0"]],"width":"10","height":"10"}', -# "username" : "garfield", -# "image_url" : "http://i.asdf.us/im/be/PinkHijab_1425078647_reye.gif", -} - -def bool_correct(s): - if re.match(r'^false$', s, re.IGNORECASE): - return False - elif re.match(r'^true$', s, re.IGNORECASE): - return True - else: - return s - -#{{{Utility functions -class dotdict(dict): - """dot.notation access to dictionary attributes""" - def __getattr__(self, attr): - return self.get(attr) - __setattr__= dict.__setitem__ - __delattr__= dict.__delitem__ -def sanitize (str): - return re.sub(r'\W+', '', str) - -def now(): - return int(time.time()) - -def browser_request (url, data=None): - headers = { - 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', - 'Accept': '*/*', - } - try: - req = Request(url, data, headers) - response = urlopen(req) - except IOError, e: - if hasattr(e, 'code'): - sys.stderr.write( '%s - ERROR %s' % (url, e.code) ) - raise; - return None - else: - return response - -def download(url, destination, max_size=MAX_SIZE): - response = browser_request(url, None) - rawimg = response.read() - if len(rawimg) == 0: - sys.stderr.write("got zero-length file") - raise; - if len(rawimg) > max_size: - sys.stderr.write("file too big: max size {} KB / {} is {} KB".format( - str(MAX_SIZE/1024), - destination, - str(len(rawimg)/1024) - )) - raise; - f = open(destination, "w") - f.write(rawimg) - f.close() - -def dimensions (filepath): - #works in lieu of a mimetype check (it reads the header as well) - ident = (Popen([BIN_IDENTIFY, filepath], stdout=PIPE).communicate()[0]).split(" ") - return ident[2].split("x") - -def file_size (filepath): - try: - return os.stat(file)[6] - except Exception as e: - sys.stderr.write(str(e)) - raise; - -def gif_frames(filepath): - try: - info = Popen([BIN_IDENTIFY,filepath], stdout=PIPE).communicate()[0] - frames = filter((lambda x: x), map( - (lambda x: x.split(" ")[0]), - (info).split('\n') - )) - return frames - except Exception as e: - sys.stderr.write(str(e)) - raise; -#}}} class Pattern: - def __init__(self, params): + def __init__(self, **kwargs): self.params = {} - self.now = now() self.tag = "imPattern"; self._pid = str(os.getpid()) self.commands = []; @@ -131,20 +31,20 @@ class Pattern: ] self.files_created = [] for k in self._required_keys: - if k in params: + if k in kwargs: if k in [ 'pattern_url', 'image_url' ]: - self.params[k] = params[k] + self.params[k] = kwargs[k] elif k == 'pattern_data': - self.params[k] = params[k] #FIXME add conversion data + self.params[k] = kwargs[k] #FIXME add conversion data else: - self.params[k] = sanitize(params[k]) + self.params[k] = utils.sanitize(kwargs[k]) else: self.params[k] = False; if not self.params['image_url']: sys.stderr.write('no image url'); raise ValueError - self.params = dotdict(self.params) + self.params = utils.dotdict(self.params) self.basename, self._format = self._get_filename(); #FIXME omit file extension for downloaded files @@ -154,7 +54,7 @@ class Pattern: self._download(self.params.image_url, self._downloaded_file) - self.width, self.height = dimensions(self._downloaded_file) # same here + self.width, self.height = utils.dimensions(self._downloaded_file) # same here self.filename = "{}.{}".format(self.basename, self._format) self.filepath = os.path.join(WORKING_DIR, self.filename) @@ -169,21 +69,18 @@ class Pattern: def _download(self, url, dest): try: - download(url, dest) + utils.download(url, dest) self.files_created.append(dest) except Exception as e: sys.stderr.write(str(e)) raise; - def _call_cmd(self, cmd, error=""): - try: - call(cmd) - self.commands.append(" ".join(cmd)); - except Exception as e: - if error: - sys.stderr.write(error) - else: - sys.stderr.write(str(e)) + 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 _from_pattern_data(self): def boolToColor(boolean): @@ -215,8 +112,8 @@ class Pattern: name_part = url.split("/")[-1] try: parts = name_part.split(".") - name_part = sanitize(parts[-2]) - file_format = sanitize(parts[-1]) + name_part = utils.sanitize(parts[-2]) + file_format = utils.sanitize(parts[-1]) if not name_part or not file_format: sys.stderr.write( "Incompatible input file type") raise; @@ -228,7 +125,7 @@ class Pattern: raise; if (len(name_part) > 20): name_part = name_part[:-20] - return "{}{}_{}_{}".format(self.tag, name_part, self.now, self.params.username or ""), file_format + return "{}{}_{}_{}".format(self.tag, name_part, utils.now(), self.params.username or ""), file_format def _cleanup(self): cmd = ["rm"]+self.files_created @@ -263,6 +160,12 @@ class Pattern: self._fuse_mask(); if __name__ == "__main__": - p = Pattern(TEST_PARAMS) + TEST_PARAMS = { + # "pattern_url" : "http://asdf.us/impattern/patterns/1.png", + "pattern_data" : '{"matrix":[["0","0","0","0","0","1","0","0","0","0"],["0","0","0","0","1","1","1","0","0","0"],["0","0","1","1","1","0","1","0","0","0"],["0","1","1","0","0","0","0","0","0","0"],["0","1","0","0","1","0","0","0","0","0"],["0","1","0","0","1","0","0","0","1","0"],["0","1","0","0","1","1","0","0","1","0"],["0","1","0","0","0","1","1","1","1","0"],["0","1","1","1","1","0","0","0","0","0"],["0","0","0","0","1","0","0","0","0","0"]],"width":"10","height":"10"}', + # "username" : "garfield", + "image_url" : "http://i.asdf.us/im/be/PinkHijab_1425078647_reye.gif", + } + p = Pattern(**TEST_PARAMS) p.create() |
