Compare commits
No commits in common. "master" and "0.2.4" have entirely different histories.
@ -1,31 +0,0 @@
|
|||||||
# Обновление 7 — Пропускать OOB если URL картинки содержит недопустимые символы
|
|
||||||
|
|
||||||
## Контекст
|
|
||||||
|
|
||||||
В update-5 была добавлена нормализация URL картинок: символ `:` в path кодировался как `%3A`.
|
|
||||||
Выяснилось, что CDN принимает закодированный URL (200 OK), но клиент Conversations
|
|
||||||
всё равно не отображает картинку — причина в hotlink protection на стороне CDN.
|
|
||||||
Таким образом, нормализация URL не решает проблему и бесполезна.
|
|
||||||
|
|
||||||
Практическое наблюдение: URL с `:` в path — признак CDN с hotlink protection.
|
|
||||||
Такие картинки не отобразятся в клиентах в любом случае.
|
|
||||||
Решение: не добавлять OOB для URL, содержащих `:` в path-части.
|
|
||||||
|
|
||||||
## Задача
|
|
||||||
|
|
||||||
1. В `adapters/sources/rss/fetcher.py`:
|
|
||||||
- Удалить функцию `_normalize_image_url` и импорты `urllib.parse`
|
|
||||||
- В `_extract_image_url` проверять raw URL: если path-часть содержит `:` — возвращать `None`
|
|
||||||
|
|
||||||
## Техническая реализация
|
|
||||||
|
|
||||||
Проверка выполняется через `urlparse`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
p = urlparse(url)
|
|
||||||
if ':' in p.path:
|
|
||||||
return None
|
|
||||||
return url
|
|
||||||
```
|
|
||||||
@ -3,7 +3,7 @@ import logging
|
|||||||
import re
|
import re
|
||||||
from html import unescape
|
from html import unescape
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import quote, urlparse, urlunparse
|
||||||
|
|
||||||
import feedparser
|
import feedparser
|
||||||
|
|
||||||
@ -20,18 +20,18 @@ def _strip_html(text: str) -> str:
|
|||||||
return unescape(text).strip()
|
return unescape(text).strip()
|
||||||
|
|
||||||
|
|
||||||
|
def _normalize_image_url(url: str) -> str:
|
||||||
|
"""URL-энкодирует path-часть, чтобы символы вроде ':' не ломали парсеры клиентов."""
|
||||||
|
p = urlparse(url)
|
||||||
|
return urlunparse(p._replace(path=quote(p.path, safe='/')))
|
||||||
|
|
||||||
|
|
||||||
def _extract_image_url(entry) -> Optional[str]:
|
def _extract_image_url(entry) -> Optional[str]:
|
||||||
"""Возвращает URL первого enclosure с type image/*.
|
"""Возвращает нормализованный URL первого enclosure с type image/*."""
|
||||||
Возвращает None если URL содержит ':' в path — признак hotlink-защищённого CDN.
|
|
||||||
"""
|
|
||||||
for enc in entry.get("enclosures", []):
|
for enc in entry.get("enclosures", []):
|
||||||
if enc.get("type", "").startswith("image/"):
|
if enc.get("type", "").startswith("image/"):
|
||||||
raw = enc.get("href") or enc.get("url")
|
raw = enc.get("href") or enc.get("url")
|
||||||
if not raw:
|
return _normalize_image_url(raw) if raw else None
|
||||||
return None
|
|
||||||
if ":" in urlparse(raw).path:
|
|
||||||
return None
|
|
||||||
return raw
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user