Alexander Hosking
3bb1600e62
This makes it easy to add new functions and features Added Removal of empty directories Added root function to control flow and make development easier
108 lines
3.8 KiB
Python
108 lines
3.8 KiB
Python
import os
|
|
import time
|
|
import sys
|
|
from shutil import copy2
|
|
import filecmp
|
|
import pathlib
|
|
from PIL import Image, ExifTags
|
|
import pendulum
|
|
|
|
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 = []
|
|
|
|
|
|
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)
|
|
file_list.append(file_name)
|
|
print(root, d_names, f_names)
|
|
print(file_list)
|
|
print(len(file_list))
|
|
process_files(file_list)
|
|
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 = "%s%s/%s/%s/%s" % (PHOTO_LIBRARY,
|
|
year, month, day, filename)
|
|
# print(destination)
|
|
print("We want to move %s to %s%s/%s/%s." %
|
|
(filename, PHOTO_LIBRARY, year, month, day))
|
|
|
|
# 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)))
|
|
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()
|
|
print("Copying %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()
|