# extract-post-sources Извлечение источников новостей из текста постов (TG-каналы/сайты) и быстрое добавление в реестр. ## Why Пользователь: нужно извлекать источники новостей из полученных постов (каналы/сайты, откуда пришли новости), чтобы в следующий раз забирать новости напрямую из источника. Сейчас ссылки в тексте постов никак не используются: всё приходит из sources.yaml, а репосты/упоминания других каналов и сайтов теряются. ## What Changes - **sources/extract.py** (новый): `extract_sources_from_text(text) -> list[dict]` — находит в тексте ссылки на TG-каналы (t.me/handle, @handle, t.me/s/handle) и внешние сайты (https://domain), исключает ссылки на сам пост (t.me/channel/postid), дедуплицирует. Ограничение: не более 5 найденных на пост (шум). - **web/app.py**: - helper `_post_sources(post)` → список {kind, address, slug_hint, known} для карточки (known = slug_hint уже есть в sources). - В render candidates/selected передаёт `post_sources`. - POST `/sources/add-from-post`: {address} → parse_address + add_or_update_source (переиспользует существующий CRUD). Возвращает redirect на ту же страницу с did-сообщением. - **web/templates/candidates.html / selected.html**: блок «🌐 Источники из поста» под бейджами: для каждого найденного — `@handle` / `domain`, бейдж «в реестре» или кнопка «➕». ## Impact - В карточках кандидатов/отобранных видны ссылки на внешние каналы/сайты из текста. - Один клик — добавить источник в реестр (yaml + БД, как ручное добавление). - Никаких LLM-вызовов — regex-извлечение, бесплатно. Дообогащение модели для одобренных — отдельная задача (по кнопке, экономия токенов).