diff --git a/organize.py b/organize.py index 96b199a..3c619fe 100644 --- a/organize.py +++ b/organize.py @@ -23,6 +23,15 @@ from pathlib import Path EXTENSIONS = {'.jpg', '.jpeg', '.png', '.heic', '.tiff', '.tif', '.webp', '.bmp'} +def get_file_created_date(filepath: Path) -> datetime | None: + """Возвращает дату создания файла из файловой системы (Windows: st_ctime).""" + try: + ts = filepath.stat().st_ctime + return datetime.fromtimestamp(ts) + except Exception: + return None + + def get_exif_date(filepath: Path) -> str | None: """Извлекает дату съёмки из EXIF (DateTimeOriginal).""" try: @@ -87,17 +96,24 @@ def organize(folder: Path) -> None: no_date = 0 for filepath in files: + dt = None + date_source = None + + # 1. EXIF DateTimeOriginal date_str = get_exif_date(filepath) - if not date_str: + if date_str: + dt = parse_date(date_str) + + # 2. Fallback: дата создания файла (Windows: st_ctime) + if dt is None: + dt = get_file_created_date(filepath) + if dt: + date_source = 'дата создания файла' + + if dt is None: skipped += 1 no_date += 1 - print(f' [—] {filepath.name} — нет EXIF даты, оставлен на месте') - continue - - dt = parse_date(date_str) - if not dt: - skipped += 1 - print(f' [?] {filepath.name} — не удалось распарсить дату "{date_str}"') + print(f' [—] {filepath.name} — нет даты (EXIF + CreatedDate), оставлен на месте') continue dest_dir = folder / str(dt.year) / f'{dt.month:02d}' / f'{dt.day:02d}' @@ -118,7 +134,8 @@ def organize(folder: Path) -> None: shutil.move(str(filepath), str(dest_path)) moved += 1 - print(f' [✓] {filepath.name} → {dt.year}/{dt.month:02d}/{dt.day:02d}/') + src = f' ({date_source})' if date_source else '' + print(f' [✓] {filepath.name} → {dt.year}/{dt.month:02d}/{dt.day:02d}/{src}') print() print(f'Готово! Перемещено: {moved}, пропущено: {skipped} (без даты: {no_date})')