summaryrefslogtreecommitdiff
path: root/README
blob: 9eb1ed379941b235ac06bd3bdc80ad89cbcb66f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
sfeed v0.9
----------

Simple RSS and Atom parser (and some format programs).


Dependencies
------------

- C compiler (C99).
- libc (recommended: C99 and POSIX >= 200809).


Optional dependencies
---------------------

- make (for Makefile).
- POSIX shell
  used by sfeed_update and sfeed_opml_export.
- curl binary: http://curl.haxx.se/
  used by sfeed_update, can be replaced with any tool like wget, fetch.
- iconv command-line utilities: http://www.gnu.org/software/libiconv/
  used by sfeed_update. If the text in your RSS/Atom feeds are already UTF-8
  encoded then you don't need this. For an alternative minimal iconv
  implementation: http://git.etalabs.net/cgit/noxcuse/tree/src/iconv.c
- mandoc for documentation: http://mdocml.bsd.lv/ . If your host
  system doesn't have mandoc you can copy the legacy man-pages from doc/man
  to your $MANPATH. For the most up-to-date documentation you can convert
  the pages to the legacy format with mandoc -Tman (make doc-oldman).


Platforms tested
----------------

- Linux (glibc+gcc, musl-gcc, clang, tcc).
- OpenBSD
- Windows (cygwin gcc, mingw).


Files
-----

sfeed             - Binary (from sfeed.c); read XML RSS or Atom feed data from
                    stdin. Write feed data in tab-separated format to stdout.
sfeed_html        - Format feeds file (TSV) from sfeed_update to HTML.
sfeed_frames      - Format feeds as a HTML file with frames.
sfeed_opml_import - Generate a sfeedrc config file based on an opml file.
sfeed_opml_export - Generate an opml file based on a sfeedrc config file.
sfeed_plain       - Format feeds file (TSV) from sfeed_update to plain text.
sfeed_stats       - Format feeds file to show a summary listing of the total
                    amount, new amount and timestamp of the latest item.
sfeed_update      - Shellscript; update feeds and merge with old feeds in the
                    file $HOME/.sfeed/feeds by default.
sfeed_web         - Find urls to RSS/Atom feed from a webpage.
sfeed_xmlenc      - Detect character-set encoding from XML stream.
sfeedrc.example   - Example config file.
style.css         - Example stylesheet to use with sfeed_html and sfeed_frames.


Files read at runtime by sfeed_update
-------------------------------------

sfeedrc   - Config file. This file is evaluated as a shellscript in
            sfeed_update. You can for example override the fetchfeed() function
            to use wget, fetch or an other download program or you can override
            the merge() function to change the merge logic. The function
            feeds() is called to fetch the feeds. The function feed() can
            safely be executed as a parallel job in your sfeedrc config file to
            speed up updating.


Files written at runtime by sfeed_update
----------------------------------------

feeds     - Tab-separated format containing all feeds. The sfeed_update script
            merges new items with this file.
feeds.new - Temporary file used by sfeed_update to merge items.


TAB-SEPARATED format
--------------------

The items are saved in a TSV-like format except newlines, tabs and
backslash are escaped with \ (\n, \t and \\). Other whitespace except
spaces are removed.

The timestamp field is converted to a unix timestamp. The timestamp is also
stored as formatted as a separate field. The other fields are left untouched
(including HTML).

The order and format of the fields are:

item unix timestamp      - string unix timestamp (GMT+0)
item formatted timestamp - string timestamp (YYYY-mm-dd HH:MM:SS tz[+-]HHMM)
item title               - string
item link                - string
item content             - string
item contenttype         - string ("html" or "plain")
item id                  - string
item author              - string
feed type                - string ("rss" or "atom")
feed name                - string (extra field added by sfeed_update)
feed url                 - string (extra field added by sfeed_update)
item baseurl site        - string (extra field added by sfeed_update)


Build and install
-----------------

Using make (respects $DESTDIR and $PREFIX):

make install


Usage
-----

Find RSS/Atom feed urls from a webpage:

	url="codemadness.org"; wget -L -q -O - "$url" | sfeed_web "$url"

output:
	application/rss+xml http://codemadness.org/blog/rss.xml
	application/atom+xml http://codemadness.org/blog/atom.xml


To update feeds and format the feeds file (configfile argument is optional):

	sfeed_update "configfile"
	sfeed_html < $HOME/.sfeed/feeds > $HOME/.sfeed/feeds.html
	sfeed_plain < $HOME/.sfeed/feeds > $HOME/.sfeed/feeds.txt


Example script to view feeds with dmenu, opens selected url in $BROWSER:

	#!/bin/sh
	url=$(sfeed_plain < "$HOME/.sfeed/feeds" | dmenu -l 35 -i |
		sed 's@^.* \([a-zA-Z]*://\)\(.*\)$@\1\2@')
	[ ! "$url" = "" ] && $BROWSER "$url"


or to view in your browser:

	$BROWSER "$HOME/.sfeed/feeds.html"


or to view in your editor:

	$EDITOR "$HOME/.sfeed/feeds.txt"


Generate a sfeedrc config file from your exported list of feeds in opml
format:

	sfeed_opml_import < opmlfile.xml > $HOME/.sfeed/sfeedrc


Export an opml file of your feeds from a sfeedrc config file (configfile
argument is optional):

	sfeed_opml_export configfile > myfeeds.opml


Over time your feeds file might become quite big. You can archive items from a
specific date by doing for example: (make sure to change
mktime("YYYY mm dd HH mm ss")):

	#!/bin/sh
	set -x -e
	gawk -F '\t' 'BEGIN {
		time = mktime("2012 01 01 12 34 56");
	}
	{
		if(int($1) >= int(time)) {
			print $0;
		}
	}' < feeds > feeds.clean

	# compress old feeds file as archive.
	gzip -c feeds > feeds_archive_`date +'%Y-%m-%d'`.gz
	# move new file over old.
	mv feeds.clean feeds


License
-------

MIT, see LICENSE file.


Author
------

Hiltjo Posthuma <hiltjo@codemadness.org>