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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
|
# -*- sh -*-
# SFEED="$HOME/.sfeed"
USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'
# sfeedpath="$SFEED/feeds"
maxjobs="$(nproc)"
### Feeds #######################################################
feeds() {
feeds_planets
feeds_youtube
feeds_podcasts
feeds_friends
feeds_news
feeds_smolweb
feeds_comics
feeds_misc
feeds_me
}
feeds_planets() {
feed "Planet Emacs" "https://planet.emacslife.com/atom.xml"
feed "Planet Lisp" "https://planet.lisp.org/rss20.xml"
feed "Planet Scheme" "https://planet.scheme.org/atom.xml"
}
feeds_youtube() {
feed "3Blue1Brown" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw'
feed "AB - Ancienne Belgique" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCUVAw2kdxJlcfCdEcdgXv5A'
feed "Abraham Moller" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCMfIwe2KHD2XoBO2lWqeFXg'
feed "Adam Ragusea" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC9_p50tH3WmMslWRWKnM7dQ'
feed "Babish Culinary Universe" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCJHA_jMfCvEnv-3kRjTCQXw'
feed "Baggers" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCMV8p6Lb-bd6UZtTc_QD4zA'
feed "Case Duckworth" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC92gRJdnUYklVu4pvj9n0Lw'
feed "Claire Saffitz x Dessert Person" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCvw6Y1kr_8bp6B5m1dqNyiw'
feed "Computerphile" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC9-y-6csu5WGm29I7JiwpnA'
feed "EBRPL Career Center" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCIvntuaxP7PyaJDeHE_9E8Q'
feed "EmacsConf and Emacs hangouts" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCwuyodzTl_KdEKNuJmeo99A'
feed "freeCodeCamp.org" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC8butISFwT-Wl7EV0hUK0BQ'
feed "Gavin Freeborn" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCJetJ7nDNLlEzDLXv7KIo0w'
feed "Henry Homesweet" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCZqjwc1Wy5t1rsviYYsJiYg'
feed "Howard Abrams" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCVHICXXtKG7rZgtC5xonNdQ'
feed "Ignite Talks" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCZotK8ZPTUNLMeW5Q6T0cKg'
feed "Jake B" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCBMMB7Yi0eyFuY95Qn2o0Yg'
feed "James Tomasino" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCbTp1BYjpuhDRG5OmgIT8iw'
feed "jan Misali" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCJOh5FKisc0hUlEeWFBlD-w'
feed "J Duckworth Animations" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCtAEaNVrNxAUy2VSRPD_PYQ'
feed "Jelle's Marble Runs" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCYJdpnjuSWVOLgGT9fIzL0g'
feed "John Kitchin" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCQp2VLAOlvq142YN3JO3y8w'
feed "karthik" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCbh_g91w0T6OYp40xFrtnhA'
feed "Ken Forkish" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCvVvFZd0e86bLbd5FdgYiUg'
feed "Lex Fridman" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCSHZKyawb77ixDdsGog4iWA'
feed "LockPickingLawyer" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCm9K6rby98W8JigLoZOh6FQ'
feed "Maangchi" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC8gFadPgK2r1ndqLI04Xvvw'
feed "Mike Zamansky" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCxkMDXQ5qzYOgXPRnOBrp1w'
feed "MIT OpenCourseWare" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCEBb1b_L6zDS3xTUrIALZOw'
feed "My Analog Journal" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC8TZwtZ17WKFJSmwTZQpBTA'
feed "Nat's What I Reckon" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCEFW1E8QzP-hKxjO2Rj68wg'
feed "Now You See It" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCWTFGPpNQ0Ms6afXhaWDiRw'
feed "Numberphile" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCoxcjq-8xIDTYp3uz647V5A'
feed "Philosophy Tube" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC2PA-AKmVpU6NKCGtZq_rKQ'
feed "PronunciationManual" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCqDSLtXeZsGc3dtVb5MW13g'
feed "Protesilaos Stavrou" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g'
feed "RailCowGirl" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCj-Xm8j6WBgKY8OG7s9r2vQ'
feed "Simone Giertz" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC3KEoMzNz8eYnwBC34RaKCQ'
feed "Steve Yegge" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC2RCcnTltR3HMQOYVqwmweA'
feed "System Crafters" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCAiiOTio8Yu69c3XnR7nQBQ'
feed "Tasting History with Max Miller" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCsaGKqPZnGp_7N80hcHySGQ'
feed "Technology Connections" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCy0tKL1T7wFoYcxCe0xjN6Q'
feed "Too Many Zooz" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCtjXVqMVzBIgU0SO8AV0vPg'
feed "Townsends" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCxr2d4As312LulcajAkKJYw'
feed "Unitarian Church of Baton Rouge" 'https://www.youtube.com/feeds/videos.xml?channel_id=UClrqHvbiFM-1hn931ZmAPFw'
feed "Vulf" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCtWuB1D_E3mcyYThA9iKggQ'
feed "WFTDA: Women's Flat Track Derby Association" 'https://www.youtube.com/feeds/videos.xml?channel_id=UC7eMWpvytqd3gYAqxTl9w7g'
feed "Zach Anner" 'https://www.youtube.com/feeds/videos.xml?channel_id=UCPTVYxUoYWhNa8J7GzIGnyQ'
}
feeds_podcasts() {
feed "Tilde Whirl Tildeverse Podcast" 'https://tilde.town/~dozens/podcast/rss.xml'
feed "trash cat tech cat" 'https://podcast.librepunk.club/tctc/ogg.xml'
feed "Hacker Public Radio" 'https://hackerpublicradio.org/hpr_ogg_rss.php'
}
feeds_friends() {
# nihilazo
feed "lipu pi jan Niko" 'https://tilde.town/~nihilazo/index.xml'
# dozens
feed "chrismanbrown.gitlab.io (dozens)" 'https://chrismanbrown.gitlab.io/rss.xml'
feed "Dozens and Dragons" 'https://dozensanddragons.neocities.org/rss.xml'
feed "dozens: Society For Putting Things On Top Of Other Things" 'https://society.neocities.org/rss.xml'
feed "dozens: vgnfdblg" 'https://supervegan.neocities.org/feed.xml'
feed "dozens: backgammon" 'http://tilde.town/~dozens/backgammon/rss.xml'
feed "dozens: It's Pro Toad and Superb Owl" 'https://git.tilde.town/dozens/protoadandsuperbowl/raw/branch/master/feed.xml'
feed "dozens dreams" 'https://tilde.team/~dozens/dreams/rss.xml'
feed "dozens: write.as" 'https://write.tildeverse.org/dozens/feed/'
feed "dozens css art" 'http://tilde.town/~dozens/cssart/feed.xml'
###
feed "Benjamin Wil" 'https://benjaminwil.info/feed.xml'
feed "(lambda (x) (create x))" 'http://lambdacreate.com/static/feed.rss'
feed "m455.casa" 'https://m455.casa/feed.rss'
feed "Oatmeal" 'https://eli.li/feed.rss'
feed "RSRSSS" 'https://envs.net/~lucidiot/rsrsss/feed.xml'
feed "Tomasino Blog" 'https://blog.tomasino.org/index.xml'
feed "Tomasino Labs" 'https://labs.tomasino.org/index.xml'
feed "Will's Blog" 'https://wflewis.com/feed.xml'
feed "Rick Carlino's Blog" 'https://rickcarlino.com/rss/feed.rss'
feed "Causal Agency" 'https://text.causal.agency/feed.atom'
feed "Benoit Joly" 'https://blog.benoitj.ca/posts/index.xml'
feed "p1k3::feed" 'https://p1k3.com/feed'
feed "linkbudz" 'https://linkbudz.m455.casa/feed.rss'
feed "Alex Schroeder" "https://alexschroeder.ch/wiki/feed/full/"
feed "Björn Wärmedal" "https://warmedal.se/~bjorn/atom.xml"
feed "a rickety bridge of impossible crossing" "https://bluelander.bearblog.dev/feed/"
}
feeds_comics() {
feed "Cat and Girl" 'https://catandgirl.com/feed/'
feed "Dinosaur Comics!" 'https://qwantz.com/rssfeed.php'
feed "False Knees" 'https://falseknees.tumblr.com/rss'
feed "Saturday Morning Breakfast Cereal" 'https://www.smbc-comics.com/comic/rss'
feed "xkcd" 'https://xkcd.com/atom.xml'
}
feeds_news() {
feed "tilde news: Private feed for acdw" \
'https://tilde.news/rss?token=FvdFj8rQkhrBy9j1yON1t6RYKDdcuG1MoUlyvRICmbgDGCf2JTWAEObDhdgt'
feed "Tildes Atom feed" 'https://tildes.net/topics.atom'
feed "NPR" "https://feeds.npr.org/1001/rss.xml"
}
feeds_me() {
:
}
feeds_smolweb() {
feed "~town friday postcard" 'https://tilde.town/~lucidiot/fridaypostcard.xml'
feed "Cosmic Voyage" 'https://cosmic.voyage/rss.xml'
feed "plan.cat" 'https://plan.cat/rss'
}
feeds_misc() {
feed "Crystalverse" 'https://crystalverse.com/feed/'
feed "Hetzner" 'https://status.hetzner.com/en.atom'
feed "LOW-TECH MAGAZINE" 'https://feeds2.feedburner.com/typepad/krisdedecker/lowtechmagazineenglish'
}
### Filter ######################################################
filter() {
case "$1" in
# Filter items based on feed name.
*NPR*)
sed 's@www\.npr\.org@text.npr.org@'
;;
*) cat ;;
esac |
filter_add_empties |
filter_html_entities |
filter_embed_youtube |
filter_filter_links
}
filter_add_empties() {
awk 'BEGIN{FS="\t";OFS=FS;}
{ $2 = $2 ? $2 : "[empty]" }
{ print $1,$2,$3,$4,$5,$6,$7,$8,$9; }
'
}
filter_embed_youtube() {
# replace youtube links with embed links
sed 's@www.youtube.com/watch?v=@www.youtube.com/embed/@g'
}
filter_filter_links() {
# shorten feedburner links and strip tracking parameters and pixels
awk -F '\t' 'BEGIN { OFS = "\t"; }
function filterlink(s) {
# protocol must start with http, https or gopher.
if (match(s, /^(http|https|gopher):\/\//) == 0) {
return "";
}
# shorten feedburner links.
if (match(s, /^(http|https):\/\/[^\/]+\/~r\/.*\/~3\/[^\/]+\//)) {
s = substr($3, RSTART, RLENGTH);
}
# strip tracking parameters
# urchin, facebook, piwik, webtrekk and generic.
gsub(/\?(ad|campaign|fbclid|pk|tm|utm|wt)_([^&]+)/, "?", s);
gsub(/&(ad|campaign|fbclid|pk|tm|utm|wt)_([^&]+)/, "", s);
gsub(/\?&/, "?", s);
gsub(/[\?&]+$/, "", s);
return s
}
{
$3 = filterlink($3); # link
$8 = filterlink($8); # enclosure
# try to remove tracking pixels: <img/> tags with 1px width or height.
gsub("<img[^>]*(width|height)[[:space:]]*=[[:space:]]*[\"'"'"' ]?1[\"'"'"' ]?[^0-9>]+[^>]*>", "", $4);
print $0;
}'
}
filter_html_entities() {
# convert HTML entities into dumb counterparts
awk '{
gsub(/"/,"\""); gsub(/"/,"\"");
gsub(/'/,"'\''"); gsub(/'/,"'\''");
gsub(/&/,"\\&"); # MUST BE LAST!;
print
}'
}
# Fetch #########################################################
fetch() { # fetch(name, url, feedfile)
# return
curl -s -L \
--max-redirs 3 \
--header "'User-Agent: $USER_AGENT'" \
--fail \
--max-time 15 \
"$2"
}
|