Newsboat

Newsboat ist ein sehr umfangreich konfigurierbarer und einfach durch Scripts und Macros erweiterbarer Feedclient für Atom- und RSS-Feeds für die Verwendung in der Konsole.
Installation
Das Programm ist als
newsboat
in extra
verfügbar, und kann von dort
mittels Pacman
installiert werden.
Nach der Installation muss zuerst mindestens ein Feed eingerichtet werden, da Newsboat ansonsten nicht startet.
Konfiguration
Newsboat lädt die Feeds und Konfiguration wahlweise aus dem Verzeichnis ~/.newsboat/
oder dem Verzeichnis ~/.config/newsboat/
. Die Feeds werden zeilenweise (optional mit entsprechender feedbezogener Konfiguration wie Tags und Titel, etc.) in der Datei urls
abgelegt, die Konfiguration erfolgt in der Datei config
.
In der Konfigurationsdatei lassen sich mittels include DATEINAME
andere Konfigurationsdateien einbinden. Angaben in Backticks (`...`
) werden vor Anwendung der Konfiguration als Shellbefehle ausgeführt und deren Ergebnis als Teil der Konfiguration interpretiert. Kommentare werden mittels #
eingeleitet. Konfigurationsparameter mit Leerzeichen müssen in Doppelte Anführungszeichen gesetzt werden ("..."
).
Feeds
Zu ladende Feeds werden Zeilenweise in der Datei urls
im beschriebenen Konfigurationsverzeichnis abgelegt. Neben dem eigentlichen URL können noch verschiedene weitere Attribute angegeben werden. Dies richtet drei Feeds ein.
urls
https://www.archlinux.de/news/feed news linux arch "~Nachrichten auf archlinux.de" https://archlinux.org/feeds/news/ news linux arch "~Englische Nachrichten über Arch" https://lkml.org/rss.php mailinglist linux kernel "~Mails in der LKML"
Die Darstellung wurde tabellarisch formatiert, um das Beispiel einfacher erklären zu können. In der ersten Spalte befindet sich jeweils der URL zum Feed. Die zweite Spalte enthält verschiedene Tags. Sollen Tags mit Leerzeichen benutzt werden, müssen diese in Doppelte Anführungszeichen gesetzt werden. Die dritte Spalte definiert den Titel für die Feeds. Technisch gesehen ist dies auch ein Tag, mit der vorangestellten Tilde bekommt es aber eine besondere Bedeutung.
In Newsboat kann man mittels T die Tagliste öffnen, und mittels der Pfeiltasten das gewünschte Tag auswählen, es werden dann nur Feeds angezeigt, dieses Tag haben.
Query-Feeds

Wenn man sehr viele Feeds hat, kann es sein, dass man den Überblick verliert und eventuell Feeds zusammenführen und ansonsten aber aus der Feedsliste verbergen möchte. Hierzu kann man Query-Feeds benutzen. Diese erlauben den Zugriff auf alle Feed- und Artikel-Informationen (Tags, Titel, Datum, Status, etc.) und können anhand dieser Informationen Artikel aus mehreren Feeds in einem Feed zusammenführen.
urls
"query:Alle News zu Arch:(tags # \"arch\") and (tags # \"news\")" combined arch news https://www.archlinux.de/news/feed ! news linux arch "~archlinux.de" https://archlinux.org/feeds/news/ ! news linux arch "~archlinux.org"
Im Beispiel werden durch das Ausrufezeichen-Tag die Feeds in der Feedliste versteckt. Es wird zudem ein Query-Feed „Alle News zu Arch“ eingerichtet, dieser listet alle Artikel aus Feeds, in deren jeweiligen Taglisten sowohl arch
als auch news
zu finden sind. Der Query-Feed selbst hat die Tags „combined“, „arch“ und „news“ (Query-Feeds matchen sich nicht selbst, daher können die Tags „arch“ und „news“ problemlos so vergeben werden).
Eine weitere Option für einen Query-Feed ist ein Sammelfeed für alle noch nicht gelesenen Artikel.
"query:Ungelesen:unread = \"yes\"" combined unread
Dadurch werden alle Artikel aller Feeds, die noch das Unread-Flag haben, in einem Feed zusammengefasst, der Query-Feed selbst erhält die Tags „combined“ und „unread“, sowie den Titel „Ungelesen“.
Query-Feeds werden standardmäßig erst beim öffnen aktualisiert. Will man bereits direkt nach dem Update schon in der Feedliste sehen, wie viele Artikel der Query-Feed hat, muss man die Konfigurationsoption prepopulate-query-feeds yes
setzen.
Automatisches Feedupdate
Will man alle Feeds beim Programmstart automatisch aktualisieren, kann man dies entsprechend in der Konfigurationsdatei hinterlegen. Standardmäßig benutzt Newsboat nur einen Thread, bzw. eine Verbindung zum aktualisieren. Man kann dies ebenfalls beschleunigen. Im Beispiel werden 10 Verbindungen parallel aufgebaut, wodurch 10 verschiedene Feeds gleichzeitig aktualisiert werden können. Zudem wird konfiguriert, dass bei laufendem Programm die Feeds alle 5 Minuten aktualisiert werden.
config
auto-reload yes reload-threads 10 reload-time 5
Zusätzlich kann man mittels newsboat -x reload
ein Update aller Feeds durchführen, ohne Newsboat dafür interaktiv starten zu müssen.
Themes


Themes sind Dateien, denen Zeilenweise Farboptionen für verschiedene Bereiche innerhalb von Newsboat gesetzt werden. Dabei werden keine konkreten Farben gesetzt, sondern lediglich definiert, welche der Terminalfarben benutzt werden soll. Themes lassen sich daher einerseits per Theme-Datei setzen, aber auch indem man die Farbkonfiguration des verwendeten Terminalemulators anpasst.
Es werden standardmäßig einige Themes mitinstalliert, die mittels include
-Keyword innerhalb der Konfiguration geladen werden können. Die Standard-Themes befinden sich im Verzeichnis /usr/share/doc/newsboat/contrib/colorschemes
. Die mitgelieferten Themedateien beinhalten Informationen darüber, für welche Terminalfarben sie entworfen wurden.
config
include /usr/share/doc/newsboat/contrib/colorschemes/commander
Ein helles Theme könnte man zum Beispiel wie folgt einrichten.
light
color title color15 color12 color background color0 color15 color listnormal color0 color15 color listnormal_unread color0 color15 bold color listfocus color0 color7 color listfocus_unread color0 color7 bold color article color0 color15 color info color7 color8 color hint-key color3 color8 bold color end-of-text-marker color15 color15 search-highlight-colors color0 color11 highlight article "^[a-zA-Z]+: .*$" color8 color15 highlight article "https?://[^ ]+" color4 color15 underline
In der Dokumentation zu Newsboat finden sich alle anpassbaren Optionen, um Themes auch selbst erstellen zu können, so kann man sich selbst ein individuelles Theme basierend auf den eigenen Terminalfarben einrichten.
Darstellung der Listen anpassen
Standardmäßig werden in der Feedübersicht der Newsboat-Interne Feed-Index, der Gelesen-Status, die Anzahl der gelesenen/ungelesenen Artikel, und der Feed-Titel hintereinander weg angezeigt. In der Artikel-Übersicht werden der Index, der Gelesen-Status, das Datum, die Größe, in Query-Feeds der Quellfeed, und der Titel angezeigt.
Es lassen sich alle Relevanten Ausgaben anpassen. Das Beispiel beschränkt sich jedoch auf die Feed-Liste (feedlist-format
), und die Artikel-Liste (articlelist-format
). Auch hier sei wieder auf die sehr gute und umfangreiche Onlinedokumentation verwiesen.
Funktionsweise
Newsboat erlaubt es, diese Anzeigen vollständig anzupassen. Die Einzelnen Werte werden in Variablen bereitgestellt, die man ähnlich wie Variablen in der printf
-Funktion von C behandeln und um Attribute erweitern kann. In der Online-Dokumentation finden sich alle Verfügbaren Variablen, daher seien hier nur die im Beispiel genutzten genannt.
Variable | Bedeutung |
---|---|
a |
Artikel-Autor |
c |
Anzahl aller Artikel im Feed |
D |
Veröffentlichungsdatum des Artikels |
n |
Ungelesen-Markierung |
T |
Erstes Tag des Feeds |
t |
Feed- oder Artikel-Titel |
U |
Anzahl der ungelesenen Artikel im Feed |
Zum Verwenden einer Variable wird diese per %_
Referenziert, wobei _
der jeweilige Buchstabe ist. Darüber hinaus können Werte auch auf Vorhandensein geprüft werden.
%?variable?wahr&falsch?
- Beispielsweise:
%?n?%U&%c?
n?
– Prüft, obn
gesetzt ist, dies ist der Fall, wenn der Feed ungelesene Artikel hat.%U&%c
– Je nachdem obn
wahr oder falsch ist, wird entweder%U
(Anzahl der ungelesenen Artikel im Feed) oder%c
(Anzahl aller Artikel im Feed) angezeigt.
„Wahr“ ist immer der Fall, wenn die entsprechende Markierung gesetzt ist (also zum Beispiel eben bei ungelesenen Artikeln im Feed), oder wenn die getestete Variable einen anderen Wert hat, als leer zu sein, oder nur aus Leerzeichen zu bestehen.
Variablen lassen sich zudem auch mit Füll-Leerzeichen versehen um die beinhalteten Zeichenketten länger zu machen (oder zu kürzen) oder auf einer Seite auszurichten:
Davor %-40t Danach
Davor Feed-Titel Danach
… und andersrum …
Davor %40t Danach
Davor Feed-Titel Danach
Wenn die Zeichenkette zu lang ist, wird sie nach erreichen der Angegebenen Länge hart abgeschnitten.
Beispiel

Oben: Feedliste
Mitte:Query-Feeds
Unten: Artikelliste
Will man sich die Artikel- und Feedliste nun anpassen, kann man seine Konfiguration entsprechend erweitern.
config
# Die Unicode-Zeichen werden im Wiki eventuell nicht richtig # angezeigt. Es handelt sich um einen Kreis mit Punkt, und # einen Kreis ohne Punkt feedlist-format " %?n?&? %-40t ┃ %?n?%U/%c&%2c?" articlelist-format " %?n?&? %D ┃ %-80t ┃ %?T?%T&%a?"
Das Beispiel macht Folgendes:
- Zuerst wird für beide Listentypen geprüft, ob die Ungelesen-Markierung gesetzt ist. Wenn dies der Fall ist, wird ein Kreis mit Punkt dargestellt, ansonsten ein Kreis ohne Punkt.
- In der Feedliste wird dann der Feed-Titel mit 40 Stellen angezeigt, gefolgt von einem Rahmenzeichen als Trenner
- Am Ende der Feedliste wird wieder geprüft, ob die Ungelesen-Markierung gesetzt ist. Wenn ja, wird die Anzahl der Ungelesenen im Verhältnis zu den gelesenen Artikeln angezeigt, wenn nein, wird nur die Gesamtzahl der Artikel angezeigt.
- Für die Artikel-Liste wird dann das Datum angezeigt, gefolgt von einem Rahmen-Zeichen als Trenner.
- Danach wird der Artikel-Titel mit 80 Stellen angezeigt, ebenfalls wieder mit einem Rahmen-Zeichen als Trenner.
- Zum Schluss folgt bei Query-Feeds jeglicher Art der Quell-Feed des Artikels, und bei normalen Artikellisten der Autor des Artikels.
Diese Formatierung schafft bei langen Artikel- oder Feedlisten eine „ruhigere“ Strukturierung, da insgesamt weniger Zeichen benutzt werden. Durch die Standardmäßige Hervorhebung der gesamten Zeile in Fettschrift wenn die Ungelesen-Markierung gesetzt ist, hat man neben dem Kreis-Symbol noch die Schriftstärke als Indikator.
Zudem werden abhängig vom jeweiligen Listenstatus, Feedstatus oder -ort, sowie Artikelstatus nur die relevanten Informationen angezeigt.
Tipps und Tricks
Update per systemd-Timer
Zum Beispiel mittels eines userbezogenen systemd-Timers kann man das reload
auch verwenden, um automatisiert alle Feeds zu aktualisieren. In diesem Fall kann man sich dann auto-reload yes
in der Konfiguration sparen, was den Start etwas beschleunigt, da man nicht erst auf die Feedupdates warten muss.
Zuerst erstellt man die Timer-Datei, hier wird festgelegt, wie oft (hier durch OnCalendar = hourly
stündlich, sowie durch OnBootSec = 1min
, einmalig eine Minute nach Systemstart) der Timer laufen soll.
~/.config/systemd/user/newsboat-reload.timer
[Unit] Description=Run newsboat-reload once an hour [Timer] OnBootSec = 1min OnCalendar = hourly [Install] WantedBy=timers.target
Dann erstellt man noch mit gleichem Dateinamen eine Service-Datei, durch die beim Aktivieren newsboat -x reload
ausgeführt wird
~/.config/systemd/user/newsboat-reload.service
[Unit] Description = Reload (Update) Newsboat feeds After = network.target [Service] Type = oneshot ExecStart = newsboat -x reload [Install] WantedBy = multi-user.target
Dann mittels systemctl --user --now enable newsboat-reload.timer
den Timer im Userkontext aktivieren und ausführen. Es wird nun im angegebenen Intervall automatisch nach neuen Artikeln gesucht.
Unterschiedliche Instanzen parallel nutzen
Wenn einem die Filter- und Sortierfunktionen nicht ausreichen, und man lieber verschiedene Themenbereiche strikt getrennt haben möchte, so kann man zum Beispiel folgende Funktion benutzen. Es wird angenommen, die Konfiguration wird unter ~/.config/newsboat/
verwaltet.
newsboat() { profile="$1" shift /usr/bin/newsboat \ --url-file "$HOME/.config/newsboat/urls${profile:+-$profile}" \ --cache-file "$HOME/.local/share/newsboat/cache.db${profile:+-$profile}" \ "$@" }
Die Funktion „ersetzt“ den Newsboat-Aufruf. Wenn nichts weiter angegeben wurde, wird Newsboat ganz normal gestartet, wenn man als ersten Parameter einen Profilnamen angibt, benutzt Newsboat statt urls
und der normalen Datenbank urls-PROFILNAME
und die entsprechend benannte Datenbank.
In der Funktion kann der Aufruf von Newsboat noch um weitere Parameter erweitert werden, um eine noch striktere Trennung zu erzeugen.
# Konfigurationsdatei --config-file "/home/user/.config/newsboat/urls${profile:+-$profile}" # Downloadqueuedatei --queue-file "/home/user/.local/share/newsboat/queue${profile:+-$profile}" # Such- und Commandline-History --search-history-file="/home/user/.local/share/newsboat/history.search${profile:+-$profile}" --cmdline-history-file="/home/user/.local/share/newsboat/history.cmdline${profile:+-$profile}"
Will man ohne die Angabe eines Profils Newsboat mit Parametern starten, kann man einfach einen leeren String als ersten Parameter übergeben: newsboat '' -x print_unread
um exemplarisch die Anzahl der ungelesenen Artikel anzuzeigen (statt newsboat -x print_unread
, was bei der Funktion eine Fehlermeldung auslösen würde).
Desktopbenachrichtigung bei neuen Artikeln
Newsboat erlaubt es, in der Konfiguration ein Programm für Desktopbenachrichtigungen zu hinterlegen. Standardmäßig ist dort nichts eingestellt, sobald man die Option konfiguriert, wird Newsboat bei jedem Update mit neuen Artikeln eine Desktopbenachrichtigung ausgeben.
config
notify-program notify-send
Je nachdem, welchen Notification-Service man nun verwendet, erscheint bei einem Neuladen der Artikel eine Benachrichtigung, ausgelöt durch den Notification-Service – vorausgesetzt, es gibt ungelesene Artikel. Will man immer eine Benachrichtigung haben, so kann man zusätzlich noch notify-always yes
setzen.
Die Benachrichtigung wird immer angezeigt, wenn man interaktiv Newsboat, oder nicht-interaktiv mittels newsboat -x reload
die Feeds aktualisiert.

Newsboat ruft Stumpf das notify-program
auf, und übermittelt dabei den per notify-format
spezifizierten Text. Weitere Parameter anzugeben ist innerhalb von Newsboat nicht möglich. Allerdings kann man als notify-program
auch ein Script angeben. Dies wird auch einfach mit dem definierten Text aufgerufen, allerdings gibt es da mehr Möglichkeiten.
config
notify-always yes notify-format "Aktualisierung abgeschlossen\nUngelesene Artikel: %n" notify-program ~/.config/newsboat/notify.sh
Dies sendet einen angepassten Notify-Text an das genannte Script, in dem dann weitere Parameter an notify-send
übergeben werden
~/.config/newsboat/notify.sh
#!/usr/bin/env bash notify-send \ --app-name Newsboat \ --category RSS \ --icon /usr/share/icons/hicolor/scalable/apps/newsboat.svg \ "$1"
Das Beispiel verwendet notify-send
aus libnotify um die Desktopbenachrichtigung zu übermitteln, und mako zum Anzeigen der Benachrichtigung. Da notify-program
aber nicht nur ein Programm sein kann, sondern per Script beliebiges mit dem übermittelten Text ausgeführt werden kann, besteht hier die möglichkeit, die Information beliebig weiterzuverarbeiten.
notify-format
hat Zugriff auf die Anzahl der durch das Update neuen Artikel (%d
), die Anzahl der insgesamt ungelesenen Artikel (%n
), sowie die Anzahl der Feeds mit ungelesenen Artikeln (%f
).
YouTube-Kanäle als Feeds
Es wird zwar nirgends auf YouTube öffentlich dafür „geworben“, aber jeder Kanal verfügt auch über einen Atom-Feed, den man sich in seinem Feedreader einbauen kann. Hierzu benötigt man lediglich die Channel-ID des Kanals, dessen Feed man abrufen möchte. Es werden über die Feeds immer die aktuellsten 15 Videos angeboten.
Die Channel-ID findet sich nirgends sichtbar auf der Seite, wenn man sich im Webbrowser aber über die Entwickler-Konsole das DOM ansieht, so findet man im <head>
einen Meta-Eintrag <link rel="canonical" href="https://www.youtube.com/channel/CHANNEL_ID">
wobei CHANNEL_ID
die benötigte ID ist. Es gibt zudem auch mit den passenden Stichwörtern schnell und leicht zu findende Internetseiten, die einem die zum Handle gehörende ID auslesen und zurückgeben.
Die ausgelesene oder ermittelte ID muss nun in den Feed-URL eingesetzt werden.
https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID
Diesen URL kann man dann ganz regulär in die urls
-Dateien packen, mit Tags versehen, einen Titel vergeben, etc. Der Artikeltext ist jeweils die Beschreibung des Videos, und der Artikel-Link verweist auf die Ansehseite des Videos.
Hat man sehr viele Abonnements und will man diese initial einmal auslesen, so kann man Google Takeout unter takeout.google.com dafür verwenden und darüber die YouTube-Abonnements als CSV-Datei exportieren. In der CSV-Datei stehen die abonnierten Kanäle mit ihrer ID, man kann sie also direkt zum Beispiel mittels des folgenden Scripts in das nötige Format umwandeln.
while IFS="," read id url name; do feedURL="https://www.youtube.com/feeds/videos.xml?channel_id=${id}" [ ! -z "${id}" ] && echo "$feedURL youtube videos \"~${name}\"" done < <(tail -n +2 Abos.csv) >> urls
Dadurch werden die Kanal-Feeds an die Datei mit den URLs angefügt. Es werden auch gleich passende Tags vergeben, sowie der Feed-Name auf den Channelnamen aus der CSV-Datei gesetzt.
Das aktualisieren aller Feeds dauert bei 500 Feeds und der Konfigurationsoption reload-threads 100
etwa 5-6 Sekunden, der Start von Newsboat verzögert sich bei so vielen Feeds um etwa 1-2 Sekunden.
Videos direkt ansehen oder runterladen
Zum Beispiel in Kombination mit mpv oder yt-dlp kann man Videos direkt aus Newsboat heraus ansehen oder herunterladen. Hierzu kann man sich der Makro-Funkationalität bedienen. Makros werden standardmäßig mittels , eingeleitet, gefolgt von der konfigurierten Taste für das Makro.
config
macro a set browser "echo Lade MPV mit dem Video; mpv %u"; open-in-browser; set browser xdg-open macro d set browser "$(alacritty -e yt-dlp %u)&"; open-in-browser-noninteractively; set browser xdg-open
Hierdurch kann man per , A das Video aus dem aktuell angezeigten oder ausgewähltem Artikel in MPV ansehen, und mittels , D Alacritty starten, in dem per yt-dlp das Video heruntergeladen wird.
Das Makro a
startet den Browser im normalen Modus, das heißt, Newsboat zeigt die Ausgaben von mpv an, und kann während das Video läuft nicht interaktiv bedient werden – zumal man in diesem Moment ja sowieso das Video guckt. Da der Start des Videos eventuell etwas dauert, wird zuvor noch eine Informationsmeldung ausgegeben.
Das Makro d
hingegen benutzt den nicht Interaktiven Modus, zudem wird der Aufruf als Subshell ausgeführt und mittels &
in den Hintergrund gebracht. Newsboat ist dadurch nach dem Start eines Downloads weiterhin normal benutzbar.
Statt xdg-open
kann der Programmname des gewünschten „eigentlichen Browsers“ angegeben werden. Wenn man die Angabe weg lässt, bleibt der Browser MPV oder yt-dlp, bis man Newsboat neu startet oder manuell mittels :set browser XYZ
den Browser XYZ einstellt.