120 lines
4.2 KiB
Python
120 lines
4.2 KiB
Python
import os
|
|
import time
|
|
import sys
|
|
from shutil import copy2
|
|
import filecmp
|
|
import pathlib
|
|
from PIL import Image, ExifTags
|
|
import pendulum
|
|
|
|
from tkinter import filedialog
|
|
from tkinter import *
|
|
root = Tk()
|
|
root.withdraw()
|
|
INGEST_DIR = filedialog.askdirectory()
|
|
|
|
# INGEST_DIR = pathlib.PureWindowsPath(
|
|
# r'C:\Users\ahosking\Nextcloud\Camera Uploads\Alex\2022')
|
|
PHOTO_LIBRARY = '//192.168.1.4/photos/photo_library/'
|
|
# TODO: Add dircectory traversal
|
|
file_list = []
|
|
dir_list = {}
|
|
|
|
|
|
def compare_and_move():
|
|
# move_list = []
|
|
for root, d_names, f_names in os.walk(INGEST_DIR, topdown=False):
|
|
for file in f_names:
|
|
file_name = os.path.join(root, file)
|
|
# print(file_name) # Debugging
|
|
file_list.append(file_name)
|
|
# print(root, d_names, f_names) # Debugging
|
|
# print(file_list) # Debugging
|
|
# print(len(file_list)) # Debugging
|
|
|
|
process_files(file_list)
|
|
print(dir_list.keys())
|
|
# remove_empty_directories(INGEST_DIR)
|
|
|
|
|
|
def process_files(file_list):
|
|
for item in file_list:
|
|
cur_file = pathlib.Path(os.path.join(INGEST_DIR, item))
|
|
print(cur_file)
|
|
# print("last modified: %s" % time.ctime(os.path.getmtime(cur_file)))
|
|
# created_date = cur_file.stat().st_ctime
|
|
|
|
# Check for Exif Data
|
|
# if no exif data revert to file created time
|
|
try:
|
|
created_date = Image.open(cur_file)._getexif()[36867]
|
|
parsed_date = pendulum.parse(created_date)
|
|
except:
|
|
created_date = (time.ctime(os.path.getctime(cur_file)))
|
|
parsed_date = pendulum.parse(created_date, strict=False)
|
|
|
|
filename, file_extension = os.path.splitext(item)
|
|
filename = os.path.basename(item).split(
|
|
'/')[-1] # Critical to the process
|
|
print()
|
|
print(filename)
|
|
print()
|
|
if not file_extension.lower() in (".nef", ".jpg", ".mp4", ".mov"):
|
|
continue
|
|
|
|
# print(filename, file_extension)
|
|
# print(created_date)
|
|
# print()
|
|
|
|
# print(parsed_date)
|
|
year = str(parsed_date.year)
|
|
month = str(parsed_date.month).zfill(2)
|
|
day = str(parsed_date.day).zfill(2)
|
|
destination_path = "%s%s/%s" % (PHOTO_LIBRARY, year, month)
|
|
destination = "%s/%s" % (destination_path, filename)
|
|
if not destination in dir_list.keys():
|
|
dir_list[destination_path] = []
|
|
dir_list[destination_path].append(cur_file)
|
|
# print(destination)
|
|
print("We want to move %s to %s%s/%s." %
|
|
(filename, PHOTO_LIBRARY, year, month))
|
|
|
|
# check if the directory exists
|
|
if not os.path.isdir(os.path.join(PHOTO_LIBRARY, str(year))):
|
|
print("We couldn't find your directory.")
|
|
os.makedirs(os.path.join(PHOTO_LIBRARY, str(year)))
|
|
if not os.path.isdir(os.path.join(PHOTO_LIBRARY, str(year), str(month))):
|
|
print("We couldn't find your directory, matching year and month")
|
|
os.makedirs(os.path.join(PHOTO_LIBRARY, str(year), str(month)))
|
|
# I'm not sure that I care about the day anymore #
|
|
# if not os.path.isdir(os.path.join(PHOTO_LIBRARY, str(year), str(month), str(day))):
|
|
# print("We couldn't find your directory, matching year month and day")
|
|
# os.makedirs(os.path.join(PHOTO_LIBRARY,
|
|
# str(year), str(month), str(day)))
|
|
|
|
# We should be copying, creating a source and destination hash
|
|
# comparing the files and then deleting the source
|
|
print("\nCopying %s to %s" % (cur_file, destination))
|
|
copy2(cur_file, destination)
|
|
if filecmp.cmp(cur_file, destination) == True:
|
|
print("%s and %s are a match. Time to delete %s" %
|
|
(cur_file, destination, cur_file))
|
|
os.remove(cur_file)
|
|
|
|
# TODO:
|
|
# Find files with no extension and save them + directory to a file
|
|
|
|
|
|
def remove_empty_directories(directory):
|
|
for root, d_names, f_names in os.walk(directory, topdown=False):
|
|
print(root, d_names, f_names)
|
|
if len(d_names) == 0 and len(f_names) == 0:
|
|
print("I want to remove:", root)
|
|
os.rmdir(root)
|
|
if not os.path.isdir(root):
|
|
print(root, "was removed.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
compare_and_move()
|