#!/bin/bash ############################################################# # Script to download all images in an imgur.com album # to disk. # USAGE: ./imgur.sh http://imgur.com/a/id ############################################################# ## We do not need to set url to '' ## With unique tempfiles, multiple instances can run simuntaneously tf=$(mktemp .imgur.XXXXX) url=$1 ## A separate usage is nice, but is is used only once: embed it into the if if [[ -z $url ]]; then echo -e "Imgur Album downloader\nUsage: $0 " exit 1 fi if [[ "$url" =~ "imgur.com/a/" ]]; then ## We have no special need for curl; wget is AFAIK more often preinstalled wget -q -O "$tf" "$1" #title=$(awk -F \" '/data-cover/ {print $6; exit}' $ass) ## I don't know enough about awk to speak of it, but regex is nice: title=$(grep -Po '(?<=data-title=").*?(?=" )' "$tf") # A lookabehind, nongreedy and ending lookahead albumid=$(grep -Po '(?<=id="album-).{5}(?=")' "$tf") # Ids are 5 chars if [[ -z $title ]]; then #title=$(awk -F \" '/data-cover/ {print $8}' $ass) ## data-cover can also be something like LPzCFb.jpg, so... # Let's just use the album id title=$albumid fi title=${title// /_} dir="${title//[^a-zA-Z0-9_]/}" if [[ -d $dir ]]; then echo "Directory '$dir' already exists, you may have downloaded this album before." exit 1 fi ## Else is unneeded ## Worst case: Using the album id, the dirname should never be empty if [[ -z $dir ]]; then title=$albumid fi echo "Saving to '$dir'" mkdir -p $dir #for image in $(awk -F \" '/data-src/ {print $10}' $ass | sed /^$/d | sed s/s.jpg/.jpg/); do ## Some images are so big they won't be displayed fully. With this we get full links! for image in $(grep -Po '(?<=a href=")http://i\.imgur.*?(?=")' "$tf"); do #filename=$(sed s/http:\\/\\/i.imgur.com\\/// <<< $image) #... #fi ## We don't need to guess the filetype nor create the name, wget handles that (<<< is neat though) echo -n "Downloading '$image'..." wget -q -nc -P "$dir" "$image" # -P will set directory prefix, -nc won't overwrite if [ "$?" = "0" ]; then echo " Done."; else echo "Failed.."; fi done fi ## No need to tell the user about tempfiles rm "$tf" echo "All done!" #exit 0