sfeed

simple feed reader - forked from git.codemadness.org/sfeed
git clone git://src.gearsix.net/sfeedsfeed.zip
Log | Files | Refs | Atom | README | LICENSE

commit ec7abe8b5ea4c56bd442f536544c4dde4b38a847
parent 4b99778344bca3a1606046b5bf1087160ea1661c
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Sun, 27 Oct 2024 09:23:53 +0100

documentation improvements

- Add ETag example to sfeedrc.5 man page.
  This was in the README but now also added to the man page for visibility.
- Indent code examples to separate leading text from code examples.
- Some textual improvements.

Diffstat:
MREADME | 4++--
Msfeed.1 | 32++++++++++++++++----------------
Msfeed_content.1 | 9+++++----
Msfeed_curses.1 | 9+++++----
Msfeed_markread.1 | 11+++++++----
Msfeed_mbox.1 | 9+++++----
Msfeed_update.1 | 8++++----
Msfeed_web.1 | 6+++---
Msfeedrc.5 | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
9 files changed, 129 insertions(+), 61 deletions(-)

diff --git a/README b/README @@ -639,9 +639,9 @@ RSS/Atom data or change the default curl options: - - - -Caching, incremental data updates and bandwidth-saving +Caching, incremental data updates and bandwidth saving -For servers that support it some incremental updates and bandwidth-saving can +For servers that support it some incremental updates and bandwidth saving can be done by using the "ETag" HTTP header. Create a directory for storing the ETags per feed: diff --git a/sfeed.1 b/sfeed.1 @@ -1,4 +1,4 @@ -.Dd January 7, 2023 +.Dd October 27, 2024 .Dt SFEED 1 .Os .Sh NAME @@ -52,51 +52,51 @@ Item, categories, multiple values are separated by the '|' character. .Sh EXIT STATUS .Ex -std .Sh EXAMPLES -.Bd -literal +.Bd -literal -offset 4n curl -s 'https://codemadness.org/atom.xml' | sfeed .Ed .Pp To convert the character set from a feed that is not UTF-8 encoded the .Xr iconv 1 tool can be used: -.Bd -literal +.Bd -literal -offset 4n curl -s 'https://codemadness.org/some_iso-8859-1_feed.xml' | \e iconv -f iso-8859-1 -t utf-8 | \e sfeed .Ed .Sh EXAMPLE SETUP 1. Create a directory for the sfeedrc configuration and the feeds: -.Bd -literal - mkdir -p ~/.sfeed/feeds +.Bd -literal -offset 4n +mkdir -p ~/.sfeed/feeds .Ed .Pp 2. Copy the example .Xr sfeedrc 5 configuration: -.Bd -literal - cp sfeedrc.example ~/.sfeed/sfeedrc - $EDITOR ~/.sfeed/sfeedrc +.Bd -literal -offset 4n +cp sfeedrc.example ~/.sfeed/sfeedrc +$EDITOR ~/.sfeed/sfeedrc .Ed .Pp Or import existing OPML subscriptions using .Xr sfeed_opml_import 1 : -.Bd -literal - sfeed_opml_import < file.opml > ~/.sfeed/sfeedrc +.Bd -literal -offset 4n +sfeed_opml_import < file.opml > ~/.sfeed/sfeedrc .Ed .Pp 3. To update feeds and merge the new items with existing items: -.Bd -literal - sfeed_update +.Bd -literal -offset 4n +sfeed_update .Ed .Pp 4. Format feeds to a plain-text list: -.Bd -literal - sfeed_plain ~/.sfeed/feeds/* +.Bd -literal -offset 4n +sfeed_plain ~/.sfeed/feeds/* .Ed .Pp Or format feeds to a curses interface: -.Bd -literal - sfeed_curses ~/.sfeed/feeds/* +.Bd -literal -offset 4n +sfeed_curses ~/.sfeed/feeds/* .Ed .Pp There are also other formatting programs included. diff --git a/sfeed_content.1 b/sfeed_content.1 @@ -1,4 +1,4 @@ -.Dd December 22, 2021 +.Dd October 27, 2024 .Dt SFEED_CONTENT 1 .Os .Sh NAME @@ -35,12 +35,13 @@ If it is not set it will use lynx by default. .Sh EXIT STATUS .Ex -std .Sh EXAMPLES -.Bd -literal +Example: +.Bd -literal -offset 4n curl -s 'https://codemadness.org/atom_content.xml' | sfeed | sfeed_content .Ed .Pp -The output format looks like this: -.Bd -literal +The output format will look like this: +.Bd -literal -offset 4n Title: The title. Author: The line with the author if it is set. Category: The line with the categories if it is set. diff --git a/sfeed_curses.1 b/sfeed_curses.1 @@ -1,4 +1,4 @@ -.Dd August 1, 2023 +.Dd October 27, 2024 .Dt SFEED_CURSES 1 .Os .Sh NAME @@ -299,14 +299,15 @@ When plumbing an URL then stdin is closed also. .Ex -std The exit status is 130 on SIGINT and 143 on SIGTERM. .Sh EXAMPLES -.Bd -literal +Example: +.Bd -literal -offset 4n sfeed_curses ~/.sfeed/feeds/* .Ed .Pp Another example which shows some of the features .Nm has: -.Bd -literal +.Bd -literal -offset 4n export SFEED_AUTOCMD="2tgo" export SFEED_URL_FILE="$HOME/.sfeed/urls" [ -f "$SFEED_URL_FILE" ] || touch "$SFEED_URL_FILE" @@ -316,7 +317,7 @@ sfeed_curses ~/.sfeed/feeds/* Which does the following: .Bl -enum .It -Set commands to execute automatically: +Set commands to execute automatically on startup: .Pp Set the current layout to a horizontal mode ('2' keybind). Showing a feeds sidebar on the top and the feed items on the bottom. diff --git a/sfeed_markread.1 b/sfeed_markread.1 @@ -1,4 +1,4 @@ -.Dd July 25, 2021 +.Dd October 27, 2024 .Dt SFEED_MARKREAD 1 .Os .Sh NAME @@ -31,13 +31,16 @@ plain-text list of read URLs. .Sh EXIT STATUS .Ex -std .Sh EXAMPLES -.Bd -literal +Example: +.Bd -literal -offset 4n export SFEED_URL_FILE="$HOME/.sfeed/urls" echo 'https://codemadness.org/sfeed.html' | sfeed_markread read .Ed .Pp -or -.Bd -literal +or pass the +.Ar urlfile +as a parameter: +.Bd -literal -offset 4n echo 'https://codemadness.org/sfeed.html' | sfeed_markread read ~/.sfeed/urls .Ed .Sh SEE ALSO diff --git a/sfeed_mbox.1 b/sfeed_mbox.1 @@ -1,4 +1,4 @@ -.Dd August 4, 2021 +.Dd October 27, 2024 .Dt SFEED_MBOX 1 .Os .Sh NAME @@ -47,14 +47,15 @@ By default this is set to "0". .Sh EXIT STATUS .Ex -std .Sh EXAMPLES -.Bd -literal +Example: +.Bd -literal -offset 4n sfeed_mbox ~/.sfeed/feeds/* .Ed .Pp -To include the content. +Below is an example to include the content. This can be insecure for some of the mail clients that interpret HTML code in an unsafe way: -.Bd -literal +.Bd -literal -offset 4n SFEED_MBOX_CONTENT=1 sfeed_mbox ~/.sfeed/feeds/* .Ed .Sh SEE ALSO diff --git a/sfeed_update.1 b/sfeed_update.1 @@ -1,4 +1,4 @@ -.Dd August 1, 2023 +.Dd October 27, 2024 .Dt SFEED_UPDATE 1 .Os .Sh NAME @@ -35,7 +35,7 @@ man page for a detailed description of the format and an example file. .El .Sh FILES WRITTEN .Bl -tag -width Ds -.It feedname +.It Pa feedname TAB-separated .Xr sfeed 5 format containing all items per feed. @@ -55,7 +55,7 @@ entry-point. .Sh LOGGING When processing a feed it will log failures to stderr and non-failures to stdout in the format: -.Bd -literal +.Bd -literal -offset 4n [HH:MM:SS] feedname message .Ed .Sh EXIT STATUS @@ -63,7 +63,7 @@ stdout in the format: If any of the feeds failed to update then the exit status is non-zero. .Sh EXAMPLES To update your feeds and format them in various formats: -.Bd -literal +.Bd -literal -offset 4n # Update feeds sfeed_update "configfile" # Format to a plain-text list diff --git a/sfeed_web.1 b/sfeed_web.1 @@ -13,8 +13,8 @@ reads the HTML data of the webpage from stdin and writes the found URLs to stdout. .Pp Such a link reference in HTML code looks like: -.Bd -literal - <link rel="alternate" href="atom.xml" type="application/atom+xml" /> +.Bd -literal -offset 4n +<link rel="alternate" href="atom.xml" type="application/atom+xml" /> .Ed .Sh OPTIONS .Bl -tag -width 8n @@ -39,7 +39,7 @@ Usually application/atom+xml or application/rss+xml. .Ex -std .Sh EXAMPLES Get URLs from a website: -.Bd -literal +.Bd -literal -offset 4n curl -s -L 'https://codemadness.org/' | sfeed_web 'https://codemadness.org/' .Ed .Sh SEE ALSO diff --git a/sfeedrc.5 b/sfeedrc.5 @@ -1,4 +1,4 @@ -.Dd December 26, 2023 +.Dd October 30, 2024 .Dt SFEEDRC 5 .Os .Sh NAME @@ -7,7 +7,8 @@ .Sh DESCRIPTION .Nm is the configuration file for -.Xr sfeed_update 1 . +.Xr sfeed_update 1 +and is evaluated as a shellscript. .Sh VARIABLES .Bl -tag -width Ds .It Va sfeedpath @@ -30,7 +31,8 @@ Inside the .Fn feeds function feeds can be defined by calling the .Fn feed -function, its arguments are: +function. +Its arguments are: .Bl -tag -width Ds .It Fa name Name of the feed, this is also used as the filename for the TAB-separated @@ -41,16 +43,22 @@ Each .Fa name should be unique. .It Fa feedurl -URL to fetch the RSS/Atom data from, usually a HTTP or HTTPS URL. +URL to fetch the RSS/Atom data from. +This is usually a HTTP or HTTPS URL. .It Op Fa basesiteurl Base URL of the feed links. -This argument allows to fix relative item links. +This argument allows fixing relative item links. .Pp -According to the RSS and Atom specification feeds should always have absolute -URLs, however this is not always the case in practise. +According to the RSS and Atom specification, feeds should always have absolute +URLs, but this is not always the case in practise. .It Op Fa encoding -Feeds are decoded from this name to UTF-8, the name should be a usable -character-set for the +Feeds are converted from this +.Ar encoding +to UTF-8. +The +.Ar encoding +should be a usable +character-set name for the .Xr iconv 1 tool. .El @@ -58,11 +66,12 @@ tool. .Sh OVERRIDE FUNCTIONS Because .Xr sfeed_update 1 -is a shellscript each function can be overridden to change its behaviour, -notable functions are: +is a shellscript each function can be overridden to change its behaviour. +Notable functions are: .Bl -tag -width Ds .It Fn fetch "name" "url" "feedfile" -Fetch feed from URL and write the data to stdout, its arguments are: +Fetch feed from URL and write the data to stdout. +Its arguments are: .Bl -tag -width Ds .It Fa name Specified name in configuration file (useful for logging). @@ -77,8 +86,8 @@ By default the tool is used. .It Fn convertencoding "name" "from" "to" Convert data from stdin from one text-encoding to another and write it to -stdout, -its arguments are: +stdout. +Its arguments are: .Bl -tag -width Ds .It Fa name Feed name. @@ -95,6 +104,7 @@ is used. Read RSS/Atom XML data from stdin, convert and write it as .Xr sfeed 5 data to stdout. +Its arguments are: .Bl -tag -width Ds .It Fa name Name of the feed. @@ -107,7 +117,8 @@ This argument allows to fix relative item links. .It Fn filter "name" "url" Filter .Xr sfeed 5 -data from stdin and write it to stdout, its arguments are: +data from stdin and write it to stdout. +Its arguments are: .Bl -tag -width Ds .It Fa name Feed name. @@ -117,7 +128,8 @@ URL of the feed. .It Fn merge "name" "oldfile" "newfile" Merge .Xr sfeed 5 -data of oldfile with newfile and write it to stdout, its arguments are: +data of oldfile with newfile and write it to stdout. +Its arguments are: .Bl -tag -width Ds .It Fa name Feed name. @@ -129,7 +141,8 @@ New file. .It Fn order "name" "url" Sort .Xr sfeed 5 -data from stdin and write it to stdout, its arguments are: +data from stdin and write it to stdout. +Its arguments are: .Bl -tag -width Ds .It Fa name Feed name. @@ -140,7 +153,7 @@ URL of the feed. .Sh EXAMPLES An example configuration file is included named sfeedrc.example and also shown below: -.Bd -literal +.Bd -literal -offset 4n #sfeedpath="$HOME/.sfeed/feeds" # list of feeds to fetch: @@ -165,8 +178,8 @@ options for fetching the data, the .Fn fetch function can be overridden and added at the top of the .Nm -file: -.Bd -literal +file, for example: +.Bd -literal -offset 4n # fetch(name, url, feedfile) fetch() { # allow for 1 redirect, set User-Agent, timeout is 15 seconds. @@ -174,6 +187,55 @@ fetch() { "$2" 2>/dev/null } .Ed +.Pp +Caching, incremental data updates and bandwidth saving +.Pp +For HTTP servers that support it some bandwidth saving can be done by changing +some of the default curl options. +These options can come at a cost of some privacy, because it exposes additional +metadata from the previous request. +.Pp +.Bl -bullet -compact +.It +The curl ETag options (--etag-save and --etag-compare) can be used to store and +send the previous ETag header value. +curl version 7.73+ is recommended for it to work properly. +.It +The curl -z option can be used to send the modification date of a local file as +a HTTP If-Modified-Since request header. +The server can then respond if the data is modified or not or respond with only +the incremental data. +.It +The curl --compressed option can be used to indicate the client supports +decompression. +Because RSS/Atom feeds are textual XML data this generally compresses very +well. +.It +The example below also sets the User-Agent to sfeed, because some CDNs block +HTTP clients based on the User-Agent request header. +.El +.Pp +Example: +.Bd -literal -offset 4n +etagpath="$HOME/.sfeed/etags" +mkdir -p "${etagpath}" + +# fetch(name, url, feedfile) +fetch() { + etag="${etagpath}/$(basename "$3")" + + curl \e + -L --max-redirs 0 \e + -H "User-Agent: sfeed" \e + -f -s -m 15 \e + --compressed \e + --etag-save "${etag}" --etag-compare "${etag}" \e + -z "${etag}" \e + "$2" 2>/dev/null +} +.Ed +.Pp +The README file has more examples. .Sh SEE ALSO .Xr curl 1 , .Xr iconv 1 ,