From c5d333f3e9a097ea4985171c0f1447b5d3d8f970 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 28 Jun 2026 16:28:23 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20fallback=20=D0=BD=D0=B0=20Created=20Dat?= =?UTF-8?q?e=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0,=20=D0=B5=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B5=D1=82=20EXIF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- organize.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) 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})')