Поиск файлов по тэгам в XMP – IPTC и операции с найденным

в 5:03, , рубрики: C, iptc, perl, xmp, метаданные, поиск по тегам, Программирование, Разработка под Linux, фотографии

Сначала может показаться, что пост о «ещё одном медиаплеере», и вот уже паникующийин бежит с выпученными глазами прочь, кидаясь минусами в людей, животных и программистов. Ну, в общем и целом, да, пост примерно об этом. Но. Есть, на мой взгляд, одно весомое Но, о котором ниже.

Поиск файлов по тэгам в XMP / IPTC и операции с найденным

Все любят фотографировать котиков. Да. Утверждаю. Некоторые даже составляют с ними фотоальбомы. Ещё кое-кто даже заморачивается тэггированием этих фоточек. А совсем уже упоротые один-два раза в жизни по этим тэгам эти фоточки ищут.

Мой случай совсем плохой. Таки да, я очень люблю фотографировать, и далеко не только котиков. Посему, фотографий, причём, уже только отобранных, на данный момент скопилось около 15 000. Ко всему этому, я конченый перфекционист-педант и люблю, когда всё (ну, почти всё) находится в порядке. Я тэггирую фотографии, ищу их по этим тэгам и не прочь составить несколько тематических альбомов.

И…

Есть множество специальных программ, работающих с метаданными. Начиная с трушной exiv2 и заканчивая различными просмотрщиками и огромными комбайнами с преферансом и комбайнёрами. Какие-то программы просто показывают котиков, какие-то позволяют лепить на этих котиков тэги, какие-то — искать этих котиков по этим тэгам, какие-то — также эти тэги редактировать, а какие-то организуют котиков в альбомчики.

Но. Я не нашёл (хотя, возможно, плохо искал) ни одного решения, которое не только предоставляло бы все эти возможности, но и логически их связывало. Можно найти фотки по тэгам, но нельзя пакетно эти тэги редактировать по тем или иным критериям. Или можно добавить список тэгов фоткам в каком-нибудь каталоге, но всем сразу и безапелляционно. Есть куча «органайзеров», но как правило, со своим собственным велосипедным способом организации фотографий, а не хоть сколь-нибудь универсальным и штатным. Не говоря уже о связанных критериях отбора.

Пилим

В общем, в этом зоопарке мне стало грустно, и я решил наваять что-то своё. С комбайнёрами, естественно. Сначала на своём любимом Perl-е. Ну, вот есть у меня такой пунктик. Но, повторюсь, только сначала. Потом я — та-дам! — переписал прогу на C. Но обо всём подробнее ниже, а пока — сразу ссылки:

Что получилось, и как с этим жить

Итак, что можно делать с этими несчастными тэгами? В общем-то, добавлять, удалять, менять и сравнивать (поиск по сути и есть сравнение с шаблоном). Причём, сравнение может быть довольно сложным.

Поиск

Многие программы позволяют искать файлы по тэгам с логическими ИИЛИ и НЕ. Но, опять же, может плохо искал, но обычно поиск возможен либо только с И, либо только с ИЛИ, либо только с НЕ. А у меня вот почему-то появляется иногда навязчивая идея найти все фотографии с человеками на природе, кои учиняют либо трэш, либо угар, но при этом не в рамках фестиваля. Итого, условие: (человеки И природа) И (трэш ИЛИ угар) И (НЕ фестиваль). Поля ввода в программу добавлены, функционал реализован, фотографии находятся корректно.

ds-findbytags

Результаты поиска

Кстати, находятся «куда»? Программа, найдя фотографии, удовлетворяющие условиям, создаёт в каталоге, в котором запущена, временный подкаталог со случайным абракадабрным именем, куда и складирует символические ссылки на найденные фотки, с абракадабрными же именами. Потом открывается просмотрщик, которому передаётся в качестве аргумента путь к этому подкаталогу. Какой просмотрщик? Я люблю “Geeqie”, так что по умолчанию открывается он. Но в ключе -l программы можно указать любой другой, либо “no”, означающее, что не надо вообще ничего открывать. После длительного любования найденными фотошедеврами и закрытия просмотрщика временный подкаталог со ссылками удаляется (если не указано обратное, об этом ниже).

Редактирование

Отлично. А что насчёт добавления, удаления и замены? Так называемого типичного случая редактирования тэгов. С самим редактированием проблем нет; в программу добавлены поля ввода «Добавить тэги», «Удалить тэги» и «Заменить тэги». Но вот тэги чего редактировать? Не напрашивается ли идея о возможности редактировать тэги файлов, найденных, собственно, по своим тэгам?

Итак, найдя кучу фотографий человеков на природе, кои учиняют либо трэш, либо угар, но при этом не в рамках фестиваля, я с ужасом обнаружил в этой куче множество фотографий с собой любимым. Причём, учиняющим, как правило, трэш, а не угар. Какие могут быть решения проблемы? Первое — не учинять трэша и угара. Не пойдёт. Второе — подредактировать тэги.

Итак, задаём новый поиск по фотографиям с теми же самыми условиями, но с добавленным в поле «И» тэгом «я любимый». Теперь, если нажать на кнопочку «Начать», найдётся часть (причём, к сожалению, бо́льшая) всего того найденного ранее безобразия. Но перед этим в поле «Добавить тэги» введём два тэга: [опоён во сне интервентами, не показывать жене] (вообще, в полях тэги разделяются запятыми, поскольку в самих тэгах вполне могут присутствовать пробелы). Также, в поле «Удалить тэги» введём [человеки], а в поле «Заменить тэги» — [трэш, забавы, угар, праздник] (в поле «Заменить тэги» они вводятся попарно: «трэш» заменится на «забавы», а «угар» на «праздник»).

ds-findbytags

Всё. Жмакаем кнопочку «Начать», и фотографии приобретают ну хоть какие-то оправдательно-смягчительные признаки. Ну и полезные. Можно потом составлять семейные альбомы, отбирая при поиске фотки с тэгом «не показывать жене», введённым в поле «И».

Организация

И вот, кстати, об альбомах. По сути, сам принцип составления альбомов у нас уже есть — логический поиск по тэгам. Осталось реализовать, собственно, организацию найденных фоток в «альбомы». И тут я подумал: я люблю велосипеды, но мотоциклы времён второй мировой люблю больше. Не проще ли просто сохранять в определённые каталоги символические ссылки на найденные фотографии? Проще. Что и сделано.

Для сохранения ссылок надо поставить галку «Сохранять ссылки в:», выбрать рядом нужный каталог и по желанию поставить галку «Сохранять имена». С сохранением имён нужно быть осторожным. Если вы уверены, что все имена файлов фотографий у вас уникальные (например, по времени съёмки, как у меня), то это имеет смысл — символические ссылки будут иметь те же имена, что и оригинальные файлы. А вот, если имена файлов могут повторяться, то, очевидно, галку ставить не стоит.

ds-findbytags

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

Дерево тэгов

Ну и до кучи, чтобы не держать в голове все придуманные и проставленные в своё время тэги, я прикрутил справа их дерево. Я уже писал, что люблю “Geeqie”, так что, звиняйте, но это дерево формируется из Geeqie-евского XML-файла с настройками, в котором, в том числе, хранится дерево созданных в программе тэгов. По умолчанию программа ищет этот файл здесь: ~/.config/geeqie/geeqierc.xml, но с ключом -t программы можно задать путь к своему собственному XML-файлу дерева тэгов. Единственное что — это дерево в нём должно быть описано по правилам Geeqie-евского конфига.

Немного о реализациях

Программа может работать как в CLI-интерфейсе (по умолчанию), так и в GUI — GTK+ 2 (если указан ключ -g).

С Perl-версией, надеюсь, всё понятно — просто запускаешь перловый скрипт с нужными ключами и радуешься. Perl-версия только на русском.

C-версия на английском с русской локализацией. Работает раза в два c половиной быстрее перловой версии, и отъедает раза в полтора меньше памяти. C-версию нужно компилировать и, по желанию, устанавливать. Всё, как обычно:

Установка

cd ~/sources (ну или где вы обычно храните сорцы)
git clone https://github.com/assador/ds-findbytags.git
cd ds-findbytags
make
sudo make install

Обновление

Заходите в тот же каталог с сорцами проги:

cd ~/sources/ds-findbytags
git pull
make
sudo make install

Удаление из системы

Не удаление сорцов, а uninstall. Заходите в тот же каталог с сорцами проги:

cd ~/sources/ds-findbytags
sudo make uninstall

Правило install делает самую малость: копирует бинарник ds-findbytags в /usr/local/bin/ и файл русской локализации ds-findbytags.mo в /usr/share/locale/ru/LC_MESSAGES/. Правило uninstall их оттуда, собственно, удаляет. Всё.

Работает под никсами. На других платформах пока не проверял, но особых проблем быть, вроде, не должно (при условии, конечно, установленной GTK+ 2 и некоторого допиливания).

В общем, вот. Я доволен и полон желания поделиться сим свободным программным обеспечением (GNU GPL v3), прости Господи, с миром, заодно очень надеясь на конструктивную критику, комментарии и, чем чёрт ни шутит, форки и/или участие в проекте.

Автор: Дмитрий Соколов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js