Skip to content

Generate preview for images #567

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed

Generate preview for images #567

wants to merge 1 commit into from

Conversation

php-coder
Copy link
Owner

@php-coder php-coder commented Apr 24, 2017

@Shkarin @Shagbark please, review this code and don't hesitate to ask any questions.

TBD:

  • extract some unrelated changes to separate commits
  • /tmp/upload -> /tmp/uploads
  • squash commits
  • update changelog
  • move preview creation to the controller
  • extract createPreview method
  • add unique index to images_data table
  • test that exception contains image id
  • test adding series and adding additional image with files
  • test when the feature is disabled
  • show a time took for image preview generation

Addressed to #387


// The value could be between 0.0 and 1.0 where 0.0 indicates the minimum quality
// and 1.0 indicates the maximum quality.
private static final double QUALITY = 0.5;
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Качество и размеры изображения выбраны практически наугад. Позже можно будет их изменить.

@mystamps-bot
Copy link

mystamps-bot commented Apr 24, 2017

1 Error
🚫 maven-failsafe-plugin error in src/test/java/ru/mystamps/web/tests/cases/WhenUserAddSeries.java:
Test case WhenUserAddSeries.shouldCreateSeriesWithAllFieldsFilled fails with error:
The element seems to be disconnected from the DOM. This means that a user cannot interact with it.
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: ‘2.53.1’, revision: ‘a36b8b1cd5757287168e54b817830adce9b0158d’, time: ‘2016-06-30 19:26:09’
System info: host: ‘testing-gce-6c7c3484-0ece-4597-8a60-21d1be1e9619.c.travis-ci-prod-2.internal’, ip: ‘10.10.20.31’, os.name: ‘Linux’, os.arch: ‘amd64’, os.version: ‘3.13.0-115-generic’, java.version: ‘1.8.0_121’
Driver info: driver.version: HtmlUnitDriver
1 Message
📖 maven-failsafe-plugin reported about 1 error. Please, fix it. See also: https://github.com/php-coder/mystamps/wiki/integration-tests

Generated by 🚫 Danger

@coveralls
Copy link

Coverage Status

Coverage decreased (-3.4%) to 77.764% when pulling 60e57d4 on gh387_image_preview into 692e6f6 on master.

@php-coder
Copy link
Owner Author

php-coder commented Apr 24, 2017

Хочу с вами обсудить, как минимум, следующие вопросы:

  1. сейчас при сабмите изображения мы в блокирующем режиме его сохраняем и делаем превью. Это может быть довольно долгий процесс, особенно теперь когда еще и превью создается, которое может есть память.
    Я думал в сторону чего-то асинхронного, но решил сначала сделать нечто работающее и потом улучшать. Но все-таки обсудить этот подход нам никто не мешает уже сейчас :) Ах, да, с асинхронностью будет еще такая проблема, что мы потеряем возможность быть в одной транзакции и почистить все за собой в случае исключения.

  2. хотелось бы иметь возможность как-то перегенеривовать превью. Например, если я изменю исходное изображение или если мы решим изменить размер этих превью. Как бы вы это реализовывали?

  3. в текущем подходе, мы возвращаем оригинальное изображение, если превью не существует. Возможно, что стоит попытаться это превью создать? Это, кстати, как раз случай для существующих на проде изображений, у которых превью нет и их нужно как-то создать.

@php-coder php-coder changed the title Generate preview for images [WIP] Generate preview for images Apr 24, 2017
@php-coder
Copy link
Owner Author

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

@php-coder php-coder force-pushed the gh387_image_preview branch from 60e57d4 to 8ccfb89 Compare April 25, 2017 11:00
@coveralls
Copy link

Coverage Status

Coverage decreased (-3.4%) to 77.764% when pulling 8ccfb89 on gh387_image_preview into 94fa3b7 on master.

@AleksSPb
Copy link
Contributor

Я бы предложил в таблицу со ссылками на изображения, добавить поле preview_ready. При подгрузке новых изображений по умолчанию устанавливать значение false.
Сделать отдельный процесс, который будет выбирать из таблицы записи у которых не готово превью и генерировать их. После генерации заменяя значение поля preview_ready на true. Послеобработки процесс засыпает на какое-то время. Время сна может меняться в зависимости от количества ожидающих обработки изображений. Количество обрабатываемых за раз изображений должно настраиваться.
В случае если требуется отсутствующая превьюшка, она генерируется на лету.

@php-coder
Copy link
Owner Author

@AleksSPb Спасибо, что присоединился!

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

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

@php-coder
Copy link
Owner Author

Я бы предложил в таблицу со ссылками на изображения, добавить поле preview_ready.

P.S. Идея хорошая, но какую проблему мы этим решим? В текущем подходе мы можем определить есть превью или нет путем либо проверки существования файла (на проде), либо поиском в таблице image_content (встроенная БД). Т.е. этот механизм и есть замена полю preview_ready, только поле статичное, а проверка динамическая. В случае с полем, также появится шанс, что файла на файловой системе нет, а preview_ready установлена в true. Короче, чем больше флагов, тем сложнее состояние и больше шансов внести ошибку.

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

Я бы даже приделал это поле, если бы оно решало, что-то что не решается в текущем подходе.

@AleksSPb
Copy link
Contributor

В такой постановке - лучше твоего решения не найти! 👍

@php-coder php-coder force-pushed the gh387_image_preview branch from 8ccfb89 to 30d8478 Compare April 26, 2017 21:24
@coveralls
Copy link

Coverage Status

Changes Unknown when pulling 30d8478 on gh387_image_preview into ** on master**.

@php-coder php-coder force-pushed the gh387_image_preview branch from 30d8478 to d484da4 Compare April 26, 2017 22:33
@coveralls
Copy link

Coverage Status

Changes Unknown when pulling d484da4 on gh387_image_preview into ** on master**.

@php-coder php-coder force-pushed the gh387_image_preview branch from d484da4 to 6fd957e Compare April 27, 2017 21:07
@coveralls
Copy link

Coverage Status

Changes Unknown when pulling 6fd957e on gh387_image_preview into ** on master**.

@php-coder php-coder changed the title [WIP] Generate preview for images Generate preview for images May 11, 2017
@php-coder php-coder force-pushed the gh387_image_preview branch from 6fd957e to 15b632f Compare May 11, 2017 21:15
@php-coder
Copy link
Owner Author

Merged in 5937d16 commit.

@php-coder php-coder closed this May 11, 2017
@php-coder php-coder deleted the gh387_image_preview branch May 11, 2017 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants