simple screenshot + sftp upload in pure sh
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.0 KiB

#!/bin/sh
remote_directory='/home/nginx/html/screenshots'
url_template='https://example.org/images/'
local_root='/home/kageru/screenshots'
date_format='%y/%m'
random_chars=5
# Leave empty if not needed. I use this to keep track which machine/user uploaded which screenshot.
prefix='k'
# put something here that’s configured in your ~/.ssh/config
ssh_host='localhost'
generate_name() {
cat /dev/urandom | tr -dc '0-9a-zA-Z' | head -c "$1"
}
capture() {
if [ -n "$WAYLAND_DISPLAY" ]; then
slurp | grim -g - "$1"
else
maim -suk "$1"
fi
}
clipboard() {
if [ -n "$WAYLAND_DISPLAY" ]; then
wl-copy "$1"
else
echo "$1" | xsel -b
fi
}
upload() {
scp "$1" "$ssh_host:$2"
}
exists() {
ssh "$ssh_host" "ls \"$1\""
}
main() {
if [ -n "$1" ]; then
ext="$(echo "$1" | awk '{ n=split($0, a, "."); print a[n] }')"
if [ "$ext" == "$1" ]; then # file has no extension
filename="$prefix$(generate_name $random_chars)"
else
filename="$prefix$(generate_name $random_chars).$ext"
fi
local_file="$1"
else
filename="$prefix$(generate_name $random_chars).png"
date_folder="$(date "+$date_format")"
local_directory="$local_root/$date_folder"
mkdir -p "$local_directory"
local_file="$local_directory/$filename"
fi
capture_and_upload "$local_file" "$remote_directory/$filename"
}
capture_and_upload() {
local_file="$1"
remote_file="$2"
if [ ! "$(exists "$remote_file")" ]; then
# If the file already exists, we’re in file upload mode.
# If it doesn’t, capture a screenshot and save it there.
if [ ! -f "$local_file" ]; then
capture "$local_file"
fi
upload "$local_file" "$remote_file"
full_url="$url_template/$filename"
clipboard "$full_url"
notify-send "$full_url"
else
echo "Debug: file $local_file already exists, retrying…"
# recurse here to generate a new name and start anew
if [ -f "$local_file" ]; then
main "$local_file"
else
main
fi
fi
}
main "$1"