#!/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()