Initial import: vesti.nixg.ru — новостной апрув-проект (web, crawler, classifier, publisher, openspec)

This commit is contained in:
kpa39l
2026-09-13 15:58:32 +00:00
commit c3f59f7b7a
113 changed files with 7065 additions and 0 deletions
@@ -0,0 +1,28 @@
## Why
Пользователь не видит, что за картинка приложена к новости в карточке кандидата:
в шаблоне `candidates.html` для постов с `media_path` показывается только бейдж
«🖼 медиа», а само изображение не отображается. В `web/app.py` нет роута, который
отдаёт медиа-файл (есть только /static для bootstrap), поэтому `<img>` некуда указывать.
Аналогично в `published.html` медиа не показывается.
## What Changes
- Добавить в `web/app.py` роут `GET /media/{filename}` (с авторизацией, как у других
роутов), который отдаёт файл из `/opt/vesti/media/` или `/opt/vesti/media/media/`
(исторический баг путей: у старых постов media_path = `media/media/<file>`).
Безопасно: только basename (защита от path traversal), отдаём FileResponse.
- В `candidates.html` и `published.html` для постов с `media_path` выводить
`<img src="/media/{{ basename(media_path) }}" class="img-fluid ...">`
(направление на роут; если файла нет — не показывать/плейсхолдер).
- Медиа в карточке: фото/видео. Для изображений — `<img>`, для видео — `<video controls>`.
## Why Not
- Отдавать медиа через /static нельзя: файлы вне static/ и большие; роут нужен именно
для media/.
## Open Questions
- Путь `media_path` в БД: `media/<file>` или `media/media/<file>` — резолвить через
basename (имя файла уникально в каталоге).