
Нетривиальный способ раздать в локальную сеть фотографии из архива
Я довольно много фотографирую. Старые фотографии были отсканированы, новые сразу в электронном виде отправляются в специальное резервируемое хранилище на моем домашнем микросервере — архив фотографий. В последнее время я перешел на съемку исключительно в RAW формате с последующей обработкой фотографий в Capture One, как одном из самых адекватных «проявителей» для цифровых негативов. И захотелось мне поделиться фотоархивом результатов обработки RAW-файлов в локальной сети, дабы домочадцы могли при желании фотографии посмотреть.
Работаю я на Windows, а мой микросервер, включенный постоянно, крутится под Linux. Помимо прочего программного продукта на сервере работает Plex Media Server и Syncthing. Последний синхронизирует фотографии с рабочего компьютера на сервер. Plex же раздает в сеть фильмы и мой архив фотографий. И почему бы туда же не подключить еще и второй архив, где RAW и результаты обработки?
Но тут возникла небольшая проблема: в моем workflow обработки фотографий все новые RAW-файлы импортируются в свои отдельные папки со значащими именами. Туда же экспортируются уже обработанные JPG файлы. Причем сразу в двух видах: с разрешением, которое можно безболезненно пересылать мессенджерами (2048px) по длинной стороне, и в максимальном размере. Складываются они в отдельные папки. Таким образом, папка с названием, например, «Поход вокруг Горок Ленинских» будет содержать все релевантные DNG-файлы, а также еще и как минимум две папки, одну «2048», в которой будут лежать фотографии в уменьшенном разрешении, и вторую «FullSize», в которой размер уже на все деньги. Причем с течением времени папка с именем «2048» видоизменялась. Где-то она называется «2048x», где-то «2048px».
В принципе, архив с RAW-файлами и всеми JPG уже имеется на сервере, и его можно было бы подключить напрямую в Plex. Но в таком случае будет задвоение фотографий из папок «FullSize» и всех остальных прочих. Необходимо как-то отфильтровать все фотографии из всех папок «2048» и на отфильтрованное уже и натравить Plex. Для просмотра на телевизоре качества этих фотографий будет более чем достаточно.
На выручку приходит bash в Linux, пара системных программ и возможность файловой системы по созданию символичных ссылок.
#!/bin/bash # Проверяем исходные данные WATCH_DIR="/volume1/BTSync/Fuji" LINK_DIR="/volume1/BackUp/2048" echo "Проверка директорий..." [ -d "$WATCH_DIR" ] || { echo "Ошибка: $WATCH_DIR не существует"; exit 1; } [ -w "$(dirname "$LINK_DIR")" ] || { echo "Ошибка: нет прав на запись в $LINK_DIR"; exit 1; } # Создаем целевую директорию mkdir -p "$LINK_DIR" update_links() { echo "Начинаем обработку файлов в $WATCH_DIR" local counter=0 find "$WATCH_DIR" -type f -path "*/2048*/*.jpg" -print0 | while IFS= read -r -d '' file; do # Вычисляем относительный путь rel_path="${file#$WATCH_DIR/}" # Извлекаем имя верхней папки top_dir="${rel_path%%/*}" # Создаем целевую директорию dest_dir="$LINK_DIR/$top_dir" mkdir -p "$dest_dir" # Создаем симлинк ln -sf "$file" "$dest_dir/$(basename "$file")" ((counter++)) echo -n "." done echo -e "\nОбработано файлов: $counter" } # Первый запуск update_links # Мониторинг изменений echo "Запуск мониторинга изменений..." inotifywait -m -r -e create,delete,moved_to,moved_from --format '%w%f' "$WATCH_DIR" | while read -r file; do if [[ "$file" == */2048*/*.jpg ]]; then echo -e "\nОбнаружено изменение: $file" update_links fi done
Вот такой вот скрипт позволяет создать символические ссылки всех jpg-файлов из всех папок имя которых начинается на 2048. Причем код не только создает символические ссылки, но и создает новые папки, имена которых соответствуют исходным папкам. Иными словами в целевой папке создается дерево значащих папок, а в них фотографии. Что довольно удобно. Но и это еще не все. Ближе к концу скрипта запускается постоянный мониторинг файловой системы исходной директории и если там происходят изменения, то автоматически происходит регенерация ссылок на файлы.
Далее остается только поместить данный скрипт на автоматический запуск как сервис, и система будет работать в автономном режиме. Кстати, под Linux данную операцию можно провести разными способами. Например, можно применить fuse-overlayfs
для создания отдельного подключенного устройства с файлами или icron вместо inotifywait для мониторинга изменений файловой системы.
Кстати, у Plex появились, а некоторые существуют довольно давно, неплохие конкуренты из мира OpenSource, так что, если Plex по каким-то причинам не подходит, то можно перейти на что-то более подходящее, например:
Мне же пока хватает Plex, тем более что он поддерживается всеми моими телевизорами и медиаприставками.