Мой проект посвящён созданию сообщества, ориентированного на культуру «Дао Дэ Цзин». У меня имеется более 5000 древних книг, которые необходимо отобразить, и я сжал все их в формат изображений AVIF. Некоторые из этих книг содержат до 2500 изображений в формате AVIF.
Мой вопрос: как вставить эти изображения в один пост Discourse, чтобы пользователи могли читать их онлайн?
Я ищу решение, возможно, в виде плагина, которое обеспечивало бы для пользователей в рамках поста следующие функции:
Простая навигация между изображениями вперёд и назад (как перелистывание страниц).
Возможность перейти напрямую к определённому номеру изображения.
Критически важно: изображения должны загружаться лениво (lazy-load), то есть только при переходе к ним, а не все сразу при открытии поста.
Все мои файлы организованы в числовом порядке и находятся в формате AVIF. Каждая книга размещена в отдельной папке. Средний размер изображения составляет 150 КБ, количество страниц в книгах обычно варьируется от 300 до 1000, хотя в некоторых случаях достигает 2500.
Почему у меня такие требования?
Моя коллекция книг обширна и на данный момент превышает 350 ГБ. Сжатие в формат AVIF было необходимо для управления хранилищем.
Форматы AVIF и WebP не могут быть легко упакованы в единый PDF-файл.
Упаковка книг в архивы ZIP или RAR делает невозможным их онлайн-чтение. Использование форматов электронных книг, таких как CBZ, создаст слишком высокую нагрузку на сервер.
Я редко так говорю, но не уверен, что Discourse — подходящий инструмент для вашей задачи.
Если вы всё же хотите попробовать, я бы, вероятно, создал отдельную тему для каждой книги и, возможно, отдельный пост для каждой главы (если это имеет смысл; может быть, глав вообще нет?).
Затем можно использовать скрипт импорта, который будет читать имя директории, создавать тему и выполнять что-то вроде:
files.each do |f|
u=uploader.create_upload(1, f.path, f.filename)
raw += uploader.html_for_upload(u, f.filename)
end
После этого вы сможете использовать полученный raw-контент для создания темы.
Вам стоит заглянуть в каталог скриптов импорта, чтобы найти примеры создания тем, но это общая идея.
Таким образом, все изображения окажутся в одной теме/посте. Существуют также инструменты, позволяющие прокручивать множество изображений, насколько я знаю. Возможно, кто-то другой обратил на них больше внимания, чем я.
Как уже говорилось, Discourse, вероятно, не поможет, по крайней мере, в размещении вашей библиотеки. Вместо этого стоит рассмотреть возможность использования отдельного сервиса для хостинга изображений параллельно с вашим экземпляром Discourse.
Ниже приведен список сервисов для галерей фотографий с самостоятельным размещением, которые могут предложить множество необходимых функций: веб-приложение «из коробки», удобный для пользователей и мобильных устройств интерфейс, альбомы на основе директорий, возможности поиска и т. д.
Вы можете запустить сервис хостинга изображений отдельно и использовать ссылки из него в виде встроенных iframe на Discourse. Это избавит базу данных Discourse от необходимости загружать все изображения и позволит сервису хостинга изображений обрабатывать ленивую загрузку. После этого можно начать рассмотрение использования компонентов тем или плагинов для создания отдельных страниц библиотеки, автоматического связывания ссылок из сообщений пользователей и т. д.
Я не считаю, что это вопрос хостинга, а скорее вопрос удобства чтения. Для людей, предпочитающих более западный стиль, это очень похоже на вопрос показа комиксов. Для таких случаев можно найти подходящие платформы, но я вполне уверен, что даже WordPress может предложить решение.
А соединение контента и сообщества/обсуждений через Discourse — это совершенно тривиальная задача.
Но в экосистеме Discourse то, что предлагал Discpage, могло бы стать другим решением. Однако оно сломано.
Существуют онлайн-читалки для форматов комиксов, которые загружают файлы по требованию:
например, GitHub - codedread/kthoom: Comic Book Reader in the Browser · GitHub поддерживает параметр alwaysOptimizedForStreaming=true, который указывает kthoom рендерить страницы сразу по мере их распаковки и позволяет загружать их с URL, поддерживающих запросы с диапазоном.
Сработает ли это также в случае, если нужно ограничить доступ к книгам для определённых групп пользователей или только для авторизованных пользователей?
Большое спасибо всем за помощь!
Я нашёл решение: я развернул сервис Zfile на своём сервере, который работает как частное облачное хранилище, и настроил его так, чтобы разрешить анонимный доступ.
Я могу контролировать количество файлов, отображаемых на странице, и настраивать, сколько из них загружается вручную при каждом запросе. Права для анонимных посетителей установлены как «только просмотр».
Это решило несколько ключевых задач для меня:
Сложное управление файлами: гораздо удобнее управлять сотнями тысяч изображений через интерфейс облачного хранилища.
Предпросмотр по требованию: по умолчанию хранилище просто перечисляет файлы, и предпросмотр генерируется только при клике на файл. Это работает очень похоже на PhotoSwipe. (Хотя в Zfile есть режим предпросмотра всех изображений сразу, я думаю, что смогу отключить его позже.)
Интеграция с Discourse: теперь я могу добавлять в свои посты на Discourse ссылку «Читать онлайн», которая при клике открывает интерфейс облачного хранилища. Вот как это выглядит: https://openttc.com/t/topic/8
Эффективность использования ресурсов: этот подход избегает ненужного потребления ресурсов, характерного для традиционных галерей или приложений для хостинга изображений. Лучший способ читать книгу — загружать по одной странице за раз, в отличие от фотоальбома, где вы ожидаете увидеть сразу несколько изображений. Одновременная загрузка нескольких страниц книги также была бы визуально запутанной, так как каждая страница выглядит довольно похоже.
Я использую Discourse как главную страницу своего сайта, управляя примерно 5000 книгами в 31 категории. Каждый пост представляет собой одну книгу, а хранилище Zfile управляет отдельными страницами контента для каждой из них. Это лучший пользовательский опыт, который я пока нашёл, и он достаточно удобен как на настольных компьютерах, так и на мобильных телефонах и планшетах. Надеюсь, это поможет другим, у кого могут быть схожие потребности.
Несколько заметок:
Zfile — не единственный вариант. Похоже, его интерфейс в основном поддерживает китайский язык, что для меня является преимуществом. Если у вас есть какие-то лучшие рекомендации, пожалуйста, сообщите.
Если когда-нибудь в будущем для Discourse появится плагин для 3D-перелистывания страниц (имитирующий реальный процесс перелистывания книги, как это доступно для WordPress), пожалуйста, тоже дайте знать.
Ещё раз спасибо!
Попробовали ли вы обернуть изображения в разметку [grid]? Тема вроде https://openttc.com/t/topic/54 стала бы гораздо удобнее для управления.
Лично я оцифровал фотоальбомы, сохранил их в PDF-файлы и загрузил в темы на Discourse. Затем компонент темы для встроенного предпросмотра PDF позволяет моим участникам прокручивать их прямо в Discourse. Преимущество этого подхода в том, что книги остаются целыми.
Большое спасибо, сэр!
Недавно я занимался разработкой, переключаясь между несколькими серверами. Поэтому ссылка openttc.com, упомянутая в этом сообщении, может работать нестабильно.
Как только я завершу текущую работу, я опубликую обновлённую ссылку в этой теме, чтобы продемонстрировать результаты нашего обсуждения (встраивание Zfile в сообщения Discourse, что может оказаться полезным для кого-то в будущем).
На самом деле, после долгих раздумий я временно отказался от своего предыдущего подхода.
Причина в том, что управлять им слишком хлопотно. Если я позже добавлю новый контент, мне придётся отдельно управлять им в системах Discourse и Zfile и вручную синхронизировать их.
В настоящее время я пытаюсь встраивать контент напрямую в сообщения в виде PDF-файлов. Некоторые отдельные PDF-файлы имеют размер более 2 ГБ, поэтому ещё предстоит решить ряд проблем…
Спасибо всем за внимание. Это сообщество действительно замечательное!
Желаю вам крепкого здоровья и счастья вашим семьям!
Я закрою эту тему, так как, похоже, вы смогли найти хорошие варианты решения вашей проблемы. Если в будущем у вас возникнут трудности, вы можете создать новые темы.