Как экспортировать текстовый список предметов в коллекции Lightroom? - Фотопедия
2 голосов
/ 27 июня 2015

Я использую Lightroom для управления моими фотографиями и специальное программное обеспечение для запуска моего сайта. Чтобы опубликовать мои коллекции, мне нужен файл с именами элементов в коллекции.

Несколько недель назад я использовал платный плагин из прошлого, который смог создать полную галерею с помощью Adobe Flash. Я быстро отказался от использования Flash в своих галереях, но до недавнего времени я использовал этот плагин, потому что он создавал XML-файл со списком элементов. К сожалению, плагин больше не работает с Lightroom 6.

Я не знаю, чтобы какой-либо другой плагин делал то же самое (XML не обязателен: любой текстовый формат в порядке; мне никогда не нужен путь к элементам, только их имя + имя копии). *

Для ясности: мне просто нужен текстовый файл со списком элементов - для публикации фотографий я использую стандартные функции Lightroom.

PS Мне нужно, чтобы элементы экспортировались в том же порядке, в котором они отображаются в коллекции.

Ответы [ 5 ]

4 голосов
/ 28 июня 2015

Возможно, вы сможете использовать тот факт, что каталог LR на самом деле является базой данных SQLite. В прошлом я писал рубиновые скрипты для генерации статистики на моих фотографиях. Вид данных, которые вы ищете, вероятно, не намного сложнее получить.

Mac OS поставляется с инструментами командной строки sqlite. Если вам не нужны интерфейсы командной строки, в Mac App Store есть несколько различных графических интерфейсов SQLite.

См. это для (старого, но все еще действительного) быстрого вступления к извлечению данных.

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

Я открыл свой каталог LR CC и быстро протестировал мою теорию. Я закончил со следующим запросом:

SELECT lf.idx_filename
FROM AgLibraryCollection AS c,
  AgLibraryCollectionImage AS ci,
  Adobe_images AS i,
  AgLibraryFile AS lf

WHERE c.id_local = ci.collection
  AND i.id_local = ci.image
  AND lf.id_local = i.rootFile
  AND c.name = 'Collection Name'

Самый простой способ выполнить это - установить SQLite Free - Datum из магазина приложений Mac, открыть каталог Lightroom (убедитесь, что LR закрыт) и вставить запрос во вкладку SQL. Более сложным (но более простым для повторения) методом было бы вставить запрос в текстовый файл и запустить в терминале следующее:

sqlite3 /path/to/lightroom_catalog.lrcat < query.txt
1 голос
/ 09 января 2019

В качестве обновления исходного ответа приведен модифицированный запрос sqlite3 для получения как абсолютного пути, так и имени файла изображений в коллекции:

SELECT lrf.absolutePath, lfo.pathFromRoot, lf.idx_filename
FROM AgLibraryCollection AS c,
  AgLibraryCollectionImage AS ci,
  Adobe_images AS i,
  AgLibraryFile AS lf,
  AgLibraryFolder AS lfo,
  AgLibraryRootFolder AS lrf

WHERE c.id_local = ci.collection
  AND i.id_local = ci.image
  AND lf.id_local = i.rootFile
  AND c.name = 'Collection Name'
  AND lfo.id_local = lf.folder
  AND lrf.id_local = lfo.rootFolder

Затем удалите | разделители из выходных данных, чтобы получить полный путь к изображениям в коллекции.

1 голос
/ 02 августа 2016

Этот другой подход, позволяющий избежать повреждения базы данных, проверяет наличие файла блокировки.

LOCK_FILE="$CATALOG.lock"

if [ -f "$LOCK_FILE" ]; then
    >&2 echo "Please quit Lightroom before running this script."
    exit 1
    fi
1 голос
/ 04 июля 2015

Выкладываю разработанное мной решение, начиная с подсказки speshak. В конце концов я сделал это с помощью bash-скрипта. Он экспортирует все веб-галереи в моем каталоге и подготавливает некоторые файлы в соответствии с моей CMS. Есть некоторые вещи, которые соответствуют моим потребностям, но я думаю, что сценарий может быть полезен для других.

Там еще проблема с сортировкой. Мне не удалось отсортировать изображения в том виде, в котором они находятся в коллекции - возможно, потому что в базе данных нет информации в виде явного индекса, а Lightroom, возможно, сортирует результаты в зависимости от свойств коллекции. Я все еще использовал сортировку по имени файла, которая работает для всех моих коллекций, кроме одной.

#!/bin/bash

#
# Exports web galleries from a Lightroom 6.x database and prepares files with gallery contents.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations under the License.
#
# $Id: ExportGalleries.sh,v ce1c71b3125a 2015/07/04 19:38:11 fabrizio $
#

TARGET_PATH="$HOME/Personal/WebSites/StoppingDown.net/structure"
CATALOG="$HOME/Personal/Photography/Lightroom/Fabrizio Lightroom Catalog/Fabrizio Lightroom Catalog.lrcat"



#
# Input         $1      a string
# Return                the string, trimmed
#
function trim
        {
                echo "$1" | sed 's/^ *//' | sed 's/ *$//'
        }

#
# Input         $1      a SQL query
# Return                the result of the query separated by spaces
#
function query
        {
                trim "`sqlite3 "$CATALOG" "$1" | tr '\n' ' '`"
        }

#
# Input         $1      the id of a collection
# Return                the name of the collection
#
function getCollectionName
        {
                query "SELECT name FROM AgLibraryCollection WHERE AgLibraryCollection.id_local = $1;"
        }

#
# Input         $1      the id of a collection
# Return                the id of the parent collection
#
function getCollectionParent
        {
                if [ "$1" != "" ] ; then
                        query "SELECT parent FROM AgLibraryCollection WHERE AgLibraryCollection.id_local = $1;"
                        fi
        }

#
# Input         $1      the id of a collection
# Return                the file name + copy name of the images contained in the collection
#
# FIXME: problems with sorting: ci.positionInCollection is null for many items; i.captureTime doesn't work as expected.
#
function getImageNamesInCollection
        {
                echo `query "SELECT lf.baseName,i.copyName FROM AgLibraryCollection AS c,
                                                                AgLibraryCollectionImage AS ci,
                                                                Adobe_images AS i,
                                                                AgLibraryFile AS lf
                                                           WHERE c.id_local = ci.collection
                                                                AND i.id_local = ci.image
                                                                AND lf.id_local = i.rootFile
                                                                AND c.id_local = $1
                                                           ORDER BY lf.baseName;"` | sed 's/|//g'
##                                                           ORDER BY i.captureTime;"` | sed 's/|//g'
##                                                           ORDER BY ci.positionInCollection;"` | sed 's/|//g'
        }

#
# Return                the ids of the collections that are a web gallery, separated by spaces
#
function getGalleryIds
        {
                query "SELECT DISTINCT id_local FROM AgLibraryCollection WHERE creationId='com.adobe.ag.webGallery';"
        }

#
# Input         $1      the id of a collection
#
function exportCollection
        {
                local PARENT=$(getCollectionParent $1)
                local GRAND_PARENT=$(getCollectionParent $PARENT)
                local GRAND_GRAND_PARENT=$(getCollectionParent $GRAND_PARENT)
                local NAME="$(getCollectionName $1)"
                local GALLERY_PATH=""
                local EXPOSED_URI=""

                # Diary
                if [ "$GRAND_GRAND_PARENT" == "2918721" ] ; then
                        local YEAR=$(getCollectionName $GRAND_PARENT)
                        local MONTH=`echo "$(getCollectionName $PARENT)" | sed -e 's/\..*$//g'`
                        local DAY=`echo "$(getCollectionName $1)" | sed -e 's/\..*$//g'`
                        local PATH_NAME="$YEAR/$MONTH/$DAY"
                        GALLERY_PATH="$TARGET_PATH/Diary/$PATH_NAME"

                # Lenses
                elif [ "$GRAND_PARENT" == "9495573" ] ; then
                        local LENS_NAME=$(getCollectionName $PARENT)
                        GALLERY_PATH=`echo "$TARGET_PATH/Themes/Lens/$LENS_NAME/$NAME" | sed 's/ /+/g'`

                # Visual Colour Check
                elif [ "$NAME" == "Visual Color Check" ]; then
                        GALLERY_PATH="$TARGET_PATH/Themes/VisualColourCheck"

                # Splash Slideshow
                elif [ "$NAME" == "Splash Slideshow" ]; then
                        GALLERY_PATH="$TARGET_PATH"
                        fi

                if [ "$GALLERY_PATH" == "" ] ; then
                        echo "Ignoring $GRAND_GRAND_PARENT/$GRAND_PARENT/$PARENT ($NAME)..."
                else
                        local IMAGES="$GALLERY_PATH/images.xml"
                        echo "Exporting $IMAGES ($NAME / $1)..."

                        if [ ! -d "$GALLERY_PATH" ]; then
                                echo "   Creating new gallery..."
                                mkdir -p $GALLERY_PATH
                                local DATE=`date -u "+%Y-%m-%dT%H:%M:%S.000+00:00"`
                                cat << EOF > "$GALLERY_PATH/Properties.xml"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<properties version="1.0">
    <property name="creationDateTime">
        <value>$DATE</value>
    </property>
    <property name="latestModificationDateTime">
        <value>$DATE</value>
    </property>
    <property name="exposedUri">
        <value>$EXPOSED_URI</value>
    </property>
</properties>
EOF
                                fi

                        echo '<?xml version="1.0" encoding="UTF-8"?>'                  > $IMAGES
                        echo '<gallery>'                                              >> $IMAGES
                        echo '    <album>'                                            >> $IMAGES

                        for i in $(getImageNamesInCollection $1); do
                                echo "        <img src=\"$i.jpg\"/>"                  >> $IMAGES
                                done

                        echo '    </album>'                                           >> $IMAGES
                        echo '</gallery>'                                             >> $IMAGES
                        fi
        }

function exportGalleries
        {
                for i in $(getGalleryIds); do
                        exportCollection $i
                        done
        }

exportGalleries
1 голос
/ 27 июня 2015

Я не знаю плагина, который делает это, но на Mac я бы сделал это следующим образом (возможно, машина Windows делает то же самое, не знаю):

  1. Откройте TextEdit.app в дополнение к Lightroom
  2. Выбрать все фотографии в коллекции
  3. Перетащите их в окно TextEdit.app, теперь у вас есть путь для перетаскиваемых фотографий в текстовом файле.
  4. Выполните поиск + замену, чтобы избавиться от пути и сохранить только имя файла

Регулярное выражение, соответствующее пути, но не имени файла, будет ^/.*/.

...