#!/bin/sh

# Author: Paul Kocialkowski
# Copyright: GNU General Public License
# Date: 26/08/2010
# Note: This should only work with a french version of wget (feel free to adapt for your language)
# Requires: sed, grep, wget, hex2ascii
# Version: 0.1

# Check arguments count
if (( $# < 1 ))
then
	echo "Usage: $0 <URL1> <URL2>..."
	exit
fi

i=0

# Loop to parse each argument
while (( $i <= $# ))
do
	# Get id and name from url
	metacafe_id=$( echo $1 | sed "s/.*\/\(.*\)\/.*\/$/\1/g" )
	metacafe_name=$( echo $1 | sed "s/.*\/.*\/\(.*\)\/$/\1/g" )

	# Get infos with the redirection from the flash file 
	metacafe_swf="http://www.metacafe.com/fplayer/$metacafe_id/$metacafe_name.swf"
	metacafe_infos=$( wget --cookies=on $metacafe_swf -O /dev/null -o /dev/stdout | grep "Emplacement:" | sed "s/.*Emplacement: \(.*\) \[suivant\].*/\1/g" | hex2ascii | hex2ascii )

	# Chck if the video is unavailable
	metacafe_unavailable=$( echo $metacafe_infos | grep -P "/.*mediaData=\[\].*unavailable.*/"  )

	if [ "$metacafe_unavailable" != "" ]
	then
		echo "Sorry, this video is unavailable"
		exit
	fi

	# Check the video format
	metacafe_video_flv=$( echo $metacafe_infos | grep "\"flv\":{\"jpn\"" )
	metacafe_video_mp4=$( echo $metacafe_infos | grep "\"MP4\":{\"jpn\"" )
	metacafe_video_hdmp4=$( echo $metacafe_infos | grep "\"highDefinitionMP4\":{\"jpn\"" )

	if [ "$metacafe_video_hdmp4" != "" ]
	then
		echo -e "HD is available, would you like to download the video in HD [y/n]: \c"
		read metacafe_hd_enable

		if [ "$metacafe_hd_enable" != "Y" ] && [ "$metacafe_hd_enable" != "y" ]
		then
			metacafe_video_hdmp4=""
		fi
	fi	

	# Get the hosted video name, the key to access it and define the output video name
	if [ "$metacafe_video_hdmp4" != "" ]
	then
		metacafe_video=$( echo "$metacafe_infos" | sed "s/.*\"highDefinitionMP4\":{\"jpn\":false,\"buffer\":[0-9],\"bitRate\":[0-9],\"mediaURL\":\"\([^}{]*\)\",\"key\":\"[^}{]*\"}.*/\1/g" | sed 's/\\\//\//g' | sed "s/\[/%5B/g" | sed "s/\]/%5D/g" )
		metacafe_gda=$( echo "$metacafe_infos" | sed "s/.*\"highDefinitionMP4\":{\"jpn\":false,\"buffer\":[0-9],\"bitRate\":[0-9],\"mediaURL\":\"[^}{]*\",\"key\":\"\([^}{]*\)\"}.*/\1/g" )
		metacafe_video_out="metacafe_$metacafe_id""_hd.mp4"
	fi

	if [ "$metacafe_video_mp4" != "" ] && [ "$metacafe_video_hdmp4" == "" ]
	then
		metacafe_video=$( echo "$metacafe_infos" | sed "s/.*\"MP4\":{\"jpn\":false,\"buffer\":[0-9],\"bitRate\":[0-9],\"mediaURL\":\"\([^}{]*\)\",\"key\":\"[^}{]*\"}.*/\1/g" | sed 's/\\\//\//g' | sed "s/\[/%5B/g" | sed "s/\]/%5D/g" )
		metacafe_gda=$( echo "$metacafe_infos" | sed "s/.*\"MP4\":{\"jpn\":false,\"buffer\":[0-9],\"bitRate\":[0-9],\"mediaURL\":\"[^}{]*\",\"key\":\"\([^}{]*\)\"}.*/\1/g" )

		echo $metacafe_gda
		metacafe_video_out="metacafe_$metacafe_id.mp4"
	fi

	if [ "$metacafe_video_flv" != "" ]  && [ "$metacafe_video_mp4" == "" ]  && [ "$metacafe_video_hdmp4" == "" ]
	then
		metacafe_video=$( echo "$metacafe_infos" | sed "s/.*\"flv\":{\"jpn\":false,\"buffer\":[0-9],\"bitRate\":[0-9],\"mediaURL\":\"\([^}{]*\)\",\"key\":\"[^}{]*\"}.*/\1/g" | sed 's/\\\//\//g' | sed "s/\[/%5B/g" | sed "s/\]/%5D/g" )
		metacafe_gda=$( echo "$metacafe_infos" | sed "s/.*\"flv\":{\"jpn\":false,\"buffer\":[0-9],\"bitRate\":[0-9],\"mediaURL\":\"[^}{]*\",\"key\":\"\([^}{]*\)\"}.*/\1/g" )
		metacafe_video_out="metacafe_$metacafe_id.flv"
	fi

	# Now, let's download the video !
	wget "$metacafe_video?__gda__=$metacafe_gda" -O "$metacafe_video_out"

	let i=1+$i
	shift
done

