#!/bin/bash # https://github.com/jomo/imgur-screenshot # https://imgur.com/tools 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'> <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 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_anonymous_image() { echo "Uploading '${1}'..." title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)" response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "filename=${title}" -F "files[]=@\"${1}\"" https://imhst.ru/upload.php)" # JSON parser premium edition (not really) if egrep -q '"success":\s*true' <<<"${response}"; then img_id="$(egrep -o '"url":\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 "${img_id}" "${1}"#"https://imgur.com/delete/${del_id}" 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 "" delwin="$(echo ${1} | cut -d "/" -f 4-)" delwin="$(echo https://i.imhst.ru/${delwin})" echo "image link: ${delwin}" #echo "delete link: ${2}" if [ "${copy_url}" = "true" ] && [ -z "${album_title}" ]; then if is_mac; then echo -n "${delwin}" | pbcopy else echo -n "${delwin}" | xclip -selection clipboard fi echo "URL copied to clipboard" fi # print to log file: image link, image location, delete link echo -e "${delwin}\t${2}" >> "${log_file}" notify ok "Upload done!" "${delwin}" if [ ! -z "${open_command}" ] && [ "${open}" = "true" ]; then open_cmd=${open_command//\%url/${1}} #open_cmd=${open_cmd//\%img/${2}} echo "Opening '${delwin}'" 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}" } 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 " -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 " -k, --keep-file <true|false> Override 'keep_file' config" echo " -d, --auto-delete <s> Automatically delete image after <s> seconds" 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;; -k | --keep-file) keep_file="${2}" shift 2;; -d | --auto-delete) auto_delete="${2}" shift 2;; *) upload_files=("${@}") break;; esac done 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 upload_anonymous_image "${img_file}" # 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