import os os.environ[ 'TMP' ] = 'c:/sandbox/temp/' from mod_python import * import sys import urllib import xml.dom.minidom from array import * from xml.dom.minidom import Node from pylab import * from networkx import * from networkx.generators.atlas import * from minghi import * from ming import * nodeSize = {} textSize = {} lineSize = {} myCirc = {} proxies = {'http': 'http://wwwproxy.unimelb.edu.au:8000'} # unimelb proxy #proxies = {} # use this if you want to by pass the proxy def findfriends(user): # talk to lastfm web services remotexml = urllib.urlopen( "http://ws.audioscrobbler.com/1.0/user/"+user+"/friends.xml",proxies=proxies ) friends = [] try: doc = xml.dom.minidom.parse( remotexml ) except: return friends i = 0 for node in doc.getElementsByTagName("user"): friends.append( node.getAttribute("username") ) i += 1 if i > 12: return friends return friends def buildgraph(user, outputName ): G = XGraph(name="lastfmgraph", multiedges=True, selfloops=False) # build the graph friendlist = findfriends( user ) nodeSize[user] = 80 textSize[user] = 240 lineSize[user] = 40 for u in friendlist: G.add_edge( user, u ) friendlist2 = findfriends( u ) nodeSize[u] = 50 textSize[u] = 150 lineSize[u] = 20 for u2 in friendlist2: G.add_edge( u, u2 ) if nodeSize.has_key(u2) == False: nodeSize[u2] = 20 textSize[u2] = 60 lineSize[u2] = 10 # layouting algorithm to generate the position for all nodes pos = spring_layout(G,iterations=15) # initialize flash file Ming_setScale(1) m = SWFMovie() m.setDimension(6400, 4800) m.setRate(12.0) minx = 100 maxx = -100 miny = 100 maxy = -100 # preparing the scale for flash file for v in G: (px,py) = pos[v] if px < minx: minx = px if px > maxx: maxx = px if py < miny: miny = py if py > maxy: maxy = py centerx = (minx+maxx)/2 centery = (miny+maxy)/2 lengthx = maxx-minx lengthy = maxy-miny xscale = 6400/lengthx yscale = 4800/lengthy if xscale > yscale: scale = yscale else: scale = xscale scale = 0.9*scale newpos = {} # draw nodes for v in G: (px,py) = pos[v] px = (px-centerx)*scale + 3200 py = -(py-centery)*scale + 2400 newpos[v] = (px,py) size = nodeSize[v]*3 myCirc = drawCircle( px, py, size, 200, 0, 0, 80 ) m.add( myCirc ) # draw lines for u, v, w in G.edges(): (x1,y1) = newpos[u] (x2,y2) = newpos[v] if lineSize[u] > lineSize[v]: lsize = lineSize[u] else: lsize = lineSize[v] m.add( drawLine( x1, y1, x2, y2, lsize, 0, 100, 100, 100 ) ) # draw labels for v in G: (px,py) = newpos[v] size = textSize[v] myTxt = drawText( str(v), "m:/devbox/apache.root/common/Bitstream Vera Sans.fdb", size, 0, 0, 0, 255 ) firstText = m.add( myTxt ) firstText.moveTo( px, py ) m.nextFrame() #save flash file m.save( outputName ) def local(req): # run locally, and save in local directory buildgraph( "washedrind", "c:/temp/lastfmnet.swf" ) def index(req): # run in web server fs = util.FieldStorage(req) req.content_type = "text/html" req.write('') if fs.getfirst("user") == None: req.write('put user="someone"') else: buildgraph( fs["user"], "m:/devbox/apache.root/showcase/output/lastfmnet.swf" ) # send an html file that contain the flash file req.write('') req.write('') req.write('') req.write('') req.write("") # web/local switcher if __name__ == "__main__": local(sys.stdout)