dotfiles/scripts/.local/bin/sharefile

85 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env sh
#
# Select a file and share it through 0x0.st
#
# Examples:
# `sharefile`
# Calling without arguments allows you to first select a folder and then
# a file from the folder to share.
# `sharefile ~/my-folder/`
# Calling with a folder as argument restricts the file selection to files within.
# `sharefile ~/my-file.zip`
# Calling with a file as argument automatically uploads the file and copies
# share link to clipboard.
# `screenshot | sharefile -`
# Calling with a dash as argument gets the file from stdin instead.
# Be aware that this currently only works for files not folders.
OXO_URL="https://0x0.st"
# use fd if available
if command -v fd >/dev/null 2>&1; then
sharefile_fd_cmd="fd"
else
sharefile_fd_cmd="find"
fi
main() {
if [ $# -eq 0 ]; then
foldpick=$(picker d "")
exit_check $?
picked=$(picker f "$foldpick")
elif [ "$1" = "-" ]; then
while read -r file; do
picked="$file"
done <"/dev/stdin"
elif [ -f "$1" ]; then
picked="$1"
elif [ -d "$1" ]; then
picked=$(picker f "$1")
else
printf "Please only provide a folder or file as the optional argument to sharefile." >&2
exit 1
fi
exit_check $?
url=$(file_to_oxo "$picked")
echo "$url"
url_to_clipboard "$url"
if command -v notify-send >/dev/null 2>&1; then
notify-send "Upload finished" "URL: $url"
fi
exit
}
picker() {
if [ "$sharefile_fd_cmd" = "fd" ]; then
selected=$(fd "$SHAREFILE_FD_OPTS" --type "${1:-f}" . "${2:-$HOME}" | fzf)
elif [ "$sharefile_fd_cmd" = "find" ]; then
selected=$(find "$SHAREFILE_FD_OPTS" "${2:-$HOME}" -type "$1" | fzf)
fi
[ "$?" -eq 130 ] && exit 130
echo "$selected"
}
url_to_clipboard() {
if command -v wl-copy >/dev/null 2>&1; then
printf "%s" "$@" | wl-copy
elif command -v xsel >/dev/null 2>&1; then
printf "%s" "$@" | xsel --clipboard
elif command -v xclip >/dev/null 2>&1; then
printf "%s" "$@" | xclip -selection clipboard >/dev/null 2>&1
fi
}
file_to_oxo() {
curl -F"file=@$1" "$OXO_URL"
}
# exit on escape pressed
exit_check() {
[ "$1" -eq 130 ] && exit 130
}
main "$@"