Skip to content

Instantly share code, notes, and snippets.

@marcelom
Created November 13, 2013 07:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marcelom/7445037 to your computer and use it in GitHub Desktop.
Save marcelom/7445037 to your computer and use it in GitHub Desktop.
Smugget v1.3
#!/bin/bash
# Original by http://braindump.dk/tech/2007/10/03/smugmug-uploader/
# Modified by Jesse DeFer http://www.dotd.com/smugget/
# Additional modifications by Robert Krawitz
# Downloads SmugMug albums
function download_image
{
echo "Downloading $albumid/$filename ($md5sum)"
if [ $LOG -eq 1 ]; then
echo "Downloading $albumid/$filename ($md5sum)" >> smugget.log
fi
curl -s -o $albumid/$filename $url
}
which curl > /dev/null
test $? -gt 0 && echo "Curl is not on the path" && exit 1
which md5sum > /dev/null
test $? -gt 0 && echo "MD5Sum is not on the path" && exit 1
test -f ~/.smugup && source ~/.smugup
UA="smugget/1.3 (smugmug@dotd.com)"
APIKEY="rjBy6Da5lMEbguUkqwpFEdzmOALQrsIE"
LOG=0
LISTONLY=0
ALBUMSONLY=0
while getopts "a:p:u:lLA" flag; do
case $flag in
u)
EMAIL=$OPTARG
;;
p)
PASSWORD=$OPTARG
;;
a)
ALBUM=$OPTARG
;;
l)
LOG=1
;;
L)
LISTONLY=1
;;
A)
ALBUMSONLY=1
;;
*)
echo "Usage: $0 [-u email] [-p password] [-a albumId] [-l] [-L] [-A]"
exit 1
esac
done
while [ -z "$EMAIL" ] ; do
echo -e 'Username: \c'
read EMAIL
done
while [ -z "$PASSWORD" ] ; do
oldmodes=`stty -g`
echo -e 'Password: \c'
stty -echo
read PASSWORD
echo
stty $oldmodes
done
SID=`curl -k -A "$UA" -s "https://api.smugmug.com/hack/rest/1.1.1/?method=smugmug.login.withPassword&EmailAddress=$EMAIL&Password=$PASSWORD&APIKey=$APIKEY" | grep SessionID`
SID=${SID/*<SessionID>/}
SID=${SID/<\/SessionID>*/}
test -z $SID && echo "Unable to login" && exit 1
if [ "$ALBUMSONLY" -eq 1 -o -z "$ALBUM" ]; then
curl -k -A "$UA" -s "https://api.smugmug.com/hack/rest/1.1.1/?method=smugmug.albums.get&SessionID=$SID&APIKey=$APIKEY"|
awk -F'[<\"][^>\"]*[>\"]' \
'BEGIN { ORS="" } /Album / {album = $2; p = 1}; /Title/ {if (p) { print " " $2 ": " album "\n"; p = 0 } }' |
sort -n
if [ "$ALBUMSONLY" -eq 1 ]; then
exit
fi
echo
echo
read -p "Album ID: " ALBUM
fi
IFS="*"
TMPFILE=$0.$$.tmp
curl -k -s -A "$UA" "https://api.smugmug.com/hack/rest/1.1.1/?method=smugmug.images.get&SessionID=$SID&AlbumID=$ALBUM&Heavy=1&APIKey=$APIKEY"| sed -n '
/<Info>/,/<\/Info>/ {
s/.*<Album id="\(.*\)" \/>/\1/p
s/.*<FileName>\(.*\)<\/FileName>/\1/p
s/.*<FileName \/>/none/p
s/.*<MD5Sum>\(.*\)<\/MD5Sum>/\1/p
s/.*<OriginalURL>\(.*\)<\/OriginalURL>/\1/p
}' | sed -n 'N
N
N
s/\n/\*/g
s/sm-//g
s/-sm//g
p' | while read albumid filename md5sum url
do
# If a blank filename is returned it's probably a video
# or something else I don't know how to handle
if [ $LISTONLY -eq 1 ]; then
echo $filename
continue
fi
if [ $filename == "none" ]; then
echo "Skipping unnamed file in album $albumid"
continue
fi
# Sanity check since sed is a poor XML parser
if [ $ALBUM -ne $albumid ]; then
echo "Album IDs don't match, possible XML parsing error"
break
fi
if [ ! -d $albumid ]; then
mkdir $albumid
fi
if [ ! -f "$albumid/$filename" ]; then
download_image
continue
fi
echo "$md5sum $albumid/$filename" > $TMPFILE
md5sum -c $TMPFILE > /dev/null
if [ $? -eq 1 ]; then
download_image
continue
fi
# MD5Sum matches, don't download
#echo "Skipping $albumid/$filename ($md5sum)"
if [ $LOG -eq 1 ]; then
echo "Skipping $albumid/$filename ($md5sum)" >> smugget.log
fi
done
rm -f $TMPFILE
curl -k -s -o /dev/null -A "$UA" "https://api.smugmug.com/hack/rest/1.1.1/?method=smugmug.logout&SessionID=$SID&APIKey=$APIKEY"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment