#!/bin/sh

# Downloads images with given tags.  Only keeps images with width >=
# 640 pixels and downsamples all images to no more than 1024 pixel
# width.

FLICKR_API_KEY= # PUT API KEY HERE;  or set it in your environment.

if [[ $# -lt 1 ]]; then
    echo "Usage: $0 imageCount [tags]";
    exit;
fi

COUNT=$1; shift;
TAGS=$1; shift;
while [[ $# -gt 0 ]]; do
    TAGS="${TAGS},$1"; shift;
done

if [[ x$TAGS != x ]]; then
    QUERY="http://www.flickr.com/services/rest/?api_key=${FLICKR_API_KEY}&method=flickr.photos.search&per_page=20&tags=${TAGS}";
else
    QUERY="http://www.flickr.com/services/rest/?api_key=${FLICKR_API_KEY}&method=flickr.photos.getRecent&per_page=20";
fi

OUT=$(wget -q -O - "$QUERY");
PAGE_COUNT=$(echo "$OUT" | grep 'pages=' | sed 's/.*pages="\([0-9]*\)".*/\1/g');
PAGES_NEEDED=$(( $COUNT / 20 + 1 ));
if [[ $PAGE_COUNT -gt $PAGES_NEEDED ]]; then
    PAGE_COUNT=$PAGES_NEEDED;
fi

for i in `seq 1 $PAGE_COUNT`; do
    OUT=$(wget -q -O - "${QUERY}&page=${i}");
    IDS=$(echo "$OUT" | sed 's/.*id="\([0-9]*\)".*/\1/g' | grep ^[0-9]);
    echo "Now on page: $i / $PAGE_COUNT"
    for id in $IDS; do
        SIZE_QUERY="http://www.flickr.com/services/rest/?api_key=${FLICKR_API_KEY}&method=flickr.photos.getSizes&photo_id=${id}";
        SIZE_OUT=$(wget -q -O - "$SIZE_QUERY");
        FIELDS=$(echo "$SIZE_OUT" | grep 'source=' | sed 's/.*width="\([0-9]*\)".*source="\([^"]*\)".*/\1 \2/g');
        URL=$(echo "$FIELDS" | awk 'BEGIN {maxw=0; out=0;}  { if ($1 > maxw) { out=$2; maxw = $1; } } END { if (maxw >= 640) { print out; } }')
        FNAME=$(basename "$URL");
        if [[ "x$URL" != x ]]; then
            wget -q -O "$FNAME" "$URL"
            MAXW=$(echo "$FIELDS" | awk 'BEGIN {maxw=0;}  { if ($1 > maxw) { maxw = $1; } } END { print maxw; }')
            if [[ $MAXW -gt 1024 ]]; then
                echo "Resizing image $FNAME (w=$MAXW)" && convert "$FNAME" -resize 1024 "resize_$FNAME" && rm -f "$FNAME" &
            fi
        fi
    done
done
