|
#!/home/lukas/projects/virtualenv-photostation/bin/python |
|
import os |
|
import sys |
|
import argparse |
|
|
|
from libxmp import consts, XMPFiles, XMPError |
|
from difflib import unified_diff |
|
|
|
parser = argparse.ArgumentParser(description='Resync image tags.') |
|
parser.add_argument('folders', metavar='FOLDER', type=str, nargs='*', |
|
help='folders that are parsed') |
|
parser.add_argument('--write', dest='write', action='store_true') |
|
parser.add_argument('--no-write', dest='write', action='store_false') |
|
parser.set_defaults(write=False) |
|
parser.set_defaults(folders=['/files/photos']) |
|
|
|
args = parser.parse_args() |
|
|
|
map_lr_dk = { |
|
'Red': '1', |
|
'Orange': '2', |
|
'Yellow': '3', |
|
'Green': '4', |
|
'Blue': '5', |
|
'Magenta': '6', |
|
'Gray': '7', |
|
'Black': '8', |
|
'White': '9' |
|
} |
|
map_dk_lr = {v: k for k, v in map_lr_dk.items()} |
|
|
|
for base in args.folders: |
|
for root, dirs, files in os.walk(base): |
|
print('Entering directory %s' % root) |
|
for file in files: |
|
if file.lower().endswith('.jpg'): |
|
try: |
|
xmpfile = XMPFiles(file_path=root + os.sep + file, open_forupdate=True) |
|
except Exception as e: |
|
print("Error handling file ", root + os.sep + file) |
|
raise e |
|
xmp = xmpfile.get_xmp() |
|
try: |
|
xmp.register_namespace('http://www.digikam.org/ns/1.0/', 'digikam') |
|
except XMPError: |
|
pass |
|
|
|
try: |
|
lr = xmp.get_property(consts.XMP_NS_XMP, 'Label') |
|
except XMPError: |
|
lr = None |
|
|
|
try: |
|
dk = xmp.get_property('http://www.digikam.org/ns/1.0/', 'ColorLabel') |
|
except XMPError: |
|
dk = None |
|
|
|
if dk == '0': |
|
dk = None |
|
|
|
if lr is None and dk is None: |
|
continue |
|
|
|
if lr is not None and lr not in map_lr_dk: |
|
print("ERROR! Lightroom color label '%s' could not be mapped!" % lr) |
|
continue |
|
|
|
if dk is not None and dk not in map_dk_lr: |
|
print("ERROR! Digikam color label '%s' could not be mapped!" % dk) |
|
continue |
|
|
|
before = str(xmp) |
|
|
|
if lr == 'White' or dk == '9': |
|
xmp.delete_property('http://www.digikam.org/ns/1.0/', 'ColorLabel') |
|
xmp.delete_property(consts.XMP_NS_XMP, 'Label') |
|
elif lr is not None and map_lr_dk[lr] == dk: |
|
continue |
|
elif lr is not None and map_lr_dk[lr] != dk: |
|
xmp.set_property('http://www.digikam.org/ns/1.0/', 'ColorLabel', map_lr_dk[lr]) |
|
elif dk is not None: |
|
xmp.set_property(consts.XMP_NS_XMP, 'Label', map_dk_lr[dk]) |
|
|
|
after = str(xmp) |
|
diff = unified_diff(before.splitlines(keepends=True), after.splitlines(keepends=True), |
|
fromfile=root + os.sep + file) |
|
print(''.join(diff), end="") |
|
|
|
if args.write: |
|
if xmpfile.can_put_xmp(xmp): |
|
xmpfile.put_xmp(xmp) |
|
xmpfile.close_file() |