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

Поиск файлов по тэгам в 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). В зависимостях — exiv2. Плюс, для C-версии — libxml2-dev. Ну и для GUI, ясен пень, gtk2.

С 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), прости Господи, с миром, заодно очень надеясь на конструктивную критику, комментарии и, чем чёрт ни шутит, форки и/или участие в проекте.

Комментарии (11)


  1. ovsale
    09.10.2017 16:18

    Как вы храните какие теги присвоены файлу?
    Совсем непонятно про дерево тегов. В скриншотах дерево по-английски в поиске по-русски. Или это разные теги?


    1. Assador Автор
      09.10.2017 16:27

      Сами тэги хранятся непосредственно в метаданных картинок, в самих файлах. Это стандарты. См. Википедию: XMP, IPTC.

      Дерево английских тэгов на скриншотах — моё личное, существующее в реальности. Это мои, мной придуманные тэги, которые я присваивал картинкам (записывая их в этих метаданных в файлах). Просто как-то так повелось, что они латиницей, а создавать специально для скриншотов отдельное дерево тэгов как-то долго и лениво. А кириллические тэги в полях — просто для примера, для поста. В нормальной рабочей ситуации, естественно, в поля добавляются реальные тэги из этого дерева тэгов. Иначе просто ничего не найдётся — в файлах-то, предположительно, тэги из дерева…


      1. ovsale
        09.10.2017 17:41

        можно ли менять иерархию тегов? если да то как отслеживается что соответствующие теги изменены во всех файлах?


        1. Assador Автор
          09.10.2017 18:19

          Дерево тэгов не имеет прямого отношения к тэгам картинок. Этого дерева вообще может не быть, я его сделал просто для удобства.

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

          Но поскольку я проставлял картинкам свои вполне определённые тэги, я список всех когда-либо вообще проставленных мной той или иной картинке тэгов для своего удобства ещё и сформировал в дерево. Что может сделать каждый. Дерево хранится в XML-файле. Там его можно править. Ну, либо, в Geeqie для наглядности.

          Сами же конкретные тэги картинок хранятся в самих картинках. Просто каждая картинка в данном конкретном случае содержит определённое количество определённых тэгов из этого дерева.


          1. ovsale
            10.10.2017 08:33

            т.е. поиск по what не выдаст картинки протегированые people?
            просто я написал программу с полноценным иерархическим тегированием. и не придумал как хранить иерархические теги в самих файлах. ибо при редактировании дерева необходимо обновлять информацию о тегах в файлах. а значит файлы должны быть доступны и проиндексированы. а если так то проще хранить теги отдельно. поэтому и удивился когда увидел иерархию тегов и хранение тегов в файлах.


            1. Assador Автор
              10.10.2017 08:47

              Самим первоначальным тэггированием я занимаюсь как раз в Geeqie. Когда для каждой конкретной фотографии смотрю, какие нужны тэги. И там — да. Если добавляешь потомка, то добавляется и родитель. Всё верно. И поиск по “what” должен выдать фотки с “people”, поскольку в фотках есть и тот, и другой тэги (ну, конкретно, в случае с “what” — нет, это просто контейнер; а вот, например, “people > “Вася” — да, и тот, и другой).

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

              Насчёт хранения иерархических тэгов — не знаю. По крайней мере, что касается тэгов в метаданных стандартов XMP и IPTC, там этого нет. Либо пилить свой велосипед с дополнительными файлом(-ами) или базой etc, либо погуглить; может, есть ещё какие-то стандартизированные возможности для этого.


            1. Assador Автор
              10.10.2017 09:00

              А ваша программа очень заинтересовала. Жду версию для Linux. Очень хочется пощупать!

              Вообще, я давно задумывался о более глобальном тэггировании. Моя прога-то, хоть и ИМХО очень полезна, но только для тех файлов, что поддерживают XMP / IPTC. Плюс, да — нет иерархии, а просто plain-список тэгов непосредственно в файлах. А иерархия в XML-дереве. C другой стороны, так ли она нужна именно в файлах? Как я уже написал в соседнем своём комментарии, при непосредственно тэггировании при добавлении потомка так же добавляется и родитель. Так что можно искать как по всем “people”, так и просто конкретно по Васе, который тоже “people” (ну, я надеюсь :)


              1. ovsale
                10.10.2017 09:42

                а если Вася перехал из people в например people->друзья. перетегирование файлов происходит?

                спасибо за отзыв! для линукса лаунчер нужно сделать. а так я тестирую в виртуальной машине все работает уже. найду время напишу. я когда писал программу основная идея была — иерархические теги и ничего больше. на самом деле это очень удобно что не нужно думать что где лежит. я уже давно не мыслю категориями папок и не задаю вопрос ГДЕ лежит? ум перестроился (да именно так) на поиск по смысловым категориям. И программа ориентирована не на поиск одного элемента а на управление набором элементов (книги по джава)…


                1. Assador Автор
                  10.10.2017 09:52

                  Нет, но это уже вопросы к Geeqie. Хотя, и не к ней.

                  Дерево — в XML-файле. Сами тэги — в тысячах файлов по всему миру могут быть :) Как можно это представить? Хранить в базе пути ко всем файлам?

                  А вот тут как раз и вступает в дело моя прога. Переместил в дереве Васю в «друзья» из «людей» — запускаешь мою прогу, скармливаешь ей корневой путь ко всем фоткам и меняешь во всех них пакетно «людей» на «друзей». Заодно можно добавить тэг «собутыльник».


                1. Assador Автор
                  10.10.2017 09:54

                  Точнее, в приведённом вами примере не меняешь «людей» на «друзей», а добавляешь тэг «друзья». «люди»-то остаются, раз родительский тэг к друзьям.


                  1. ovsale
                    10.10.2017 10:09

                    я понял. после изменения дерева тегов программа производит соответствующие изменения в файлах.