Скрипт для автоматической сортировки фотографий

Наверно у всех рано или поздно встает проблема разбора фоточек. У меня эта задача откладывалась несколько лет, а фоточки все прибывали, сваливались в одну папку и росли как снежный ком. В итоге у меня накопилась огромная масса накиданных в одну кучу фотографий (больше 100 гигов). Терпеть дальше это было нельзя, но и ручной разбор тоже неприемлем, т.к. банальная задача по удалению дублей в ручном разборе невозможна. Использование специальных программ, таких как «Фото» для Mac OS X отвергаю сразу из-за идеологических соображений, да и не только из-за них.

И-так имеем папку, в которую накиданы разные папки с фотками, многие фотографии повторяются по несколько раз, необходимо:

  1. Убрать дубли
  2. Отсортировать по годам
  3. Внутри годов распределить фото по альбомам

Для решения этой задачи я написал небольшой скрипт на php, предупреждаю сразу я писал для себя, на коленке, так что скрипт мягко говоря не идеален. В начале пара нюансов, при запуске скрипта:

  1. Прежде всего надо помнить что для выполнения php скриптов есть таймаут, и если скрипт будет работать долго (а у нас он может работать несколько часов), то выполнения вашей программы прервется на полдороге. Обойти это можно несколькими способами, у меня в коде прописывается ini_set('max_execution_time', 0); Это значит, что нет ограничений по времени на работу скрипта.
  2. Я записываю всю информацию о фото в БД, использую MAMP (для MAC OS). Скрипт я буду запускать из консоли и тут есть нюанс для работы с MySQL из консоли. MAMP вешает MySQL на 8889 порт, а по умолчанию, если писать localhost, то подразумевается 3306 порт. Поэтому в коде, при подключении к БД у меня прописано $db = new PDO('mysql:host=localhost:8889;dbname=photo_sort;charset=utf8', "root", "root");
  3. В phpMyAdmin необходимо создать БД photo_sort.

И-так, а теперь коротко о том как скрипт работает:

  1. Скрипт состоит из 2 файлов: класс infoPhoto.php и index.php. В переменную $mainPathAllPhoto необходимо записать полный путь к папочке с фотками. В переменную $mainPathSelectedPhoto необходимо записать путь к папке, куда будут копироваться фото уже в отсортированном виде. Запускаем скрипт в консоли php /Users/falbin/Projects/photo-sort/index.php
  2. Скрипт удалят таблицу photo, а затем создает ее снова.
  3. Функция рекурсивно обходит все папки и собирает пути только к фотографиям и видео, согласно регулярке: /^[\s\S]*\.jpg|png|jpeg|avi|mp4$/i .
  4. Затем скрипт проходит по всем фоточкам, собирая о них информацию и добавляя ее в БД. В таблице «photo» будет храниться информация о всех фото, в том числе и о повторяющихся.
  5. Скрипт собрал данные о всех фото (в том числе и хэш фоток) и записал в массив. Тут есть небольшой недостаток моего скрипта, если фотографий будет ОЧЕНЬ много, то массив загнется, у меня такое было, когда я записывал туда еще и метоинформацию. Поэтому тем, у кого фоток ОЧЕНЬ много, необходимо будет переделать скрипт и работать только с БД, без массива. Опять же это у меня одноразовый скрипт, поэтому там есть недоработки.
    После того как все данные о всех фотках были получены, скрипт удалил из массива дубли (основываясь на хэше фоток).
  6. Теперь копируем фото из неотсортированной кучи в новую директорию. Структура папок в отсортированной директории следующая:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ├── год
    │ ├── Название альбома 1
    │ ├── Название альбома 2
    │ └── Название альбома n
    ├── 2015
    │ ├── Супер отдых 2015
    │ └── ДР на озере
    ├── И так далие

Т.е. глубина вложенности всего два уровня, это год и название альбома (название папки, в которой лежала фотка).

  1. Также обновляем данные в таблице photo, добавляем информацию о новом местоположении фоток. Структура таблицы:
    • id
    • oldname – старое название фотографии
    • newname_md5 – новое название фотографии – это хэш этой фотки
    • extension – расширение фотки
    • oldpath – путь к оригеналу фотки (по нему мы можем узнать в каких альбомах лежала фотка)
    • album – название папки, в которой лежит фотка
    • newpath – новый путь фотки, в уже отсортированной папке
    • datecreatefile
    • datecreatephoto
    • metaInfo – полная мета информация о фотке

Хоть скрипт и делает огромную долю работы, но это очень грубая обработка, и по прежнему нужна ручная сортировка. Именно для помощи при ручной сортировки нам и нужна информация в БД.

К примеру, фотографии с дня рождения были в папке «Денюха 2011», а их дубли в паке «Разобрать фотки», и быть может в отсортированном варианте фотки с ДР будут лежать в альбоме «Разобрать фотки», а альбома «Денюха 2011» не будет. Тогда-то мы простым SQL запросом по названию фотки можем узнать где она раньше лежала, и ее метоинформацию. Или же фотографии Нового Года, часть будет лежать в папке скажем «2011», а часть в «2012». Тут поможет только ручной разбор, а БД нам в этом поможет.

Ниже привожу скриншоты реальной работы скрипта, при сортировки фоточек:

Код на github

Поделиться