-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.py
105 lines (75 loc) · 2.85 KB
/
script.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
from imghdr import what
from os import walk, mkdir, path, listdir, getenv
from datetime import datetime
from shutil import copy2
from argparse import ArgumentParser
from PIL.ExifTags import GPSTAGS, TAGS
from PIL import Image, ExifTags
from geopy.geocoders import Here
from dotenv import load_dotenv
load_dotenv() # Loading vars in env file
def prepare_arguments():
# Adding arguments
parser = ArgumentParser()
parser.add_argument("-S", "--src",
help="The source folder where images exist")
parser.add_argument("-D", "--dir",
help="The dir folder where images should be copied to")
args = parser.parse_args()
if not args.src and not args.S:
raise ValueError("No source folder was provided")
if not args.dir and not args.D:
raise ValueError("No dir folder was provided")
return args
# Get location information from image file and assgin correct labels to the geotagging dict
def get_geotagging(exif):
geotagging = {}
for (idx, tag) in TAGS.items():
if tag == 'GPSInfo':
if idx not in exif:
return None
else:
for (key, val) in GPSTAGS.items():
if key in exif[idx]:
geotagging[val] = exif[idx][key]
return geotagging
def prepare_files(src_folder):
files = []
# get only files and ignore directories
files_names = onlyfiles = [f for f in listdir(
src_folder) if path.isfile(path.join(src_folder, f))]
for filename in files_names:
file_path = src_folder + '/' + filename
file_type = what(file_path)
if file_type == 'jpeg' or file_type == 'png':
image_exif = Image.open(file_path).getexif()
date_string = image_exif.get(36867)
if date_string:
date = datetime.strptime(date_string, "%Y:%m:%d %H:%M:%S")
x = {
'geotagging': get_geotagging(image_exif),
'path': file_path,
'year': datetime.strftime(date, '%Y'),
'month': datetime.strftime(date, '%B')
}
files.append(x)
return files
def copy_files(files, dir_folder):
for f in files:
target_year_dir = dir_folder + '/' + f['year']
target_month_dir = target_year_dir + '/' + f['month']
if path.exists(target_year_dir):
if path.exists(target_month_dir):
copy2(f['path'], target_month_dir)
else:
mkdir(target_month_dir)
copy2(f['path'], target_month_dir)
else:
mkdir(target_year_dir)
mkdir(target_month_dir)
copy2(f['path'], target_month_dir)
def main():
args = prepare_arguments()
files = prepare_files(args.src)
copy_files(files, args.dir)
main()