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

69 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Обновление 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>`:
```xml
<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-превью.
Для этого к сообщению добавляется элемент:
```xml
<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`:
```python
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`