1
1
# -*- coding: utf-8 -*-
2
- u """Common code
2
+ """Common code
3
3
4
4
:copyright: Copyright (c) 2017 Robert Nagler. All Rights Reserved.
5
5
:license: http://www.apache.org/licenses/LICENSE-2.0.html
17
17
import time
18
18
19
19
20
- _MOVIES = ' 3gp|mp4|mov|mpg|avi|mts|m4v'
20
+ _MOVIES = " 3gp|mp4|mov|mpg|avi|mts|m4v"
21
21
22
22
# icns is for unit testing
23
- _NEED_JPG = ' icns|dng|pcd|arw|skp'
23
+ _NEED_JPG = " icns|dng|pcd|arw|skp"
24
24
25
- _STILL = ' jpg|heic|png|tif|gif|psd|pdf|thm|jpeg'
25
+ _STILL = " jpg|heic|png|tif|gif|psd|pdf|thm|jpeg"
26
26
27
27
STILL = re .compile (
28
- r' ^(.+)\.({}|{}|{})$' .format (_STILL , _MOVIES , _NEED_JPG ),
28
+ r" ^(.+)\.({}|{}|{})$" .format (_STILL , _MOVIES , _NEED_JPG ),
29
29
flags = re .IGNORECASE ,
30
30
)
31
31
32
32
MOVIE = re .compile (
33
- r' ^(.+)\.({})$' .format (_MOVIES ),
33
+ r" ^(.+)\.({})$" .format (_MOVIES ),
34
34
flags = re .IGNORECASE ,
35
35
)
36
36
37
37
NEED_PREVIEW = re .compile (
38
- r' ^(.+)\.({})$' .format (_NEED_JPG + '|' + _MOVIES ),
38
+ r" ^(.+)\.({})$" .format (_NEED_JPG + "|" + _MOVIES ),
39
39
flags = re .IGNORECASE ,
40
40
)
41
41
42
- THUMB_DIR = re .compile (' ^(?:200|50)$' )
42
+ THUMB_DIR = re .compile (" ^(?:200|50)$" )
43
43
44
44
45
45
@contextlib .contextmanager
46
46
def user_lock ():
47
47
# Lock directories don't work within Dropbox folders, because
48
48
# Dropbox uploads them and they can hang around after deleting here.
49
- lock_d = ' /tmp/rnpix-lock-' + os .environ [' USER' ]
50
- lock_pid = os .path .join (lock_d , ' pid' )
49
+ lock_d = " /tmp/rnpix-lock-" + os .environ [" USER" ]
50
+ lock_pid = os .path .join (lock_d , " pid" )
51
51
52
52
def _pid ():
53
53
res = - 1
@@ -73,21 +73,21 @@ def _pid():
73
73
try :
74
74
os .mkdir (lock_d )
75
75
is_locked = True
76
- with open (lock_pid , 'w' ) as f :
76
+ with open (lock_pid , "w" ) as f :
77
77
f .write (str (os .getpid ()))
78
78
break
79
79
except OSError as e :
80
80
if e .errno != errno .EEXIST :
81
81
raise
82
82
pid = _pid ()
83
83
if pid <= 0 :
84
- time .sleep (.4 )
84
+ time .sleep (0 .4 )
85
85
continue
86
86
if pid == _pid ():
87
87
os .remove (lock_pid )
88
88
os .rmdir (lock_d )
89
89
else :
90
- raise ValueError (' {}: unable to create lock' .format (lock_d ))
90
+ raise ValueError (" {}: unable to create lock" .format (lock_d ))
91
91
yield lock_d
92
92
finally :
93
93
if is_locked :
@@ -97,79 +97,85 @@ def _pid():
97
97
98
98
def move_one (src , dst_root ):
99
99
e = src .ext .lower ()
100
- if e == ' .jpeg' :
101
- e = ' .jpg'
102
- f1 = ' %Y-%m-%d-%H.%M.%S'
103
- f2 = ' {}-{}-{}-{}.{}.{}'
100
+ if e == " .jpeg" :
101
+ e = " .jpg"
102
+ f1 = " %Y-%m-%d-%H.%M.%S"
103
+ f2 = " {}-{}-{}-{}.{}.{}"
104
104
# CreationDate is in timezone as is DateTimeOriginal but not for movies
105
- z = ('-CreationDate' , '-CreationDateValue' , '-createdate' ) if MOVIE .search (src .basename ) else ('-DateTimeOriginal' ,)
105
+ z = (
106
+ ("-CreationDate" , "-CreationDateValue" , "-createdate" )
107
+ if MOVIE .search (src .basename )
108
+ else ("-DateTimeOriginal" ,)
109
+ )
106
110
d = None
107
111
for y in z :
108
112
p = subprocess .run (
109
- (' exiftool' , '-d' , f1 , y , '-S' , '-s' , src ),
113
+ (" exiftool" , "-d" , f1 , y , "-S" , "-s" , src ),
110
114
stdout = subprocess .PIPE ,
111
115
stderr = subprocess .PIPE ,
112
116
universal_newlines = True ,
113
117
)
114
118
if p .returncode != 0 :
115
- pykern .pkcli .command_error ('exiftool failed: {} {}' .format (src , p .stderr ))
116
- m = re .search (r'((?:20|19)\d\d)\D(\d\d)\D(\d\d)\D(\d\d)\D(\d\d)\D(\d\d)' , str (p .stdout ))
119
+ pykern .pkcli .command_error ("exiftool failed: {} {}" .format (src , p .stderr ))
120
+ m = re .search (
121
+ r"((?:20|19)\d\d)\D(\d\d)\D(\d\d)\D(\d\d)\D(\d\d)\D(\d\d)" , str (p .stdout )
122
+ )
117
123
if m :
118
124
# Creation Date Value is 2021:03:15 07:10:01-06:00
119
125
# it's not a date, just a string but it has timezone
120
126
t = f2 .format (* m .groups ())
121
- d = ' {}/{}-{}' .format (* m .groups ())
127
+ d = " {}/{}-{}" .format (* m .groups ())
122
128
break
123
129
if not d :
124
130
d = datetime .datetime .fromtimestamp (src .mtime ())
125
131
t = d .strftime (f1 )
126
- d = d .strftime (' %Y/%m-%d' )
127
- pkdlog (' use mtime: {} => {}' , src , t )
132
+ d = d .strftime (" %Y/%m-%d" )
133
+ pkdlog (" use mtime: {} => {}" , src , t )
128
134
if dst_root :
129
135
d = dst_root .join (d )
130
136
pykern .pkio .mkdir_parent (d )
131
137
else :
132
- d = pykern .pkio .py_path ('.' )
138
+ d = pykern .pkio .py_path ("." )
133
139
f = d .join (t + e )
134
140
if f == src :
135
- pkdlog (' ignoring same name: {}' , src , f )
141
+ pkdlog (" ignoring same name: {}" , src , f )
136
142
return
137
- pkdlog (' src {}' , src )
143
+ pkdlog (" src {}" , src )
138
144
if f .exists ():
139
145
for i in range (1 , 10 ):
140
- if f .read ('rb' ) == src .read ('rb' ):
141
- pkdlog (' removing dup={} keep={}' , src , f )
146
+ if f .read ("rb" ) == src .read ("rb" ):
147
+ pkdlog (" removing dup={} keep={}" , src , f )
142
148
src .remove (ignore_errors = True )
143
149
return
144
- f = d .join (' {}-{}{}' .format (t , i , e ))
150
+ f = d .join (" {}-{}{}" .format (t , i , e ))
145
151
if not f .exists ():
146
152
break
147
153
else :
148
- raise AssertionError (' {}: exists' .format (f ))
154
+ raise AssertionError (" {}: exists" .format (f ))
149
155
if src .dirname == f .dirname :
150
156
_fix_index (src .dirpath (), src .basename , f .basename )
151
- pkdlog (' mv {} {}' , src .basename , f .basename )
157
+ pkdlog (" mv {} {}" , src .basename , f .basename )
152
158
src .rename (f )
153
- pkdlog (' dst {}' , f )
159
+ pkdlog (" dst {}" , f )
154
160
return f
155
161
156
162
157
163
def root ():
158
- r = os .getenv (' RNPIX_ROOT' )
159
- assert r , ' must set $RNPIX_ROOT'
164
+ r = os .getenv (" RNPIX_ROOT" )
165
+ assert r , " must set $RNPIX_ROOT"
160
166
return pykern .pkio .py_path (r )
161
167
162
168
163
169
def _fix_index (d , old , new ):
164
- i = d .join (' index.txt' )
170
+ i = d .join (" index.txt" )
165
171
if not i .exists ():
166
172
return
167
173
r = []
168
- for l in i .read ().split (' \n ' ):
174
+ for l in i .read ().split (" \n " ):
169
175
if len (l .strip ()) <= 0 :
170
176
continue
171
177
if l .startswith (old ):
172
- pkdlog (' updating index: {} => {}' , old , new )
178
+ pkdlog (" updating index: {} => {}" , old , new )
173
179
l = l .replace (old , new )
174
180
r .append (l )
175
- i .write (' \n ' .join (r ) + ' \n ' )
181
+ i .write (" \n " .join (r ) + " \n " )
0 commit comments