From 71791236b9952d61090195d0b2f6e337bc3ad2d7 Mon Sep 17 00:00:00 2001 From: tfrdidi Date: Sun, 6 Dec 2015 01:52:21 +0100 Subject: [PATCH] used file counter for file names, one method to be called after images have been copied --- jpgSorter.py | 64 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/jpgSorter.py b/jpgSorter.py index 25cbfb1..ce278e7 100644 --- a/jpgSorter.py +++ b/jpgSorter.py @@ -1,9 +1,10 @@ import os.path import exifread -import time +from time import localtime, strftime, strptime, mktime import shutil minEventDelta = 60 * 60 * 24 * 4 # 4 days in seconds +unknownDateFolderName = "Datum unbekannt" def getMinimumCreationTime(exif_data): creationTime = None @@ -27,22 +28,27 @@ def getMinimumCreationTime(exif_data): return creationTime -def postprocessImage(images, sourceDir, imageDirectory, fileName): - imagePath = os.path.join(sourceDir, fileName) +def postprocessImage(images, imageDirectory, fileName): + imagePath = os.path.join(imageDirectory, fileName) image = open(imagePath, 'rb') + creationTime = None try: exifTags = exifread.process_file(image, details=False) + creationTime = getMinimumCreationTime(exifTags) except: print("invalid exif tags for " + fileName) - creationTime = getMinimumCreationTime(exifTags) # distinct different time types if creationTime is None: - creationTime = time.gmtime(os.path.getctime(imagePath)) + creationTime = localtime(os.path.getctime(imagePath)) else: - creationTime = time.strptime(str(creationTime), "%Y:%m:%d %H:%M:%S") + try: + creationTime = strptime(str(creationTime), "%Y:%m:%d %H:%M:%S") + except: + creationTime = localtime(os.path.getctime(imagePath)) - images.append((time.mktime(creationTime), imagePath)) + images.append((mktime(creationTime), imagePath)) + image.close() def createNewFolder(destinationRoot, year, eventNumber): @@ -53,21 +59,47 @@ def createNewFolder(destinationRoot, year, eventNumber): if not os.path.exists(eventPath): os.mkdir(eventPath) +def createUnknownDateFolder(destinationRoot): + path = os.path.join(destinationRoot, unknownDateFolderName) + if not os.path.exists(path): + os.mkdir(path) + def writeImages(images, destinationRoot): sortedImages = sorted(images) previousTime = None eventNumber = 0 + today = strftime("%d/%m/%Y") for imageTuple in sortedImages: - t = time.gmtime(imageTuple[0]) - year = time.strftime("%Y", t) - if (previousTime == None) or ((previousTime + minEventDelta) < imageTuple[0]): + t = localtime(imageTuple[0]) + year = strftime("%Y", t) + creationDate = strftime("%d/%m/%Y", t) + if(creationDate == today): + createUnknownDateFolder(destinationRoot) + destination = os.path.join(destinationRoot, unknownDateFolderName) + shutil.move(imageTuple[1], destination) + else: + if (previousTime == None) or ((previousTime + minEventDelta) < imageTuple[0]): + previousTime = imageTuple[0] + eventNumber = eventNumber + 1 + createNewFolder(destinationRoot, year, eventNumber) + previousTime = imageTuple[0] - eventNumber = eventNumber + 1 - createNewFolder(destinationRoot, year, eventNumber) - - previousTime = imageTuple[0] - destination = os.path.join(destinationRoot, year, str(eventNumber)) - shutil.copy(imageTuple[1], destination) + destination = os.path.join(destinationRoot, year, str(eventNumber)) + # it may be possible that an event covers 2 years. + # in such a case put all the images to the even in the old year + if not (os.path.exists(destination)): + destination = os.path.join(destinationRoot, year-1, str(eventNumber)) + + shutil.move(imageTuple[1], destination) + + +def postprocessImages(imageDirectory): + images = [] + for root, dirs, files in os.walk(imageDirectory): + for file in files: + postprocessImage(images, imageDirectory, file) + + writeImages(images, imageDirectory)