jabnews/docs/update-4.md
2026-03-23 11:45:43 +03:00

3.2 KiB
Raw Permalink Blame History

Обновление 4 — Исправление отображения картинок

Контекст

В update-2 и update-3 была реализована отправка новостей через XHTML-IM (XEP-0071) с картинкой через тег <img>. По результатам тестирования картинки не отображаются:

  • Gajim — показывает URL картинки вместо изображения (использует plain-text fallback)
  • Monocle Chat (форк Conversations) — показывает незагруженную заглушку

Причины установлены в ходе анализа лога stanza.


Исправление 1 — двойной <body> в XHTML-IM

Проблема

slixmpp xep_0071 при присвоении msg["html"]["body"] = xhtml_body самостоятельно оборачивает содержимое в <body xmlns="http://www.w3.org/1999/xhtml">. Текущая реализация _build_xhtml также включает этот тег, в результате в stanza попадает вложенный <body>:

<body xmlns="http://www.w3.org/1999/xhtml">   ← добавляет slixmpp
  <body>                                        ← добавляет наш код
    <p>...</p>
  </body>
</body>

Это невалидный XHTML-IM, что приводит к использованию plain-text fallback в строгих клиентах.

Решение

В методе _build_xhtml убрать обёртку <body xmlns="...">...</body> — возвращать только внутренние элементы (<p>, <br/>). slixmpp добавит <body> сам.


Исправление 2 — OOB для отображения картинок в Conversations-клиентах

Проблема

Клиенты семейства Conversations (включая Monocle Chat) блокируют загрузку внешних изображений из XHTML-IM <img src="..."> по умолчанию — это намеренная защита от трекинг-пикселей. Картинка парсится, но не загружается.

Решение

Дополнительно к XHTML-IM прикреплять URL картинки как Out-of-Band Data (XEP-0066). Conversations и его форки умеют рендерить OOB-ссылки как inline-превью.

Для этого к сообщению добавляется элемент:

<x xmlns="jabber:x:oob">
  <url>https://example.com/image.jpg</url>
</x>

Техническая реализация

  1. Зарегистрировать плагин xep_0066 в JabberConnection
  2. В методе send_to_room_xhtml добавить OOB-поле к сообщению, если передан image_url:
    msg["oob"]["url"] = image_url
    
  3. Сигнатуру send_to_room_xhtml расширить необязательным параметром image_url: str | None = None
  4. В JabberNewsPublisher.publish передавать item.image_url в send_to_room_xhtml