Home | History | Annotate | Download | only in imd
      1 #!/usr/local/bin/python
      2 #
      3 # imdm
      4 # 
      5 # IMage Display Master
      6 #
      7 # This uses the affiliated C-cgi "imd" to build a caching image display
      8 # server with only passive Apache cgis.
      9 #
     10 import sys,os,string
     11 import cgi
     12 
     13 # this function should find the first four images inside a
     14 # nested subdirectory
     15 
     16 albumstartfile = "/~jeske/Images/jeskealbum.imd"
     17 imagestartfile = "/~jeske/Images/jeskealbum.imc"
     18 
     19 THUMB_WIDTH = 120
     20 THUMB_HEIGHT = 90 
     21 
     22 # ------------------------------------------------------------------------------------
     23 #
     24 # utility functions
     25 
     26 def albumoverview(basedir,sub_dir,count = 4,skip = 0):
     27     images = []
     28 
     29     fulldir = os.path.join(basedir,sub_dir)
     30     for a_entry in os.listdir(fulldir):
     31 	fullpath = os.path.join(fulldir,a_entry)
     32 	if os.path.isfile(fullpath):
     33 	    if string.lower(string.split(a_entry,".")[-1]) in ["jpeg","jpg"]:
     34 		images.append(os.path.join(sub_dir,a_entry))
     35 	elif os.path.isdir(fullpath):
     36 	    images + albumoverview(basedir,os.path.join(sub_dir,a_entry),1)
     37 	if len(images) >= (count + skip):
     38 	    return images[skip:]
     39 
     40     return images[skip:]
     41 
     42 
     43 def makethumbnailimgtag(filename,width=THUMB_WIDTH,height=THUMB_HEIGHT):
     44     global imagestartfile
     45     return '<IMG SRC="%s?image=%s&width=%s&height=%s">' % (imagestartfile,filename,width,height)
     46 
     47 def makealbumurl(dir):
     48     global albumstartfile
     49     return "%s?album=%s" % (albumstartfile,dir)
     50 
     51 def makepictureurl(dir,picture):
     52     global albumstartfile
     53     return "%s?album=%s&picture=%s" % (albumstartfile,dir,picture)
     54 
     55 # ------------------------------------------------------------------------------------
     56 #
     57 # picturedisplay
     58 
     59 def picturedisplay(basedir,album,picture):
     60     sys.stdout.write("<A HREF=\"%s?\">top</A> " % albumstartfile)
     61 
     62     sys.stdout.write("-- <A HREF=\"%s\">%s</A>" % (makealbumurl(album),album))
     63 
     64     imagename = os.path.join(album,picture)
     65 
     66     sys.stdout.write("<br><hr>")
     67 
     68     sys.stdout.write("<TABLE WIDTH=100%><TR><TD ALIGN=CENTER>\n")
     69     sys.stdout.write(makethumbnailimgtag(imagename,width=600,height=500))
     70     sys.stdout.write("</TD></TR></TABLE>\n")
     71 
     72     images = albumoverview(basedir,album,count=500)
     73     image_index = None
     74     for x in range(len(images)):
     75 	if images[x] == imagename:
     76 	    image_index = x
     77 	    break
     78 
     79     if not image_index is None:
     80 	sys.stdout.write("<CENTER><TABLE WIDTH=50% BORDER=1><TR>")
     81 	
     82 	# pre-images
     83 	for i in range(1,3):
     84 	    pic_index = image_index - i
     85 	    
     86 	    picture_path = string.join(string.split(images[pic_index],'/')[1:],'/')
     87 	    sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>" % (makepictureurl(album,picture_path),makethumbnailimgtag(images[pic_index])))
     88 
     89 	sys.stdout.write("<br>")
     90 
     91 	# post-images
     92 	for i in range(1,3):
     93 	    pic_index = image_index + i
     94 	    if pic_index >= len(images):
     95 		pic_index = pic_index - len(images)
     96 	    
     97 	    picture_path = string.join(string.split(images[pic_index],'/')[1:],'/')
     98 	    sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>" % (makepictureurl(album,picture_path), makethumbnailimgtag(images[pic_index])))
     99 	sys.stdout.write("</TR></TABLE></CENTER>\n")
    100 	    
    101     # navigation
    102 
    103 
    104 # ------------------------------------------------------------------------------------
    105 #
    106 #  albumdisplay
    107 
    108     
    109 
    110 def albumdisplay(basedir,album,columns=7,rows=5):
    111     next_page = 0
    112 
    113     
    114     sys.stdout.write("<table border=0 bgcolor=#cccccc width=100%%><tr><td align=center><font size=+2>%s</font></td></tr></table>" % album)
    115 
    116     imgcount = columns * rows 
    117     images = albumoverview(basedir,album,count=(imgcount + 1),skip=0)
    118 
    119     if len(images) > imgcount:
    120 	images = images[:-1]
    121 	next_page = 1
    122 
    123     while images:
    124 	sys.stdout.write("<CENTER><TABLE WIDTH=90% CELLSPACING=3 BORDER=1><TR>")
    125 	for a_col in range(columns):
    126 	    if len(images):
    127 		picture_path = string.join(string.split(images[0],'/')[1:],'/')
    128 		sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>" % (makepictureurl(album,picture_path),makethumbnailimgtag(images[0])))
    129 		images = images[1:]
    130 	sys.stdout.write("</tr></table></CENTER>")
    131 
    132     if next_page:
    133 	sys.stdout.write("more...")
    134     
    135 
    136 # ------------------------------------------------------------------------------------
    137 #
    138 # topalbumoverview
    139 
    140 def topalbumoverview(dir):
    141     for a_dir in os.listdir(dir):
    142 	if os.path.isdir(os.path.join(dir,a_dir)):
    143 	    sys.stdout.write("<CENTER>")
    144 	    sys.stdout.write("<TABLE BGCOLOR=#ccccc WIDTH=50% BORDER=0 CELLSPACING=1 CELLPADDING=1>")
    145 	    
    146 	    sys.stdout.write("<TR><TD> <font size=+2><A HREF=\"%s\">%s</A></font></TD></TR>" % (makealbumurl(a_dir),a_dir))
    147 
    148 	    sys.stdout.write("<TR><TD ALIGN=CENTER><TABLE BGCOLOR=#FFFFFF WIDTH=100% BORDER=0 CELSPACING=0 CELLPADDING=0><TR>")
    149 			     
    150 	    for a_file in albumoverview(dir,a_dir):
    151 		picture_path = string.join(string.split(a_file,'/')[1:],'/')
    152 		sys.stdout.write("<TD ALIGN=CENTER><A HREF=\"%s\">%s</A></TD>\n" % (makepictureurl(a_dir,picture_path),makethumbnailimgtag(a_file)))
    153 	    sys.stdout.write("</TR></TABLE></TD></TR></TABLE></CENTER>\n<p>\n")
    154 
    155 # ------------------------------------------------------------------------------------
    156 #
    157 # readvars() -- simple file format reader
    158 
    159 def readvars(filename):
    160     vars = {}
    161     data = open(filename,"rb").read()
    162     lines = string.split(data,"\n")
    163     for a_line in lines:
    164 	stripped_line = string.strip(a_line)
    165 	if not stripped_line or stripped_line[0] == "#":
    166 	    continue
    167 	try:
    168 	    key,value = string.split(a_line,"=")
    169 	    vars[key] = value
    170 	except:
    171 	    pass
    172     return vars
    173 
    174 # ------------------------------------------------------------------------------------
    175 #
    176 # main()
    177 
    178 
    179 def main():
    180     global cgiform
    181     cgiform = cgi.FieldStorage()
    182 
    183     sys.stdout.write("Content-Type: text/html\n\n")
    184     sys.stdout.write("<h1>HTML Image Viewer!</h1><p>")
    185 
    186     myvars = readvars(os.environ['PATH_TRANSLATED'])
    187 
    188     sys.stderr.write(repr(myvars))
    189     
    190     global albumstartfile, imagestartfile
    191     albumstartfile = os.environ['PATH_INFO']
    192     imagestartfile = myvars['IMGSTARTFILE']
    193     BASEDIR        = myvars['BASEDIR']
    194 
    195     album = cgiform.getvalue('album',None)
    196     picture = cgiform.getvalue('picture',None)
    197 
    198     if album is None:
    199 	topalbumoverview(BASEDIR)
    200     elif picture is None:
    201 	albumdisplay(BASEDIR,album)
    202     else:
    203 	picturedisplay(BASEDIR,album,picture)
    204 
    205 if __name__ == "__main__":
    206     main()
    207 
    208 
    209 
    210