From 561486e4e32223fc5b66464ea552e40e6e6dcc6e Mon Sep 17 00:00:00 2001 From: Robohash <401330+e1ven@users.noreply.github.com> Date: Tue, 5 Jul 2011 19:31:17 -0400 Subject: [PATCH] send as img --- static/images/out.png | Bin 16701 -> 0 bytes webfront.py | 113 ++++++++++++++++++++++++++++++------------ 2 files changed, 82 insertions(+), 31 deletions(-) delete mode 100644 static/images/out.png diff --git a/static/images/out.png b/static/images/out.png deleted file mode 100644 index f0ebe322e7e97b2e8e4ba1139847b95cfa09877e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16701 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 K(zTN2VgC<_!Ug#N diff --git a/webfront.py b/webfront.py index e3bc393..2dcf504 100755 --- a/webfront.py +++ b/webfront.py @@ -10,56 +10,107 @@ import tornado.web import tornado.escape import socket import re -import os +import robohash +import os import pprint import Image -import random +import hashlib +import urllib try: from hashlib import md5 as md5_func except ImportError: from md5 import new as md5_func -def getPNG(path): - completelist = [] - locallist = [] - for ls in os.listdir(path): - if not ls.startswith("."): - if os.path.isdir(path + "/" + ls): - subfiles = getPNG(path + "/" + ls) - if subfiles is not None: - completelist = completelist + subfiles - else: - locallist.append( path + "/" + ls) - - if len(locallist) > 0: - luckyelement = locallist[random.randrange(0,len(locallist))] - locallist = [] - locallist.append(luckyelement) - - completelist = completelist + locallist - return completelist - - -class MainHandler(tornado.web.RequestHandler): - def get(self): - #Generate a robohash- - hashlist = getPNG(random.choice(['blue','brown','green','orange','grey','pink','purple','red','white','yellow'])) +class Robohash(object): + def __init__(self,string): + hash = hashlib.sha512() + hash.update(string) + self.hexdigest = hash.hexdigest() + self.hasharray = [] + + def createHashes(self,count): + #Create and store a series of hash-values + #Basically, split up a hash (SHA/md5/etc) into X parts + for i in range(0,count): + #Get 1/numblocks of the hash + blocksize = (len(self.hexdigest) / count) + currentstart = (1 + i) * blocksize - blocksize + currentend = (1 +i) * blocksize + self.hasharray.append(int(self.hexdigest[currentstart:currentend],16)) + + def dirCount(self,path): + #return the count of just the directories beneath me. + return sum([len(dirs) for (root, dirs, files) in os.walk(path)]) + + def getHashList(self,map): + #Kinda a complicated function. + #Basically, we're recursively calling ourselves, and keeping track of the depth + #Since we use two return values, we're storing them in a map. + #Each iteration, if we hit a directory, recurse + #If not, choose the appropriate file, given the hashes, stored above + path = map['path'] + depth = map['depth'] + completelist = [] + locallist = [] + for ls in os.listdir(path): + if not ls.startswith("."): + if os.path.isdir(path + "/" + ls): + returnval = self.getHashList({'path': path + "/" + ls ,'depth': depth + 1}) + subfiles = returnval['completelist'] + if subfiles is not None: + completelist = completelist + subfiles + else: + locallist.append( path + "/" + ls) + + if len(locallist) > 0: + elementchoice = self.hasharray[map['depth']] % len (locallist) + luckyelement = locallist[elementchoice] + locallist = [] + locallist.append(luckyelement) + + completelist = completelist + locallist + return {'completelist':completelist,'depth':depth} + + + + + +class ImgHandler(tornado.web.RequestHandler): + def get(self,string=None): + self.content_type = 'application/json' + #Create a hash for the string as given + if string is None: + string = self.request.remote_ip + string = urllib.quote_plus(string) + r = Robohash(string) + r.createHashes(r.dirCount("blue")) + + #Change to a usuable format + if string.endswith(('.png','.gif','.jpg','bmp','im','jpeg','pcx','ppm','tiff','xbm')): + ext = string[string.rfind('.') +1 :len(string)] + else: + ext = "png" + self.set_header("Content-Type", "image/" + ext) + hashlist = r.getHashList({'path':"blue",'depth':0})['completelist'] hashlist.sort() + pprint.pprint(hashlist) robohash = Image.open(hashlist[0]) for png in hashlist: img = Image.open(png) robohash.paste(img,(0,0),img) - robohash.save("static/images/out.png") - self.write("Running in Random mode:
") - self.write("") + robohash.save(self,format=ext) + # self.write("Running in Random mode:
") + # self.write("") application = tornado.web.Application([ - (r"/", MainHandler), (r"/images/(.*)", tornado.web.StaticFileHandler, {"path": os.path.join(os.path.dirname(__file__), "static/images")}), + (r"/", ImgHandler), + (r"/(.*)", ImgHandler), + ]) if __name__ == "__main__":