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