#!/usr/bin/python3 import sys import piexif as x import datetime as dt shift = dt.timedelta(hours = 1, minutes = 6) print('Shift exif date time by', shift) if len(sys.argv) <= 1: print(sys.argv[0], 'img1.jpg img2.jpg') quit() def codesOfLabelsContaining(value: str): codes = [] for (k, v) in x.TAGS['Exif'].items(): if value in v['name']: codes.append(k) return codes timeCodes = codesOfLabelsContaining('Time') dateTimeCodes = codesOfLabelsContaining('DateTime') filenames = sys.argv[1:] formatDate = '%Y:%m:%d %H:%M:%S' formatFrom = f"b'{formatDate}'" def dateTimeOf(exif): for k in dateTimeCodes: if k in exif.keys(): return dt.datetime.strptime(str(exif[k]), formatFrom) return dt.datetime.now() def describeExif(exif): for k in timeCodes: if k in exif.keys(): print('Exif[', k, ']=', exif[k], '->', x.TAGS['Exif'][k]['name']) else: print('Exif[', k, ']=', '?', '->', x.TAGS['Exif'][k]['name']) def shiftDateTime(exifDict): e = exifDict['Exif'] t = dateTimeOf(e) print('Shifting') print(t) targetDateTime = t + shift print('to') print(targetDateTime) for k in dateTimeCodes: e[k] = targetDateTime.strftime(formatDate).encode() return exifDict for filename in filenames: print(filename) exifDict = x.load(filename) describeExif(exifDict['Exif']) exifDict = shiftDateTime(exifDict) describeExif(exifDict['Exif']) exifBytes = x.dump(exifDict) x.insert(exifBytes, filename) print()