import os, sys import re from time import strptime, strftime, gmtime from optparse import OptionParser import Image # for exif images = [] def add_dir(dir, traverse=0): filenames = os.listdir(dir) #filenames.sort() subdirs = [] for filename in filenames: pathname = os.path.join(dir, filename) if VALID_PICTURE(filename): # TODO deal with directories better images.append(pathname) else: sys.stderr.write("Error: %s: %s\n" % ("Not a valid JPEG", pathname)) if os.path.isdir(pathname) and traverse: subdirs.append(pathname) map(add_dir, subdirs) def VALID_PICTURE(name): if re.search("\.(jpg)$", name, re.I): return 1 def IMAGE_TIME(i): """ Grab EXIF time. If none, then use mtime """ im = Image.open(i) rawexif = im._getexif() if not rawexif or 36867 not in rawexif: sys.stderr.write("Error: %s: %s\n" % ("no EXIF found in", i)) mtime = os.stat(i)[8] imagetime = gmtime(mtime) else: imagetime = strptime(rawexif[36867], "%Y:%m:%d %H:%M:%S") year = strftime("%Y", imagetime) month = strftime("%b", imagetime).lower() # no capitalized month names day = int(strftime("%d", imagetime)) # no leading zero time = strftime("%T", imagetime) return (year, month, day, time) def importimages(orig, dest, verbose=False): add_dir(orig, 1) if verbose: print len(images), "Original pictures: ", orig, "\nDestination Web directory: ", dest for i in images: head, tail = os.path.split(i) tag = os.path.basename(head) if verbose: print repr(tag), i year, month, day, time = IMAGE_TIME(i) uri = '/'.join([tag, year, month, str(day), time]) fulluri = os.path.join(dest, uri) if verbose: print fulluri if os.path.isdir(fulluri): print "Skipping:", i, " at ", fulluri, "exists" fulluri = fulluri + "/index.jpg" if os.path.exists(fulluri): if verbose: print fulluri, "exists!" print else: if verbose: print "Creating directory: ", fulluri os.makedirs(fulluri) if verbose: print "Creating symlink from source", i, "to", fulluri fulluri = fulluri + "/index.jpg" os.symlink(i, fulluri) if verbose: print im = None def main(): usage = "Usage: %prog [options] picture_dir web_dir" parser = OptionParser(usage, version="%prog $id: $ ") parser.add_option("-v", "--verbose", action="store_true", dest="verbose") parser.add_option("-q", "--quiet", action="store_false", dest="verbose") (options, args) = parser.parse_args() if len(args) != 2: parser.error("incorrect number of arguments") for arg in args: if not os.path.isdir(arg): raise ValueError importimages(args[0], args[1], options.verbose) if __name__ == '__main__': main()