Last active
March 11, 2018 17:43
-
-
Save danielrocher/c634898068f09aa2e9bbd3aec20ccd0e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
# Written by Daniel Rocher <daniel.rocher@resydev.fr> | |
# License GPL-3.0-only | |
# Copyright (C) 2018 | |
""" | |
Restore file creation date from exif datas. Rename file, format : %Y%m%d-%H%M%S.jpg | |
This script require python3-exif. | |
On debian/ubuntu : | |
sudo apt install python3-exif | |
""" | |
import sys, os, time, exifread | |
from datetime import datetime | |
def getExifFromFile(filename): | |
tags=None | |
try: | |
fd = open(filename, 'rb') | |
tags=exifread.process_file(fd) | |
fd.close() | |
except: | |
return None | |
return tags | |
def convertDateFromString(datetimeoriginal): | |
try: | |
return datetime.strptime(datetimeoriginal, '%Y:%m:%d %H:%M:%S') | |
except: | |
return None | |
def getDateTimeOriginalFromTags(tags): | |
datetimeoriginal=None | |
try: | |
datetimeoriginal=convertDateFromString(str(tags['EXIF DateTimeOriginal'])) | |
if datetimeoriginal: | |
return datetimeoriginal | |
except: | |
pass | |
try: | |
return convertDateFromString(str(tags['EXIF DateTimeDigitized'])) | |
except: | |
return None | |
def renameFile(filename, newfilename): | |
try: | |
os.rename(filename, newfilename) | |
return True | |
except: | |
sys.stderr.writelines("Impossible to rename file :{}\n".format(filename)) | |
return False | |
def changeUtimeForFile(filename, datetimeoriginal): | |
try: | |
utime=time.mktime(datetimeoriginal.utctimetuple()) | |
os.utime(filename, (utime, utime)) | |
return True | |
except: | |
sys.stderr.writelines("Impossible to change utime for file :{}\n".format(filename)) | |
return False | |
def usage(progname): | |
print (""" | |
{0} [files] | |
example: | |
{0} *.jpg | |
""".format(progname)) | |
def proccess(filename): | |
tags=getExifFromFile(filename) | |
if tags: | |
datetimeoriginal=getDateTimeOriginalFromTags(tags) | |
if datetimeoriginal: | |
changeUtimeForFile(filename, datetimeoriginal) | |
newfilename=datetimeoriginal.strftime('%Y%m%d-%H%M%S.jpg') | |
if renameFile( filename, newfilename): | |
print ("{} -> {} (EXIF DateTimeOriginal : {})".format(filename, newfilename, datetimeoriginal)) | |
else: | |
sys.stderr.writelines("Impossible to retrieve DateTimeOriginal data from exif datas (file :{})\n".format(filename)) | |
else: | |
sys.stderr.writelines("Impossible to retrieve exif data from {}\n".format(filename)) | |
if __name__ == '__main__': | |
args=sys.argv[1:] | |
if len(args)<2: | |
usage(sys.argv[0]) | |
sys.exit(1) | |
for arg in args: | |
proccess(arg) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment