pytable/dt_fix_file_structure.py
2024-09-02 20:45:46 +02:00

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()