#!/bin/sh
# Written by Aleksandar Kuktin <akuktin@gmail.com> over a period of years.
# Script in public domain.
SED_TRANS_RULES=" \
 -e sI%21I!Ig \
 -e sI%22I\"Ig \
 -e sI%2AI*Ig \
 -e sI%2aI*Ig \
 -e sI%27I'Ig \
 -e sI%28I(Ig \
 -e sI%29I)Ig \
 -e sI%3BI;Ig \
 -e sI%3bI;Ig \
 -e sI%3AI:Ig \
 -e sI%3aI:Ig \
 -e sI%40I@Ig \
 -e sI%26I\&Ig \
 -e sI%3DI=Ig \
 -e sI%3dI=Ig \
 -e sI%2BI+Ig \
 -e sI%2bI+Ig \
 -e sI%24I\$Ig \
 -e sI%25I%Ig \
 -e sI%2CI,Ig \
 -e sI%2cI,Ig \
 -e sI%2FI/Ig \
 -e sI%2fI/Ig \
 -e sI%3FI?Ig \
 -e sI%3fI?Ig \
 -e sI%23I#Ig \
 -e sI%5BI[Ig \
 -e sI%5bI[Ig \
 -e sI%5DI]Ig \
 -e sI%5dI]Ig \
 -e sI%7CI|Ig \
 -e sI%7cI|Ig \
 -e sI%3cI<Ig \
 -e sI%3CI<Ig \
 -e sI%3eI>Ig \
 -e sI%3EI>Ig \
 -e sI%2eI.Ig \
 -e sI%2EI.Ig "

user_agent='Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16';
rate_limit='200k';

while true; do
  case "${1}" in
    "-h") ;&
    "--help")
      echo "Usage: get_from_youtube.sh [--help|-h] [options] [-e] <id list>";
      echo "Options: --music";
      echo "         --user-agent=foo --limit-rate=bar";
      echo "         --hq --vhq --uhq  --lq --vlq --ulq --slq";
      echo "         --hd --vhd --uhd  --ld --vld --uld --sld";
      exit 0;
      ;;
    "--music")
      dwnld_flags="samo_muzika";
      shift;
      ;;
    "--user-agent="*)
      user_agent="${1/--user-agent=}";
      shift;
      ;;
    "--limit-rate="*)
      rate_limit="${1/--limit-rate=}";
      shift;
      ;;
    "--hq") ;&
    "--hd")
      quality_flag="high_quality";
      shift;
      ;;
    "--vhq") ;&
    "--vhd")
      quality_flag="very_high_quality";
      shift;
      ;;
    "--uhq") ;&
    "--uhd")
      quality_flag="ultra_high_quality";
      shift;
      ;;
    "--lq") ;&
    "--ld")
      quality_flag="low_quality";
      shift;
      ;;
    "--vlq") ;&
    "--vld")
      quality_flag="very_low_quality";
      shift;
      ;;
    "--ulq") ;&
    "--uld")
      quality_flag="ultra_low_quality";
      shift;
      ;;
    "--slq") ;&
    "--sld")
      quality_flag="super_low_quality";
      shift;
      ;;
    "-e")
      shift;
      break;
      ;;
    *)
      break;
      ;;
  esac
done

echo get_from_youtube.sh: interpreting input...
for iparm in "${@}"; do
  INPUT_PARM=$(echo "${iparm}" | sed $SED_TRANS_RULES | sed \
  -e 's!^.*www\.youtube\.com/watch?.*v=\([^&]\+\).*$!\1!' \
  -e 's!^.*www\.youtube\.com/v/\([^?&]\+\).*$!\1!' \
  -e 's!^.*www\.youtube\.com/embed/\(...........\).*$!\1!')

  TMP=`mktemp`
  KUKISI=`mktemp`
  URL_LIST=`mktemp`

  echo get_from_youtube.sh: pulling the information...
  wget --keep-session-cookies --save-cookies "${KUKISI}" \
       --load-cookies "${KUKISI}" -4 \
       -U "${user_agent}" \
       -O "${TMP}" 'http://www.youtube.com/watch?v='"${INPUT_PARM}" || \
   { rm "${TMP}" "${KUKISI}" "${URL_LIST}" ; exit 1 ; }

  echo get_from_youtube.sh: analizing...
  grep 'fmt_stream_map' "${TMP}" >/dev/null || \
   { echo "get_from_youtube.sh: *** error: something went wrong";
     echo "get_from_youtube.sh: YouTube advises: `grep reason "${TMP}" | sed $SED_TRANS_RULES | sed -e 's/^.*reason=\([^<]*\).*$/\1/' -e 's/+/ /g'`";
     rm "${TMP}" "${KUKISI}" "${URL_LIST}" ;
     exit 1; }

# ignorisemo mogucnost da postoje druga moguca polja u oznaci
  TITLE=`grep '<meta.*name=.\?title' "${TMP}" | \
         sed -e 's/^.*content=\(['\''"]\?\)\(.*\)\\\\\{0\}\1.*$/\2/' | \
         sed 's~/~_~g'`

  grep 'url_encoded_fmt_stream_map' "${TMP}" | \
      sed 's/^.*fmt_stream_map[^ ]\+ "\([^ ]*\)", .*$/\1/' | \
      sed 's/\\u0026/\&/g' | \
      sed 's/,/\n/g' | \
      sed 's/^\(.*&\?\)\(itag=[^&]\+&\?\)\(.*\)$/\2\&\1\3/' | \
      sed 's/^\(.*&\?\)\(sig=[^&]\+&\?\)\(.*\)$/\2\&\1\3/' | \
      sed 's/^\(.*&\?\)\(url=[^&]\+&\?\)\(.*\)$/\2\&\1\3/' | \
      sed 's/url=\([^&]*\)&.*sig=\([^&]*\)&.*itag=\([[:digit:]]\+\).*$/,\3|\1\&signature=\2||/' | \
      sed $SED_TRANS_RULES | \
      sed $SED_TRANS_RULES | \
      sed 's/\(,[[:digit:]]\{1,2\}|[^|]*||[^,]*\)/\1 /g' > "${URL_LIST}"

  case "${quality_flag}" in
    "high_quality")
      quality_list="22 35 34 18 6 5";
      ;;
    "very_high_quality")
      quality_list="37 22 35 34 18 6 5";
      ;;
    "ultra_high_quality")
      quality_list="38 37 22 35 34 18 6 5";
      ;;
    "low_quality")
      quality_list="34 18 6 5";
      ;;
    "very_low_quality")
      quality_list="18 6 5";
      ;;
    "ultra_low_quality")
      quality_list="6 5";
      ;;
    "super_low_quality")
      quality_list="5";
      ;;
    *)
      quality_list="35 34 18 6 5";
      ;;
  esac

  for i in ${quality_list}; do
    case "${dwnld_flags}" in
      "samo_muzika")
        case "${i}" in
          "18") ;;
          "5") ;;
          *)
            continue;
            ;;
        esac
        ;;&
    esac
    YT_URL=`cat "${URL_LIST}" | \
	    sed 's/ /\n/g' | \
	    grep "^,${i}|" | \
	    sed 's/^,[[:digit:]]*|\([^|]*\).*$/\1/'`

    if [ -n "${YT_URL}" ]; then
      echo "get_from_youtube.sh: using quality: ${i}";
      break;
    fi
  done

  if [ -z "${YT_URL}" ]; then
    echo "get_from_youtube.sh: no suitable quality found, exiting";
    rm "${TMP}" "${KUKISI}" "${URL_LIST}";
    exit 1;
  fi

  echo get_from_youtube.sh: pulling the video file...
  wget --keep-session-cookies --save-cookies "${KUKISI}" \
       --load-cookies "${KUKISI}" -4 \
       -U "${user_agent}" \
       --limit-rate="${rate_limit}" -O "${TITLE}" "${YT_URL}" || \
   { rm "${TITLE}" "${TMP}" "${KUKISI}" "${URL_LIST}"; exit 1 ; }

  rm "$TMP" "${KUKISI}" "${URL_LIST}"
  if file "${TITLE}" | grep -q 'Macromedia Flash Video' ; then
    mv "${TITLE}" "${TITLE}.flv"
  else
    if file "${TITLE}" | grep -q 'WebM'; then
      mv "${TITLE}" "${TITLE}.webm"
    else
      mv "${TITLE}" "${TITLE}.mp4"
    fi
  fi
  echo get_from_youtube.sh: done
done
echo get_from_youtube.sh: all renamed and done, have a nice day!
