#!/bin/sh

TMPFILE="/tmp/yt-${RANDOM}.html"
VIDS=""
PREFIX=""
COUNT=00000

## Prefered format
FORMAT=43

## Prefered closed caption language
LANG=en

while [ ! -z $1 ]; do
    case "$1" in
        '-t')
            FILENAME_FROM_TITLE=1
            shift
            ;;
        '-A')
            AUTO_NUMBER=1
            shift
            ;;
        '--write-srt')
            SAVE_SRT=1
            shift
            ;;
        '--srt-lang')
            shift
            LANG=$1
            shift
            ;;
        '-f')
            shift
            FORMAT=$1
            shift
            ;;
        *)
            VIDS="$VIDS $1"
            shift
            ;;
    esac
done
#echo $VIDS

for VID in $VIDS; do
    ID=$(echo "$VID" | sed 's/.*\(v=[^&]\+\).*/\1/;s/^v=//;s/.*youtu.be\///')
    URL="http://www.youtube.com/watch?v=${ID}"
    if [ "$AUTO_NUMBER" = 1 ]; then
        PREFIX="${COUNT}-"
        COUNT=$(printf "%.5d\n" $((COUNT + 1)))
    fi
    
    ## Informations
    echo -n "Downloading video page... "
    if wget -q --no-cache "$URL" -O "$TMPFILE"; then
        echo OK
    else
        echo Error
        break
    fi
    if [ "$FILENAME_FROM_TITLE" = 1 ]; then
        TITLE=$(grep '<meta property="og:title" content=' "$TMPFILE" | cut -d\" -f4 | tr ' ' '_')
        FILENAME="${PREFIX}${TITLE}-${ID}"
    else
        FILENAME="${PREFIX}${ID}"
    fi
    case $FORMAT in
        44|43) EXT=webm ;;
        22|18|17) EXT=mp4 ;;
        5) EXT=flv ;;
    esac

    ## Subtitles
    if [ "$SAVE_SRT" = 1 ]; then
        echo -n "Downloading subtitles... "
        wget -q --no-cache "http://video.google.com/timedtext?lang=en&format=srt&v=${ID}" -O "${FILENAME}.srt"
        if [ -s "${FILENAME}.srt" ]; then
            echo OK
        else 
            echo Error
            rm -f "${FILENAME}.srt"
        fi
    fi

    echo -n "Extracting video URL... "
    URL="$(sed 's/"url_encoded_fmt_stream_map"\(.*\)/\1/g' "$TMPFILE" | sed 's/,/\n\n/g' | grep itag="$FORMAT")"
    if [ -n "$URL" ]; then
        echo OK
        URL="$(echo "$URL" | sed 's/\:\ \"//' | sed 's/%3A/:/g' | sed 's/%2F/\//g' | sed 's/%3F/\?/g' |\
                             sed 's/%3D/\=/g' | sed 's/%252C/%2C/g' | sed 's/%26/\&/g' |\
                             sed 's/sig=/signature=/g' | sed 's/\\u0026/\&/g' | sed 's/type=[^&]\+//g' |\
                             sed 's/fallback_host=[^&]\+//g' | sed 's/quality=[^&]\+//g')" 
        SIGNATURE="$(echo "$URL" | sed 's/.*\(signature=[^&]\+\).*/\1/')"  
        YOUTUBEURL="$(echo "$URL" | sed 's/.*\(http\?:.\+\).*/\1/'| sed 's/&signature.\+$//')"
        DOWNLOADURL="$(echo "${YOUTUBEURL}&${SIGNATURE}" | sed 's/&\+/\&/g' | sed 's/&itag=[0-9]\+&signature=/\&signature=/g')"
        wget -c --no-cache "$DOWNLOADURL" -O "${FILENAME}.${EXT}"
        ## alternative download method with a bar only, curl required
        # curl -C - -# -o "${FILENAME}.${EXT}" "$DOWNLOADURL"
    else
        echo "URL not found, try different format"
    fi

    rm -f "$TMPFILE"
done
