Created
February 21, 2022 19:04
-
-
Save artixnous/8e212d4c1409b9d72aead48938cdc517 to your computer and use it in GitHub Desktop.
Simple upload-to-imgur bash script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Imgur script by Bart Nagel <[email protected]> | |
# Improvements by Tino Sino <[email protected]> | |
# Version 6 or more | |
# I release this into the public domain. Do with it what you will. | |
# The latest version can be found at https://github.com/tremby/imgur.sh | |
# API Key provided by Bart; | |
# replace with your own or specify yours as IMGUR_CLIENT_ID environment variable | |
# to avoid limits | |
default_client_id=c9a6efb3d7932fd | |
client_id="${IMGUR_CLIENT_ID:=$default_client_id}" | |
# Function to output usage instructions | |
function usage { | |
echo "Usage: $(basename $0) [<filename|URL> [...]]" >&2 | |
echo | |
echo "Upload images to imgur and output their new URLs to stdout. Each one's" >&2 | |
echo "delete page is output to stderr between the view URLs." >&2 | |
echo | |
echo "A filename can be - to read from stdin. If no filename is given, stdin is read." >&2 | |
echo | |
echo "If xsel, xclip, pbcopy, or clip is available," >&2 | |
echo "the URLs are put on the X selection or clipboard for easy pasting." >&2 | |
echo "Use environment variables to set special options for your clipboard program (see code)." >&2 | |
} | |
# Function to upload a path | |
# First argument should be a content spec understood by curl's -F option | |
function upload { | |
curl -s -H "Authorization: Client-ID $client_id" -H "Expect: " -F "image=$1" https://api.imgur.com/3/image.xml | |
# The "Expect: " header is to get around a problem when using this through | |
# the Squid proxy. Not sure if it's a Squid bug or what. | |
} | |
# Check arguments | |
if [ "$1" == "-h" -o "$1" == "--help" ]; then | |
usage | |
exit 0 | |
elif [ $# -eq 0 ]; then | |
echo "No file specified; reading from stdin" >&2 | |
exec "$0" - | |
fi | |
# Check curl is available | |
type curl &>/dev/null || { | |
echo "Couldn't find curl, which is required." >&2 | |
exit 17 | |
} | |
clip="" | |
errors=false | |
# Loop through arguments | |
while [ $# -gt 0 ]; do | |
file="$1" | |
shift | |
# Upload the image | |
if [[ "$file" =~ ^https?:// ]]; then | |
# URL -> imgur | |
response=$(upload "$file") 2>/dev/null | |
else | |
# File -> imgur | |
# Check file exists | |
if [ "$file" != "-" -a ! -f "$file" ]; then | |
echo "File '$file' doesn't exist; skipping" >&2 | |
errors=true | |
continue | |
fi | |
response=$(upload "@$file") 2>/dev/null | |
fi | |
if [ $? -ne 0 ]; then | |
echo "Upload failed" >&2 | |
errors=true | |
continue | |
elif echo "$response" | grep -q 'success="0"'; then | |
echo "Error message from imgur:" >&2 | |
msg="${response##*<error>}" | |
echo "${msg%%</error>*}" >&2 | |
errors=true | |
continue | |
fi | |
# Parse the response and output our stuff | |
url="${response##*<link>}" | |
url="${url%%</link>*}" | |
delete_hash="${response##*<deletehash>}" | |
delete_hash="${delete_hash%%</deletehash>*}" | |
delete_page="https://imgur.com/delete/$delete_hash" | |
echo $url | |
echo "Delete page: $delete_page" >&2 | |
# Append the URL to a string so we can put them all on the clipboard later | |
clip+="$url" | |
if [ $# -gt 0 ]; then | |
clip+=$'\n' | |
fi | |
# Keep a log of the uploads | |
IMGUR_LOG_FILE="$HOME/.imgur.sh.log" | |
if [ -n "${IMGUR_LOG_FILE-}" ]; then | |
echo "$(date -Isecond) $url $delete_page $file" >>$HOME/.imgur.sh.log | |
fi | |
done | |
# Put the URLs on the clipboard if we can | |
if type pbcopy &>/dev/null; then | |
echo -n "$clip" | pbcopy $IMGUR_PBCOPY_OPTIONS | |
elif type clip &>/dev/null; then | |
echo -n "$clip" | clip $IMGUR_CLIP_OPTIONS | |
elif [ $DISPLAY ]; then | |
if type xsel &>/dev/null; then | |
echo -n "$clip" | xsel -i $IMGUR_XSEL_OPTIONS | |
elif type xclip &>/dev/null; then | |
echo -n "$clip" | xclip $IMGUR_XCLIP_OPTIONS | |
else | |
echo "Haven't copied to the clipboard: no xsel or xclip" >&2 | |
fi | |
else | |
echo "Haven't copied to the clipboard: no \$DISPLAY or pbcopy or clip" >&2 | |
fi | |
if $errors; then | |
exit 1 | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment