#!/usr/bin/python __version__ = '$Id: exif_redater.py 469 2008-03-05 06:09:01Z mn $' USAGE = "exif_redater.py\n\tredate .jpg/.jpeg files according to EXIF data" """ Iterates through a directory, reading the EXIF data from each jpg/jpeg file. Parses the date/time from EXIF data and if it differs from file modification date/time then changes file date/time author: Michal Niklas """ import os import os.path import sys import time import EXIF ALL_CNT = 0 CHANGED_CNT = 0 EXTENSIONS = ('.jpg', '.jpeg') def show_fdt(fdt): """human readable format of file modification datetime""" return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(fdt)) # 2005:10:20 23:22:28 def exif_info2time(ts): """changes EXIF date ('2005:10:20 23:22:28') to number of seconds since 1970-01-01""" tpl = time.strptime(ts, '%Y:%m:%d %H:%M:%S') return time.mktime(tpl) def redate_by_exif(fn): """reads EXIF from jpg/jpeg and if file datetime differs from EXIF changes file date""" global ALL_CNT, CHANGED_CNT ALL_CNT += 1 exif_time = None s = os.stat(fn) f = open(fn, 'rb') try: tags = EXIF.process_file(f) dt_value = "%s" % tags["Image DateTime"] file_time = s[8] exif_time = exif_info2time(dt_value) finally: f.close() if exif_time: secs_diff = file_time - exif_time MAX_DIFF = 130.0 if secs_diff > MAX_DIFF or secs_diff < -MAX_DIFF: print "%s %s -> %s" % (fn, show_fdt(file_time), show_fdt(exif_time)) os.utime(fn, (exif_time, exif_time)) CHANGED_CNT += 1 def process_dir(_, dir_name, files): """looks for .jpg/.jpeg file in dir""" for fname in files: can_change = False fnl = fname.lower() for ext in EXTENSIONS: if fnl.endswith(ext): can_change = True break if can_change: fname = dir_name + '/' + fname if os.path.isfile(fname): try: redate_by_exif(fname) except: pass def main(): os.path.walk('.', process_dir, None) print '\nChecked: %d\nChanged %d\n' % (ALL_CNT, CHANGED_CNT) if '--version' in sys.argv: print __version__ else: if __name__ == '__main__': if '--help' in sys.argv: print USAGE else: main()