-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
140 lines (107 loc) · 4.8 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import os
import sys
from exiftool import ExifToolHelper
from datetime import datetime
import filecmp
import shutil
# This python script need the https://exiftool.org
class CustomImage:
def __init__(self, path):
self.debug = False
self.path = path
self.image_name = os.path.basename(path)
self.image_path = os.path.dirname(path)
self.image_extension = os.path.splitext(path)[1]
self.last_folder = os.path.basename(self.image_path)
self.exif_data = self.get_exif_data(self.path)
self.exifDate = self.get_date_taken()
self.fileCreationDate = datetime.fromtimestamp(os.path.getctime(self.path)) # seconds since the epoch
self.fileModDate = datetime.fromtimestamp(os.path.getmtime(self.path)) # seconds since the epoch
self.earliestDate = self.getEarliestDateTime(self.fileCreationDate, self.exifDate)
print("Taken on ",self.exifDate)
print("File Creation ",self.fileCreationDate)
print("Final Date:",self.earliestDate)
print("Final name: ",self.getOutputFileName())
#print(self.creationDate)
#print(self.get_date_taken())
def get_exif_data(self,path):
with ExifToolHelper() as et:
metaData = et.get_metadata(path)
if(self.debug):
for d in metaData:
for k, v in d.items():
print(f"Dict: {k} = {v}")
return metaData[0]
def get_date_taken(self):
dictToCheck = self.exif_data
try:
if "EXIF:DateTimeOriginal" in dictToCheck:
dateString = self.exif_data["EXIF:DateTimeOriginal"]
elif "File:FileModifyDate" in dictToCheck:
dateString = self.exif_data["File:FileModifyDate"]
# we do not care if this goes wrong
date_object = datetime.strptime(dateString, "%Y:%m:%d %H:%M:%S")
return date_object
except:
return datetime.max
return datetime.max
def getEarliestDateTime(self,d1, d2):
if d1<=d2:
return d1
else:
return d2
def getOutputFileName(self):
date_string = self.earliestDate.strftime("%Y-%m-%d_%H-%M-%S")
final_string = date_string+self.image_extension
return final_string
def writeTags(self,outputFile):
with ExifToolHelper() as et:
et.set_tags(outputFile,{
'EXIF:UserComment': self.path,
'EXIF:DateTimeOriginal': self.earliestDate.strftime("%Y:%m:%d %H:%M:%S")
},params="-overwrite_original")
def isTheSameImage(self,outputFile):
metaData = self.get_exif_data(outputFile)
if('EXIF:UserComment' in metaData and metaData['EXIF:UserComment'] == self.path):
return True
else:
return False
def save_image(self, dest_path):
save_path = os.path.join(dest_path, self.getOutputFileName())
if os.path.exists(save_path):
if self.isTheSameImage(save_path) or filecmp.cmp(self.path, save_path, shallow=False):
print(f"File {self.image_name} already exists and is identical. Skipping save.")
return
else:
base, ext = os.path.splitext(save_path)
counter = 1
while os.path.exists(f"{base}_{counter}{ext}"):
counter += 1
save_path = f"{base}_{counter}{ext}"
shutil.copy2(self.path, save_path)
self.writeTags(save_path)
# Alter the
print(f"Saved {self.image_name} as {os.path.basename(save_path)}")
def process_images(input_path, dest_path, file_extensions):
#if not os.path.exists(dest_path):
# os.makedirs(dest_path)
for root, dirs, files in os.walk(input_path):
for filename in files:
if any(filename.endswith(ext) for ext in file_extensions):
img_path = os.path.join(root, filename)
custom_img = CustomImage(img_path)
#relative_path = os.path.relpath(root, input_path)
#save_path = os.path.join(dest_path, relative_path, filename)
# Create directories if they do not exist
#os.makedirs(os.path.dirname(save_path), exist_ok=True)
#custom_img.image.save(save_path)
custom_img.save_image(dest_path)
print(f"Processed {filename}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python main.py <input_path> <dest_path>")
sys.exit(1)
input_path = sys.argv[1]
dest_path = sys.argv[2]
file_extensions = [".jpg", ".JPG"]
process_images(input_path, dest_path,file_extensions)