1.py


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)