Newsboat

Aus wiki.archlinux.de
Newsboat 2.38 in der Standardkonfiguration zeigt den Nachrichten-Feed von archlinux.de an, einige Artikel wurden bereits gelesen, andere sind noch neu.

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.

pacman -S newsboat

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

Die Kombinierte Ansicht wie im Beispiel beschrieben. Newsboat zeigt zu den Artikeln in dieser Ansicht auch immer den Originalfeed an.

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

Newsboat mit den Beispiel-Feeds im mitgelieferten Theme „Commander“
Anzeige des Query-Feeds der Arch-News im beispielhaften hellen Theme

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, ob n gesetzt ist, dies ist der Fall, wenn der Feed ungelesene Artikel hat.
  • %U&%c – Je nachdem ob n 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

Die Formatierung der beiden Listentypen nach Anwendung des Beispiels.

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.

Eine Desktopbenachrichtigung mit weiteren Optionen, wie Titel und Icon, ausgelöst durch ein Update in Newsboat und angezeigt via Script wie im Beispiel beschrieben.

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.

Siehe auch

Weblinks