rushlink/contrib/rushlink

123 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env sh
set -e
LINK=https://hashru.link/
DELFILE="${XDG_DATA_HOME:-$HOME/.local/share}/rushlink/delete"
link() {
case "$1" in
https://*|http://*)
printf '%s' "$1" | curl -sS -F'shorten=<-' "$LINK"
;;
*)
curl -sS -Ffile=@- "$LINK" < "$1"
;;
esac | awk 'NR == 1 { print } $NF ~ /deleteToken=/ { print $NF; exit }' | (
IFS= read -r link
IFS= read -r deletelink
echo "$link"
mkdir -p "$(dirname "$DELFILE")"
echo "$deletelink" >> "$DELFILE"
)
}
del() {
case "$1" in
https://*|http://*)
URL="$1"
;;
*)
URL="$LINK$1"
;;
esac
# Remove file extension, if any.
NAME="${URL##*/}"
URL="${URL%/*}/${NAME%%.*}"
if DELURL=$(grep -s -m1 "$URL?deleteToken=" "$DELFILE"); then
echo "Deleting $URL..." >&2
curl -sS -X DELETE "$DELURL" | grep deleted
else
echo "Delete token for $URL is not known." >&2
exit 1
fi
}
screenshot() {
if command -v import >/dev/null 2>&1; then
CMD="import png:-"
elif command -v maim >/dev/null 2>&1; then
CMD="maim -uks"
else
echo "Neither import (imagemagick) nor maim were found. One of these is needed to make screenshots." >&2
exit 1
fi
FILE=$(mktemp)
if $CMD > "$FILE"; then
LINK=$(link "$FILE")
rm -f "$FILE"
echo "$LINK.png"
if command -v xdg-open >/dev/null 2>&1; then
xdg-open "$LINK.png"
fi
else
rm -f "$FILE"
exit $?
fi
}
if [ $# -gt 0 ]; then
case "$1" in
--help|-h)
CMD=$(basename "$0")
echo "$CMD - Command line tool for $LINK"
echo
echo "Usage:"
echo " $CMD https://example.com/"
echo " Shorten link."
echo " $CMD file.txt"
echo " $CMD < file.txt"
echo " Upload file."
echo " $CMD"
echo " echo hi | $CMD"
echo " Upload file from standard input."
echo " $CMD (--screenshot|-s)"
echo " Select a window or an area of your screen, and upload it as png."
echo " $CMD (--delete|-d) ${LINK}xd42"
echo " $CMD (--delete|-d) xd42"
echo " Delete file or shortened link."
echo
echo "Delete tokens are stored in $DELFILE"
exit 0
;;
--delete|-d)
shift
for url in "$@"; do
del "$url"
done
exit 0
;;
--screenshot|-s)
shift
if [ $# -gt 0 ]; then
echo "No arguments expected to --screenshot" >&2
exit 1
fi
screenshot
exit 0
;;
*)
for url in "$@"; do
link "$url"
done
exit 0
esac
fi
if [ -t 0 ]; then
echo "Sending standard input to $LINK" >&2
echo "^C to cancel, ^D to send." >&2
fi
link /dev/stdin