Files
photoimport/photoimport.py
T

103 lines
4.0 KiB
Python

#!/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, 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 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:
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 a directory path argument is provided
if len(sys.argv) != 2:
print("Usage: python photoimport.py <drive_path>")
print("Example (for Windows): python photoimport.py Q:\\")
sys.exit(1)
# The first argument (index 1) is the path
target_path = sys.argv[1]
# 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)