2019-03-10 18:29:12 +00:00
#!/usr/bin/env bash
# https://github.com/jomo/imgur-screenshot
# https://imgur.com/tools
#
# Slightly modified for `nnn` integration
2019-03-10 18:58:28 +00:00
#
# Shell: bash
# Description: Upload an image file to imgur
2019-03-10 18:29:12 +00:00
if [ " ${ 1 } " = "--debug" ] ; then
echo "########################################"
echo "Enabling debug mode"
echo "Please remove credentials before pasting"
echo "########################################"
echo ""
uname -a
for arg in ${ 0 } " ${ @ } " ; do
echo -n " ' ${ arg } ' "
done
echo -e "\n"
shift
set -x
fi
current_version = "v1.7.4"
function is_mac( ) {
uname | grep -q "Darwin"
}
### IMGUR-SCREENSHOT DEFAULT CONFIG ####
# You can override the config in ~/.config/imgur-screenshot/settings.conf
imgur_anon_id = "ea6c0ef2987808e"
imgur_icon_path = " ${ HOME } /Pictures/imgur.png "
imgur_acct_key = ""
imgur_secret = ""
login = "false"
album_title = ""
album_id = ""
credentials_file = " ${ HOME } /.config/imgur-screenshot/credentials.conf "
file_name_format = "imgur-%Y_%m_%d-%H:%M:%S.png" # when using scrot, must end with .png!
file_dir = " ${ HOME } /Pictures "
upload_connect_timeout = "5"
upload_timeout = "120"
upload_retries = "1"
if is_mac; then
screenshot_select_command = "screencapture -i %img"
screenshot_window_command = "screencapture -iWa %img"
screenshot_full_command = "screencapture %img"
open_command = "open %url"
else
screenshot_select_command = "scrot -s %img"
screenshot_window_command = "scrot %img"
screenshot_full_command = "scrot %img"
open_command = "xdg-open %url"
fi
open = "true"
mode = "select"
edit_command = "gimp %img"
edit = "false"
exit_on_album_creation_fail = "true"
log_file = " ${ HOME } /.imgur-screenshot.log "
auto_delete = ""
copy_url = "true"
keep_file = "true"
check_update = "true"
# NOTICE: if you make changes here, also edit the docs at
# https://github.com/jomo/imgur-screenshot/wiki/Config
# You can override the config in ~/.config/imgur-screenshot/settings.conf
############## END CONFIG ##############
settings_path = " ${ HOME } /.config/imgur-screenshot/settings.conf "
if [ -f " ${ settings_path } " ] ; then
source " ${ settings_path } "
fi
# dependency check
if [ " ${ 1 } " = "--check" ] ; then
( which grep & >/dev/null && echo "OK: found grep" ) || echo "ERROR: grep not found"
if is_mac; then
if which growlnotify & >/dev/null; then
echo "OK: found growlnotify"
elif which terminal-notifier & >/dev/null; then
echo "OK: found terminal-notifier"
else
echo "ERROR: growlnotify nor terminal-notifier found"
fi
( which screencapture & >/dev/null && echo "OK: found screencapture" ) || echo "ERROR: screencapture not found"
( which pbcopy & >/dev/null && echo "OK: found pbcopy" ) || echo "ERROR: pbcopy not found"
else
( which notify-send & >/dev/null && echo "OK: found notify-send" ) || echo "ERROR: notify-send (from libnotify-bin) not found"
( which scrot & >/dev/null && echo "OK: found scrot" ) || echo "ERROR: scrot not found"
( which xclip & >/dev/null && echo "OK: found xclip" ) || echo "ERROR: xclip not found"
fi
( which curl & >/dev/null && echo "OK: found curl" ) || echo "ERROR: curl not found"
exit 0
fi
# notify <'ok'|'error'> <title> <text>
function notify( ) {
if is_mac; then
if which growlnotify & >/dev/null; then
growlnotify --icon " ${ imgur_icon_path } " --iconpath " ${ imgur_icon_path } " --title " ${ 2 } " --message " ${ 3 } "
else
terminal-notifier -appIcon " ${ imgur_icon_path } " -contentImage " ${ imgur_icon_path } " -title " imgur: ${ 2 } " -message " ${ 3 } "
fi
else
if [ " ${ 1 } " = "error" ] ; then
notify-send -a ImgurScreenshot -u critical -c "im.error" -i " ${ imgur_icon_path } " -t 500 " imgur: ${ 2 } " " ${ 3 } "
else
notify-send -a ImgurScreenshot -u low -c "transfer.complete" -i " ${ imgur_icon_path } " -t 500 " imgur: ${ 2 } " " ${ 3 } "
fi
fi
}
function take_screenshot( ) {
echo "Please select area"
is_mac || sleep 0.1 # https://bbs.archlinux.org/viewtopic.php?pid=1246173#p1246173
cmd = " screenshot_ ${ mode } _command "
cmd = ${ !cmd// \% img / ${ 1 } }
shot_err = " $( ${ cmd } & >/dev/null) " #takes a screenshot with selection
if [ " ${ ? } " != "0" ] ; then
echo " Failed to take screenshot ' ${ 1 } ': ' ${ shot_err } '. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting " | tee -a " ${ log_file } "
notify error "Something went wrong :(" "Information has been logged"
exit 1
fi
}
function check_for_update( ) {
# exit non-zero on HTTP error, output only the body (no stats) but output errors, follow redirects, output everything to stdout
remote_version = " $( curl --compressed -fsSL --stderr - "https://api.github.com/repos/jomo/imgur-screenshot/releases" | egrep -m 1 --color 'tag_name":\s*".*"' | cut -d '"' -f 4) "
if [ " ${ ? } " -eq "0" ] ; then
if [ ! " ${ current_version } " = " ${ remote_version } " ] && [ ! -z " ${ current_version } " ] && [ ! -z " ${ remote_version } " ] ; then
echo "Update found!"
echo " Version ${ remote_version } is available (You have ${ current_version } ) "
notify ok "Update found" " Version ${ remote_version } is available (You have ${ current_version } ). https://github.com/jomo/imgur-screenshot "
echo " Check https://github.com/jomo/imgur-screenshot/releases/ ${ remote_version } for more info. "
elif [ -z " ${ current_version } " ] || [ -z " ${ remote_version } " ] ; then
echo "Invalid empty version string"
echo " Current (local) version: ' ${ current_version } ' "
echo " Latest (remote) version: ' ${ remote_version } ' "
else
echo " Version ${ current_version } is up to date. "
fi
else
echo " Failed to check for latest version: ${ remote_version } "
fi
}
function check_oauth2_client_secrets( ) {
if [ -z " ${ imgur_acct_key } " ] || [ -z " ${ imgur_secret } " ] ; then
echo "In order to upload to your account, register a new application at:"
echo "https://api.imgur.com/oauth2/addclient"
echo "Select 'OAuth 2 authorization without a callback URL'"
echo "Then, set the imgur_acct_key (Client ID) and imgur_secret in your config."
exit 1
fi
}
function load_access_token( ) {
token_expire_time = 0
# check for saved access_token and its expiration date
if [ -f " ${ credentials_file } " ] ; then
source " ${ credentials_file } "
fi
current_time = " $( date +%s) "
preemptive_refresh_time = " $(( 10 * 60 )) "
expired = " $(( current_time > ( token_expire_time - preemptive_refresh_time)) ) "
if [ ! -z " ${ refresh_token } " ] ; then
# token already set
if [ " ${ expired } " -eq "0" ] ; then
# token expired
refresh_access_token " ${ credentials_file } "
fi
else
acquire_access_token " ${ credentials_file } "
fi
}
function acquire_access_token( ) {
check_oauth2_client_secrets
# prompt for a PIN
authorize_url = " https://api.imgur.com/oauth2/authorize?client_id= ${ imgur_acct_key } &response_type=pin "
echo "Go to"
echo " ${ authorize_url } "
echo "and grant access to this application."
read -rp "Enter the PIN: " imgur_pin
if [ -z " ${ imgur_pin } " ] ; then
echo "PIN not entered, exiting"
exit 1
fi
# exchange the PIN for access token and refresh token
response = " $( curl --compressed -fsSL --stderr - \
-F " client_id= ${ imgur_acct_key } " \
-F " client_secret= ${ imgur_secret } " \
-F "grant_type=pin" \
-F " pin= ${ imgur_pin } " \
https://api.imgur.com/oauth2/token) "
save_access_token " ${ response } " " ${ 1 } "
}
function refresh_access_token( ) {
check_oauth2_client_secrets
token_url = "https://api.imgur.com/oauth2/token"
# exchange the refresh token for access_token and refresh_token
response = " $( curl --compressed -fsSL --stderr - -F " client_id= ${ imgur_acct_key } " -F " client_secret= ${ imgur_secret } " -F "grant_type=refresh_token" -F " refresh_token= ${ refresh_token } " " ${ token_url } " ) "
if [ ! " ${ ? } " -eq "0" ] ; then
# curl failed
handle_upload_error " ${ response } " " ${ token_url } "
exit 1
fi
save_access_token " ${ response } " " ${ 1 } "
}
function save_access_token( ) {
if ! grep -q "access_token" <<< " ${ 1 } " ; then
# server did not send access_token
echo "Error: Something is wrong with your credentials:"
echo " ${ 1 } "
exit 1
fi
access_token = " $( egrep -o 'access_token":".*"' <<< " ${ 1 } " | cut -d '"' -f 3) "
refresh_token = " $( egrep -o 'refresh_token":".*"' <<< " ${ 1 } " | cut -d '"' -f 3) "
expires_in = " $( egrep -o 'expires_in":[0-9]*' <<< " ${ 1 } " | cut -d ':' -f 2) "
token_expire_time = " $(( $( date +%s) + expires_in )) "
# create dir if not exist
mkdir -p " $( dirname " ${ 2 } " ) " 2>/dev/null
touch " ${ 2 } " && chmod 600 " ${ 2 } "
cat <<EOF > " ${ 2 } "
access_token = " ${ access_token } "
refresh_token = " ${ refresh_token } "
token_expire_time = " ${ token_expire_time } "
EOF
}
function fetch_account_info( ) {
response = " $( curl --compressed --connect-timeout " ${ upload_connect_timeout } " -m " ${ upload_timeout } " --retry " ${ upload_retries } " -fsSL --stderr - -H " Authorization: Bearer ${ access_token } " https://api.imgur.com/3/account/me) "
if egrep -q '"success":\s*true' <<< " ${ response } " ; then
username = " $( egrep -o '"url":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
echo " Logged in as ${ username } . "
echo " https:// ${ username } .imgur.com "
else
echo " Failed to fetch info: ${ response } "
fi
}
function delete_image( ) {
response = " $( curl --compressed -X DELETE -fsSL --stderr - -H " Authorization: Client-ID ${ 1 } " " https://api.imgur.com/3/image/ ${ 2 } " ) "
if egrep -q '"success":\s*true' <<< " ${ response } " ; then
echo " Image successfully deleted (delete hash: ${ 2 } ). " >> " ${ 3 } "
else
echo " The Image could not be deleted: ${ response } . " >> " ${ 3 } "
fi
}
function upload_authenticated_image( ) {
echo " Uploading ' ${ 1 } '... "
title = " $( echo " ${ 1 } " | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev) "
if [ -n " ${ album_id } " ] ; then
response = " $( curl --compressed --connect-timeout " ${ upload_connect_timeout } " -m " ${ upload_timeout } " --retry " ${ upload_retries } " -fsSL --stderr - -F " title= ${ title } " -F " image=@\" ${ 1 } \" " -F " album= ${ album_id } " -H " Authorization: Bearer ${ access_token } " https://api.imgur.com/3/image) "
else
response = " $( curl --compressed --connect-timeout " ${ upload_connect_timeout } " -m " ${ upload_timeout } " --retry " ${ upload_retries } " -fsSL --stderr - -F " title= ${ title } " -F " image=@\" ${ 1 } \" " -H " Authorization: Bearer ${ access_token } " https://api.imgur.com/3/image) "
fi
# JSON parser premium edition (not really)
if egrep -q '"success":\s*true' <<< " ${ response } " ; then
img_id = " $( egrep -o '"id":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
img_ext = " $( egrep -o '"link":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev) " # "link" itself has ugly '\/' escaping and no https!
del_id = " $( egrep -o '"deletehash":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
if [ ! -z " ${ auto_delete } " ] ; then
export -f delete_image
echo " Deleting image in ${ auto_delete } seconds. "
nohup /bin/bash -c " sleep ${ auto_delete } && delete_image ${ imgur_anon_id } ${ del_id } ${ log_file } " &
fi
handle_upload_success " https://i.imgur.com/ ${ img_id } . ${ img_ext } " " https://imgur.com/delete/ ${ del_id } " " ${ 1 } "
else # upload failed
err_msg = " $( egrep -o '"error":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
test -z " ${ err_msg } " && err_msg = " ${ response } "
handle_upload_error " ${ err_msg } " " ${ 1 } "
fi
}
function upload_anonymous_image( ) {
echo " Uploading ' ${ 1 } '... "
title = " $( echo " ${ 1 } " | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev) "
if [ -n " ${ album_id } " ] ; then
response = " $( curl --compressed --connect-timeout " ${ upload_connect_timeout } " -m " ${ upload_timeout } " --retry " ${ upload_retries } " -fsSL --stderr - -H " Authorization: Client-ID ${ imgur_anon_id } " -F " title= ${ title } " -F " image=@\" ${ 1 } \" " -F " album= ${ album_id } " https://api.imgur.com/3/image) "
else
response = " $( curl --compressed --connect-timeout " ${ upload_connect_timeout } " -m " ${ upload_timeout } " --retry " ${ upload_retries } " -fsSL --stderr - -H " Authorization: Client-ID ${ imgur_anon_id } " -F " title= ${ title } " -F " image=@\" ${ 1 } \" " https://api.imgur.com/3/image) "
fi
# JSON parser premium edition (not really)
if egrep -q '"success":\s*true' <<< " ${ response } " ; then
img_id = " $( egrep -o '"id":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
img_ext = " $( egrep -o '"link":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev) " # "link" itself has ugly '\/' escaping and no https!
del_id = " $( egrep -o '"deletehash":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
if [ ! -z " ${ auto_delete } " ] ; then
export -f delete_image
echo " Deleting image in ${ auto_delete } seconds. "
nohup /bin/bash -c " sleep ${ auto_delete } && delete_image ${ imgur_anon_id } ${ del_id } ${ log_file } " &
fi
handle_upload_success " https://i.imgur.com/ ${ img_id } . ${ img_ext } " " https://imgur.com/delete/ ${ del_id } " " ${ 1 } "
else # upload failed
err_msg = " $( egrep -o '"error":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
test -z " ${ err_msg } " && err_msg = " ${ response } "
handle_upload_error " ${ err_msg } " " ${ 1 } "
fi
}
function handle_upload_success( ) {
echo ""
echo " image link: ${ 1 } "
echo " delete link: ${ 2 } "
if [ " ${ copy_url } " = "true" ] && [ -z " ${ album_title } " ] ; then
if is_mac; then
echo -n " ${ 1 } " | pbcopy
else
echo -n " ${ 1 } " | xclip -selection clipboard
fi
echo "URL copied to clipboard"
fi
# print to log file: image link, image location, delete link
echo -e " ${ 1 } \t ${ 3 } \t ${ 2 } " >> " ${ log_file } "
notify ok "Upload done!" " ${ 1 } "
# if [ ! -z "${open_command}" ] && [ "${open}" = "true" ]; then
# open_cmd=${open_command//\%url/${1}}
# open_cmd=${open_cmd//\%img/${2}}
# echo "Opening '${open_cmd}'"
# eval "${open_cmd}"
# fi
}
function handle_upload_error( ) {
error = " Upload failed: \" ${ 1 } \" "
echo " ${ error } "
echo -e " Error\t ${ 2 } \t ${ error } " >> " ${ log_file } "
notify error "Upload failed :(" " ${ 1 } "
}
function handle_album_creation_success( ) {
echo ""
echo " Album link: ${ 1 } "
echo " Delete hash: ${ 2 } "
echo ""
notify ok "Album created!" " ${ 1 } "
if [ " ${ copy_url } " = "true" ] ; then
if is_mac; then
echo -n " ${ 1 } " | pbcopy
else
echo -n " ${ 1 } " | xclip -selection clipboard
fi
echo "URL copied to clipboard"
fi
# print to log file: album link, album title, delete hash
echo -e " ${ 1 } \t\" ${ 3 } \"\t ${ 2 } " >> " ${ log_file } "
}
function handle_album_creation_error( ) {
error = " Album creation failed: \" ${ 1 } \" "
echo -e " Error\t ${ 2 } \t ${ error } " >> " ${ log_file } "
notify error "Album creation failed :(" " ${ 1 } "
if [ ${ exit_on_album_creation_fail } ] ; then
exit 1
fi
}
while [ ${# } != 0 ] ; do
case " ${ 1 } " in
-h | --help)
echo " usage: ${ 0 } [--debug] [-c | --check | -v | -h | -u] "
echo " ${ 0 } [--debug] [option]... [file]... "
echo ""
echo " --debug Enable debugging, must be first option"
echo " -h, --help Show this help, exit"
echo " -v, --version Show current version, exit"
echo " --check Check if all dependencies are installed, exit"
echo " -c, --connect Show connected imgur account, exit"
echo " -o, --open <true|false> Override 'open' config"
echo " -e, --edit <true|false> Override 'edit' config"
echo " -i, --edit-command <command> Override 'edit_command' config (include '%img'), sets --edit 'true'"
echo " -l, --login <true|false> Override 'login' config"
echo " -a, --album <album_title> Create new album and upload there"
echo " -A, --album-id <album_id> Override 'album_id' config"
echo " -k, --keep-file <true|false> Override 'keep_file' config"
echo " -d, --auto-delete <s> Automatically delete image after <s> seconds"
echo " -u, --update Check for updates, exit"
echo " file Upload file instead of taking a screenshot"
exit 0; ;
-v | --version)
echo " ${ current_version } "
exit 0; ;
-s | --select)
mode = "select"
shift; ;
-w | --window)
mode = "window"
shift; ;
-f | --full)
mode = "full"
shift; ;
-o | --open)
open = " ${ 2 } "
shift 2; ;
-e | --edit)
edit = " ${ 2 } "
shift 2; ;
-i | --edit-command)
edit_command = " ${ 2 } "
edit = "true"
shift 2; ;
-l | --login)
login = " ${ 2 } "
shift 2; ;
-c | --connect)
load_access_token
fetch_account_info
exit 0; ;
-a | --album)
album_title = " ${ 2 } "
shift 2; ;
-A | --album-id)
album_id = " ${ 2 } "
shift 2; ;
-k | --keep-file)
keep_file = " ${ 2 } "
shift 2; ;
-d | --auto-delete)
auto_delete = " ${ 2 } "
shift 2; ;
-u | --update)
check_for_update
exit 0; ;
*)
upload_files = ( " ${ @ } " )
break; ;
esac
done
if [ " ${ login } " = "true" ] ; then
# load before changing directory
load_access_token
fi
if [ -n " ${ album_title } " ] ; then
if [ " ${ login } " = "true" ] ; then
response = " $( curl -fsSL --stderr - \
-F " title= ${ album_title } " \
-H " Authorization: Bearer ${ access_token } " \
https://api.imgur.com/3/album) "
else
response = " $( curl -fsSL --stderr - \
-F " title= ${ album_title } " \
-H " Authorization: Client-ID ${ imgur_anon_id } " \
https://api.imgur.com/3/album) "
fi
if egrep -q '"success":\s*true' <<< " ${ response } " ; then # Album creation successful
echo " Album ' ${ album_title } ' successfully created "
album_id = " $( egrep -o '"id":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
del_id = " $( egrep -o '"deletehash":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
handle_album_creation_success " http://imgur.com/a/ ${ album_id } " " ${ del_id } " " ${ album_title } "
if [ " ${ login } " = "false" ] ; then
album_id = " ${ del_id } "
fi
else # Album creation failed
err_msg = " $( egrep -o '"error":\s*"[^"]+"' <<< " ${ response } " | cut -d "\"" -f 4) "
test -z " ${ err_msg } " && err_msg = " ${ response } "
handle_album_creation_error " ${ err_msg } " " ${ album_title } "
fi
fi
if [ -z " ${ upload_files } " ] ; then
upload_files[ 0] = ""
fi
for upload_file in " ${ upload_files [@] } " ; do
if [ -z " ${ upload_file } " ] ; then
cd " ${ file_dir } " || exit 1
# new filename with date
img_file = " $( date +" ${ file_name_format } " ) "
take_screenshot " ${ img_file } "
else
# upload file instead of screenshot
img_file = " ${ upload_file } "
fi
# get full path
img_file = " $( cd " $( dirname " ${ img_file } " ) " && echo " $( pwd ) / $( basename " ${ img_file } " ) " ) "
# check if file exists
if [ ! -f " ${ img_file } " ] ; then
echo " file ' ${ img_file } ' doesn't exist ! "
exit 1
fi
# open image in editor if configured
if [ " ${ edit } " = "true" ] ; then
edit_cmd = ${ edit_command // \% img / ${ img_file } }
echo " Opening editor ' ${ edit_cmd } ' "
if ! ( eval " ${ edit_cmd } " ) ; then
echo " Error for image ' ${ img_file } ': command ' ${ edit_cmd } ' failed, not uploading. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting " | tee -a " ${ log_file } "
notify error "Something went wrong :(" "Information has been logged"
exit 1
fi
fi
if [ " ${ login } " = "true" ] ; then
upload_authenticated_image " ${ img_file } "
else
upload_anonymous_image " ${ img_file } "
fi
# delete file if configured
if [ " ${ keep_file } " = "false" ] && [ -z " ${ 1 } " ] ; then
echo " Deleting temp file ${ file_dir } / ${ img_file } "
rm -rf " ${ img_file } "
fi
echo ""
done
if [ " ${ check_update } " = "true" ] ; then
check_for_update
fi