#!/usr/local/bin/python # # imdm # # IMage Display Master # # This uses the affiliated C-cgi "imd" to build a caching image display # server with only passive Apache cgis. # import sys,os,string import cgi # this function should find the first four images inside a # nested subdirectory albumstartfile = "/~jeske/Images/jeskealbum.imd" imagestartfile = "/~jeske/Images/jeskealbum.imc" THUMB_WIDTH = 120 THUMB_HEIGHT = 90 # ------------------------------------------------------------------------------------ # # utility functions def albumoverview(basedir,sub_dir,count = 4,skip = 0): images = [] fulldir = os.path.join(basedir,sub_dir) for a_entry in os.listdir(fulldir): fullpath = os.path.join(fulldir,a_entry) if os.path.isfile(fullpath): if string.lower(string.split(a_entry,".")[-1]) in ["jpeg","jpg"]: images.append(os.path.join(sub_dir,a_entry)) elif os.path.isdir(fullpath): images + albumoverview(basedir,os.path.join(sub_dir,a_entry),1) if len(images) >= (count + skip): return images[skip:] return images[skip:] def makethumbnailimgtag(filename,width=THUMB_WIDTH,height=THUMB_HEIGHT): global imagestartfile return '<IMG SRC="%s?image=%s&width=%s&height=%s">' % (imagestartfile,filename,width,height) def makealbumurl(dir): global albumstartfile return "%s?album=%s" % (albumstartfile,dir) def makepictureurl(dir,picture): global albumstartfile return "%s?album=%s&picture=%s" % (albumstartfile,dir,picture) # ------------------------------------------------------------------------------------ # # picturedisplay def picturedisplay(basedir,album,picture): sys.stdout.write("<A HREF=\"%s?\">top</A> " % albumstartfile) sys.stdout.write("-- <A HREF=\"%s\">%s</A>" % (makealbumurl(album),album)) imagename = os.path.join(album,picture) sys.stdout.write("<br><hr>") sys.stdout.write("<TABLE WIDTH=100%><TR><TD ALIGN=CENTER>\n") sys.stdout.write(makethumbnailimgtag(imagename,width=600,height=500)) sys.stdout.write("</TD></TR></TABLE>\n") images = albumoverview(basedir,album,count=500) image_index = None for x in range(len(images)): if images[x] == imagename: image_index = x break if not image_index is None: sys.stdout.write("<CENTER><TABLE WIDTH=50% BORDER=1><TR>") # pre-images for i in range(1,3): pic_index = image_index - i picture_path = string.join(string.split(images[pic_index],'/')[1:],'/') sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>" % (makepictureurl(album,picture_path),makethumbnailimgtag(images[pic_index]))) sys.stdout.write("<br>") # post-images for i in range(1,3): pic_index = image_index + i if pic_index >= len(images): pic_index = pic_index - len(images) picture_path = string.join(string.split(images[pic_index],'/')[1:],'/') sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>" % (makepictureurl(album,picture_path), makethumbnailimgtag(images[pic_index]))) sys.stdout.write("</TR></TABLE></CENTER>\n") # navigation # ------------------------------------------------------------------------------------ # # albumdisplay def albumdisplay(basedir,album,columns=7,rows=5): next_page = 0 sys.stdout.write("<table border=0 bgcolor=#cccccc width=100%%><tr><td align=center><font size=+2>%s</font></td></tr></table>" % album) imgcount = columns * rows images = albumoverview(basedir,album,count=(imgcount + 1),skip=0) if len(images) > imgcount: images = images[:-1] next_page = 1 while images: sys.stdout.write("<CENTER><TABLE WIDTH=90% CELLSPACING=3 BORDER=1><TR>") for a_col in range(columns): if len(images): picture_path = string.join(string.split(images[0],'/')[1:],'/') sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>" % (makepictureurl(album,picture_path),makethumbnailimgtag(images[0]))) images = images[1:] sys.stdout.write("</tr></table></CENTER>") if next_page: sys.stdout.write("more...") # ------------------------------------------------------------------------------------ # # topalbumoverview def topalbumoverview(dir): for a_dir in os.listdir(dir): if os.path.isdir(os.path.join(dir,a_dir)): sys.stdout.write("<CENTER>") sys.stdout.write("<TABLE BGCOLOR=#ccccc WIDTH=50% BORDER=0 CELLSPACING=1 CELLPADDING=1>") sys.stdout.write("<TR><TD> <font size=+2><A HREF=\"%s\">%s</A></font></TD></TR>" % (makealbumurl(a_dir),a_dir)) sys.stdout.write("<TR><TD ALIGN=CENTER><TABLE BGCOLOR=#FFFFFF WIDTH=100% BORDER=0 CELSPACING=0 CELLPADDING=0><TR>") for a_file in albumoverview(dir,a_dir): picture_path = string.join(string.split(a_file,'/')[1:],'/') sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>\n" % (makepictureurl(a_dir,picture_path),makethumbnailimgtag(a_file))) sys.stdout.write("</TR></TABLE></TD></TR></TABLE></CENTER>\n<p>\n") # ------------------------------------------------------------------------------------ # # readvars() -- simple file format reader def readvars(filename): vars = {} data = open(filename,"rb").read() lines = string.split(data,"\n") for a_line in lines: stripped_line = string.strip(a_line) if not stripped_line or stripped_line[0] == "#": continue try: key,value = string.split(a_line,"=") vars[key] = value except: pass return vars # ------------------------------------------------------------------------------------ # # main() def main(): global cgiform cgiform = cgi.FieldStorage() sys.stdout.write("Content-Type: text/html\n\n") sys.stdout.write("<h1>HTML Image Viewer!</h1><p>") myvars = readvars(os.environ['PATH_TRANSLATED']) sys.stderr.write(repr(myvars)) global albumstartfile, imagestartfile albumstartfile = os.environ['PATH_INFO'] imagestartfile = myvars['IMGSTARTFILE'] BASEDIR = myvars['BASEDIR'] album = cgiform.getvalue('album',None) picture = cgiform.getvalue('picture',None) if album is None: topalbumoverview(BASEDIR) elif picture is None: albumdisplay(BASEDIR,album) else: picturedisplay(BASEDIR,album,picture) if __name__ == "__main__": main()