В не столь отдаленные времена, когда Flickr еще не предлагал терабайт для хранения фотографий, а BitTorrent Sync только что вышел в Интернете в своей небезопасной альфа-версии, у меня возникла необходимость: поделиться фотографиями с друзьями и многое другое.
Но как это обычно бывает у программистов, слово «поделиться» стоит гораздо больше, чем размещение фотографий в ВКонтакте.
А именно:
- Загрузите фотографии куда-нибудь на свой сервер с помощью красивого и простого веб-интерфейса.
- Исходные изображения легко загружать и скачивать оптом.
- Возможность ограничить доступ к определенным альбомам.
- Попробуйте связать это с локальным сетевым хранилищем, чтобы не дублировать фотографии.
- Если возможно, через некоторое время удалите оригинальные фотографии с сервера и оставьте только фотографии с измененным размером.
- По максимуму бесплатно ! :)
Что сейчас предлагают фотохостинги?
Google нашел множество облачных сервисов для загрузки фотографий, предназначенных в основном для фотографов (и не только).Суть всех услуг в том, что начиная с определенного объема вы должны платить фиксированную сумму в месяц.
Если через полгода сумма будет выглядеть не такой уж и большой, то через два года это станет неприятным напоминанием.
Можно провести аналогию с оплатой 600 рублей в год за ru-домены на nic.ru и постоянным напоминанием себе, что вам следует передать эти домены другим регистраторам :).
С другой стороны, если у вас уже есть сервер, то вам нужно использовать его по максимуму.
Я нашел два проекта, которые в принципе могли соответствовать моим потребностям.
Этот Пивиго (ранее phpWebGallery) и Кокен .
Последний проект меня очень порадовал.
Но познакомившись с ними поближе, я понял, что и это меня не устраивает. Dropbox, Skydrive, Google+ (Picasa), Яндекс.
Фото — эти ребята отлично выполняли свои функции, пока хватало места.
Поделиться с друзьями
Я хотел бы поговорить подробнее о том, что для меня означает термин «совместное использование».После какого-то мероприятия (будь то поездка на природу или прогулка по городу), в котором принимают участие несколько человек, появляется множество фотографий.
После обработки фотографии (300–700 МБ) отправляются на локальный NAS (Synology DS210j).
И эту папку с NAS надо выложить в интернет, чтобы ее могли скачать те же друзья, что на фотографиях.
Загружать/скачивать такой объем через браузер - не для меня.
Но в конечном итоге я хочу иметь ссылку на альбом, которую я могу отправить кому-нибудь другому.
Ну и еще было бы неплохо иметь список альбомов.
Простой нормальный процесс.
Самое главное, чтобы были оригинальные фотографии и нормальный ресайз без фильтров (а не то, что сейчас предлагают ВК и другие).
Тогда, когда у каждого будет 4К-телевизор (как сейчас FullHD), будет очень здорово просматривать свой фотоархив и лишний раз радоваться.
БитТоррент Синхронизация
После того, как я прочитал новость о выходе первой версии BTSync для всех платформ, я всё понял.У меня в голове есть четкий алгоритм работы:
- Первоначальная загрузка фотографий происходит через BitTorrent Sync.
- Неважно, где пользователь расшаривает папку и получает секретный ключ только для чтения, и он может сделать это на NAS или локально.
- Далее пользователь переходит в веб-интерфейс управления и добавляет альбом, используя секретный ключ только для чтения.
- Веб-интерфейс отправляет команду BTSync для загрузки этой папки на сервер.
Постепенно начинается загрузка на сервер.
- В это время в короне или еще где-то идет проверка все ли скачалось или нет (а-ля индексация файлов).
Все файлы, например, добавляются в базу данных, и из них создается уменьшенная копия (т.е.
вся метаинформация поступает из исходных файлов в базу данных).
- Через некоторое время удаляем оригиналы с сервера (но! они сохраняются у успевших скачать пользователей).
Вооружившись Go, я написал консольная утилита для работы с BTSync. Ну тогда я сделал это Сорт для PHP. И тогда останется только написать все остальное ;)
EazyPhoto
Моя основная специальность — я PHP-программист. Верстка - это худшее, что может со мной случиться :).Поэтому, взяв тональную основу, я попыталась на ней что-то изобразить.
На главной странице мы видим список альбомов с названиями и датами.
А на странице альбома квадратные фотографии с превью, как в дропбоксе.
Если к каждой фотографии добавить описание и задать ее порядковый номер, получится что-то вроде блога.
Размер больших фотографий для веб-интерфейса я выбрал как маркетолог — FullHD :) Управление альбомами и фотографиями осуществляется внутри административной панели.
Вот как выглядит добавление нового альбома: просто введите название, дату начала и секрет только для чтения.
На чем все это написано? Проект написан на внутреннем движке Изе .
Он далек от совершенства, но позволяет быстро решать те или иные проблемы за определенный короткий промежуток времени.
У него нет нормальной документации, но он написан на PHP, поэтому чтобы что-то понять, нужно просто заглянуть внутрь (прямо как в идеологии go-lang :).
База данных: Я выбрал MySQL, потому что он есть у всех.
В основном здесь интересны эти два знака: альбомы и фотографии.
Индексирование файлов
Сначала я написал индексатор на PHP: он прогонял новые альбомы, добавлял их в очередь на загрузку в BTSync, а потом пробегал существующие и добавлял новые найденные файлы.Достаточно ставить скрипт в cron раз в 5 минут: этого будет достаточно.
Но не для меня.
Было бы здорово, если бы фотографии добавлялись в базу данных по мере загрузки.
И здесь на помощь приходит Go.
Easyphotod
Небольшой демон, который зависает и проверяет каталоги на наличие новых файлов.Создает превью фотографий и сохраняет их в базу данных.
Общается с BTSync. Вот его основные задачи.
Для реализации этих задач я использовал следующие пакеты:
- code.google.com/p/gcfg — работа с конфигурационными ini-файлами в стиле gitconfig. На выходе получается заполненная структура.
- github.com/disintegration/imaging — работа с изображениями (изменение размера, обрезка, подгонка и т.д.).
Без использования gd, чистый go.
- github.com/go-sql-driver/mysql - драйвер для MySQL.
- github.com/howeyc/fsnotify — кроссплатформенный пакет для отслеживания изменений в файловой системе.
- github.com/rwcarlsen/goexif/exif — пакет для чтения EXIF-данных.
- github.com/sergeyfast/btsync-cli — мой пакет для работы с BTSync API.
Получение заняло около двух дней готовый результат .
Как это работает? eazyphotod запускается через выскочку (в будущем планирую переконвертировать в супервизорд).
После запуска он загружает все альбомы в память и начинает сканировать каталоги на наличие новых фотографий.
Параллельно с этим запускается горутина для отслеживания изменений в файловой системе и обработки HTTP-запросов (обновление метаинформации альбома и добавление нового альбома в очередь загрузки).
Все запросы (изменение размера, обновление метаинформации, событие создания нового файла) объединены в один.
очередь :
Теги: #хостинг фото #golang #bittorrent sync #разработка сайтов #php #Govar SyncQueue = make(chan *SyncItem) type SyncItem struct {
-
Ядов Владимир Александрович.
19 Oct, 24 -
Предисловие, Первые Шаги
19 Oct, 24 -
Рисование С Помощью Кода В Swift, Paintcode
19 Oct, 24