Added classes for better handling
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1 +1,4 @@
|
|||||||
.venv
|
.venv
|
||||||
|
*.jpg
|
||||||
|
Photos
|
||||||
|
Videos
|
148
main.py
148
main.py
@@ -1,80 +1,88 @@
|
|||||||
import os, re, shutil, calendar, datetime
|
import os, re, shutil, calendar, datetime
|
||||||
import exifread
|
import exifread
|
||||||
|
|
||||||
match = r'(.*)(\..*)'
|
class Photos():
|
||||||
root_dir = '/mnt/dati/process'
|
def __init__(self, path, name):
|
||||||
photos_dir = '/mnt/dati/export/Photos'
|
self.path = path
|
||||||
videos_dir = '/mnt/dati/export/Videos'
|
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})')
|
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 root, dirs, files in os.walk(root_dir):
|
||||||
for file in files:
|
for file in files:
|
||||||
data = os.path.join(root, file)
|
path = os.path.join(root, file)
|
||||||
file_match = re.search(match, data, re.IGNORECASE)
|
ext = os.path.splitext(path)[1].lower()
|
||||||
if file_match and file_match.group(2).lower() in ('.jpg', '.jpeg', '.png', '.webp', '.heic'):
|
if ext in ('.jpg', '.jpeg', '.png', '.webp', '.heic'):
|
||||||
with open(data, 'rb') as ph:
|
media.append(Photos(path, file))
|
||||||
foundMatch = False
|
elif ext in ('.mov', '.mp4', '.3gp'):
|
||||||
try:
|
media.append(Videos(path, file))
|
||||||
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'):
|
for element in media:
|
||||||
foundMatch = False
|
try:
|
||||||
for pattern in matches:
|
if hasattr(element, 'order_by_tag'):
|
||||||
try:
|
element.order_by_tag(export_dir)
|
||||||
m = re.search(pattern, data)
|
else:
|
||||||
if m:
|
element.order_by_match(matches, export_dir)
|
||||||
year = int(m.group(1))
|
except Exception as e:
|
||||||
month = int(m.group(2))
|
print(f'Error processing {element.name}: {e}')
|
||||||
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')
|
|
||||||
|
Reference in New Issue
Block a user