2026-08-28 08:50:47 +00:00
|
|
|
# Pinned to exact versions. These are what production runs and what the test
|
|
|
|
|
# suite is green against — with `>=` the image you get depends on the day you
|
|
|
|
|
# build it, which is how a rebuild once swapped in a gunicorn that could not
|
|
|
|
|
# boot the gevent worker at all.
|
|
|
|
|
#
|
|
|
|
|
# Nothing here updates on its own any more, so bump deliberately: change a
|
|
|
|
|
# version, let CI run, then deploy.
|
|
|
|
|
Django==6.1
|
|
|
|
|
pylast==7.1.0
|
|
|
|
|
requests==2.34.2
|
|
|
|
|
python-dotenv==1.2.3
|
|
|
|
|
whitenoise==6.12.0
|
|
|
|
|
feedparser==6.0.14
|
|
|
|
|
gevent==26.8.0
|
|
|
|
|
# gunicorn 26.2.0 imports packaging.version in ggevent.py while declaring no
|
|
|
|
|
# dependencies of its own, so packaging has to be requested explicitly.
|
2026-08-28 08:34:27 +00:00
|
|
|
gunicorn==26.2.0
|
2026-08-28 08:50:47 +00:00
|
|
|
packaging==26.3
|
2026-08-31 22:29:13 +02:00
|
|
|
piper-tts==1.7.0
|
2026-10-04 12:38:06 +02:00
|
|
|
# ffmpeg (a static binary in the wheel) finds the pauses for skipping silence in the browser.
|
|
|
|
|
imageio-ffmpeg==0.6.0
|
Feed-Reader (Server): Nachrichten und Blogs, Volltext, Meldungen bündeln
Neue App feeds: Quellen sind entweder Nachrichten oder Blog.
- Abruf wie bei Podcasts (ETag, Body-Hash, Backoff), refresh_newsfeeds für den Cron
- Anrisstexte: der Artikel wird von der Seite geholt (trafilatura), HTML bereinigt,
relative Links absolut
- Nachrichten: gleiche Meldung aus mehreren Quellen wird eine Story (tf-idf, je
Artikel verglichen), Briefing „Seit letztem Mal“ (Top-Themen, dann nach Ressort),
verfallen nach news_keep_days (Standard 2)
- Blogs: Ungelesen-Liste je Blog, bleiben bis gelesen
- API unter /feeds/: Quellen suchen/abonnieren/OPML, News, Stories, Blogs,
Artikel, gelesen, merken
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 19:57:23 +02:00
|
|
|
# The feed reader takes the article out of a news page (main text without menus, ads, comments).
|
|
|
|
|
trafilatura==2.3.0
|