Now paths are generated correctly
This commit is contained in:
+34
-18
@@ -19,13 +19,16 @@ def get_exif_date(file_path):
|
|||||||
text=True,
|
text=True,
|
||||||
check=True
|
check=True
|
||||||
)
|
)
|
||||||
# The result should contain the date string on the first line.
|
# The result contains "CreateDate : 2026-04-19".
|
||||||
date_string = result.stdout.strip()
|
# Extract only the value after the colon.
|
||||||
|
output = result.stdout.strip()
|
||||||
|
if ':' in output:
|
||||||
|
date_string = output.split(':', 1)[1].strip()
|
||||||
|
else:
|
||||||
|
date_string = output
|
||||||
if date_string:
|
if date_string:
|
||||||
# Clean up potential trailing units or extra metadata lines
|
# Replace '-' with '\' as requested for path compatibility.
|
||||||
cleaned_date = date_string.split('\n')[0].strip()
|
return date_string.replace('-', '\\')
|
||||||
# Replace '-' with '\' as requested
|
|
||||||
return cleaned_date.replace('-', '\\')
|
|
||||||
return "Date not found in metadata."
|
return "Date not found in metadata."
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
# This handles cases where exiftool fails (e.g., corrupted file)
|
# This handles cases where exiftool fails (e.g., corrupted file)
|
||||||
@@ -34,9 +37,10 @@ def get_exif_date(file_path):
|
|||||||
# This handles cases where 'exiftool' command is not found
|
# 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."
|
return "CRITICAL ERROR: exiftool command not found. Please ensure exiftool is installed and in your system PATH."
|
||||||
|
|
||||||
def scan_photos(root_dir):
|
def scan_photos(root_dir, base_target_path):
|
||||||
"""
|
"""
|
||||||
Recursively scans the given directory (root_dir), extracts EXIF date, and prints file details.
|
Recursively scans the given directory (root_dir), extracts EXIF date, and prints file details,
|
||||||
|
showing the proposed destination path based on the base_target_path.
|
||||||
"""
|
"""
|
||||||
# Define accepted extensions (in lowercase)
|
# Define accepted extensions (in lowercase)
|
||||||
accepted_extensions = (
|
accepted_extensions = (
|
||||||
@@ -68,22 +72,33 @@ def scan_photos(root_dir):
|
|||||||
|
|
||||||
if found_files:
|
if found_files:
|
||||||
print("\n========================================================")
|
print("\n========================================================")
|
||||||
print("--- File Name & Creation Date/Time ---")
|
print("--- File Name & Proposed Destination Directory ---")
|
||||||
print("========================================================\n")
|
print("========================================================\n")
|
||||||
|
|
||||||
processed_count = 0
|
processed_count = 0
|
||||||
for file_path in found_files:
|
for file_path in found_files:
|
||||||
# Extract the date using the external tool
|
# Extract the date using the external tool
|
||||||
date_time = get_exif_date(file_path)
|
date_time_str = get_exif_date(file_path)
|
||||||
|
|
||||||
# Print the file name and the date/time
|
# 1. Construct the full destination directory path
|
||||||
print(f"File Name: {os.path.basename(file_path)}")
|
# The base_target_path is expected to end with a separator.
|
||||||
print(f"Creation Date/Time: {date_time}")
|
# The date_time_str is in YYYY\MM\DD format (backslash-separated).
|
||||||
|
|
||||||
|
# Explicitly join with backslashes for Windows-style paths.
|
||||||
|
if not base_target_path.endswith('\\'):
|
||||||
|
destination_dir = base_target_path + '\\' + date_time_str
|
||||||
|
else:
|
||||||
|
destination_dir = base_target_path + date_time_str
|
||||||
|
|
||||||
|
print(f"File: {os.path.basename(file_path)}")
|
||||||
|
print(f" -> Extracted Date: {date_time_str}")
|
||||||
|
print(f" -> Proposed Destination Directory: {destination_dir}")
|
||||||
print("-" * 40)
|
print("-" * 40)
|
||||||
processed_count += 1
|
processed_count += 1
|
||||||
|
|
||||||
print(f"\n========================================================")
|
print(f"\n========================================================")
|
||||||
print(f"--- Scan complete. Processed {processed_count} files. ---")
|
print(f"--- Scan complete. Processed {processed_count} files. ---")
|
||||||
|
print(f"Files with the same date will point to the same destination directory.")
|
||||||
else:
|
else:
|
||||||
print("\n--- Scan complete. No specified photo files found in this directory or its subdirectories. ---")
|
print("\n--- Scan complete. No specified photo files found in this directory or its subdirectories. ---")
|
||||||
|
|
||||||
@@ -97,15 +112,16 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
# Argument 1: The directory to scan (the drive)
|
# Argument 1: The directory to scan (the drive)
|
||||||
root_scan_dir = sys.argv[1]
|
root_scan_dir = sys.argv[1]
|
||||||
# Argument 2: The path to display to the user
|
# Argument 2: The path to display to the user (the base path for grouping)
|
||||||
target_display_path = sys.argv[2]
|
base_target_path = sys.argv[2]
|
||||||
|
|
||||||
# Echo the specified path
|
# Echo the specified path
|
||||||
print(f"Using path: {target_display_path}")
|
print(f"Using base target path for grouping: {base_target_path}")
|
||||||
|
|
||||||
# Ensure the scanning path ends with a directory separator
|
# Ensure the scanning path ends with a directory separator
|
||||||
|
# This is important for os.path.join to work correctly
|
||||||
if not root_scan_dir.endswith(os.sep):
|
if not root_scan_dir.endswith(os.sep):
|
||||||
root_scan_dir = root_scan_dir + os.sep
|
root_scan_dir = root_scan_dir + os.sep
|
||||||
|
|
||||||
# Perform the scan using the first argument (the drive)
|
# Perform the scan using the first argument (the drive) and the base path
|
||||||
scan_photos(root_scan_dir)
|
scan_photos(root_scan_dir, base_target_path)
|
||||||
Reference in New Issue
Block a user