В якості шаблону для генерації JPG зображень я обрав саме SVG через простоту та швидкість роботи з цим форматом. Наприклад HTML в якості шаблону дає більше можливостей, але більш складний у реалізації та підтримці.
Задача - генерація JPG картинки для OpenGraph розмітки (це картинка/прев'юшка для деяких соц. мереж). Rails застосунок знаходиться на Heroku. Кількість RAM не дуже велика, тож задачу генерації картинки треба кудись винести. Налаштовувати та платити за sidekiq для пет-проєкту немає сенсу. Гарним варіантом для мене виявився Heroku Scheduler. Цей стандартний (безкоштовний) addon буде запускати нашу рейк-таску за розкладом (раз на добу). Ну а сама таска буде знаходити пости, які ще не мають OG картинки, та будуть її генерувати та приатачувати (використовується ActiveStorage, зображення буде завантажене на aws) до моделі.
Перше що треба зробити - це зробити SVG шаблон. Спочатку граємось з SVG. OG картинка має бути 1200px x 630px.
Ось приблизно так буде виглядати SVG шаблон:
Цей шаблон не має ніяких змінних. Змінні будуть інтерпретуватись у .erb шаблоні. Закинемо цей SVG-шаблон до нашого rails-застосунка та додамо розширення .erb, наприклад lib/templates/og_image_template.svg.erb.
Я використовую бібліотеку mini_magick. Тож вже маю в Gemfile:
gem "mini_magick"
Далі сам сам код lib/cover_image_generator.rb.
require 'mini_magick'
require 'erb'
module CoverImageGenerator
class Generator
def generate_and_attach(entry, entry_title)
begin
# Динамічно заповнити SVG-шаблон
@entry_title = entry_title.truncate(160)
@blog_name = entry.blog.slug
svg_template = File.read(File.expand_path('./templates/cover_image_template.svg.erb', __dir__))
svg_content = ERB.new(svg_template).result(binding)
# Створити зображення MiniMagick з вмісту SVG
cover_image = MiniMagick::Image.read(svg_content)
# Конвертувати в JPG
cover_image.format('jpg')
temp_file_path = entry.slug + '.jpg'
cover_image.write(temp_file_path)
# Прикріпити зображення до запису
entry.cover_image.attach(io: File.open(temp_file_path), filename: "#{entry.slug}.jpg", content_type: 'image/jpeg')
# Очистити тимчасовий файл
File.delete(temp_file_path)
rescue => e
# Тут скоріш за все будуть проблеми з текстом, який має специфічні символи, які не можуть будуть конвертовані у JPG.
# Поки що такі тайтли я просто ігнорую - треба знайти рішення для цієї проблеми.
# Наразі, якщо модель немає доданого OG-зображення, я показую дефолтну картинку.
puts "Помилка на: #{@entry_title}, ID: #{entry.id}"
puts e
puts "=========================================="
end
puts "Зображення прикріплено до: #{@entry_title}, ID: #{entry.id}"
puts "=========================================="
end
end
end
AWS вже налаштован й все що треба зробити - це додати cover_image до нашої моделі (наприклад Topic)
Цей код треба додати в рейк таску, яка пройду та згенерує OG-зображення для всіх потрібних об'єктів. Також можна використовувати цей код для генерації зображення після створення або оновлення (заголовку) об'єкту.
Результат:
Цей приклад коду / концепції не є фінальним варіантом. Є ще над чим попрацювати.
Цей блок містить всю необхідну інформацію для правильного цитування, включаючи дату публікації, назву допису, URL та інше.
Зверніть увагу, що посилатись потрібно на автора/авторку контенту (профіль, окремий допис тощо), а сайт цейво (tseivo.com) - лише майданчик для розміщення публікацій.
💡 Архівування сторінки у веб-архіві, такому як Wayback Machine, є корисною практикою, коли ви посилаєтесь на неї. Це дозволить зберегти стан сторінки на цей час і знизить ризики від зміни контенту або зміни структури сайту у майбутньому.
Оберіть та скопіюйте потрібний стандарт цитування:
ДСТУ 8302:2015
Генерація зображень Open Graph в Rails за допомогою SVG-шаблонів [Електронний ресурс] // tseivo.com. – Режим доступу: https://tseivo.com/b/memecode/t/qg2kxgeqxr (дата звернення: 23.11.2024). – Назва з екрана.
ДСТУ ГОСТ 7.1:2006 (ВАК)
Генерація зображень Open Graph в Rails за допомогою SVG-шаблонів [Електронний ресурс] // tseivo.com. – URL: https://tseivo.com/b/memecode/t/qg2kxgeqxr (дата звернення: 23.11.2024).
Або ж використовуйте наступну інформацію для формування цитування:
Дата публікації:
24.01.2024
Назва допису:
Генерація зображень Open Graph в Rails за допомогою SVG-шаблонів
URL:
https://tseivo.com/b/memecode/t/qg2kxgeqxr
Дата звернення:
23.11.2024
Назва блогу та хендл блогу
meme code | @memecode
Автор/авторка пише під псевдонимом і не оприлюднює своє справжнє ім'я. Завжди перевіряйте достовірність контенту використовуючи декілька джерел (навіть, якщо контент опублікован під справжнім ім'ям).
Про зображення:
На нашій платформі ми приділяємо особливу увагу правильному вказуванню джерел зображень, щоб забезпечити дотримання авторських прав і прав на використання контенту. Ми намагаємося мотивувати використовувати виключно власні зображення, ресурси, що відповідають принципам fair use, або безкоштовні зображення з ліцензіями на кшталт Unsplash, які дозволяють вільне використання без порушення прав інтелектуальної власності.
Однак, враховуючи масштаб нашої платформи та різноманітність контенту, ми не можемо повністю контролювати всі публікації користувачів. Тому ми рекомендуємо перевіряти права на використання зображень та дотримуватися відповідних ліцензій, щоб уникнути можливих порушень авторських прав.
Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.
Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.