69 lines
3.2 KiB
Markdown
69 lines
3.2 KiB
Markdown
# Обновление 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`
|