Наверно у всех рано или поздно встает проблема разбора фоточек. У меня эта задача откладывалась несколько лет, а фоточки все прибывали, сваливались в одну папку и росли как снежный ком. В итоге у меня накопилась огромная масса накиданных в одну кучу фотографий (больше 100 гигов). Терпеть дальше это было нельзя, но и ручной разбор тоже неприемлем, т.к. банальная задача по удалению дублей в ручном разборе невозможна. Использование специальных программ, таких как «Фото» для Mac OS X отвергаю сразу из-за идеологических соображений, да и не только из-за них.
И-так имеем папку, в которую накиданы разные папки с фотками, многие фотографии повторяются по несколько раз, необходимо:
- Убрать дубли
- Отсортировать по годам
- Внутри годов распределить фото по альбомам
Для решения этой задачи я написал небольшой скрипт на php, предупреждаю сразу я писал для себя, на коленке, так что скрипт мягко говоря не идеален. В начале пара нюансов, при запуске скрипта:
- Прежде всего надо помнить что для выполнения php скриптов есть таймаут, и если скрипт будет работать долго (а у нас он может работать несколько часов), то выполнения вашей программы прервется на полдороге. Обойти это можно несколькими способами, у меня в коде прописывается
ini_set('max_execution_time', 0);
Это значит, что нет ограничений по времени на работу скрипта. - Я записываю всю информацию о фото в БД, использую MAMP (для MAC OS). Скрипт я буду запускать из консоли и тут есть нюанс для работы с MySQL из консоли. MAMP вешает MySQL на 8889 порт, а по умолчанию, если писать localhost, то подразумевается 3306 порт. Поэтому в коде, при подключении к БД у меня прописано
$db = new PDO('mysql:host=localhost:8889;dbname=photo_sort;charset=utf8', "root", "root");
- В phpMyAdmin необходимо создать БД photo_sort.
И-так, а теперь коротко о том как скрипт работает:
- Скрипт состоит из 2 файлов: класс infoPhoto.php и index.php. В переменную $mainPathAllPhoto необходимо записать полный путь к папочке с фотками. В переменную $mainPathSelectedPhoto необходимо записать путь к папке, куда будут копироваться фото уже в отсортированном виде. Запускаем скрипт в консоли php
/Users/falbin/Projects/photo-sort/index.php
- Скрипт удалят таблицу photo, а затем создает ее снова.
- Функция рекурсивно обходит все папки и собирает пути только к фотографиям и видео, согласно регулярке:
/^[\s\S]*\.jpg|png|jpeg|avi|mp4$/i
. - Затем скрипт проходит по всем фоточкам, собирая о них информацию и добавляя ее в БД. В таблице «photo» будет храниться информация о всех фото, в том числе и о повторяющихся.
- Скрипт собрал данные о всех фото (в том числе и хэш фоток) и записал в массив. Тут есть небольшой недостаток моего скрипта, если фотографий будет ОЧЕНЬ много, то массив загнется, у меня такое было, когда я записывал туда еще и метоинформацию. Поэтому тем, у кого фоток ОЧЕНЬ много, необходимо будет переделать скрипт и работать только с БД, без массива. Опять же это у меня одноразовый скрипт, поэтому там есть недоработки.
После того как все данные о всех фотках были получены, скрипт удалил из массива дубли (основываясь на хэше фоток). - Теперь копируем фото из неотсортированной кучи в новую директорию. Структура папок в отсортированной директории следующая:Т.е. глубина вложенности всего два уровня, это год и название альбома (название папки, в которой лежала фотка).
1
2
3
4
5
6
7
8
9
10
11├── год
│ ├── Название альбома 1
│ ├── Название альбома 2
│ └── Название альбома n
│
├── 2015
│ ├── Супер отдых 2015
│ └── ДР на озере
│
├── И так далие
│ - Также обновляем данные в таблице photo, добавляем информацию о новом местоположении фоток. Структура таблицы:
- id
- oldname – старое название фотографии
- newname_md5 – новое название фотографии – это хэш этой фотки
- extension – расширение фотки
- oldpath – путь к оригеналу фотки (по нему мы можем узнать в каких альбомах лежала фотка)
- album – название папки, в которой лежит фотка
- newpath – новый путь фотки, в уже отсортированной папке
- datecreatefile
- datecreatephoto
- metaInfo – полная мета информация о фотке
Хоть скрипт и делает огромную долю работы, но это очень грубая обработка, и по прежнему нужна ручная сортировка. Именно для помощи при ручной сортировки нам и нужна информация в БД.
К примеру, фотографии с дня рождения были в папке «Денюха 2011», а их дубли в паке «Разобрать фотки», и быть может в отсортированном варианте фотки с ДР будут лежать в альбоме «Разобрать фотки», а альбома «Денюха 2011» не будет. Тогда-то мы простым SQL запросом по названию фотки можем узнать где она раньше лежала, и ее метоинформацию. Или же фотографии Нового Года, часть будет лежать в папке скажем «2011», а часть в «2012». Тут поможет только ручной разбор, а БД нам в этом поможет.
Ниже привожу скриншоты реальной работы скрипта, при сортировки фоточек: