summaryrefslogtreecommitdiff
path: root/pattern.py
diff options
context:
space:
mode:
Diffstat (limited to 'pattern.py')
-rwxr-xr-xpattern.py151
1 files changed, 27 insertions, 124 deletions
diff --git a/pattern.py b/pattern.py
index b622aeb..5470004 100755
--- a/pattern.py
+++ b/pattern.py
@@ -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()