#!/usr/bin/python # ExiFilm -- Add film exposure metadata to EXIF tags of digital images # Copyright (C) 2009 James E. Blair # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os, sys import pyexiv2 import datetime import decimal, fractions import re from exifilm import * import lfrecord class MyImage(object): def __init__(self, fn): if fn: image = pyexiv2.ImageMetadata(fn) image.read() keys = image.exif_keys self.image = image else: keys = [] def get(key, default=''): if key in keys: return image[key].value return default self.date = get('Exif.Photo.DateTimeOriginal', '') self.shutter=str(get('Exif.Photo.ExposureTime')) self.aperture=to_fstop(str(get('Exif.Photo.FNumber'))) self.lens=str(get('Exif.Photo.FocalLength')) self.description=get('Exif.Image.ImageDescription') extras, comments = decode_comments(get('Exif.Photo.UserComment')) self.comments=comments self.id = extras.get(ID, '') self.film = extras.get(FILM, '') self.carrier = extras.get(CARRIER, '') self.process = extras.get(PROCESS, '') self.front_movements = extras.get(FRONT_MOVEMENTS, '').split('/') self.rear_movements = extras.get(REAR_MOVEMENTS, '').split('/') def render(self): r = ' (%s) (%s) (%s) (%s)\n' % (self.id, self.film, self.carrier, self.process) r += ' (%s) (%s) (%s)\n' % (self.lens, self.aperture, self.shutter) r += ' ' if 'rising' in self.front_movements: r += '1 ' elif 'falling' in self.front_movements: r += '-1 ' else: r += '0 ' if 'forward tilt' in self.front_movements: r += '1 ' elif 'backward tilt' in self.front_movements: r += '-1 ' else: r += '0 ' if 'left swing' in self.front_movements: r += '1 ' elif 'right swing' in self.front_movements: r += '-1 ' else: r += '0 ' if 'left shift' in self.front_movements: r += '1 ' elif 'right shift' in self.front_movements: r += '-1 ' else: r += '0 ' r += ' ' if 'rising' in self.rear_movements: r += '1 ' elif 'falling' in self.rear_movements: r += '-1 ' else: r += '0 ' if 'forward tilt' in self.rear_movements: r += '1 ' elif 'backward tilt' in self.rear_movements: r += '-1 ' else: r += '0 ' if 'left swing' in self.rear_movements: r += '1 ' elif 'right swing' in self.rear_movements: r += '-1 ' else: r += '0 ' if 'left shift' in self.rear_movements: r += '1' elif 'right shift' in self.rear_movements: r += '-1' else: r += '0' r += '\n' notes = [] if self.description: notes.append(self.description) if self.date: notes.append(str(self.date.date())) if self.description or self.date: notes.append('') notes += self.comments.split('\n') r += ' [ ' for note in notes: r += '('+note+') ' r += ']\n' r += 'record\n' return r def main(): directory = sys.argv[1] start = int(sys.argv[2]) end = int(sys.argv[3]) end += end%4 files = os.listdir(directory) files.sort() images = {} for fn in files: if not (fn.lower().endswith('.jpeg') or fn.lower().endswith('.jpg')): continue i = MyImage(os.path.join(directory,fn)) if i.id: images[int(i.id)] = i code = '' page = 0 i = start while i