Недавно я создал часть программного обеспечения (DevDeck), позволяющую разработчикам использовать Elgato Stream Deck в качестве инструмента повышения производительности. Программное обеспечение работает по модульному принципу, позволяя любому написать плагин для Stream Deck. Один из плагинов, которые я написал для DevDeck, — это интеграция со Slack, чтобы вы могли изменить свой статус Slack через Stream Deck.

Вот как обычно выглядит моя Stream Deck:

Я могу использовать значок Slack для доступа к элементам управления, специфичным для Slack:

Статус Slack обычно состоит из текста статуса и эмодзи статуса. Я подумал, что если бы я мог найти хороший способ отображения смайликов, я мог бы использовать смайлики в качестве значка для переключателей статуса. Вы можете видеть мои переключатели статуса в средней строке этого изображения.

Немного покопавшись, я понял, что есть два возможных варианта отображения смайликов в колоде стрима. Мне пришлось бы либо включить шрифт эмодзи, либо включить набор значков эмодзи в мой плагин.

Существует более 1000 смайликов, поэтому поставка набора значков смайликов с плагином должна была значительно увеличить размер загрузки плагина, поэтому сначала я больше склонялся к тому, чтобы попытаться заставить работать шрифт смайликов.

Поэкспериментировав с несколькими разными шрифтами, я понял, что шрифты эмодзи часто используют растровые изображения или работают только с определенным разрешением. Несмотря на эти ограничения, эти шрифты также часто имеют размер в несколько мегабайт. Использование шрифта эмодзи не сработает, если только я не хочу, чтобы смайлики были очень маленькими на клавишах Stream Deck размером 512x512 пикселей.

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

Что, если бы существовал API, где я мог бы запрашивать нужные мне смайлики на лету и в нужном мне разрешении? Это позволило бы моему программному обеспечению использовать изображения смайликов без необходимости отправлять большие шрифты или даже большие пакеты изображений смайликов.

Следующий шаг, выберите домен: emojiapi.dev

Поиск изображений эмодзи

Первое, что мне нужно было сделать, это найти набор изображений смайликов, которые я мог бы использовать. К счастью, я нашел репозиторий Noto Emoji, лицензия которого разрешает распространение смайликов.

Noto Emoji предоставляет смайлики в формате изображений PNG и SVG, но с изображениями SVG я могу заставить свой API получить любой формат файла и размер изображения, которые ему нужны.

Как это работает?

emojiapi.dev написан на Node.js как бессерверное приложение, работающее на AWS Lambda и AWS API Gateway.

Когда через API поступает запрос, запрашивается либо исходная версия эмодзи в формате SVG, либо растровый формат (например, JPEG, PNG, TIFF, WEBP и т. д.).

В случае запроса SVG API может просто вернуть исходное изображение.

С другой стороны, если запрашивается растровое изображение, API сначала проверит, было ли уже создано это растровое изображение. Если это не так, API сначала необходимо сгенерировать растровое изображение, прежде чем возвращать его.

Все изображения (SVG или растеризованные) хранятся в AWS S3.

Эта концепция разработана как «ленивая», когда растеризованные изображения рассчитываются по мере необходимости.

Я также хотел свести к абсолютному минимуму любые запросы, требующие обработки API. В результате перед API стоит CDN — в данном случае я использовал AWS CloudFront.

CloudFront настроен с высоким TTL для кэширования ответов от API в течение длительного периода времени, поскольку изображения вряд ли изменятся. Это означает, что CloudFront должен обслуживать запрошенные эмодзи без вызова API, если они уже были кэшированы граничным узлом CloudFront, обрабатывающим запрос.

Вы можете запросить SVG эмодзи со следующим GET запросом:

https://emojiapi.dev/api/v1/{emoticon_code_or_name}.svg

И растровый формат с использованием следующего запроса GET:

https://emojiapi.dev/api/v1/{emoticon_code_or_name}/{size}.{jpg,png,raw,tiff,webp}

Если вы, как и я, не слишком разбираетесь в том, как называются все смайлики, вы можете найти их список здесь.

Вывод

Я никогда не собирался создавать API-интерфейс смайликов, просто это был хороший побочный проект, возникший в результате попытки разработать часть программного обеспечения, которое позволило бы разработчикам программного обеспечения использовать колоду потоков в качестве инструмента повышения производительности.

Я уверен, что со временем появится множество функций, которые можно будет добавить в API emoji или на веб-сайт emojiapi.dev, но пока это удовлетворяет мои потребности. 🙂