diff --git a/digest.sh b/digest.sh new file mode 100755 index 0000000..981fa1f --- /dev/null +++ b/digest.sh @@ -0,0 +1,109 @@ +#!/bin/bash + + + +url=$(curl -s -H Accept:application/activity+json "$1" | jq -r '.outbox' | xargs curl -s -H Accept:application/activity+json | jq -r '.first') +targetdate=$(date -d "now - $2 days" +%s) + +declare -A activities + +# Mastodon has pagination, so - let's find the page that contains post from now to n days ago. + +stop=false +echo -n "Processing pages" +while [ "$url" != "" ] && [ "$stop" != true ] ; do + response=$(curl -s -H "Accept: application/activity+json" "$url") + lines=$(echo "$response" | jq -c '.orderedItems[] | {id, published}') + while IFS= read -r line; do + ts=$(echo "$line" | jq -r '.published' | xargs date +%s -d) + act=$(echo "$line" | jq -r '.id') + if [[ "$ts" -gt "$targetdate" ]]; then + activities["${ts}"]="$act" + else + stop=true + fi + done <<<"$lines" + url=$(echo "$response" | jq -r .next) + echo -n "." +done +echo "" + +# We got some activities, so now let's extract relevant info form them, turning into actual posts data + +declare -a posts +echo -n "Processing activities" +for key in "${!activities[@]}"; do + activity="${activities[$key]}" + response=$(curl -s -H "Accept: application/activity+json" "$activity") + type=$(echo "$response" | jq -r '.type') + datetime=$(echo "$response" | jq -r '.published') + date=$(echo "$datetime" | cut -d "T" -f 1) + time=$(echo "$datetime" | cut -d "T" -f 2 | tr -d "Z") + if [[ "$type" = "Announce" ]]; then + link=$(echo "$response" | jq -r '.object') + object=$(curl -s -H "Accept: application/activity+json" "$link") + content=$(echo "$object" | jq -r '.content') + replyto=$(echo "$response" | jq -r '.inReplyRTo') + actorlink=$(echo "$object" | jq -r '.attributedTo') + attachment=$(echo "$object" | jq -jc '.attachment[].url' 2>/dev/null || echo null) + if [ "$attachment" = "" ]; then + attachment="null" + fi + by=$(curl -s -H "Accept: application/activity+json" "$actorlink" | jq -r '.name') + else + link=$(echo "$response" | jq -r '.object.id') + content=$(echo "$response" | jq -r '.object.content') + replyto=$(echo "$response" | jq -r '.object.inReplyTo') + actorlink=$(echo "$response" | jq -r '.actor') + attachment=$(echo "$response" | jq -jc '.object.attachment[].url' 2>/dev/null || echo null) + if [ "$attachment" = "" ]; then + attachment="null" + fi + by=$(curl -s -H "Accept: application/activity+json" "$actorlink" | jq -r '.name') + fi + posts+=("$date―$time―$type―$link―$by―$content―$replyto―$attachment") + echo -n "." + # $(echo $content | w3m -T text/html -dump) +done + +# Sort posts by date + +IFS=$'\n' sortedPosts=($(sort <<<"${posts[*]}")) +unset IFS + +echo "" + +# Render posts on the screen and via less + +for i in "${sortedPosts[@]}" +do + date=$(echo "$i" | awk -F'―' '{ print $1 }') + time=$(echo "$i" | awk -F'―' '{ print $2 }') + type=$(echo "$i" | awk -F'―' '{ print $3 }') + link=$(echo "$i" | awk -F'―' '{ print $4 }') + by=$(echo "$i" | awk -F'―' '{ print $5 }') + content=$(echo "$i" | awk -F'―' '{ print $6 }') + replyto=$(echo "$i" | awk -F'―' '{ print $7 }') + attachment=$(echo "$i" | awk -F'―' '{ print $8 }') + + if [ "$prevdate" != "$date" ]; then + echo -e "\e[1;41m====$date==== \e[0m" + prevdate="$date" + fi + + if [[ "$type" = "Announce" ]]; then + type="🔄" + else + type="✨" + fi + echo -e "\e[1;42m$type $time $by $link\e[0m" + if [ "$replyto" != "null" ]; then + echo " ↩️ $replyto" + fi + echo "$content" | w3m -T text/html -dump + if [ "$attachment" != "null" ]; then + echo "$attachment" + fi +done | less -r + +#printf "[%s]\n" "${sortedPosts[@]}"