#!/usr/local/bin/python import os, os.path import re import PIL import Image import stat import statcache from Cheetah.Template import Template thumbdir = 'thumbnail' smalldir = 'small' slidedir = 'slide' bigdir = 'big' thumbsize = (125, 125) smallsize = (250, 250) slideize = (600, 400) bigsize = (950, 600) picturesPerRow = 5 dirs = [thumbdir, smalldir, slidedir, bigdir] sizes = [thumbsize, smallsize, slideize, bigsize] sizelist = map(None, dirs, sizes) overviewfilename = 'index.html' def getSubDirs(): ret = [] for x in os.listdir('.'): if os.path.isdir(x): if not x in dirs: ret.append(x) ret.sort() if ret == []: ret = None return ret def readTemplate(file): fp = open(os.path.join('/usr/local/share/mkgal/default', file)) ret = fp.read() fp.close return ret templateOverview = readTemplate('overview.template.html') templateSlide = readTemplate('slide.template.html') # create dirs for x in dirs: if not os.path.isdir(x): os.mkdir(x) # get list of images img_pat = re.compile('.*(\.[jJ][pP][eE]?[gG]|[gG][iI][fF])$') images = [x for x in os.listdir('.') if img_pat.match(x)] # create thumbnails catalog = {} for x in images: if os.path.isfile(x): # im = Image.open(x) for (dir, size) in sizelist: if not catalog.has_key(dir): catalog[dir] = [] outfile = os.path.join(dir, os.path.splitext(x)[0] + ".jpeg") if os.path.isfile(outfile): srctime = statcache.stat(x)[stat.ST_MTIME] dsttime = statcache.stat(outfile)[stat.ST_MTIME] if dsttime > srctime: try: im = Image.open(outfile) catalog[dir].append((x, outfile, im.size)) except IOError: print "cannot read", outfile continue try: new_im = Image.open(x) #new_im = im.copy() new_im.thumbnail(size) catalog[dir].append((x, outfile, new_im.size)) new_im.save(outfile) del new_im except IOError: print "cannot convert", x # del im # create overview data overview = [] for (image, thumb, size) in catalog[thumbdir]: (x, y) = size overview.append({'url': thumb, 'width': x, 'height': y, 'name': image, 'link': os.path.join(slidedir, os.path.splitext(image)[0] + ".html")}) rows = [] p = picturesPerRow while len(overview) > 0: if len(overview) < p: p = len(overview) l = overview[0:p] overview = overview[p:] rows.append(l) nameSpaceOverview = {'content': rows, 'subdirs': getSubDirs} templateObjOverview = Template(templateOverview, nameSpaceOverview) fp = open(overviewfilename, 'w') fp.write(str(templateObjOverview)) fp.close() def getPictureInfo(file): im = Image.open(file) (x, y) = im.size del im size = "%.1f" % (float(os.path.getsize(file)) / 1024) return {'width': x, 'height': y, 'url': '../' + file, 'filesize': size} def warp(x, max, min = 0): if x > max: x = min if x < min: x = max return x # create slide pages for i in range(len(images)): l = images[i] nameSpace = {'thumbpage': '../' + overviewfilename, 'prev': '', 'next': ''} nameSpace['next'] = os.path.splitext(images[warp(i+1, len(images)-1)])[0] + ".html" nameSpace['prev'] = os.path.splitext(images[warp(i-1, len(images)-1)])[0] + ".html" nameSpace['original'] = getPictureInfo(l) for (dir, size) in sizelist: infile = os.path.join(dir, os.path.splitext(l)[0] + ".jpeg") nameSpace[dir] = getPictureInfo(infile) templateObjSlide = Template(templateSlide, nameSpace) outfile = os.path.join(slidedir, os.path.splitext(l)[0] + ".html") fp = open(outfile, 'w') fp.write(str(templateObjSlide)) fp.close()