#!/usr/bin/env python3 import os import re import typing import datetime import PIL.ExifTags import PIL.Image import progressbar EXTENSION_PATTERN = re.compile(r"\.JPE?G", re.I) COMMON_PATTERN = re.compile(r"(IMG|DSC[NF]?|100|P10|f|t)_?\d+", re.I) EXIF_TAG_NAME = "DateTimeOriginal" EXIF_TAG_ID = list(PIL.ExifTags.TAGS.keys())[ list(PIL.ExifTags.TAGS.values()).index(EXIF_TAG_NAME) ] EXIF_DATE_FORMAT = "%Y:%m:%d %H:%M:%S" def get_pictures(directory: str = ".", skip_renamed: bool = True) -> typing.Generator: for root, _, files in os.walk(directory): for filename in files: filename_trunk, extension = os.path.splitext(filename) # if extension.upper() not in ('.JPEG', '.JPG'): if not re.match(EXTENSION_PATTERN, extension): continue if skip_renamed: if not re.match(COMMON_PATTERN, filename_trunk): continue full_path = os.path.join(root, filename) yield full_path def main() -> None: print("Counting files...") nb_imgs = len(list(get_pictures())) print("Processing files...") iterator = progressbar.progressbar(get_pictures(), max_value=nb_imgs) for full_path in iterator: img = PIL.Image.open(full_path) exif_data = img._getexif() if exif_data and EXIF_TAG_ID in exif_data: date_raw = exif_data[EXIF_TAG_ID] date = datetime.datetime.strptime(date_raw, EXIF_DATE_FORMAT) new_name = date.isoformat().replace(":", "-") + ".jpg" # For NTFS print(full_path, new_name) os.rename(full_path, new_name) # TODO FOLDER img.close() if __name__ == "__main__": # TODO Arguments parsing main()