diff --git a/src/exif_redater.py b/src/exif_redater.py new file mode 100644 index 0000000..393b846 --- /dev/null +++ b/src/exif_redater.py @@ -0,0 +1,92 @@ +#!/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() \ No newline at end of file