summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anderson <ejona86@gmail.com>2013-06-15 17:51:38 -0700
committerEric Anderson <ejona86@gmail.com>2013-06-15 17:56:35 -0700
commit6c9e8d2a34fe5f4965494c292b359edb2843e64c (patch)
treee4520e38c6e8e0a44894679d51d568b9dde21417
parent3a80e4a5832d63417aad5634c464f16b172d0893 (diff)
downloadhib-dlagent-6c9e8d2a34fe5f4965494c292b359edb2843e64c.tar.gz
hib-dlagent-6c9e8d2a34fe5f4965494c292b359edb2843e64c.zip
Refactor download location handling
We now handle many more cases and show clear error messages when using conflicting features.
-rwxr-xr-xhib-dlagent125
1 files changed, 82 insertions, 43 deletions
diff --git a/hib-dlagent b/hib-dlagent
index 84f8898..5afc79d 100755
--- a/hib-dlagent
+++ b/hib-dlagent
@@ -9,7 +9,6 @@ COOKIE_JAR=
FILE=
DESTINATION=
DOWNLOAD=1
-LISTING_PAGES=()
USERNAME=
PASSWORD=
KEYS=()
@@ -32,13 +31,15 @@ usage() {
echo
echo "Usage: $0 [OPTIONS] FILE"
echo "Options:"
- echo " -d Storage directory to look first"
+ echo " -d <dir> Directory for searching and saving files. The normal save"
+ echo " location is still used, but will be a symbolic link"
echo " -h This help"
echo " -k <key> Search key's files. Use multiple times for multiple keys"
echo " -o <file> Name to use when saving file"
echo " -p <pass> Use pass to login. If specified multiple times, the last is"
echo " used"
- echo " -s Print URL to stdout instead of downloading"
+ echo " -s Print URL to stdout instead of downloading. Incompatible"
+ echo " with -d"
echo " -u <user> Use user to login. Search account's files. If specified"
echo " multiple times, the last is used"
echo
@@ -48,6 +49,47 @@ usage() {
echo "specify -k for bundles associated with an account."
}
+handle_download() {
+ local SAVE_FILE="$1"
+ local LISTING_PAGES=()
+
+ COOKIE_JAR=$(mktemp)
+
+ if [ -n "$USERNAME" ]; then
+ login
+ LISTING_PAGES+=("$HOME_PAGE")
+ fi
+
+ for KEY in "${KEYS[@]}"; do
+ LISTING_PAGES+=("https://www.humblebundle.com/downloads?key=$KEY")
+ done
+
+ if [ -z "$LISTING_PAGES" ]; then
+ echo "You must specify at least one of -u and -k" >&2
+ exit 1
+ fi
+
+ local URL
+ for LISTING_PAGE in "${LISTING_PAGES[@]}"; do
+ URL=$(discover_url "$LISTING_PAGE")
+ if [ -n "$URL" ]; then break; fi
+ done
+
+ # Cookie no longer necessary.
+ rm "$COOKIE_JAR"
+
+ if [ ! -n "$URL" ]; then
+ echo "Could not find URL for file: $FILE" >&2
+ exit 2
+ fi
+
+ if [ $DOWNLOAD -eq 0 ]; then
+ echo "$URL"
+ else
+ /usr/bin/curl -C - --retry 3 --retry-delay 3 -o "$SAVE_FILE" "$URL"
+ fi
+}
+
main() {
if [ $# -eq 0 ]; then
usage
@@ -96,57 +138,54 @@ main() {
exit 1
fi
- COOKIE_JAR=$(mktemp)
- FILE="${1#hib://}"
-
- if [ -z "$DESTINATION" ]; then
- DESTINATION="${FILE##*/}"
+ if [ $DOWNLOAD -eq 0 -a -n "$STORAGE" ]; then
+ echo "-s and -d are incompatible" >&2
+ exit 1
fi
- if [ -n "$STORAGE" ]; then
- STORAGE_FILE=$(/usr/bin/find "$STORAGE" -name "$FILE")
- if [ -n "$STORAGE_FILE" ]; then
- echo "Found file: $STORAGE_FILE"
- ln -s "$STORAGE_FILE" "$DESTINATION"
- return;
- fi
- fi
+ FILE="$1"
- if [ -n "$USERNAME" ]; then
- login;
- LISTING_PAGES+=("$HOME_PAGE")
+ if [ "$FILE" != "$(basename "$FILE")" ]; then
+ # We need a simple file name without any slashes. Instead of erroring, we
+ # strip the file name out so that hib://filename is a valid argument.
+ FILE=$(basename "$FILE")
+ # Since we are doing something fancy, give the user a clue that we modified
+ # their input.
+ echo "Searching for $FILE" >&2
fi
- for KEY in "${KEYS[@]}"; do
- LISTING_PAGES+=("https://www.humblebundle.com/downloads?key=$KEY")
- done
-
- if [ -z "$LISTING_PAGES" ]; then
- echo "You must specify at least one of -u and -k" >&1
- exit 1
+ if [ -z "$DESTINATION" ]; then
+ DESTINATION="."
fi
- for LISTING_PAGE in "${LISTING_PAGES[@]}"; do
- URL=$(discover_url "$LISTING_PAGE")
- if [ -n "$URL" ]; then break; fi
- done
-
- # Cookie no longer necessary.
- rm "$COOKIE_JAR"
-
- if [ ! -n "$URL" ]; then
- echo "Could not find URL for file: $FILE" >&2
- exit 2
+ if [ -d "$DESTINATION" ]; then
+ DESTINATION="$DESTINATION/$FILE"
fi
- if [ $DOWNLOAD -eq 0 ]; then
- echo "$URL"
+ if [ -z "$STORAGE" ]; then
+ handle_download "$DESTINATION"
else
- if [ -n "$STORAGE" ]; then
- ln -s "$STORAGE/$FILE" "$DESTINATION"
- DESTINATION="$STORAGE/$FILE"
+ local STORAGE_FILE
+ STORAGE_FILE=$(/usr/bin/find "$STORAGE" -name "$FILE")
+ if [ -z "$STORAGE_FILE" ]; then
+ STORAGE_FILE="$STORAGE/$FILE"
+ handle_download "$STORAGE_FILE"
+ fi
+
+ if [ ! "$STORAGE_FILE" -ef "$DESTINATION" ]; then
+ ln -s "$STORAGE_FILE" "$DESTINATION"
+ if [ ! "$STORAGE_FILE" -ef "$DESTINATION" ]; then
+ # If DESTINATION is in a different directory than the CWD and STORAGE
+ # is a relative path, then ln -s will produce a broken link. To produce
+ # a valid link we resolve the path with readlink. This is unfortunate
+ # because having relative links is nicer and we will undo any symlinks
+ # in the path. Therefore, we detect when things have broken and only
+ # use readlink when we must.
+ STORAGE_FILE=$(/usr/bin/readlink -f "$STORAGE_FILE")
+ rm "$DESTINATION"
+ ln -s "$STORAGE_FILE" "$DESTINATION"
+ fi
fi
- /usr/bin/curl -C - --retry 3 --retry-delay 3 -o "$DESTINATION" "$URL"
fi
}