- parse_address(address, crawler) в sources/sources.py: telegram (t.me/name, @name,
https://t.me/s/name) → slug/channel/url; rss → feed_url/url/slug из домена.
- GET /sources/preview: telegram — название через Telethon get_entity (title),
rss — через feedparser (feed.title); slug и name возвращаются в JSON.
- _form_source: единое поле address вместо url/channel/feed_url; slug из адреса.
- /sources: direction datalist из DIRECTIONS + уникальные значения из БД,
свободный ввод остаётся.
- Форма: поле Address + кнопка «Найти» (JS fetch → заполнение slug/name),
direction datalist динамический.
Также в sources.py входит незакоммиченная ранее веб-CRUD-логика (upsert_source_yaml,
delete_source_yaml, sync_yaml_to_db_and_back и др.) — работала на проде, теперь в git.
Форма добавления не имела поля channel, валидатор требует его для
crawler=telegram → 'telegram-источнику нужен channel'.
Добавлено поле в add-форму (required для telegram через JS), показ channel
в таблице у telegram-источников. Backend не менялся.
web/templates/sources.html ранее отсутствовал в git — добавлен.