Files
bin/postMastodon.sh

109 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
INSTANCE="https://mamot.fr"
TOKEN="${MAMOT_TOKEN:-}"
if [ -z "$TOKEN" ] && [ -f "$HOME/.mamot-token" ]; then
TOKEN="$(tr -d '\n' < "$HOME/.mamot-token")"
fi
if [ -z "$TOKEN" ]; then
echo "ERROR: no token. Set MAMOT_TOKEN or create ~/.mamot-token" >&2
exit 1
fi
usage() {
echo "Usage: $0 [--edit STATUS_ID] 'post text' [audio-file]" >&2
exit 1
}
MODE="post"
if [ "${1:-}" = "--edit" ]; then
MODE="edit"
shift
if [ "$#" -lt 2 ]; then
usage
fi
STATUS_ID="$1"
shift
fi
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
usage
fi
TEXT="$1"
MEDIA="${2:-}"
json_field() {
python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('$1','') or '')"
}
if [ "$MODE" = "edit" ]; then
echo "--> Editing status $STATUS_ID..."
RESP="$(curl -sS -X PUT "$INSTANCE/api/v1/statuses/$STATUS_ID" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "status=$TEXT")"
URL="$(echo "$RESP" | json_field url)"
if [ -z "$URL" ]; then
echo "ERROR: edit failed: $RESP" >&2
exit 1
fi
echo "--> Edited: $URL"
exit 0
fi
MEDIA_IDS=()
if [ -n "$MEDIA" ]; then
echo "--> Uploading media: $MEDIA"
RESP="$(curl -sS -f -X POST "$INSTANCE/api/v2/media" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@$MEDIA" \
-F "description=Asciisync session audio (terminal + synth/mic mix)")"
MEDIA_ID="$(echo "$RESP" | json_field id)"
if [ -z "$MEDIA_ID" ]; then
echo "ERROR: media upload failed: $RESP" >&2
exit 1
fi
MEDIA_IDS+=("$MEDIA_ID")
echo "--> Media uploaded, id: $MEDIA_ID"
echo "--> Waiting for media processing..."
for i in $(seq 1 20); do
STATUS="$(curl -sS -H "Authorization: Bearer $TOKEN" "$INSTANCE/api/v1/media/$MEDIA_ID")"
if echo "$STATUS" | grep -q '"original"'; then
echo "--> Media ready."
break
fi
sleep 2
done
fi
echo "--> Posting status..."
ARGS=(-sS -X POST "$INSTANCE/api/v1/statuses" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "status=$TEXT" \
--data-urlencode "visibility=public" \
--data-urlencode "language=en")
for id in "${MEDIA_IDS[@]}"; do
ARGS+=("--data-urlencode" "media_ids[]=$id")
done
RESP=""
for i in $(seq 1 10); do
RESP="$(curl "${ARGS[@]}")"
if echo "$RESP" | grep -q '"error"'; then
if echo "$RESP" | grep -q 'not finished processing'; then
echo "--> Media still processing, retry $i..."
sleep 3
continue
fi
break
fi
break
done
URL="$(echo "$RESP" | json_field url)"
if [ -z "$URL" ]; then
echo "ERROR: post failed: $RESP" >&2
exit 1
fi
echo "--> Posted: $URL"