#!/bin/sh #Auteur : thuban #licence : GNU General Public Licence v3 #Description : simple feed reader #Depends : wget, xmlstarlet # Thanks to Patric Haller : http://lists.suckless.org/dev/1110/9813.html # Thanks to Hiltjo Posthuma for sfeed # http://www.codemadness.nl/sfeed-simple-feed-parser.html if [ -n "$1" ]; then SRSSDIR=$1 else SRSSDIR=~/.srss fi FEEDS=$SRSSDIR/feeds FEEDLIST=$SRSSDIR/feedlist # one feed url per line TMP=$(mktemp) SEP="---.---" dl() { wget --timeout=60 -q -O $TMP 2>/dev/null "$1" return $? } check() { # initial checks mkdir -p $SRSSDIR mkdir -p $FEEDS if [ ! -e $FEEDLIST ]; then echo "Add feed url in $FEEDLIST. One url per line" fi } get_rss(){ echo "> Downloading feeds" TOTAL=$(wc -l < "${FEEDLIST}") i=1 while read url; do echo "* [$i/$TOTAL] : $url" dl $url if [ $? -eq 0 ]; then TITLE=$(xmlstarlet sel -t -m "/rss/channel" -v "title" < $TMP) if [ $? -ne 0 ]; then TITLE=$(echo $url |cut -d'/' -f3) #ugly fi xmlstarlet sel -t -m "/rss/channel/item" \ -v "title" -n \ -v "link" -n \ -v "description" -n\ -o $SEP -n\ < $TMP \ | xmlstarlet unesc > "${FEEDS}/${TITLE}.new" fi i=$(($i+1)) done < $FEEDLIST } keepnew(){ echo "> Merging feeds" for i in "${FEEDS}"/*.new; do BN="${i%.new}.feed" NEW="$i" OLD="${i%.new}.old" rm "${BN}" && touch "${BN}" # empty feed if [ ! -e "${OLD}" ]; then # first check touch "${OLD}" cp "${NEW}" "${BN}" else # last line is first of old feed STOP="$(sed -n 1p "${OLD}")" while read line; do if [ "$line" != "$STOP" ]; then echo "$line" >> "${BN}" else break fi done < "${NEW}" #grep -v -F -x -f "${OLD}" "${NEW}" > $BN #diff "${OLD}" "${NEW}" --unchanged-group-format='' > $BN #cat "${OLD}" "${NEW}" | sort | uniq -u fi mv "${NEW}" "${OLD}" done } check get_rss keepnew exit 0