# -*- 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() {
	## feed NAME FEED_URL BASE_URL ENCODING # defined by sfeedrc(5).
	# I want to add some extra fields after these.
	feeds_planets
	feeds_youtube
	feeds_podcasts
	feeds_friends
	feeds_people
	feeds_news
	feeds_smolweb
	feeds_comics
	feeds_misc
	feeds_me
}

feeds_planets() {
	feed "Planet Emacs" "https://planet.emacslife.com/atom.xml" "https://planet.emacslife.com/" ""
	feed "r/emacs" "http://old.reddit.com/r/emacs.rss" "http://old.reddit.com/r/emacs" ""
	feed "Planet Lisp" "https://planet.lisp.org/rss20.xml" "https://planet.lisp.org/" ""
	feed "Planet Scheme" "https://planet.scheme.org/atom.xml" "https://planet.scheme.org/" ""
}

feeds_youtube() {
	feed "[yt] 3Blue1Brown" "https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw" ""
	feed "[yt] AB - Ancienne Belgique" "https://www.youtube.com/feeds/videos.xml?channel_id=UCUVAw2kdxJlcfCdEcdgXv5A" ""
	feed "[yt] Abraham Moller" "https://www.youtube.com/feeds/videos.xml?channel_id=UCMfIwe2KHD2XoBO2lWqeFXg" ""
	feed "[yt] Adam Ragusea" "https://www.youtube.com/feeds/videos.xml?channel_id=UC9_p50tH3WmMslWRWKnM7dQ" ""
	feed "[yt] Babish Culinary Universe" "https://www.youtube.com/feeds/videos.xml?channel_id=UCJHA_jMfCvEnv-3kRjTCQXw" ""
	feed "[yt] Baggers" "https://www.youtube.com/feeds/videos.xml?channel_id=UCMV8p6Lb-bd6UZtTc_QD4zA" ""
	feed "[yt] Case Duckworth" "https://www.youtube.com/feeds/videos.xml?channel_id=UC92gRJdnUYklVu4pvj9n0Lw" ""
	feed "[yt] Claire Saffitz x Dessert Person" "https://www.youtube.com/feeds/videos.xml?channel_id=UCvw6Y1kr_8bp6B5m1dqNyiw" ""
	feed "[yt] Computerphile" "https://www.youtube.com/feeds/videos.xml?channel_id=UC9-y-6csu5WGm29I7JiwpnA" ""
	feed "[yt] EBRPL Career Center" "https://www.youtube.com/feeds/videos.xml?channel_id=UCIvntuaxP7PyaJDeHE_9E8Q" ""
	feed "[yt] EmacsConf and Emacs hangouts" "https://www.youtube.com/feeds/videos.xml?channel_id=UCwuyodzTl_KdEKNuJmeo99A" ""
	feed "[yt] Gavin Freeborn" "https://www.youtube.com/feeds/videos.xml?channel_id=UCJetJ7nDNLlEzDLXv7KIo0w" ""
	feed "[yt] Henry Homesweet" "https://www.youtube.com/feeds/videos.xml?channel_id=UCZqjwc1Wy5t1rsviYYsJiYg" ""
	feed "[yt] Howard Abrams" "https://www.youtube.com/feeds/videos.xml?channel_id=UCVHICXXtKG7rZgtC5xonNdQ" ""
	feed "[yt] Ignite Talks" "https://www.youtube.com/feeds/videos.xml?channel_id=UCZotK8ZPTUNLMeW5Q6T0cKg" ""
	feed "[yt] Jake B" "https://www.youtube.com/feeds/videos.xml?channel_id=UCBMMB7Yi0eyFuY95Qn2o0Yg" ""
	feed "[yt] James Tomasino" "https://www.youtube.com/feeds/videos.xml?channel_id=UCbTp1BYjpuhDRG5OmgIT8iw" ""
	feed "[yt] jan Misali" "https://www.youtube.com/feeds/videos.xml?channel_id=UCJOh5FKisc0hUlEeWFBlD-w" ""
	feed "[yt] J Duckworth Animations" "https://www.youtube.com/feeds/videos.xml?channel_id=UCtAEaNVrNxAUy2VSRPD_PYQ" ""
	feed "[yt] Jelle's Marble Runs" "https://www.youtube.com/feeds/videos.xml?channel_id=UCYJdpnjuSWVOLgGT9fIzL0g" ""
	feed "[yt] John Kitchin" "https://www.youtube.com/feeds/videos.xml?channel_id=UCQp2VLAOlvq142YN3JO3y8w" ""
	feed "[yt] karthik" "https://www.youtube.com/feeds/videos.xml?channel_id=UCbh_g91w0T6OYp40xFrtnhA" ""
	feed "[yt] Ken Forkish" "https://www.youtube.com/feeds/videos.xml?channel_id=UCvVvFZd0e86bLbd5FdgYiUg" ""
	feed "[yt] Lex Fridman" "https://www.youtube.com/feeds/videos.xml?channel_id=UCSHZKyawb77ixDdsGog4iWA" ""
	feed "[yt] LockPickingLawyer" "https://www.youtube.com/feeds/videos.xml?channel_id=UCm9K6rby98W8JigLoZOh6FQ" ""
	feed "[yt] Maangchi" "https://www.youtube.com/feeds/videos.xml?channel_id=UC8gFadPgK2r1ndqLI04Xvvw" ""
	feed "[yt] Mike Zamansky" "https://www.youtube.com/feeds/videos.xml?channel_id=UCxkMDXQ5qzYOgXPRnOBrp1w" ""
	feed "[yt] MIT OpenCourseWare" "https://www.youtube.com/feeds/videos.xml?channel_id=UCEBb1b_L6zDS3xTUrIALZOw" ""
	feed "[yt] My Analog Journal" "https://www.youtube.com/feeds/videos.xml?channel_id=UC8TZwtZ17WKFJSmwTZQpBTA" ""
	feed "[yt] Nat's What I Reckon" "https://www.youtube.com/feeds/videos.xml?channel_id=UCEFW1E8QzP-hKxjO2Rj68wg" ""
	feed "[yt] Now You See It" "https://www.youtube.com/feeds/videos.xml?channel_id=UCWTFGPpNQ0Ms6afXhaWDiRw" ""
	feed "[yt] Numberphile" "https://www.youtube.com/feeds/videos.xml?channel_id=UCoxcjq-8xIDTYp3uz647V5A" ""
	feed "[yt] Philosophy Tube" "https://www.youtube.com/feeds/videos.xml?channel_id=UC2PA-AKmVpU6NKCGtZq_rKQ" ""
	feed "[yt] PronunciationManual" "https://www.youtube.com/feeds/videos.xml?channel_id=UCqDSLtXeZsGc3dtVb5MW13g" ""
	feed "[yt] Protesilaos Stavrou" "https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g" ""
	feed "[yt] RailCowGirl" "https://www.youtube.com/feeds/videos.xml?channel_id=UCj-Xm8j6WBgKY8OG7s9r2vQ" ""
	feed "[yt] Simone Giertz" "https://www.youtube.com/feeds/videos.xml?channel_id=UC3KEoMzNz8eYnwBC34RaKCQ" ""
	feed "[yt] Steve Yegge" "https://www.youtube.com/feeds/videos.xml?channel_id=UC2RCcnTltR3HMQOYVqwmweA" ""
	feed "[yt] System Crafters" "https://www.youtube.com/feeds/videos.xml?channel_id=UCAiiOTio8Yu69c3XnR7nQBQ" ""
	feed "[yt] Tasting History with Max Miller" "https://www.youtube.com/feeds/videos.xml?channel_id=UCsaGKqPZnGp_7N80hcHySGQ" ""
	feed "[yt] Technology Connections" "https://www.youtube.com/feeds/videos.xml?channel_id=UCy0tKL1T7wFoYcxCe0xjN6Q" ""
	feed "[yt] Too Many Zooz" "https://www.youtube.com/feeds/videos.xml?channel_id=UCtjXVqMVzBIgU0SO8AV0vPg" ""
	feed "[yt] Townsends" "https://www.youtube.com/feeds/videos.xml?channel_id=UCxr2d4As312LulcajAkKJYw" ""
	feed "[yt] Unitarian Church of Baton Rouge" "https://www.youtube.com/feeds/videos.xml?channel_id=UClrqHvbiFM-1hn931ZmAPFw" ""
	feed "[yt] Vulf" "https://www.youtube.com/feeds/videos.xml?channel_id=UCtWuB1D_E3mcyYThA9iKggQ" ""
	feed "[yt] WFTDA: Women's Flat Track Derby Association" "https://www.youtube.com/feeds/videos.xml?channel_id=UC7eMWpvytqd3gYAqxTl9w7g" ""
	feed "[yt] Zach Anner" "https://www.youtube.com/feeds/videos.xml?channel_id=UCPTVYxUoYWhNa8J7GzIGnyQ" ""
	feed "[yt] Andrew Tropin" "https://www.youtube.com/feeds/videos.xml?channel_id=UCuj_loxODrOPxSsXDfJmpng" ""
	feed "[yt] Animist" "https://www.youtube.com/feeds/videos.xml?channel_id=UCweDxCT5Fiykk3uHqPKqLWg" ""
	feed "[yt] Chris Were Digital" "https://www.youtube.com/feeds/videos.xml?channel_id=UCAPR27YUyxmgwm3Wc2WSHLw" ""
	feed "[yt] Esoterica" "https://www.youtube.com/feeds/videos.xml?channel_id=UCoydhtfFSk1fZXNRnkGnneQ" ""
	feed "[yt] FOSDEM" "https://www.youtube.com/feeds/videos.xml?channel_id=UC9NuJImUbaSNKiwF2bdSfAw" ""
}

feeds_podcasts() {
	feed "Tilde Whirl Tildeverse Podcast" "https://tilde.town/~dozens/podcast/rss.xml" "https://tilde.town/~dozens/podcast/" ""
	feed "trash cat tech cat" "https://podcast.librepunk.club/tctc/ogg.xml" "https://podcast.librepunk.club/tctc/" ""
	feed "Hacker Public Radio" "https://hackerpublicradio.org/hpr_ogg_rss.php" "https://hackerpublicradio.org/" ""
}

feeds_friends() {
	feed "lipu pi jan Niko" "https://tilde.town/~nihilazo/index.xml" "https://tilde.town/~nihilazo/" ""
	feed "chrismanbrown.gitlab.io (dozens)" "https://chrismanbrown.gitlab.io/rss.xml" "https://chrismanbrown.gitlab.io/" ""
	feed "Dozens and Dragons" "https://dozensanddragons.neocities.org/rss.xml" "https://dozensanddragons.neocities.org/" ""
	feed "dozens: Society For Putting Things On Top Of Other Things" "https://society.neocities.org/rss.xml" "https://society.neocities.org/" ""
	feed "dozens: vgnfdblg" "https://supervegan.neocities.org/feed.xml" "https://supervegan.neocities.org/" ""
	feed "dozens: backgammon" "http://tilde.town/~dozens/backgammon/rss.xml" "http://tilde.town/~dozens/backgammon/" ""
	feed "dozens: It's Pro Toad and Superb Owl" "https://git.tilde.town/dozens/protoadandsuperbowl/raw/branch/master/feed.xml" "https://git.tilde.town/dozens/protoadandsuperbowl/" ""
	feed "dozens dreams" "https://tilde.team/~dozens/dreams/rss.xml" "https://tilde.team/~dozens/dreams/" ""
	feed "dozens: write.as" "https://write.tildeverse.org/dozens/feed/" "https://write.tildeverse.org/dozens/" ""
	feed "dozens css art" "http://tilde.town/~dozens/cssart/feed.xml" "http://tilde.town/~dozens/cssart/" ""
	feed "Benjamin Wil" "https://benjaminwil.info/feed.xml" "https://benjaminwil.info/" ""
	feed "(lambda (x) (create x))" "http://lambdacreate.com/static/feed.rss" "http://lambdacreate.com/" ""
	feed "m455.casa" "https://m455.casa/feed.rss" "https://m455.casa/" ""
	feed "Oatmeal" "https://eli.li/feed.rss" "https://eli.li/" ""
	feed "RSRSSS" "https://envs.net/~lucidiot/rsrsss/feed.xml" "https://envs.net/~lucidiot/rsrsss/" ""
	feed "Tomasino Blog" "https://blog.tomasino.org/index.xml" "https://blog.tomasino.org/" ""
	feed "Tomasino Labs" "https://labs.tomasino.org/index.xml" "https://labs.tomasino.org/" ""
	feed "Will's Blog" "https://wflewis.com/feed.xml" "https://wflewis.com/" ""
	feed "Rick Carlino's Blog" "https://rickcarlino.com/rss/feed.rss" "https://rickcarlino.com/rss/" ""
	feed "Causal Agency" "https://text.causal.agency/feed.atom" "https://text.causal.agency/" ""
	feed "Benoit Joly" "https://blog.benoitj.ca/posts/index.xml" "https://blog.benoitj.ca/posts/" ""
	feed "p1k3::feed" "https://p1k3.com/feed" "https://p1k3.com/" ""
	feed "linkbudz" "https://linkbudz.m455.casa/feed.rss" "https://linkbudz.m455.casa/" ""
	feed "Alex Schroeder" "https://alexschroeder.ch/wiki/feed/full/" "https://alexschroeder.ch/" ""
	feed "Björn Wärmedal" "https://warmedal.se/~bjorn/atom.xml" "https://warmedal.se/~bjorn/" ""
	feed "a rickety bridge of impossible crossing" "https://bluelander.bearblog.dev/feed/" "https://bluelander.bearblog.dev/" ""
}

feeds_people() {
	feed "ajroach" "http://ajroach42.com/feed.xml" "http://ajroach42.com/" ""
}

feeds_news() {
	feed "Hacker News" "https://news.ycombinator.com/rss" "https://news.ycombinator.com/" ""
	feed "lobste.rs" "https://lobste.rs/rss" "https://lobste.rs/" ""
	feed "tilde news" "https://tilde.news/rss" "https://tilde.news/" ""
	feed "Tildes Atom feed" "https://tildes.net/topics.atom" "https://tildes.net/" ""
	feed "NPR" "https://feeds.npr.org/1001/rss.xml" "https://text.npr.org/" ""
}

feeds_smolweb() {
	feed "~town friday postcard" "https://tilde.town/~lucidiot/fridaypostcard.xml" ""
	feed "Cosmic Voyage" "https://cosmic.voyage/rss.xml" "https://cosmic.voyage/" ""
	feed "plan.cat" "https://plan.cat/rss" "https://plan.cat/" ""
}

feeds_comics() {
	feed "Cat and Girl" "https://catandgirl.com/feed/" "https://catandgirl.com/" ""
	feed "Dinosaur Comics!" "https://qwantz.com/rssfeed.php" "https://qwantz.com/" ""
	feed "False Knees" "https://falseknees.tumblr.com/rss" "https://falseknees.tumblr.com/" ""
	feed "Saturday Morning Breakfast Cereal" "https://www.smbc-comics.com/comic/rss" "https://www.smbc-comics.com/" ""
	feed "xkcd" "https://xkcd.com/atom.xml" "https://xkcd.com/" ""
}

feeds_misc() {
	feed "Crystalverse" "https://crystalverse.com/feed/" "https://crystalverse.com/" ""
	feed "Hetzner" "https://status.hetzner.com/en.atom" "https://status.hetzner.com/" ""
	feed "LOW-TECH MAGAZINE" "https://feeds2.feedburner.com/typepad/krisdedecker/lowtechmagazineenglish" "https://www.lowtechmagazine.com/" ""
}

feeds_me() {
	:
}

### Filter ######################################################

filter() {
	case "$1" in
	# Filter items based on feed name.
	*'Hacker News'*)
		# Hacker news is stupid and doesn't include IDs, and
		# instead includes a comments tag in its body.
		awk 'BEGIN {FS="\t"; OFS="\t"} {
$6 = $4
sub(/^<a href="/,"", $6)
sub(/">.*$/,"", $6)
print
}'
		;;
	*NPR*)
		sed 's@www\.npr\.org@text.npr.org@'
		;;
	r_* | r/*)                     # reddit (not sure when / => _)
		reddit_alt_url="i.reddit.com" # teddit is slow :(
		sed -e "s@old\.reddit\.com@${reddit_alt_url}@" \
			-e "s@reddit\.com@${reddit_alt_url}@"
		;;
	'Saturday Morning Breakfast Cereal')
		sed 's@Saturday Morning Breakfast Cereal - @@'
		;;
	*) cat ;;
	esac |
		filter_add_empties |
		filter_html_entities |
		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
	# (and weird shit to normal shit, too)
	awk '{
gsub(/&#34;/,"\""); gsub(/&#x22;/,"\"");
gsub(/&#39;/,"'\''"); gsub(/&#x27;/,"'\''");
gsub(/’/,"'\''");
gsub(/&amp;/,"\\&"); # MUST BE LAST!;
print
}'
}

# Fetch #########################################################

fetch() { # fetch(name, url, feedfile)
	"${NOFETCH:-false}" && return
	curl -s -L \
		--max-redirs 3 \
		--header "'User-Agent: $USER_AGENT'" \
		--fail \
		--max-time 15 \
		"$2"
}

# Local Variables:
# truncate-lines: t
# End: