Vitaphoto
Vitaphoto — система управления фотогалереями, обладающая некоторыми уникальными отличительными особенностями, самая главная из которых — заливка фотографий в галерею не через веб-интерфейс, а обычным копированием файла в заданную директорию на сервере. То есть, ФС-ориентированность.
На данной странице вы можете узнать об истории и преимуществах системы Vitaphoto над прочими аналогичными. Среди них — удобство использования, гибкость, безопасность и возможность управления множеством галерей на одном сервере.
Посмотреть на Vitaphoto V3 / 1.4 в лице моей фотогалереи можно по следующей ссылке: http://vmx.yourcmc.ru/vitaphotov3. Гламурная… Ух!
Старая версия (1.3 / V2) находится по адресу http://vmx.yourcmc.ru/vitaphoto-legacy.
Посмотреть исходные коды Vitaphoto и выросшего из Vitaphoto фреймворка Sway Solstice можно здесь: (V3) lib-vitaphoto, (V3) lib-sway Solstice. Исходники старой версии: (legacy) lib, (legacy) lib-sway.
Содержание
История создания Vitaphoto
Причиной создания Vitaphoto послужило то, что… мне просто захотелось выкладывать фотографии к себе на сайт. Фотохостинги я не люблю — вот лишь небольшой список их недостатков с моей точки зрения:
- имена файлов после заливки, как правило, теряются;
- нет возможности резервного копирования;
- в моде AJAX и браузерные интерфейсы, кое-где (Picasa) из-за этого «Opera поддерживается не полностью», а Opera — мой любимый браузер, да и вообще не люблю я, когда всё пестрит;
- многие сервисы изобилуют рекламой;
- многие сервисы расположены на загруженных или отдалённых от России серверах, короче, банально «тормозят»;
- многие сервисы используют откровенно некачественные алгоритмы масштабирования изображений (например, ФотоФайл);
- добавление фото практически везде ведётся только через веб-интерфейс или через 'специально разработанную' программу-* клиент, а они, как правило, ещё и убого («плюшево») выглядят, или напичканы ненужными функциями;
- как правило, нет возможности скачать альбом на диск полностью, а кое-где с этим даже ведут борьбу (всё тот же ФотоФайл);
- некоторые сервисы стараются даже запретить выкладывать фотографии в блог без вставки ссылки на сам сервис.
И наоборот, на преимущества вроде кластеризатора фотографий (Flickr), или возможности «отправить ссылку на этот альбом» (Picasa), или возможности онлайн-заказа печати фото (ФотоФайл, НетПринт) мне откровенно наплевать. Иногда, возможно, и было бы интересно поиграться, но не более того. «Социальные сети… Облачность… Интеграция с тем… Интеграция с этим… Интеграция с интеграцией… Теперь другу можно отправить фотку одним кликом сидя в туалете, но нельзя выключить компьютер!» (лор).
Возможно, вы и сами уже прочувствовали на себе некоторые из этих недостатков. Обо мне и говорить нечего, меня они просто достали :-)
Потому я и создал Vitaphoto. Преимущества Vitaphoto с моей точки зрения:
- Добавление фотографий и видеороликов представляет собой обычное копирование файлов, которое можно осуществлять по FTP и в любых объёмах, пока не закончится место на диске. Все скопированные фотографии добавляются в базу данных автоматически. Кстати, это будет легко и для непродвинутых пользователей, ибо даже виндовый Проводник может работать с FTP серверами.
- Название и теги фотографии сохраняются в именах файлов, время создания извлекается из EXIF-метаданных и метаданных видео.
- Резервное копирование просто до безумия — достаточно зайти на сервер по FTP и слить к себе все файлы.
- Точно так же просто дать доступ на скачивание всех фотографий кому-либо, заведя отдельную учётную запись FTP.
- И точно так же просто дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, а в название самой директории включить теги, которыми будет автоматически помечено всё содержимое, и (по желанию) название кодировки имён файлов;
- Фотографии масштабируются по алгоритму Lanczos с использованием ImageMagick / GraphicsMagick — иными словами, «качественные миниатюры»!
- Лично мне гораздо удобнее держать мою фотогалерею расположенной на своём сервере, а не на некотором стороннем фотохостинге.
- Стабильное по датам разбиение всей фотогалереи на страницы, идентификация фотографий по именам, гламурненький дизайн, несколько размеров фото на выбор.
Система управления фотогалереями Vitaphoto написана на языке Perl 5 и может запускаться в разных конфигурациях — как простой отдельный HTTP-сервер, под CGI/FastCGI, под управлением запатченного модуля nginx ngx_http_perl_module и модулей Apache 2.x mod_perl 2.x или Apache 1.x mod_perl 1.x. Я старался создать простую и удобную систему со вменяемым исходным кодом. Вменяемым, кстати, исходный код стал не сразу, а только в версии 1.2, написанной в районе конца февраля — начале марта 2008 года. А может, только в 1.4 (2010 год). :-) Кроме того, мне очень близки идеи Лэрри Уолла, в частности TMTOWTDI (There’s More Than One Way To Do It — «Это можно сделать по-разному»), а также «приятно быть важным, но куда важнее быть приятным». Возможно, они тоже наложили свой отпечаток на систему.
Разработка системы ведётся, как всегда, эпизодически — по принципу «в попу стрельнуло», а в попу обычно стреляет сделать что-нибудь глобальное. Мелочи не привлекают.
TODO для V3.1 / 1.5
Активная в данный момент разрабатываемая версия. Фичи:
- Код снова подрос, его нужно привести в более MVP-состояние, разнести на модули / классы страниц.
-
Обработка изменений в именах директорий в процессе мониторинга, а не только при его начале
-
Также чтобы при удалении тега, который есть также в имени директории, он не удалялся с файла
-
- Поле выбора тега с автокомплитом
- Навигация в начало галереи (к самым старым фотографиям)
- (?) Редиректы со старых имён на новые
- (?) Режим файлменеджера
-
X-Accel-Redirect на файл по короткому URL с отдачей Content-Disposition, с целью генерации красивого УРЛа к файлу, при этом отдающего правильное UTF-8 имя файла вне зависимости от кодировки имён файлов на диске
-
Warning: Здесь есть проблема у nginx - он не понимает URL-кодированные адреса в X-Accel-Redirect. Написал патч, его отревьюили, но пока не приняли.
-
-
Опция быстрого старта ScaleDaemon’а --skip-initial — отключение изначальной проверки всех файлов на изменения в галерее
- (?) Статистика (неплохо бы рисовать простой графичек)
- Для видео:
-
Автоматическое теггирование всех видеороликов тегом "video"
-
Поддержка нескольких разрешений — ручное добавление уменьшенных версий с тегом "downsampled"
-
Поддержка pseudostreaming'а, т.е. возможность перемотки при добавленных FLV-метаданных и включённом flv-стриминге в веб-сервере
-
Разбор FLV-метаданных
- Maybe также возможность задавать дату съёмки в имени (ибо в MP4 и пока что WEBM с метаданными беда)
-
- RSS/Atom подписка на новые фотографии!
-
Путь к шаблонам по умолчанию брать относительно каталога с кодом
-
Отдельное пространство имён для видео? -
Показывать все теги ролика во всплывающей подсказке в списке
-
Исключая автотег "video"!
-
- (?) Асинхронная подгрузка миниатюр вместо зависания запроса, когда надо много отмасштабировать. Тут нужно обратить внимание на то, чтобы они не ломились кучей (создаются-то всё равно последовательно).
- Что-то придумать на тему тегирования фото БОЛЬШИМ количеством тегов, когда результирующее имя файла получается длиннее лимита ОС (255 символов)
- Возможность скрыть фото с главной
Исправления багов:
-
Пропуск симлинков
-
Не обрабатывать левые файлы в каталоге с изображениями (типа *.php, например)
-
Ошибочное сообщение о пустом альбоме не показывалось
-
image.ISO Speed Used + image.ISO Speed Rating иногда показывались вместе, дублируя параметр ISO
-
Угадывание тегов не учитывало наличие фотографий с этими тегами из-за бага в селектбилдере
Vitaphoto V3 / 1.4
Версия Vitaphoto V3 / 1.4 соответствует 5 июля 2010 года. Исходные коды 1.4.
Качества:
- «Скажи синтетическим ключам „нет“!» Фотографии и альбомы идентифицируются по именам, а не по ID’шникам.
- Обычная страничная навигация заменена разбиением по датам.
- Огламуренный интерфейс, дизайн на флоатах и несколько размеров фото на выбор (viva большие мониторы!). Дошло аж до Drag’n’Drop’а.
- Поддержка видео.
- Убран «язык запросов по тегам». Заменён выборкой по нескольким тегам.
- Убраны «альбомы». Заменены выборкой по нескольким тегам.
- Убрана собственная авторизация, добавлена «глобальная» через расширение MediaWiki (вот оно).
- Добавлено облако тегов.
- Поддержка просмотра полной EXIF-информации.
- Переписана на Sway Solstice, причём, вместе со ScaleDaemon’ом. Кода меньше раза в 3, он понятнее и расширяемый, а работает лучше. И апача больше тоже нет.
- Живёт по адресу http://vmx.yourcmc.ru/vitaphotov3.
Почему идущая после 1.3 версия 1.4 называется также V3? Ответ кроется в версии схемы базы данных — это её третий вариант с момента зарождения. Первая база называлась просто «vitaphoto» (Vitaphoto 1.0, 1.1), вторая несовместимая с первой и заполняемая заново (Vitaphoto 1.2, 1.3) «vitaphotov2», третья и теперешняя «vitaphotov3».
Системные требования
Требуются следующие Perl-модули (установить командой cpan, она же perl -MCPAN -e shell):
cpan Log::Log4perl Hash::Merge Net::Server PPI::Document Digest::SHA1 \ URI::Query URI::QueryParam URI::Escape HTTP::Body Image::EXIF \ Cache::FastMmap File::Path CGI::Cookie JSON HTTP::Server::Simple
Также требуется один из модулей Graphics::Magick (из комплекта graphicsmagick), Image::Magick или GD.
Анализ V2
Ниже можно почитать о моём незамутнённом взгляде на V2 в формате «проблема-решение»: плюсы и минусы Vitaphoto 1.3 глазами меня (автора). По этим плюсам и минусам, а точнее, проблемам и решениям, и построена версия Vitaphoto V3 / 1.4. Vitaphoto V3 также содержит MediaWiki-расширение для глобальной авторизации.
Значок рядом с фичей / решением проблемы означает, что в релизе V3 / 1.4 эта фича уже реализована.
Хранение
V2 | Удобно? | А как удобно? |
---|---|---|
Выкладывать фотки копированием и хранить свой фотоархив в одном месте, организуя его, как душа пожелает. | удобно | ![]() |
Отдельный синтаксис у атрибутов файлов (скрытые и т. п.). | неудобно | ![]() |
Описания альбомов и выражения в файлах. | неудобно | Брать их из статей YourcmcWiki. |
Статические страницы лежат отдельными HTML’ками. | неудобно | Брать их из статей YourcmcWiki. |
… С другой стороны, это будет завязка на MediaWiki. | неудобно | Хранить все «завязки» в файлах или базе. Из MediaWiki просто экспорт. Причём тут даже никакой демон не нужен — из медиавики экспорт по таким же ссылкам в отдельную папочку, а дальше подключение шаблонизатором. |
При скачивании фото название теряется. | неудобно | ![]() |
Создаваемые кучи симлинков усложняют код. | неудобно | ![]() |
Все миниатюры хранятся в одном каталоге (direntry кончатся!) | неудобно | ![]() |
Возможность сменить кодировку имён файлов для подпапки. | удобно | ![]() |
Возможность автоматического теггирования файлов в подпапке. | удобно | ![]() |
Необходимость задавать эти 2 свойства в файле dirinfo. | неудобно | ![]() |
Невозможность жестоко ликвидировать файл из базы — при удалении только ставится флаг. | неудобно | ![]() |
… Но тогда придётся заново масштабировать переименованные файлы. | неудобно | ![]() |
Невозможность скачать сразу набор файлов | неудобно | Можно предоставить интерфейс для скачивания сразу тучи файлов, НО по паролю! |
Веб-морда
V2 | Удобно? | А как удобно? |
---|---|---|
Независимые ссылки на фотографии по началу имени до первой точки. | удобно | ![]() |
Ссылки на альбомы содержат синтетический ключ и «нечеловекопонятны». | неудобно | ![]() |
Есть комменты. | удобно | |
… В них есть разметка-"виласипет" (самодельная), можно сказать её нет. | неудобно | Использовать Wiki-разметку, опять-таки, из MediaWiki. |
… Комменты хранятся отдельно, сбоку, в базе. | неудобно | Неплохо бы как-то приспособить к этому страницы обсуждения YourcmcWiki. |
Текстовые части дизайна выглядят очень грустно, «нетипографично». | неудобно | Тексты форматировать через YourcmcWiki. |
Голосование («+» и «-» отдельно). | удобно | ![]() |
Лог голосования хранится в базе. | удобно | ![]() |
Отдельная база пользователей, и нет регистрации. | неудобно | ![]() |
Нет сортировки по дате, извлекаемой из EXIF. | неудобно | ![]() |
Нет RSS-лент. | неудобно | Добавить их — на все альбомы, желательно также на обсуждения фотографий. |
Нет выборки по дате. | неудобно | ![]() |
Нет ссылок на предыдущую/следующую страницу в альбоме. | неудобно | ![]() |
Есть «альбомы», нет «облаков тегов». | неудобно | ![]() |
Навигация в альбомах по страницам; при обновлении меняются ВСЕ страницы, так как разбиение — по числу фотографий. | неудобно | ![]() |
Статистика просмотров собирается, но не отображается. | неудобно | Отображать (по фотографии, по тегу)! |
Размер миниатюр в альбомах фиксирован. | неудобно | ![]() |
Некрасиво выглядят «вертикальные» фотографии в общем потоке… | неудобно | ![]() |
Описания альбомов находятся где-то сильно в жопе, внизу. | неудобно | ![]() |
Есть диафильмы. | удобно | |
… Но миниатюры в них крупноваты и всего 3 фото. | неудобно | Показывать диафильм мельче и справа, а не сверху. |
… Кнопки влево-вправо двигают диафильм, а не переключают фото. | неудобно | Добавить мелкие полупрозрачные кнопки по краям диафильма — они пусть двигают диафильм. Большие влево-вправо оставить вверху фото и пусть они ведут на другие фото. |
Невозможно «руками» выбрать дату и/или тег | неудобно | Сделать поля ввода для выбора. Для тегов — с автокомплитом, для дат — м.б. с календарём? |
Архитектура кода
V2 | Удобно? | А как удобно? |
---|---|---|
Код веб-приложения кривоват и содержит много дублирования. | неудобно | ![]() |
Язык булевых запросов по тегам, реализованный в базе на PL/SQL + Sway::TagAlbum / Sway::TagEntry. | неудобно | ![]() |
Приложение не расширяемое. | неудобно | ![]() |
Масса галерей в одной БД усложняет код. | неудобно | ![]() |
Реализовано в Vitaphoto 1.3
Версия Vitaphoto 1.3 соответствует 6 сентября 2008 года. Исходные коды 1.3, исходные коды 1.31.
- Язык запросов по тегам, то есть, чтобы была позволена не только логическая операция «И», а также «ИЛИ» и «НЕ»; автоматическое вычисление вхождения альбома в альбом (используется приведение выражения к ДНФ);
- То есть, можно задавать логические выражения (в стандартном базисе :-D) над тегами. Это могут делать все на странице поиска. Автоматическое вычисление вхождения подальбома в альбом (сравнение булевых функций, заданных формулами O_o);
- Голосование «за» и «против» фотографий, с возможностью привязки к комментариям;
- Онлайн-конфигурация своей фотогалереи (надо быть root’ом);
- Комментарии к фотографиям (иерархические, с возможностью ответа);
- Возможность рассылки ответов на комментарии по электронной почте;
- «Анонимный логин» (через ввод CAPTCHA) — чтобы быть анонимусом (c), нужно подтвердить, что вы не компьютер;
- Вход по OpenID с автоматической регистрацией локального образа пользователя;
- Возможность использования различных кодировок имён файлов в различных подкаталогах;
- Возможность автоматически ставить некоторые теги на все файлы в заданных подкаталогах;
- Дальнейшие усовершенствования архитектуры кода (в первую очередь Web-приложения).
Реализовано в Vitaphoto 1.2
Версия Vitaphoto 1.2 соответствует 8 марта 2008 года. Исходные коды.
- Apache 2.x / mod_perl 2.x вместо Apache 1.x / mod_perl 1.x, логгирование через Log4perl;
- Огромные усовершенствования структуры и архитектуры кода (он внезапно стал вменяемым);
- Отдельный демон — обновлятор (ScaleDaemon). Обновление фотогалереи, основанное на мониторинге рабочих каталогов и обработке событий;
- Теперь добавление/обновление/удаление фотографий из базы данных осуществляется отдельным демоном (scaledaemon.pl), и основано на мониторинге файловой системы через Sys::Gamin, ранее доработанный мною; это значит, что теперь система не занимается постоянными проверками в духе «а не изменились ли какие-нибудь файлы?», а точно в нужное время получает события от wikipedia:Gamin'а и действует на их основе;
- Отказ от древовидной структуры галереи. На каждое фото ставятся теги, альбом — подмножество файлов, имеющих заданный набор тегов. Запрос всех файлов, имеющих заданный тег, по вводу URL вида http://vmx.yourcmc.ru/vitaphoto/tag/природа/;
- Теперь для каждого файла можно (и нужно) задавать список меток (тегов), а альбом является срезом по заданному набору тегов, или просто содержит все файлы, как сейчас главная страница моей фотогалереи; также можно просматрировать списки файлов, имеющие задаваемый прямо в адресной строке тег (например, http://vmx.yourcmc.ru/vitaphoto/tag/art/);
- Извлечение всех метаданных (тегов, имени, приоритета отображения, статуса скрыто/видимо) из имени файла;
- Лично у меня теперь все фотографии имеют имена вроде «02-0935 (портрет, ВМК, Наташа Дышкант) +2 +H.jpg». 02-0935 — не обязательные числа, но для меня очень удобно их писать — это номер фотографии, присвоенный фотоаппаратом. В скобках перечислены метки. +2 — приоритет отображения, а +H означает, что фото скрыто;
- Хитрая схема хранения фотографий. В двух словах её не опишешь… Если говорить о её преимуществах — то это:
- отсутствие необходимости в постоянных перенаправлениях 302 Found браузера, обрабатываемых мод_перлом, так как автоматически создаются и поддерживаются символические ссылки на файл, миниатюру и изображение среднего размера по ID в базе;
- по той же причине отсутствие проблем с запросом файлов с русскоязычными именами;
- отсутствие необходимости удалять, а потом добавлять файл в базу при переименовании, по причине того, что заливаемые фотографии превращаются в символические ссылки на файл в специальной поддиректории «хранилище» (store);
- эти символические ссылки относительные, поэтому нет проблем с копированием файлов по FTP (в случае абсолютных проблемы бы были, так как большинство FTP серверов делают chroot после авторизации пользователя);
- Ссылки на фотографии по именам;
- Добавлена возможность обращаться к фотографиям, масштабированным изображениям, альбомам по имени, а не только по ID — очень полезно для вставки ссылок на фотографии на внешние страницы. Так, например, я сделал во всех записях своего ЖЖ, в которых были выложены фотографии, дабы впредь больше ссылки менять не пришлось;
- Каждый альбом также представлен отдельным файлом (текстовым), и также обновляется в базе данных ScaleDaemon-ом;
- Возможность использования викиобразной (собственной разработки) разметки в описаниях альбомов;
- Добавлена возможность относительно несложной викиобразной разметки описаний альбомов. Разметка — собственная разработка («велосипед», ага). Как несложно заметить, если в альбоме не будет фотографий, но будет описание — мы получим просто статическую страницу;
- Страницы ошибок вместо чёрных надписей «401 Unathorized», «403 Forbidden» и т. п. на белом фоне;
- Теперь вместо сообщений 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error вы увидите относительно дружелюбные страницы ошибок (например, 404 Not Found выглядит так).
- Переписана куча кода;
- Теперь код стал а) вменяемый и б) объектно-ориентированный (фотография — объект, фотоальбом — объект). Это я сделал, когда написал код обновления галереи в том же стиле, в каком был написан мною весь код летом, и понял, что дальше так жить нельзя. Код был укуренный, а теперь отпустило :) превеед, m0r1k! Ты меня почти воспитал;
- Ведение простой статистики в БД.
Архитектурные отличия старой версии 1.2 от более новых:
- Была завязка на mod_perl 2.0;
- Благодаря созданию символических ссылок на файлы, отсутствуют проблемы при запросе файлов с именами в русских кодировках, но зато теряются полные имена файлов при скачивании;
- Чтобы дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, и положить в него недоступный на запись через FTP файл «dirinfo» с заданием кодировки имён файлов и/или автоматически проставляемых на все фотографии подкаталога тегов;
- Система рассчитана на любое количество галерей, управляемых одним приложением;
- В описании альбома можно пользоваться простым wikiобразным синтаксисом для форматирования текста.
Реализовано в Vitaphoto 1.1
Версия Vitaphoto 1.1 соответствует 17 августа 2007 года. Исходные коды.
- Авторизация (по сути бессмысленная, так как ничего не давала);
- Чтение EXIF информации из фотографий.
Реализовано в Vitaphoto 1.0
Версия Vitaphoto 1.0 соответствует 19 июля 2007. Исходные коды.
- Первая версия фотогалереи;
- Множественные конфигурации (несколько галерей под управлением одного приложения);
- Автообновление всей галереи каждые N минут при HTTP-запросе;
- Иерархическая структура галереи (каталог — альбом, файл — фотография);
- Задание приоритетов, названий фото и каталогов в специальных файлах «Dirinfo».