From ba7a549f6fbe23000c81accd3b14fe46fa2de6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksi=20R=C3=A4s=C3=A4nen?= Date: Sun, 19 Apr 2026 08:39:13 +0300 Subject: [PATCH] Script launches exiftool and shows Creation Date/Time from image files --- photoimport.py | 67 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/photoimport.py b/photoimport.py index 4c9aeea..408d064 100644 --- a/photoimport.py +++ b/photoimport.py @@ -1,27 +1,56 @@ #!/usr/bin/env python3 import os import sys +import subprocess + +def get_exif_date(file_path): + """ + Uses exiftool to extract the File Creation Date/Time (CreateDate). + Returns the formatted date string or an error message if extraction fails. + """ + # Use exiftool to extract the CreateDate tag. + # We use -d to define the desired output format: YYYY-MM-DD HH:MM:SS + try: + # Command: exiftool -d "Format" -CreateDate "file_path" + # The -d option allows specifying the desired output format. + result = subprocess.run( + ['exiftool', '-d', "%Y-%m-%d %H:%M:%S", '-CreateDate', file_path], + capture_output=True, + text=True, + check=True + ) + # The result should contain the date string on the first line. + date_string = result.stdout.strip() + if date_string: + # Clean up potential trailing units or extra metadata lines + return date_string.split('\n')[0].strip() + return "Date not found in metadata." + except subprocess.CalledProcessError as e: + # This handles cases where exiftool fails (e.g., corrupted file) + return f"ERROR: exiftool failed. Check file integrity or permissions. (Details: {e.stderr.strip()})" + except FileNotFoundError: + # This handles cases where 'exiftool' command is not found + return "CRITICAL ERROR: exiftool command not found. Please ensure exiftool is installed and in your system PATH." def scan_photos(root_dir): """ - Recursively scans the given directory and lists all specified photo file types. + Recursively scans the given directory, extracts EXIF date, and prints file details. """ # Define accepted extensions (in lowercase) accepted_extensions = ( - '.jpg', '.jpeg', '.raf', '.dng', '.raw', '.cr2', '.cr3' + '.jpg', '.jpeg', '.dng', '.raw', '.cr2', '.cr3', '.raf' ) - print(f"--- Starting scan in: {root_dir} ---") + print(f"--- Starting photo import scan in: {root_dir} ---") found_files = [] + # 1. Find all files try: for foldername, subfolders, filenames in os.walk(root_dir): for filename in filenames: - # Get the full path full_path = os.path.join(foldername, filename) # Check the file extension - # os.path.splitext splits filename into (root, extension) _, ext = os.path.splitext(filename) # Convert extension to lowercase for case-insensitive matching @@ -29,17 +58,30 @@ def scan_photos(root_dir): found_files.append(full_path) except FileNotFoundError: - print(f"Error: The path '{root_dir}' was not found. Please check the drive letter.") + print(f"\nFATAL ERROR: The path '{root_dir}' was not found. Please check the drive letter.") return except Exception as e: - print(f"An unexpected error occurred: {e}") + print(f"\nAN UNEXPECTED ERROR OCCURRED DURING DIRECTORY TRAVERSAL: {e}") return if found_files: - print("\n--- Files Found ---") + print("\n========================================================") + print("--- File Name & Creation Date/Time ---") + print("========================================================\n") + + processed_count = 0 for file_path in found_files: - print(file_path) - print(f"\n--- Scan complete. Found {len(found_files)} files. ---") + # Extract the date using the external tool + date_time = get_exif_date(file_path) + + # Print the file name and the date/time + print(f"File Name: {os.path.basename(file_path)}") + print(f"Creation Date/Time: {date_time}") + print("-" * 40) + processed_count += 1 + + print(f"\n========================================================") + print(f"--- Scan complete. Processed {processed_count} files. ---") else: print("\n--- Scan complete. No specified photo files found in this directory or its subdirectories. ---") @@ -54,9 +96,8 @@ if __name__ == "__main__": # The first argument (index 1) is the path target_path = sys.argv[1] - # Ensure the path ends with a directory separator if it's not empty - # This helps when the user types "Q:" instead of "Q:\" + # Ensure the path ends with a directory separator if not target_path.endswith(os.sep): target_path = target_path + os.sep - scan_photos(target_path) + scan_photos(target_path) \ No newline at end of file