requires exifread
pip install exifread
requires exifread
pip install exifread
#!/usr/bin/env python3 | |
import os | |
import sys | |
from datetime import datetime | |
import exifread as exif | |
def _date_from_exif(filename, extension='.jpg'): | |
date = None | |
date_by = None | |
if filename.lower().endswith(extension): | |
try: | |
with open(filename, 'rb') as f: | |
tags = exif.process_file(f) | |
candidates = [ | |
datetime.strptime(tags[name].values, '%Y:%m:%d %H:%M:%S') | |
for name in [ | |
'EXIF DateTimeOriginal', | |
'EXIF DateTimeDigitized', | |
'Image DateTime' | |
] if name in tags | |
] | |
if candidates: | |
date = min(candidates) | |
date_by = "exif" | |
except: | |
print(f"Error: {filename}") | |
return date, date_by | |
def _data_from_stat(filename): | |
attr = os.stat(filename) | |
date = datetime.fromtimestamp(min(attr.st_mtime, attr.st_atime, attr.st_ctime)) | |
date_by = "ctime" | |
return date, date_by | |
def process(filename): | |
date, date_by = _date_from_exif(filename, extension='.jpg') | |
if not date: | |
date, date_by = _data_from_stat(filename) | |
folder = os.path.join(str(date.year), str(date.month)) | |
src = filename | |
#dst = os.path.join(folder, *filename.split('/')[2:]) | |
dst = os.path.join(folder, *filename.split('/')[2:]) | |
#dst = os.path.join(folder, filename) | |
if src != dst: | |
print(f"{src}: @{date_by}-> {dst}") | |
os.makedirs(os.path.dirname(dst), exist_ok=True) | |
os.rename(src, dst) | |
def from_stdin(): | |
try: | |
#for line in iter(sys.stdin.readline, b''): | |
for line in iter(sys.stdin.readline, ''): | |
process(line.strip()) | |
except KeyboardInterrupt: | |
sys.stdout.flush() | |
pass | |
if __name__ == "__main__": | |
if len(sys.argv) > 1: | |
filename = ' '.join(sys.argv[1:]) | |
process(filename) | |
else: | |
from_stdin() |