commit 610e7bb0feb2c8ce67c841fb4c8ed79a114cc51c Author: holden093 Date: Sun Jul 6 14:52:17 2025 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b694934 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv \ No newline at end of file diff --git a/main.py b/main.py new file mode 100755 index 0000000..8aada1f --- /dev/null +++ b/main.py @@ -0,0 +1,80 @@ +import os, re, shutil, calendar, datetime +import exifread + +match = r'(.*)(\..*)' +root_dir = '/mnt/dati/process' +photos_dir = '/mnt/dati/export/Photos' +videos_dir = '/mnt/dati/export/Videos' + +matches = (r'(\d{4})-(\d{2})-(\d{2})', r'(\d{4})(\d{2})(\d{2})') + + +for root, dirs, files in os.walk(root_dir): + for file in files: + data = os.path.join(root, file) + file_match = re.search(match, data, re.IGNORECASE) + if file_match and file_match.group(2).lower() in ('.jpg', '.jpeg', '.png', '.webp', '.heic'): + with open(data, 'rb') as ph: + foundMatch = False + try: + tags = exifread.process_file(ph) + if tags: + if 'Image DateTime' in tags: + date_taken = str(tags["Image DateTime"]).split() + elif 'EXIF DateTimeOriginal' in tags: + date_taken = str(tags["EXIF DateTimeOriginal"]).split() + year, month, day = map(int, date_taken[0].split(':')) + hour, minute, second = map(int, date_taken[1].split(':')) + date_obj = datetime.datetime(year, month, day, hour, minute, second) + month_dir = os.path.join(os.path.join(photos_dir, str(year)), calendar.month_name[month]) + os.makedirs(month_dir, exist_ok=True) + shutil.copyfile(data, os.path.join(month_dir, file)) + os.utime(os.path.join(month_dir, file), (date_obj.timestamp(), date_obj.timestamp())) + foundMatch = True + else: + for pattern in matches: + m = re.search(pattern, data) + if m: + year = int(m.group(1)) + if year < 2000 or year > 2030: + continue + if re.search(r's100', data): + continue + if re.search(r'Screenshot', data, re.IGNORECASE): + continue + month = int(m.group(2)) + day = int(m.group(3)) + date_obj = datetime.datetime(year, month, day) + month_dir = os.path.join(os.path.join(photos_dir, str(year)), calendar.month_name[month]) + os.makedirs(month_dir, exist_ok=True) + shutil.copyfile(data, os.path.join(month_dir, file)) + os.utime(os.path.join(month_dir, file), (date_obj.timestamp(), date_obj.timestamp())) + foundMatch = True + break + except Exception as e: + print(f'Error processing photo {data}: {e}') + if not foundMatch: + print(f'No date pattern found in filename: {data}\n') + + elif file_match and file_match.group(2).lower() in ('.mov', '.mp4', '.3gp'): + foundMatch = False + for pattern in matches: + try: + m = re.search(pattern, data) + if m: + year = int(m.group(1)) + month = int(m.group(2)) + day = int(m.group(3)) + if year < 2000 or year > 2030: + continue + date_obj = datetime.datetime(year, month, day) + month_dir = os.path.join(os.path.join(videos_dir, str(year)), calendar.month_name[month]) + os.makedirs(month_dir, exist_ok=True) + shutil.copyfile(data, os.path.join(month_dir, file)) + os.utime(os.path.join(month_dir, file), (date_obj.timestamp(), date_obj.timestamp())) + foundMatch = True + break + except Exception as e: + print(f'Error processing video {data}: {e}') + if not foundMatch: + print(f'No date pattern found in filename: {data}\n') \ No newline at end of file