Как стать автором
Обновить

Порядок в фото- и видеоархиве с помощью методики и пары скриптов

Время на прочтение11 мин
Количество просмотров28K
Я далеко не профессиональный фотограф, но снимать люблю, и периодически мой архив из нескольких десятков тысяч фотографий самого разного качества пополняется фотками с зеркалки, «мыльницы» и трех телефонов, а также видеозаписями с телефонов и видеокамеры. Какой я только софт не перепробовал для поддержания архива фото и видео в порядке! Adobe Lightroom, Apple iPhoto, Google Picasa…

В итоге ни один из них не решал задачу хорошо, и пришлось писать свой. Я подумал, что мой опыт может кому-то пригодиться, из чего и родилась эта статья.

Если вы не только фотограф, но и немножко программист, то создать подобную систему у себя вы сможете за полчаса.



Постановка задачи

Итак, какую же задачу мне нужно было решить? Насколько необычны мои ожидания от каталоголизатора?

  • Мне нужен механизм разбора фото по годам, месяцам и датам. Чтобы при необходимости быстро найти событие по времени.
  • Мне нужно определять дубликаты при импорте и добавлять в архив только новое.
  • Мне нужен бесплатный софт, желательно не требующий инсталляции, а в идеале еще и многоплатформенный. Идея в том, что софт должен лежать на внешнем диске вместе с фотоархивом, а запускаться с той машины, к которой этот диск подключен. Причина — требование к надежности и объему жестких дисков.
  • Мне нужен софт, который пережил бы все переустановки, смены операционной системы (даже на другую).
  • Мне нужен удобный механизм для создания резервной копии локально, при этом мне важно, чтобы бэкап не зависел от софта (то есть это была просто копия папки), и мог легко восстанавливаться целиком или по частям (подпапки).
  • Мне нужно отдельно держать RAW-версии фото (в идеале вообще на отдельном диске) и разделять их с JPG-версиями (пусть даже высокого разрешения). При этом при необходимости поднимать RAW-версию нужного файла быстро и просто. Ну и да, нужно понимать, у какого файла эта RAW-версия есть, а у какого — нет.
  • Аналогично мне нужно создавать превью видео (.AVI) для AVCHD-записей с камеры Canon (.MTS) и держать FullHD-видео (.MTS) отдельно от превью-видео (.AVI), так как FullHD занимают много места и их неудобно быстро просматривать в поисках нужного фрагмента, но когда нужно для монтажа высокое качество, было откуда достать
  • Мне нужно выкладывать фото в сеть целыми папками (Яндекс.Фотки, Facebook)
  • Иметь актуальный «мобильный архив» превьюшек с собой на мобильном телефоне, планшете, ноутбуке.


Самые обычные требования. Наверное, в мире существует готовое ПО, позволяющее все это делать, но мне его найти не удалось. Поэтому пришлось писать самому.

Концепция решения

Итак, в чем состоит мой подход?

  • Никаких баз данных, проприетарного ПО. Все фото хранятся в открытой файловой системе в упорядоченном виде.
  • За упорядочивание отвечают несложные скрипты, которые можно создать для любой операционной системы и при необходимости доработать
  • Использование разных жестких дисков под разные задачи. Внешних ЖД — под тяжелые файлы (.MTS, .RAW, может, оригиналы JPG), а самого ноута под легкие возобновляемые архивы (превью). Оригиналы RAW и VIDEO могут храниться на внешнем жестком диске, так как имеют тенденцию съедать все дисковое пространство, используются крайне редко, а также потому, что важны и их жалко потерять. Оригиналы JPG хранятся либо на внешнем жестком диске, либо на локальном, если в нем есть уверенность (Raid-массив, жесткий диск настольного ПК). Превьюхи (фото и видео отдельно) хранятся на ноуте или на локальном жестком диске настольного ПК и удобны для заливки в сеть.
    Структура файловой системы под описанную выше схему:

    • Жесткий диск ноутбука, флэшка (средняя надежность)
      • IMPORT/
        • Файлики_с_флэшки/
          • IMG_2014.RAW
          • IMG_2014.JPG
          • IMG_2015.RAW
          • IMG_2016.JPG
          • MOV_0001.MOV
      • PREVIEW/
        • 2013/
          • 05/
            • 16/
              • IMG_2014.JPG
              • IMG_2015_RAW.JPG
          • 06/
            • 10/
              • IMG_2016.JPG
      • PREVIEW_VIDEO/
        • 2013/
          • 05/
            • 10/
              • MOV_0001.MOV
    • Жесткий диск ноутбука, ПК, внешний жесткий диск под нетяжелые оригиналы (высокая надежность)
      • ORIG/
        • 2013/
          • 05/
            • 16/
              • IMG_2014.JPG
              • IMG_2015_RAW.JPG
          • 06/
            • 10/
              • IMG_2016.JPG
    • Внешний жесткий диск под тяжелые оригиналы (высокая надежность)
      • RAW/
        • 2013/
          • 05/
            • 16/
              • IMG_2015.RAW
      • VIDEO/
        • 2013/
          • 05/
            • 10/
              • MOV_0001.MOV


    Папка IMPORT

    Сюда копируется все новое с фотоаппаратов и телефонов. В этой куче мы можем найти JPG-фото, RAW-фото, AVI-видео, MOV-видео в самых разных разрешениях. При обработке фото и видео переносятся из этой папки в другие (см. ниже), а старые, уже импортированные фотки, удаляются из этой папки. В итоге там может остаться какой-то мусор, который обрабатывается вручную.

    Папка ORIG

    Папка для хранения оригиналов фото в формате JPG. Для структурирования фоток и видео по годам-месяцам-дням в этой и последующих папках используется иерархия год-месяц-день. То есть, фото за 12 сентября 2004 года будут храниться в ветке ORIG/2004/09/12/. У меня имена файлов совпадают с оригинальными из IMPORT, но корректно сделать, чтобы имена файлов были уникальными, например, в форме timestamp YYYYMMDDHHMMII.JPG, чтобы не было задвоений при импорте с разных устройств.

    Папка RAW

    Если встречается RAW-фото, то проверяется, есть ли для него родной JPG-вариант, и если вдруг его нет, он создается автоматически в ORIG/YYYY/MM/DD/, а само RAW-фото переносится в RAW/YYYY/MM/DD/. При этом в имени JPG-версии в ORIG вносится указание, что для данного файла есть RAW-вариант: IMG_5905_RAW.JPG. Обычно RAW-файлы большие, поэтому эту папку имеет смысл держать на внешнем диске.

    Папка VIDEO

    Сюда переносятся оригиналы видеофайлов. Обычно они довольно большие, поэтому эту папку имеет смысл держать на внешнем диске.

    Папки PREVIEW и PREVIEW_VIDEO

    Превьюшки создаются автоматически при импорте и кладутся в свою папку PREVIEW, сохраняя иерархию, выходит что-то типа PREVIEW/2004/09/12/. Именно они скидываются на мобильные устройства для мобильного каталога фото и загружаются на фотохостинги

    Архив превьюшек я сбрасываю на мобильные устройства и периодически обновляю — обычным копированием последних по дате папок. Папку с RAW и VIDEO удобно держать на внешнем диске, так как они имеют свойство заполнять собой любой свободный объем диска, а папку с превьюхами держать на ноуте — если вдруг они потеряются из-за какого-нибудь сбоя жесткого диска или потери ноута, их всегда можно будет сделать еще раз, зато при случае можно быстро найти нужное фото или показать их друзьям.

    Особенно это ценно по отношению к FullHD-видео с видеокамеры. Для домашнего архива достаточно хранить видео экранного качества, а на случай монтажа хорошо было бы взять оригинальный MOV в Full HD — для этого подключаю внешний жесткий диск. Более того, лично у меня абсолютно все ноуты тормозят с проигрыванием Full HD MOV с камеры Canon (по крайней мере, первые несколько секунд, пока подгружается), что делает активное использование для бытовых целей оригиналов видео затруднительным. Поэтому очень удобно, когда превьюхи видео — локально, а FullHD-версии — на внешнем диске.

    А что же с событиями?

    У меня для группировки по событиям используются символические ссылки на папки по дням. То есть, поездка на Мадейру хранится в виде папки EVENTS/Мадейра/ в которой лежат папки 2012/05/01, 2012/05/02,…, 2012/05/09. Но есть несколько затруднений, которое этот подход не решает.

    Первое связано с тем, что иногда хочется связать с поездкой на Мадейру не 3500 фотографий, а пару сотен, но отобранных. Второе заключается в том, что не всегда тема четко бьется по дням. Зачастую в течение дня может быть несколько тем, а некоторые темы могут затрагивать вторую половину одного дня и первую половину следующего, в то время как остальное время этих двух дней будет относиться уже к другому событию.

    Поэтому кроме описанного выше способа есть еще два: 1) делать символические ссылки на файлы, или 2) эти файлы физическим образом копировать в папку с событием. Массового создания символических ссылок в операционной системе нет. Тем не менее, реализовать такой способ все равно реально и несложно. Физическое копирование имеет свои недостатки — одинаковые файлы начинают храниться в двух местах. Возможно, это тоже плюс — можно убить похожие фото, оставить только лучшие и т.д. Можно сделать скрипт, проходящий по файлам в обоих папках и при полной идентичности заменяющий файл на его символическую ссылку.

    Весь архив у меня хранится на жестком диске, который может быть подключен к трем компам — MacBook, компу с «виндами» и к компу с Ubuntu. Соответственно, софт должен быть в идеале совместим со всеми тремя операционками.

    Это была концепция, все, что ниже — моя (отнюдь не идеальная) реализация.

    Реализация

    Этот блок уже для тех фотографов, которым не чуждо программирование и автоматизация. Задача довольно простая и при наличии минимальных знаний о bash-скриптинге можно разобраться.

    Весь софт у меня — это два скрипта. Один обрабатывает все из папки IMPORT и раскладывает по ORIG/YYYY/MM/DD/, VIDEO/YYYY/MM/DD/, RAW/YYYY/MM/DD/ попутно создавая папки при необходимости. Второй скрипт сканирует ORIG, VIDEO, RAW и создает PREVIEW для фото и видео и кладет его в папку PREVIEW/YYYY/MM/DD.

    Импорт и раскладывание файлов по папочкам



    Для работы первого скрипта нужна утилита под названием exiftool. Она позволяет вытащить из EXIF-информации файла дату и время съемки. Ее можно найти для всех трех операционных систем. Под ubuntu она ставится из пакетов apt-get install libimage-exiftool-perl. Под Windows и MacOS скачать можно тут: http://www.sno.phy.queensu.ca/~phil/exiftool/

    В качестве инструментария разработки логики я выбрал bash scripting и perl. Во-первых, потому что он едины для MacOS и Ubuntu, а также при наличии Cygwin portable, все это заработает без существенных правок под Windows. С вашего разрешения сконцентрируюсь на MacOS и немножко на Ubuntu, и на обработке изображений, чтобы совсем не распыляться.

    Ниже я привожу сильно упрощенные скрипты, выполняющие поставленные задачи.

    Для начала разберем скрипт, добавляющий указанный файл .JPG в библиотеку:

    #./add_file_to_media_library.sh <filename> 
    


    Как видно из синтаксиса вызова, он работает с одним файлом, указанным в параметре. Небольшое ограничение для удобства — путь должен быть относительным. То есть, либо «IMG_5949.JPG» (в текущей директории), либо MYPHOTOS/IMG_5949.JPG" (в папке MYPHOTOS, которая положена в текущую директорию).

    1. export PREFIX="/Volumes/Elements/" # это путь к архиву фото. В этой папке находится ORIG
    2. export FILENAME="`pwd`/$1« # добавляем к имени файла полный путь.
    3. export OUT=`exiftool «$FILENAME» | grep "Create Date | head -n 1«`; # получаем дату создания фото из EXIF
    4. echo $OUT | grep «Create Date»;
    5. # далее создаем из даты путь вида ORIG/2013/05/01/ — куда в конечном итоге кладем файл
    6. export FOLDER=`echo $OUT | perl -i -npe "s/^(.*?): (\d+)\:(\d+)\:(\d+) (.*?)$/ORIG\/\2\/\3\/\4\//g«`
    7. # если такого пути нет, создаем его
    8. echo mkdir -p «$PREFIX$FOLDER»
    9. mkdir -p «$PREFIX$FOLDER»
    10. echo -n $FILENAME
    11. # поскольку в параметре путь может быть относительный, вытаскиваем только имя файла
    12. export NEWFILENAME=`echo $FILENAME | perl -i -npe "s/^(.*?)\/([^\/]+?)\.JPG$/\2.JPG/g«;`
    13. # проверяем, есть ли в пути вида ORIG/2013/05/01/ уже файлик
    14. if [ -f «$PREFIX$FOLDER$NEWFILENAME» ]
    15. then
    16. # есть, тогда удаляем
    17. echo «exist… $PREFIX$FOLDER$NEWFILENAME»
    18. # тут если надо, можем включить удаление из папки IMPORT
    19. # но это дело опасное, потому что целевой файл может быть битым, нулевого размера и т.д. Тогда можно потерять фото. Можно перенести файл куда-то, но я этим не заморачивался
    20. #rm $FILENAME
    21. else
    22. # если файла нет, то переносим файл из папки IMPORT в папку ORIG/YYYY/MM/DD/
    23. echo mv \"$FILENAME\" \"$PREFIX$FOLDER
    24. mv «$FILENAME» «$PREFIX$FOLDER»
    25. fi




    В итоге, весь софт у нас требует только exiftool, bash и perl и занимает несколько строк на bash. Осталось теперь создать скрипт, который будет вызывать вышеприведенный фрагмент, передавая ему параметр «имя файла». Тут есть масса способов, как это сделать, я использую

    # find . -name «*.JPG» | perl -i -npe "s/^(.*?)[\n\r]+$/\.\/add_file_to_media_library.sh \"\1\"\n/g"
    ./add_file_to_media_library.sh «./фото/IMG_5790.JPG»
    ./add_file_to_media_library.sh «./фото/IMG_5802.JPG»
    ./add_file_to_media_library.sh «./фото/IMG_5794.JPG»
    


    Соответственно, создаем add2media.sh:

    #!/bin/bash
    find . -name «*.JPG» | perl -i -npe "s/^(.*?)[\n\r]+$/\.\/add_file_to_media_library.sh \"\1\"\n/g" > /tmp/run.sh
    bash /tmp/run.sh
    rm /tmp/run.sh
    


    (BTW не очень изящное решение с созданием run.sh. можно было использовать и xargs, и -exec в find, у всего есть свои минусы и плюсы)

    Создание превью

    Для работы второго скрипта (создание превьюшек) нужна утилита, умеющая конвертировать видеофайлы и изображения. Для фото это утилита convert из пакета imagemagick (http://imagemagick.com), для видео — комплекты ffmpeg или handbrake.

    Поскольку создание превьюшек связано с конвертацией форматов, дело это небыстрое, зато не требует участия пользователя. Можно оставить на ночь, в произвольный момент прервать и при следующем запуске работа восстановится с прежней точки.

    1. #!/bin/bash
    2. #добавляем к файлу, переданному в параметре, путь к текущей директории
    3. export FILENAME="`pwd`/$1″
    4. #папка, где создан каталог PREVIEW. В моем случае — это внешний диск, можно использовать локальный
    5. export PREFIX="/Volumes/Elements/"
    6. #поскольку все файлы в ORIG уже разложены по полочкам, будем верить дате из иерархии и лишний раз не обращаться к exiftool
    7. export FOLDER=`echo $1 | perl -i -npe "s/^(.*?)\/(\d\d\d\d)\/(\d\d)\/(\d\d)\/(.*?)$/PREVIEW\/\2\/\3\/\4\//g«`;
    8. mkdir -p «$PREFIX$FOLDER»
    9. #вытаскиваем имя файла из пути
    10. export NEWFILENAME=`echo $FILENAME | perl -i -npe "s/^(.*?)\/([^\/]+?)\.JPG$/\2.JPG/g«;`
    11. echo ${PREFIX}${FOLDER}${NEWFILENAME}
    12. #создавалась ли превьюшка раньше?
    13. if [ -f «${PREFIX}${FOLDER}${NEWFILENAME}» ]
    14. then
    15. #да, создавалась. Делать ничего не надо
    16. echo «...skipped (exist) ${PREFIX}${FOLDER}${NEWFILENAME}»;
    17. else
    18. #нет, не создавалась. Надо сконвертировать
    19. echo «...convert»;
    20. convert «$infile» -auto-orient -resize 1024 -quality 85 «${PREFIX}${FOLDER}${NEWFILENAME}»
    21. fi




    Данный скрипт также предполагает передачу в качестве параметра имени файла. Для того, чтобы пройтись по всем файлам в ORIG, используется точно такой же, как в примере для раскладывания по полочкам сканер файловой системы, только вместо вызова ./add_file_to_media_library.sh там будет ./create_preview.sh

    Возможное развитие

    Отправка фотографий в Facebook и Google Picasa. У меня на этот счет также были наработки, автоматизирующие выкладку из PREVIEW. Для Facebook используется утилита FBCMD, а для создания альбомов и пакетной заливки изображений на Picasa — утилита Google Command Line Tool.

    На мой взгляд, различные «фичи» существующих каталоголизаторов, как добавление описания фотографий, теггирование, лица и проч. плохо подходят для ситуаций, когда одно событие генерит тысячу снимков и один только выбор из них важного-нужного превращается в серьезную работу. А вот использование и модификация EXIF-информации выглядит очень интересным направлением. Например, можно указать, что с 1 по 10 мая я был на Мадейре, и все снимки в ORIG в соответствующем поле EXIF приобретают географические координаты. При последующем импорте в онлайн-фотохостинги эта информация может быть считана и фотографии автоматически прикреплены к месту.

    Также очень хотелось бы, чтобы весь фото и видеоархив по ночам скидывался куда-то в защищенное облако а-ля бэкап. Это тоже довольно просто автоматизировать в описанном выше подходе, но еще не дошли руки. А какие каталоголизаторы используете вы? есть ли в них что-то нужное, что не учтено в моем подходе?

    Алиев Рауф | http://RaufAliev.ru | Facebook | LinkedIn | r.aliev@gmail.com
Теги:
Хабы:
+22
Комментарии10

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн