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

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

    Поиск файлов по тэгам в 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

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

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

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

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

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

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

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

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

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

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

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

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое