From bc4ed5e8d4661aac663802073be27cc66bef8e7e Mon Sep 17 00:00:00 2001 From: holden093 Date: Fri, 11 Jul 2025 02:12:56 +0200 Subject: [PATCH] Added classes for better handling --- .gitignore | 5 +- main.py | 148 ++++++++++++++++++++++++++++------------------------- 2 files changed, 82 insertions(+), 71 deletions(-) diff --git a/.gitignore b/.gitignore index b694934..58ebdaa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -.venv \ No newline at end of file +.venv +*.jpg +Photos +Videos \ No newline at end of file diff --git a/main.py b/main.py index 8aada1f..4baa25c 100755 --- a/main.py +++ b/main.py @@ -1,80 +1,88 @@ 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' +class Photos(): + def __init__(self, path, name): + self.path = path + self.name = name + + def order_by_tag(self, export_dir): + with open(self.path, 'rb') as ph: + tags = exifread.process_file(ph) + if 'Image DateTime' in tags: + date_taken = str(tags["Image DateTime"]).split() + elif 'EXIF DateTimeOriginal' in tags: + date_taken = str(tags["EXIF DateTimeOriginal"]).split() + else: + raise ValueError(f"No valid EXIF date tag found in {self.name}") + 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(export_dir, str(year), calendar.month_name[month]) + os.makedirs(month_dir, exist_ok=True) + shutil.move(self.path, os.path.join(month_dir, self.name)) + os.utime(os.path.join(month_dir, self.name), (date_obj.timestamp(), date_obj.timestamp())) + + def order_by_match(self, matches, export_dir): + if re.search(r's100', self.path): + return + if re.search(r'Screenshot', self.path, re.IGNORECASE): + return + m = next((re.search(pattern, self.path) for pattern in matches if re.search(pattern, self.path)), None) + if not m: + return + year = int(m.group(1)) + if year < 2000 or year > 2030: + return + month = int(m.group(2)) + day = int(m.group(3)) + date_obj = datetime.datetime(year, month, day) + month_dir = os.path.join(export_dir, str(year), calendar.month_name[month]) + os.makedirs(month_dir, exist_ok=True) + shutil.move(self.path, os.path.join(month_dir, self.name)) + os.utime(os.path.join(month_dir, self.name), (date_obj.timestamp(), date_obj.timestamp())) + +class Videos(): + def __init__(self, path, name): + self.path = path + self.name = name + + def order_by_match(self, matches, export_dir): + m = next((re.search(pattern, self.path) for pattern in matches if re.search(pattern, self.path)), None) + if not m: + return + year = int(m.group(1)) + if year < 2000 or year > 2030: + return + month = int(m.group(2)) + day = int(m.group(3)) + date_obj = datetime.datetime(year, month, day) + month_dir = os.path.join(export_dir, str(year), calendar.month_name[month]) + os.makedirs(month_dir, exist_ok=True) + shutil.move(self.path, os.path.join(month_dir, self.name)) + os.utime(os.path.join(month_dir, self.name), (date_obj.timestamp(), date_obj.timestamp())) + +root_dir = './' +export_dir = './Export/' matches = (r'(\d{4})-(\d{2})-(\d{2})', r'(\d{4})(\d{2})(\d{2})') +media = list() 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') + path = os.path.join(root, file) + ext = os.path.splitext(path)[1].lower() + if ext in ('.jpg', '.jpeg', '.png', '.webp', '.heic'): + media.append(Photos(path, file)) + elif ext in ('.mov', '.mp4', '.3gp'): + media.append(Videos(path, file)) - 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 +for element in media: + try: + if hasattr(element, 'order_by_tag'): + element.order_by_tag(export_dir) + else: + element.order_by_match(matches, export_dir) + except Exception as e: + print(f'Error processing {element.name}: {e}')