diff --git a/fedi2html.sh b/fedi2html.sh
index 821e73e..533fda8 100755
--- a/fedi2html.sh
+++ b/fedi2html.sh
@@ -65,10 +65,18 @@ render_post() {
local responses_data="$2"
local POST_TREE_LEVEL="$3"
- local ACCOUNT_URL="$(echo "$post_data" | jq -r .account.url)"
- local ACCOUNT_ID="$(echo "$post_data" | jq -r .account.fqn)"
- local ACCOUNT_NAME="$(echo "$post_data" | jq -r .account.display_name | replace_emojis "$(echo "$post_data" | jq -r '.account')")"
- local ACCOUNT_AVATAR="$(echo "$post_data" | jq -r .account.avatar)"
+ local reblog=""
+ local acct_data="$(echo "$post_data" | jq -r .reblog.account)"
+ if test "$acct_data" = "null"; then
+ acct_data="$(echo "$post_data" | jq -r .account)"
+ else
+ reblog="1"
+ fi
+
+ local ACCOUNT_URL="$(echo "$acct_data" | jq -r .url)"
+ local ACCOUNT_ID="$(echo "$acct_data" | jq -r .fqn)"
+ local ACCOUNT_NAME="$(echo "$acct_data" | jq -r .display_name | replace_emojis "$acct_data")"
+ local ACCOUNT_AVATAR="$(echo "$acct_data" | jq -r .avatar)"
local POST_URL="$(echo "$post_data" | jq -r .url)"
local POST_DATE="$(echo "$post_data" | jq -r .created_at)"
local POST_CONTENT="$(echo "$post_data" | jq -r .content | replace_emojis "$post_data")"
@@ -150,7 +158,7 @@ media_attachments() {
# Pass a post’s context JSON along stdin; out comes the response_data in JSON.
# fetch_post_context $url | context_to_responses
context_to_responses() {
- jq '.descendants' \
+ jq '.descendants' 2> /dev/null \
| jq 'sort_by(.created_at)' \
| maybe_jq_reverse \
| jq -cr '.[]'
@@ -166,10 +174,10 @@ statuses_api_request() {
api_request="/$api_request"
fi
- local id="$(url_id "$url")"
- local server="$(url_server "$url")"
+ local id="$(url_post_id "$post_url")"
+ local server="$(url_server "$post_url")"
curl --location --header 'Accept: application/json,application/activity+json' \
- "$server/api/v1/statuses/${id}${api_request}"
+ "${server}/api/v1/statuses/${id}${api_request}"
}
@@ -177,7 +185,8 @@ statuses_api_request() {
# fetch_post_context $url
fetch_post_context() {
local url="$1"
- statuses_api_request "$url" "context"
+ statuses_api_request "$url" "context" \
+ | context_to_responses
}
@@ -189,18 +198,50 @@ fetch_post() {
}
+# Given a user-account URL, request JSON of its posts.
+# fetch_post $url
+fetch_user_posts() {
+ local url="$1"
+ local server="$(url_server "$url")"
+ curl --location --header 'Accept: application/json,application/activity+json' \
+ "$server/api/v1/accounts/$(url_user_id "$url")/statuses?exclude_reblogs" \
+ | jq -c '.[]'
+}
+
+
+# Return the ID of a user, based on its URL.
+# url_user_id $url
+url_user_id() {
+ local url="$1"
+ # Pleroma-style URLs: https://jam.xwx.moe/users/Tirifto
+ # Mastodon-style URLs: https://esperanto.masto.host/@jubiloEO
+ if echo "$url" | grep "/users/" > /dev/null; then
+ echo "$url" \
+ | sed 's%.*/users/%%'
+ elif echo "$url" | grep -E "/@[[:alnum:]]+[/]*$" > /dev/null; then
+ echo "$url" \
+ | sed 's%.*/@%%' \
+ | sed 's%/$%%'
+ else
+ return 1
+ fi
+}
+
+
# Return the ID of a post, based on its URL.
-# url_id $url
-url_id() {
+# url_post_id $url
+url_post_id() {
local url="$1"
# Pleroma-style URLs: https://jam.xwx.moe/notice/Ac6PIZAP0ZzkMTYBBg
# Mastodon-style URLs: https://esperanto.masto.host/@minjo/111461250815264185
if echo "$url" | grep "/notice/" > /dev/null; then
echo "$url" \
| sed 's%.*/notice/%%'
- else
+ elif echo "$url" | grep -E "/@[[:alnum:]]+/[[:digit:]]+" > /dev/null; then
echo "$url" \
| sed 's%.*/@[[:alnum:]]*/%%'
+ else
+ return 1
fi
}
@@ -255,6 +296,44 @@ maybe_jq_reverse() {
}
+# Render a user’s posts, one-by-one, taking into account cli arguments.
+# handle_user_url https://jam.xwx.moe/users/tirifto
+handle_user_url() {
+ local url="$1"
+ local user_posts="$(fetch_user_posts "$url")"
+ local IFS="
+"
+ echo "$user_posts" > jadedctrl.json
+ for post in $user_posts; do
+ local url="$(echo "$post" | jq -r '.url')"
+ if test -z "$NO_RESPONSES"; then
+ context="$(fetch_post_context "$url")"
+ if test -n "$NO_PARENT"; then
+ render_responses "$post" "$context" 0
+ else
+ render_post "$post" "$context" 0
+ fi
+ else
+ render_post "$post" "" 0
+ fi
+ done
+}
+
+
+# Render a post and/or its responses, taking into account cli arguments.
+handle_post_url() {
+ local url="$1"
+ local post="$(fetch_post "$url")"
+ local context="$(fetch_post_context "$url")"
+
+ if test -n "$NO_PARENT"; then
+ render_responses "$post" "$context" 0
+ else
+ render_post "$post" "$context" 0
+ fi
+}
+
+
usage() {
echo "usage: $(basename "$0") [-h] [-IR] POST_URL"
echo
@@ -304,12 +383,17 @@ if test -z "$URL"; then
fi
-POST="$(fetch_post "$URL")"
-RESPONSES="$(fetch_post_context "$URL" | context_to_responses)"
-if test -n "$NO_PARENT"; then
- render_responses "$POST" "$RESPONSES" 0
+
+USER_ID="$(url_user_id "$URL")"
+POST_ID="$(url_post_id "$URL")"
+if test -n "$POST_ID"; then
+ echo "POST"
+ handle_post_url "$URL"
+elif test -n "$USER_ID"; then
+ handle_user_url "$URL"
else
- render_post "$POST" "$RESPONSES" 0
+ echo "That URL is not recognized as a post or user URL." 1>&2
+ exit 3
fi