Get-Last-RSS-Post/get-last-rss-post.sh

157 lines
4.7 KiB
Bash
Executable File

#!/bin/sh
help() {
echo "Usage: $0 [-d] [-r] [-t VISIBILITY] [-h] URL"
echo ""
echo " Downloads the RSS feed of the URL and checks the latest post."
echo " It provides a simple way to copy/paste the Title and Link of the post."
echo " If toot is installed, it can post the status with custom visibility."
echo " There is also set of funny(?) random variants of the message."
echo " Arguments:"
echo " -d Checks if the Publication Date of the post is Today."
echo " If not, it exits."
echo " -r Uses a random expression."
echo " -t Post the link with toot. A prompt will ask confirmation."
echo " Accepted value: direct, unlisted, public, private"
echo " -h Displays this message."
echo ""
}
while getopts ":drt:h" opt; do
case $opt in
d)
TODAY=$(date +'%d %b %Y')
CHECK_TODAY=1
;;
r)
RANDOMIZE=1
;;
t)
TOOT=1
case "${OPTARG}" in
direct|unlisted|public|private)
VISIBILITY=${OPTARG}
;;
*)
echo "Invalid visibility option: --${OPTARG}"
exit 1
;;
esac
;;
h)
# Help
help
exit 1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
shift $(($OPTIND - 1))
if [[ "$*" == "" ]]; then
help
exit 1
fi
echo_msg () {
echo "\n+++++"
echo "$EXPRESSION \"$TITLE\"\n\n$LINK"
echo "+++++\n"
}
today() {
# Checks if pubDate is $TODAY
echo "Checking if the post pubblication days is ${TODAY}"
echo $PUB_DATE | grep -q "$TODAY"
if [[ "$?" == "0" ]]; then # pubDate is $TODAY
echo "Published Date is today - good!"
else
echo "ERROR. Published Date is different than today. Exiting."
cleanup 1
fi
}
random() {
EXPRESSIONS=("Latest article on my blog:"
"Latest rant on my blog:"
"Check out my latest post!"
"New. Blog. Post. NOW!"
"Just wrote a new blog post:"
"Just hit some random keys on the keyboard and pressed \"Publish\":"
"Just hit some random keys on my keyboard:"
"New thoughts:"
"New wordvomit:"
"I could have used some cool app to publish this post. Instead I used a script. 🤖"
"100 PRINT \"NEW BLOG POST\"\n200 PRINT"
"Yet another article on my blog."
"🤖 This is a random sentence chosen by a Bash script.\nSorry if it doesn't make much sense.\nAnd this is my new blog post:"
"Roses are red. Violets are blue. Here is a new blog post:"
"Sit down, grab a cup of tea, and click here for a new article on my blog:"
"🧠 -> 🧑‍💻 ->"
"$ cat new_blog_post.md\n"
"🤖 Beep. Boop. I'm a script to share my new blog post:")
EXPRESSION=${EXPRESSIONS[ $RANDOM % ${#EXPRESSIONS[@]} ]}
}
yes_or_no() {
while true; do
read -p "$* [Y]es/[N]o/[R]andom: " ynr
case $ynr in
[Yy]*) echo "$EXPRESSION \"$TITLE\"\n\n$LINK" | \
/opt/homebrew/bin/toot post -v $VISIBILITY ; return 0 ;;
[Nn]*) echo "Exiting." ; cleanup 0 ;;
[Rr]*) echo "\nPicking up a new expression:"; random; echo_msg ;;
esac
done
}
cleanup () {
rm -f feed.xml
rm -f feed_old.xml
rm -f status.txt
exit $1
}
echo "Downloading latest XML feed…"
wget -q -O feed.xml $*
if ! [[ $? == "0" ]]; then echo "Error."; cleanup 1; else echo "Done."; fi
# Check if downloaded file has <rss> tag
grep -q '<rss' feed.xml
if ! [[ $? == "0" ]]; then echo "This is not a RSS feed. Exiting."; cleanup 1; fi
# Clean up RSS from tabs
mv feed.xml feed_old.xml; cat feed_old.xml | tr -d ' ' > feed.xml
# Find 2nd clean title (1st post) and replaces / with \/
TITLE=$(awk '/<title>/{++n; if (n==2) {print; exit}}' feed.xml | sed -e 's/<title>\(.*\)<\/title>/\1/' | xargs)
#echo "TITLE: $TITLE"
# Find the link of the article
LINK=$(grep -A1 "<title>$TITLE" feed.xml | tail -n 1 | sed 's/<link>\(.*\)<\/link>/\1/' | xargs)
#echo "LINK: $LINK"
# Replace / with \/ in the link
LINK_FIXED=$(echo $LINK | sed 's./.\\/.g')
# Print whole post until pubDate tag, saves the PUB_DATE
PUB_DATE=$(sed -n "/<link>$LINK_FIXED/,/pubDate/p" feed.xml | tail -n 1 | sed 's/<pubDate>//g; s/<\/pubDate>//g')
if [[ "$CHECK_TODAY" == "1" ]]; then today; fi
EXPRESSION="Latest article on my blog:"
if [[ "$RANDOMIZE" == "1" ]]; then random; fi
echo "\nCopy and Paste this:"
echo_msg
if [[ "$TOOT" == "1" ]]; then
which toot > /dev/null # Check if toot is installed
if ! [[ $? == "0" ]]; then echo "ERROR. Toot is not installed. Exiting."; cleanup 1; fi
ACCOUNT=$(toot auth | grep ACTIVE | awk '{print $2}')
yes_or_no "Post it on Mastodon (as $ACCOUNT)?"
fi
cleanup 0