Ветцштайн Петр

Блог программиста

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

 
 
Голосов:   77

 

Наверно у всех рано или поздно встает проблема разбора фоточек. У меня эта задача откладывалась несколько лет, а фоточки все прибывали, сваливались в одну папку и росли как снежный ком. В итоге у меня накопилась огромная масса накиданных в одну кучу фотографий (больше 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 │ └── Название альбома n │ ├── 2015 │ ├── Супер отдых 2015 │ └── ДР на озере │ ├── И так далие

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



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

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

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






0                09.04.2016


Комментарии:



    Введите ник:


    Введите e-mail:


    Введите комментарий:


    Очистить все поля




    Самые популярные статьи

    В процессе написания очередной программы на C# столкнулся с проблемой создания ZIP-архива. Нужно было упаковать сформированный файл отчета в архив для дальнейшей отправки по почте. Сейчас попытаюсь как можно проще описать процесс создания архива с помощью простой подключаемой библиотеки "SharpZipLib" (Скачать можно с оф.сайта, как в виде скомпилированой библиотеки, так и исходный код). Итак, создаем новое приложение Windows Forms. Кидаем на форму лейбл (label1), текстовое поле (textBox1) и.....

    23609  5460 Читать полностью >>>
    Сегодняшний пост будет довольно короткий, но при этом раскроет основы работы Skype API. Для работы нам понадобится библиотека Skype4COM. К сожалению в разделе для разработчиков (developer.skype.com) нет нормальной документации для работы с данной библиотекой, так же как и нет примеров кода на C#. Меньше слов, больше дела! Распаковываем архив и регистрируем dll в системе: Пуск => Выполнить => "regsvr32 D:\Skype4COM.dll" где D:\Skype4COM.dll - путь dll. В студии создаем новый проект и объявляе.....

    1070  1711 Читать полностью >>>
    Я всегда любил C# очень удобный, нативный и в целом очень красивый язык программирования, но так вышло что я ушел в сторону php, JavaScript и прочих веб технологий. К C# я не подходил очень давно, но вот недавно пришлось разбираться в коде давно написанной программы. Это программа для продажи ювелирных изделий, реально крутится в 5 магазинах. Всех все устраивало, и если б не один педантичный кассир, мы бы никогда не узнали всю глубину падения Microsoft. Оказывается программа при введении с.....

    160  7 Читать полностью >>>
    Вы задавались вопросом, как написать парсер на C#? Думаю ни для кого не секрет, что парсер это синтаксический анализатор. Рано или поздно все кто занимаются программированием, сталкиваются с необходимостью написания синтаксического анализатора. И-так парсер, который разберем в данной статье предназначен для облегчения SEO оптимизации сайта. Очень удобно было бы знать на какой позиции находится оптимизируемы сайт по тому или иному запросу. Это полезно для анализа уже проделанной SEO оптимизац.....

    148  385 Читать полностью >>>
    Моей основной ОС является MAC OS. Мне необходимо было установить VirtualBox и установить в ней, в качестве гостевой ОС Ubuntu Server без графической оболочки. Настроить Ubuntu в качестве LAMP сервера и установить Apache, Mysql, phpMyAdmin. Также настроить общую папку между основной и гостевой ОС. Ниже представлена инструкция как это сделать. Скачиваем VirtualBox для MAC OS X Скачиваем Ubuntu Server 64-bit (без графической оболочки) Устанавливаем VirtualBox и Ubuntu. В разделе «Выбор пр.....

    100  1 Читать полностью >>>

    Архив статей

      Статей нет!
        Статей нет!
          Статей нет!

          Статистика