|
@@ -4,52 +4,78 @@ import sys
|
|
|
import piexif as x
|
|
|
import datetime as dt
|
|
|
|
|
|
-shift = dt.timedelta(hours = 1)
|
|
|
+shift = dt.timedelta(hours = 1, minutes = 6)
|
|
|
print('Shift exif date time by', shift)
|
|
|
|
|
|
if len(sys.argv) < 1:
|
|
|
print('shift 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
|
|
|
|
|
|
-timeTagCodes = [36867, 36868]
|
|
|
+timeCodes = codesOfLabelsContaining('Time')
|
|
|
+dateTimeCodes = codesOfLabelsContaining('DateTime')
|
|
|
+offsetCodes = codesOfLabelsContaining('OffsetTime')
|
|
|
|
|
|
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 timeTagCodes:
|
|
|
+ for k in timeCodes:
|
|
|
if k in exif.keys():
|
|
|
- t = dt.datetime.strptime(str(exif[k]), formatFrom)
|
|
|
- print('Exif[', k, ']=', t, '->', x.TAGS['Exif'][k]['name'])
|
|
|
+ print('Exif[', k, ']=', exif[k], '->', x.TAGS['Exif'][k]['name'])
|
|
|
else:
|
|
|
print('Exif[', k, ']=', '?', '->', x.TAGS['Exif'][k]['name'])
|
|
|
- return t
|
|
|
-
|
|
|
|
|
|
-def shiftThisFile(filename: str):
|
|
|
- m = x.load(filename)
|
|
|
- e = m['Exif']
|
|
|
- t = describeExif(e)
|
|
|
|
|
|
- targetDateTime = t + shift
|
|
|
+def shiftDateTime(exifDict):
|
|
|
+ e = exifDict['Exif']
|
|
|
+ t = dateTimeOf(e)
|
|
|
print('Shifting')
|
|
|
print(t)
|
|
|
+
|
|
|
+ targetDateTime = t + shift
|
|
|
print('to')
|
|
|
print(targetDateTime)
|
|
|
|
|
|
- for k in timeTagCodes:
|
|
|
+ for k in dateTimeCodes:
|
|
|
e[k] = targetDateTime.strftime(formatDate).encode()
|
|
|
|
|
|
- describeExif(e)
|
|
|
- return m
|
|
|
+ return exifDict
|
|
|
+
|
|
|
+
|
|
|
+def overrideOffset(exifDict, offset: str):
|
|
|
+ e = exifDict['Exif']
|
|
|
+ offsetBytes = offset.encode()
|
|
|
+ for k in offsetCodes:
|
|
|
+ print('Exif[', k, ']=', e[k], '->', offsetBytes, ':', x.TAGS['Exif'][k]['name'])
|
|
|
+ e[k] = offsetBytes
|
|
|
+
|
|
|
+ return exifDict
|
|
|
|
|
|
|
|
|
for filename in filenames:
|
|
|
print(filename)
|
|
|
- exifDict = shiftThisFile(filename)
|
|
|
+ exifDict = x.load(filename)
|
|
|
+ describeExif(exifDict['Exif'])
|
|
|
+ exifDict = shiftDateTime(exifDict)
|
|
|
+ exifDict = overrideOffset(exifDict, '+02:00')
|
|
|
+ describeExif(exifDict['Exif'])
|
|
|
exifBytes = x.dump(exifDict)
|
|
|
x.insert(exifBytes, filename)
|
|
|
print()
|