diff options
| -rw-r--r-- | Params/__init__.py | 2 | ||||
| -rwxr-xr-x | Pb/Generate/__init__.py | 29 | ||||
| -rwxr-xr-x | Pb/Grid/__init__.py | 84 | ||||
| -rwxr-xr-x | Pb/Landscape/__init__.py | 66 | ||||
| -rwxr-xr-x | Pb/Pattern/__init__.py | 115 | ||||
| -rw-r--r-- | test.py | 4 |
6 files changed, 82 insertions, 218 deletions
diff --git a/Params/__init__.py b/Params/__init__.py index 2c94460..dc8fbfa 100644 --- a/Params/__init__.py +++ b/Params/__init__.py @@ -66,6 +66,8 @@ class Params(object): elif value_type == "enum": if value not in enum_values: raise ValueError + elif value_type == "json": + pass self.__setattr__(key, value) except Exception as e: self.err_warn("key: %s value: %s" % (key, value), error=str(e)) diff --git a/Pb/Generate/__init__.py b/Pb/Generate/__init__.py index 76082aa..0062652 100755 --- a/Pb/Generate/__init__.py +++ b/Pb/Generate/__init__.py @@ -14,7 +14,7 @@ _compose_params = [ "Over", "ATop", "Dst_Over", "Dst_In", "Dst_Out", "Multiply", _dispose_params = ["None","Previous","Background"] _dispose_default = "None" -class Im(Pb): +class PbGenerate(Pb): example_params = { #{{{ example params 'nearest': 'true', @@ -76,12 +76,13 @@ class Im(Pb): format=DEFAULT_FINALFORMAT, dispose="None", #STRINGS - username=None, + name=None, callback=None, ): + super(PbGenerate,self).__init__(); #IMAGES - self.params.set_val("url", url, value_type="image_url") - self.params.set_val("background", background, value_type="image_url") + self.params.set_val("url", url, value_type="img_url") + self.params.set_val("background", background, value_type="img_url") #BOOLS self.params.set_val("coalesce", coalesce, value_type="bool") @@ -98,14 +99,14 @@ class Im(Pb): self.params.set_val("subtract", subtract, value_type="color") #INTS - self.params.set_val("fuzz", fuzz, value_type="int") - self.params.set_val("width", width, value_type="int") - self.params.set_val("height", height, value_type="int") - self.params.set_val("brightness", brightness, value_type="int") - self.params.set_val("contrast", contrast, value_type="int") - self.params.set_val("saturation", saturation, value_type="int") - self.params.set_val("rotate", rotate, value_type="int") - self.params.set_val("hue", hue, value_type="int") + self.params.set_val("fuzz", fuzz or 0, value_type="int") + self.params.set_val("width", width or 0, value_type="int") + self.params.set_val("height", height or 0, value_type="int") + self.params.set_val("brightness", brightness or 0, value_type="int") + self.params.set_val("contrast", contrast or 0, value_type="int") + self.params.set_val("saturation", saturation or 0, value_type="int") + self.params.set_val("rotate", rotate or 0, value_type="int") + self.params.set_val("hue", hue or 0, value_type="int") #ENUMS self.params.set_val("compose", compose, value_type="enum", enum_values=_compose_params) @@ -114,13 +115,15 @@ class Im(Pb): self.params.set_val("format", format, value_type="enum", enum_values=OUTPUT_IMAGE_TYPES) #STRINGS - self.params.set_val("username", username, value_type="string") + self.params.set_val("username", name, value_type="string") self.params.set_val("callback", callback, value_type="string") self.tag = _default_tag if self.params.background: self.tag = self.params.compose if self.params.transparent: self.tag = self.params.transparent + self.filename, self.filepath = self._filename_filepath_create(url=self.params.url['url'], extension=self.params.format) + def _composite (self): cmd = [ BIN_CONVERT, self.params.background['path'], diff --git a/Pb/Grid/__init__.py b/Pb/Grid/__init__.py index 09718bd..b2c8bdd 100755 --- a/Pb/Grid/__init__.py +++ b/Pb/Grid/__init__.py @@ -11,7 +11,17 @@ from Pb import Pb _default_line_color = "silver" -class Imgrid(Pb): +class PbGrid(Pb): + example_params = { + 'bgimage' : 'http://i.asdf.us/im/1a/imBreak_1424909483_xx_abridged___.gif', + 'planebgimage' : 'http://i.imgur.com/FICZtph.png', + 'tilt' : '30', + 'spacing' : '30', + 'hlines' : 'true', + 'roll' : '30', + 'shadow' : 'true', + 'trim' : 'true' + } def __init__(self, width=None, height=None, @@ -37,41 +47,23 @@ class Imgrid(Pb): finalformat=DEFAULT_FINALFORMAT, username=None ): - super(Imgrid,self).__init__(); - - _frame = inspect.currentframe(); - _args_vals = inspect.getargvalues(_frame); - for arg in _args_vals.args: - if arg == "self": - continue - argval = _args_vals.locals.get(arg) - try: - if arg in [ 'skycolor', 'bgcolor', 'planebgcolor','linecolor' ]: - self.params.set_val(arg, argval, value_type="color") - elif arg == 'opacity': - self.params.set_val(arg, argval, value_type="float") - elif arg == 'zoom': - self.params.set_val(arg, argval, value_type="int") - elif arg in [ 'bgimage', 'planebgimage', 'imageinstead' ]: - self.params.set_val(arg, argval, value_type="img_url") - if self.params.get_mimetype(arg) == 'gif': - self.params.gif_convert_to_still(arg) - self.files_created.append(self.params.get_filepath(arg)) - elif arg in ['finalformat', 'username' ] : - self.params.set_val(arg, argval, value_type="string") - else: - self.params.set_val(arg, argval, value_type="bool") - - except Exception as e: - self.log_err(str(e)) - - #FIXME these need to be bumped up to the parent class - self.basename = self._get_filename(); - self.filename = "{}.{}".format(self.basename, self.params.finalformat) - #final filepath is stored in self.filepath - self.filepath = os.path.join(WORKING_DIR, self.filename) - - + super(PbGrid,self).__init__(); + self.params.set_val("skycolor", skycolor, value_type="color") + self.params.set_val("bgcolor", bgcolor, value_type="color") + self.params.set_val("planebgcolor", planebgcolor, value_type="color") + self.params.set_val("linecolor", linecolor, value_type="color") + self.params.set_val("opacity", opacity, value_type="float") + self.params.set_val("zoom", zoom, value_type="int") + self.params.set_val("bgimage", bgimage, value_type="img_url") + self.params.set_val("planebgimage", planebgimage, value_type="img_url") + self.params.set_val("imageinstead", imageinstead, value_type="img_url") +#FIXME choose gif frame + self.params.set_val("spacing", spacing, value_type="bool") + self.params.set_val("vlines", vlines, value_type="bool") + self.params.set_val("hlines", hlines, value_type="bool") + self.params.set_val("shadow", shadow, value_type="bool") + self.params.set_val("finalformat", finalformat, value_type="string") + self.params.set_val("username", username, value_type="string") #makes a canvas file...step 1 (if not bgimage) def _make_canvas(self): @@ -157,12 +149,6 @@ class Imgrid(Pb): ] self._call_cmd(cmd) - def _cleanup(self): - if not len(self.files_created): - return - cmd = ["rm", "-f"] + self.files_created - self._call_cmd(cmd) - def create(self): if self.params.bgimage: self._prepare_gridimage(self.params.bgimage) @@ -177,17 +163,3 @@ class Imgrid(Pb): if self.params.planebgimage: self._overlay_planebgimage() if self.params.trim: self._trim_cmd() self._cleanup() - -if __name__ == "__main__": - g = Imgrid(**{ - 'bgimage' : 'http://i.asdf.us/im/1a/imBreak_1424909483_xx_abridged___.gif', - 'planebgimage' : 'http://i.imgur.com/FICZtph.png', - 'tilt' : '30', - 'spacing' : '30', - 'hlines' : 'true', - 'roll' : '30', - 'shadow' : 'true', - 'trim' : 'true' - }) - g.create() - print g.commands diff --git a/Pb/Landscape/__init__.py b/Pb/Landscape/__init__.py index 59212a6..e285fb5 100755 --- a/Pb/Landscape/__init__.py +++ b/Pb/Landscape/__init__.py @@ -1,62 +1,26 @@ -#!/usr/bin/python2.7 import sys -import random import re -import urllib -import urlparse from Config import * import Pb import base64 -import time -import string -from subprocess import Popen, PIPE -import sha -import simplejson as json from Pb import Pb -import mimetypes - -class Imlandscape(Pb): - def __init__(self, **kwargs): - sys.stderr.write("inside init"); - sys.stderr.write(str(kwargs)) - return; - self.params = {} - self.tag = "imlandscape" - self.commands = []; - self._required_keys = [ - "heightmap", - "imgdata", - "texture", - "name", - ] - self._now = self.now() - self.files_created = [] - for k in self._required_keys: - if k in kwargs: - self.params[k] = kwargs[k] - else: - self.params[k] = self.bool_correct(self.sanitize(kwargs[k])) - - def _filename_from_url (self, url, name=""): - if "?" in url: - url = url.split("?")[0] - if "/" in url: - url = urllib.unquote(url).replace(" ","") - filename = url.split("/")[-1] - filetype = "png" - filename = sanitize(filename[:-4]) - else: - filename = "" - if name != "": - name = name+"_" - return "{}_{}{}_{}.{}".format("imlandscape", name, filename,self._now, "png") +class PbLandscape(Pb): + def __init__(self, + heightmap=None, + imgdata=None, + texture=None, + name=None, + ): + self._required_keys = [ + "heightmap", + "imgdata", + "texture", + "name", + ] def _saveImgData(self, imgdata, filename): try: -# up = urlparse.urlparse(url) -# head, data = imgdata.split(',', 1) -# bits = head.split(';') parts = imgdata.split(';') mime_type = parts[0] if parts[0] else 'text/plain' data = parts[1] @@ -77,10 +41,6 @@ class Imlandscape(Pb): except Exception as e: sys.stderr.write("ERROR: {}\n".format(str(e))); -# def _cleanup(self): -# cmd = ["rm"]+self.files_created -# self._call_cmd(cmd) - def create(self, breakmode=""): self.filepath = self._filename_from_url(self.params.get('texture',""), self.params.get('name',"")); self._saveImgData(self.params.get('imgdata'), self.filepath); diff --git a/Pb/Pattern/__init__.py b/Pb/Pattern/__init__.py index 7c53746..0018fd9 100755 --- a/Pb/Pattern/__init__.py +++ b/Pb/Pattern/__init__.py @@ -1,4 +1,3 @@ -#!/usr/bin/python2.7 import os import sys import random @@ -13,50 +12,33 @@ import uuid _fuse_mode="Pin_Light" -class Impattern(Pb): - def __init__(self, **kwargs): - self.params = {} - self.tag = "imPattern"; - self._pid = str(os.getpid()) - self.commands = []; - self._now = self.now() - self.height = "" - self.width = "" - self._required_keys = [ - #FIXME change name to username in js - #FIXME change js api - "pattern_url", - "pattern_data", - "username", - "image_url", - ] - self.files_created = [] - for k in self._required_keys: - if k in kwargs: - if k in [ 'pattern_url', 'image_url' ]: - self.params[k] = kwargs[k] - elif k == 'pattern_data': - self.params[k] = kwargs[k] #FIXME add conversion data - else: - self.params[k] = self.sanitize(kwargs[k]) - else: - self.params[k] = False; - - if not self.params['image_url']: - sys.stderr.write('no image url'); - raise ValueError - self.params = self.make_dotdict(self.params) +class PbPattern(Pb): + example_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 __init__(self, + pattern_url=None, + pattern_data=None, + username=None, + image_url=None, + ): + super(PbPattern,self).__init__(); + + self.params.set_val("image_url", url, value_type="img_url"); + self.params.set_val("pattern_url", url, value_type="img_url"); + self.params.set_val("pattern_data", url, value_type="json"); + self.params.set_val("username", username, value_type="string"); self.basename, self._format = self._get_filename(); #FIXME omit file extension for downloaded files - self._downloaded_file = os.path.join(WORKING_DIR, "IMPATTERNTMP_DL{}_{}.{}".format(self.basename, self._pid, self._format)) # same here #lets go back to this in a second self._pattern_file = os.path.join(WORKING_DIR, "IMPATTERNTMP_PTN{}_{}.{}".format(self.basename, self._pid, self._format)) # this self._download(self.params.image_url, self._downloaded_file) - self.width, self.height = self.dimensions(self._downloaded_file) # same here - self.filename = "{}.{}".format(self.basename, self._format) self.filepath = os.path.join(WORKING_DIR, self.filename) @@ -68,21 +50,6 @@ class Impattern(Pb): sys.stderr.write("pattern must be supplied as json array or as a png url") raise ValueError; - def _download(self, url, dest): - try: - self.download(url, dest) - self.files_created.append(dest) - except Exception as e: - sys.stderr.write(str(e)) - raise; - - def _call_cmd(self, cmd): - try: - self.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): if boolean: @@ -101,40 +68,10 @@ class Impattern(Pb): img.save(self._pattern_file, "PNG") - - def _get_filename (self): - url = self.params.image_url - name_part = ""; - file_format = ""; - if "?" in url: - url = url.split("?")[0] - if "/" in url: - url = urllib.unquote(url).replace(" ","") - name_part = url.split("/")[-1] - try: - parts = name_part.split(".") - name_part = self.sanitize(parts[-2]) - file_format = self.sanitize(parts[-1]) - if not name_part or not file_format: - sys.stderr.write( "Incompatible input file type") - raise; - except Exception as e: - sys.stderr.write( "Incompatible input file type") - raise; - else: - sys.stderr.write( "Incompatible url") - 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 - - def _cleanup(self): - cmd = ["rm"]+self.files_created - self._call_cmd(cmd) - #first step def _make_canvas(self): - cmd = [BIN_CONVERT,"-size",self.width+"x"+self.height,"canvas:transparent", self.filepath] + _width, _height = self.dimensions(self._downloaded_file) # same here + cmd = [BIN_CONVERT, "-size", _width + "x" + _height, "canvas:transparent", self.filepath] self._call_cmd(cmd) #second step use the Canvas as a background @@ -160,13 +97,3 @@ class Impattern(Pb): self._make_mask() self._fuse_mask(); -if __name__ == "__main__": - 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() - @@ -1,3 +1,3 @@ -from Pb.Gradient import PbGradient -PbGradient.example_run() +from Pb.Generate import PbGenerate +PbGenerate.example_run() |
