scripts

Various scripts for UNIX-like systems
git clone https://git.tronto.net/scripts
Download | Log | Files | Refs | README

feed (1450B)


      1 #!/bin/sh
      2 
      3 # RSS feed manager
      4 
      5 # Requires: sfeed, sfeed_plain (get), dmenu, open-url (menu)
      6 
      7 # Usage: feed [-m menu] [get|menu|clear|show]
      8 
      9 dir=$HOME/box/sfeed
     10 feeddir=$dir/urls
     11 destdir=$dir/new
     12 olddir=$dir/old
     13 readdir=$dir/last
     14 menu="dmenu -l 20 -i"
     15 urlopener=open-url
     16 
     17 usage() {
     18 	echo "Usage: feed [get|menu|clear|show]"
     19 }
     20 
     21 getnew() {
     22 	for f in "$feeddir"/*; do
     23 		read -r url < "$f"
     24 		name=$(basename "$f")
     25 		d="$destdir/$name"
     26 		r="$readdir/$name"
     27 
     28 		[ -f "$r" ] && read -r lr < "$r" || lr=0
     29 
     30 		# Get new feed items
     31 		tmp=$(mktemp)
     32 		curl -s "$url" | sfeed | \
     33 		awk -v lr="$lr" '$1 > lr {print $0}' | \
     34 		tee "$tmp" | sfeed_plain >> "$d"
     35 
     36 		# Update last time stamp
     37 		awk -v lr="$lr" '$1 > lr {lr=$1} END {print lr}' <"$tmp" >"$r"
     38 	done
     39 }
     40 
     41 show() {
     42 	for f in "$destdir"/*; do
     43 		ff=$(basename "$f")
     44 		if [ -s "$f" ]; then
     45 			sort -r "$f" | while read -r line; do
     46 				printf '%20s    %s\n' "$ff" "$line"
     47 			done
     48 		fi
     49 	done
     50 }
     51 
     52 selectmenu() {
     53 	$menu | awk '{print $NF}' | xargs $urlopener
     54 }
     55 
     56 while getopts "m:" opt; do
     57 	case "$opt" in
     58 		m)
     59 			menu="$OPTARG"
     60 			;;
     61 		*)
     62 			usage
     63 			exit 1
     64 			;;
     65 	esac
     66 done
     67 
     68 shift $((OPTIND - 1))
     69 
     70 if [ -z "$1" ]; then
     71 	usage
     72 	exit 1
     73 fi
     74 
     75 case "$1" in
     76 	get)
     77 		getnew
     78 		countnew=$(cat "$destdir"/* | wc -l)
     79 		echo "$countnew new feed items"
     80 		;;
     81 	menu)
     82 		show | selectmenu
     83 		;;
     84 	clear)
     85 		d="$olddir/$(date +'%Y-%m-%d-%H-%M-%S')"
     86 		mkdir "$d"
     87 		mv "$destdir"/* "$d/"
     88 		;;
     89 	show)
     90 		show
     91 		;;
     92 	*)
     93 		usage
     94 		exit 1
     95 		;;
     96 esac