#!/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 (root_dir), extracts EXIF date, and prints file details. """ # Define accepted extensions (in lowercase) accepted_extensions = ( '.jpg', '.jpeg', '.dng', '.raw', '.cr2', '.cr3', '.raf' ) print(f"--- Starting photo scan in: {root_dir} ---") found_files = [] # 1. Find all files try: for foldername, subfolders, filenames in os.walk(root_dir): for filename in filenames: full_path = os.path.join(foldername, filename) # Check the file extension _, ext = os.path.splitext(filename) # Convert extension to lowercase for case-insensitive matching if ext.lower() in accepted_extensions: found_files.append(full_path) except FileNotFoundError: print(f"\nFATAL ERROR: The path '{root_dir}' was not found. Please check the drive letter.") return except Exception as e: print(f"\nAN UNEXPECTED ERROR OCCURRED DURING DIRECTORY TRAVERSAL: {e}") return if found_files: print("\n========================================================") print("--- File Name & Creation Date/Time ---") print("========================================================\n") processed_count = 0 for file_path in found_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. ---") if __name__ == "__main__": # Check if two arguments are provided (script name + drive + path) if len(sys.argv) != 3: print("Usage: python photoimport.py ") print("Example (for Windows): python photoimport.py Q:\\ I:\\Photos") sys.exit(1) # Argument 1: The directory to scan (the drive) root_scan_dir = sys.argv[1] # Argument 2: The path to display to the user target_display_path = sys.argv[2] # Echo the specified path print(f"Using path: {target_display_path}") # Ensure the scanning path ends with a directory separator if not root_scan_dir.endswith(os.sep): root_scan_dir = root_scan_dir + os.sep # Perform the scan using the first argument (the drive) scan_photos(root_scan_dir)