sfeedpath="$HOME/.sfeed/feeds" : ${SFEEDEFIERS_PATH:=${HOME}/.sfeedefiers} # order by timestamp (ascending). # order(name) order() { sort -t ' ' -k1n,1 } # fetch a feed via HTTP/HTTPS etc. # fetch(name, url, feedfile) fetch() { fetcher="" fetcher_options="" case "$2" in *://*.bandcamp.com/music ) fetcher=${SFEEDEFIERS_PATH}/bandcamp fetcher_options="-n 10" ;; *://mupdf.com/release_history.html ) fetcher=${SFEEDEFIERS_PATH}/mupdf ;; *://www.mixcloud.com/* | *://soundcloud.com/* ) fetcher=${SFEEDEFIERS_PATH}/youtube-dl fetcher_options="-n 10" ;; * ) log "${name}" "unsupported URL" return 1 ;; esac ${fetcher} ${fetcher_options} "$2" 2>/dev/null } # fetch and parse feed. # feed(name, feedurl) feed() { # wait until ${maxjobs} are finished: will stall the queue if an item # is slow, but it is portable. [ ${signo} -ne 0 ] && return [ $((curjobs % maxjobs)) -eq 0 ] && wait [ ${signo} -ne 0 ] && return curjobs=$((curjobs + 1)) (name="$1" filename="$(printf '%s' "$1" | tr '/' '_')" feedurl="$2" sfeedfile="${sfeedpath}/${filename}" tmpfeedfile="${sfeedtmpdir}/${filename}" if ! fetch "${name}" "${feedurl}" "${sfeedfile}" > "${tmpfeedfile}.tsv"; then log "${name}" "FAIL (FETCH)" return fi if ! filter "${name}" < "${tmpfeedfile}.tsv" > "${tmpfeedfile}.filter"; then log "${name}" "FAIL (FILTER)" return fi rm -f "${tmpfeedfile}.tsv" # new feed data is empty: no need for below stages. if [ ! -s "${tmpfeedfile}.filter" ]; then log "${name}" "OK" return fi # if file does not exist yet "merge" with /dev/null. if [ -e "${sfeedfile}" ]; then oldfile="${sfeedfile}" else oldfile="/dev/null" fi if ! merge "${name}" "${oldfile}" "${tmpfeedfile}.filter" > "${tmpfeedfile}.merge"; then log "${name}" "FAIL (MERGE)" return fi rm -f "${tmpfeedfile}.filter" if ! order "${name}" < "${tmpfeedfile}.merge" > "${tmpfeedfile}.order"; then log "${name}" "FAIL (ORDER)" return fi rm -f "${tmpfeedfile}.merge" # copy if ! cp "${tmpfeedfile}.order" "${sfeedfile}"; then log "${name}" "FAIL (COPY)" return fi rm -f "${tmpfeedfile}.order" # OK log "${name}" "OK" ) & } # list of feeds to fetch: feeds() { # feed feed 'bandcamp-idlesband' 'https://idlesband.bandcamp.com/music' feed 'mupdf' 'https://mupdf.com/release_history.html' feed 'soundcloud-filastine' 'https://soundcloud.com/filastine' }