101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
from pytable.models import Image, ImageFlags, FilmRoll
|
|
|
|
from datetime import datetime
|
|
import peewee as pw
|
|
import os
|
|
from pprint import pprint
|
|
import subprocess
|
|
|
|
base_path = "/home/oke/Pictures/Darktable"
|
|
real_folders = [
|
|
"/home/oke/Pictures/DarktableRemote",
|
|
"/home/oke/Pictures/DarktableLocal",
|
|
]
|
|
|
|
subprocess.check_call(["mountpoint", "/home/oke/Pictures/DarktableRemote"])
|
|
|
|
query = Image.filter()
|
|
pw.prefetch(query, FilmRoll)
|
|
dry = True
|
|
|
|
move_files = []
|
|
|
|
|
|
d_root = "/home/oke/Pictures/Darktable"
|
|
d_local = "/home/oke/Pictures/DarktableLocal"
|
|
d_remote = "/home/oke/Pictures/DarktableRemote"
|
|
|
|
|
|
def me_and_related_dt(fn, new_folder, new_basename):
|
|
directory, filename = os.path.split(fn)
|
|
basename, ext = os.path.splitext(filename)
|
|
yield fn, os.path.join(new_folder, new_basename + ext)
|
|
yield os.path.join(directory, "." + basename + ".mov"), os.path.join(new_folder, "." + new_basename + ".mov"),
|
|
yield fn + ".xmp", os.path.join(new_folder, new_basename + ext + ".xmp")
|
|
|
|
|
|
def me_and_related_potential(fn, new_folder, new_basename):
|
|
for local_fn, local_fn_related in me_and_related_dt(fn, new_folder, new_basename):
|
|
assert local_fn.startswith(d_root)
|
|
yield local_fn.replace(d_root, d_local), local_fn_related.replace(d_root, d_local)
|
|
yield local_fn.replace(d_root, d_remote), local_fn_related.replace(d_root, d_remote)
|
|
|
|
def me_and_related(fn, new_folder, new_basename):
|
|
for fn, fn_related in me_and_related_potential(fn, new_folder, new_basename):
|
|
if os.path.exists(fn):
|
|
assert not os.path.exists(fn_related), fn + "=>" + fn_related
|
|
yield fn, fn_related
|
|
|
|
changes = []
|
|
|
|
for image in query:
|
|
try:
|
|
n = 0
|
|
dt_fn = datetime.strptime(image.filename[:13],"%Y%m%d_%H%M")
|
|
if image.datetime_taken:
|
|
dt_internal = datetime(image.datetime_taken.year, image.datetime_taken.month, image.datetime_taken.day, image.datetime_taken.hour, image.datetime_taken.minute)
|
|
expected_folder = os.path.join(base_path, dt_internal.strftime("%Y%m%d"))
|
|
if dt_fn != dt_internal:
|
|
d = ((dt_internal - dt_fn).total_seconds() / 3600)
|
|
dt_formatted = image.datetime_taken.strftime("%Y%m%d_%H%M")
|
|
new_film_roll = image.film
|
|
if expected_folder != image.film.folder:
|
|
new_film_roll = FilmRoll.get(folder=expected_folder)
|
|
assert new_film_roll
|
|
|
|
new_fn = dt_formatted + image.filename[13:]
|
|
new_basename, _ = os.path.splitext(new_fn)
|
|
|
|
changes.append((
|
|
image, new_film_roll, new_fn,
|
|
list(me_and_related(os.path.join(image.film.folder, image.filename), new_film_roll.folder, new_basename))
|
|
))
|
|
|
|
print("%s: %.2fH" % (image.filename, d))
|
|
for src, dst in changes[-1][-1]:
|
|
print("\t%s => %s" % (src, dst))
|
|
except Exception as e:
|
|
print("ERROR:", e)
|
|
|
|
|
|
|
|
reply = input("Type YES to remove all these files. This is not reversible... : ")
|
|
|
|
if reply != 'YES':
|
|
print("You did not type 'YES'. Not doing anything!")
|
|
exit(-1)
|
|
|
|
for image, film_roll, new_fn, move in changes:
|
|
print(image.filename, "=>", new_fn)
|
|
|
|
for src, dst in move:
|
|
assert not os.path.exists(dst)
|
|
|
|
for src, dst in move:
|
|
print("Moving %s => %s" % (src, dst))
|
|
os.rename(src, dst)
|
|
print("Saving image into sql")
|
|
image.film = film_roll
|
|
image.filename = new_fn
|
|
image.save()
|