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