1 | #!/usr/bin/python
|
2 |
|
3 | # max zeitabstand in sekunden
|
4 | DELTA = 3
|
5 |
|
6 | import sys
|
7 | import os
|
8 | import re
|
9 | from PIL import Image
|
10 | from PIL.ExifTags import TAGS
|
11 | from datetime import datetime
|
12 |
|
13 | def get_exif(fn):
|
14 | '''exif-daten zu einer datei fn lesen'''
|
15 | ret = {}
|
16 | i = Image.open(fn)
|
17 | info = i._getexif()
|
18 | for tag, value in info.items():
|
19 | decoded = TAGS.get(tag, tag)
|
20 | ret[decoded] = value
|
21 | return ret
|
22 |
|
23 | def get_date(fn):
|
24 | '''DateTimeOriginal aus datei als datetime'''
|
25 | info = get_exif(fn)
|
26 | d = info['DateTimeOriginal']
|
27 | return datetime.strptime(d, '%Y:%m:%d %H:%M:%S')
|
28 |
|
29 | def build_dict(files):
|
30 | '''dict aus zeit und dateinamen'''
|
31 | res = dict()
|
32 | for f in files:
|
33 | d = get_date(f)
|
34 | res[d] = f
|
35 | return res
|
36 |
|
37 | def sec_delta(a,b):
|
38 | '''abstand zwischen zwei datetimes'''
|
39 | td = a - b
|
40 | # mit python 2.7 ginge das eleganter:
|
41 | return abs((td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 )
|
42 |
|
43 | def sort_and_group(di):
|
44 | '''list mit lists aus files mit zeitabstand <= DELTA'''
|
45 | res=list()
|
46 | dates = sorted(di.keys())
|
47 | last_d = dates[0]
|
48 | group = list()
|
49 | for d in dates[1:]:
|
50 | group.append(di[last_d])
|
51 | diff = sec_delta(d , last_d)
|
52 | if diff > DELTA: #neue list anfangen, alte ins ergebnis schubsen
|
53 | res.append(group)
|
54 | group = list()
|
55 | last_d = d
|
56 | return res
|
57 |
|
58 | def move_sorted(d, wd):
|
59 | '''order fuer jede gruppe von mehr als einem file erstellen und files verschieben, gibt nur shellbefehle aus'''
|
60 | num = 1
|
61 | for p in d:
|
62 | if len(p) > 1:
|
63 | foldername = '%s/foo_%05d' % (wd, num)
|
64 | num += 1
|
65 | print 'mkdir "%s"' % foldername
|
66 | for f in p:
|
67 | print 'mv "%s" "%s/"' % (f, foldername)
|
68 | else:
|
69 | print '# ignoring %s' % (p[0])
|
70 |
|
71 | def list_files(d):
|
72 | ''' alle jpgs aus ordner d'''
|
73 | return [os.path.join(d, f) for f in os.listdir(d) if re.match('\.jpe?g$', os.path.splitext(f)[1], re.IGNORECASE ) ]
|
74 |
|
75 | if __name__ == '__main__':
|
76 | working_dir = sys.argv[1].rstrip('/')
|
77 | pics = list_files(working_dir)
|
78 | picswithdate = build_dict(pics)
|
79 | pics_sorted = sort_and_group(picswithdate)
|
80 | move_sorted(pics_sorted, working_dir)
|