#!/bin/bash
##
# Simppeli YouTube-ripperi by Katja (fly5.kapsi.fi)
##
# Käyttö:
# Joko "YouTube osoite nimi", "YouTube osoite" tai ihan
# pelkästään "YouTube", se kysyy sen osoitetta ja nimeä.
# Jos nimeä ei anneta, niin se poimitaan sivun titlestä.
##

# mihin videot tallennetaan
hakemisto="$HOME/YouTube"
# pid mukana et voi lataa montaa kerral
pid=$$
# väliaikaistiedostot
temppi1="/tmp/you-$pid"
temppi2="/tmp/you-$pid.flv"

# jepjep
urli=$1
nimi=$2

# urlin alku
alkuoso="http://youtube.com/get_video.php?"

# putsaus-funktio
loppu() {
	echo -n "Siistitään.."
	rm -f ${temppi1} ${temppi2} && echo -n "ok." || echo "sotkuseks jäi."
	trap - EXIT
	exit 0
}

# signaalien metsästystä
trap loppu INT TERM EXIT

# tehään hakemisto videoille ja mennään sinne
mkdir -p $hakemisto
	if [ "$?" != "0" ]; then
		echo "Ongelmallinen hakemisto: $hakemisto"
		exit 1
	fi
cd $hakemisto

# onko määritetty youtube urlia, jos ei niin kysyy sitä
if [ -z "$urli" ]; then
	read -p "YouTube osoite? " urli

fi

# tarvii osoitteen tai ei tehä mitään
if [ -z "$urli" -o -z "`echo $urli | grep youtube.com/watch`" ]; then
	echo "Ei voi ladata videota ilman osoitetta. Anna osoite muodossa
\"http://www.youtube.com/watch?v=Z6hL6fkJ1_k\""
	exit 1
fi

# ladataan se sivu meille
wget -q ${urli} -O ${temppi1}

# onko sitä nimeä
if [ -z "$nimi" ]; then
	echo "Paina enteriä jos haluat että nimi haetaan titlestä."
	read -p "Nimi? " nimi 
fi

# liiat rimpsut pois
strippaa="tr -d \",.\!?;:'\"'\"\`'"

if [ -n "$nimi" ]; then
	nimi="`echo ${nimi} | sed 's/ //g' | ${strippaa}`"
fi

# tungetaanko title nimeks
if [ -z "$nimi" ]; then
	nimi="`grep '</title>' ${temppi1}`"
	nimi="${nimi#*<title>YouTube -}"
	nimi="${nimi%%</title>*}"
	nimi="`echo ${nimi} | sed 's/ //g' | ${strippaa}`"
fi

# pengotaan vähän
filu="`grep watch_fullscreen ${temppi1}`"

filu="${filu#*/watch_fullscreen?*}"
filu="${filu%%&title=*}"

## ^ sama sedillä
#filu=`echo ${filu} | sed "s;.*\(video_id.\+\)&title.*;\1;"`

filu="${alkuoso}${filu}"

echo "Ladataan: $nimi"

# haetaan filu
wget -q "${filu}" -O ${temppi2}

if [ -z ${temppi2} ]; then
	echo "Jotain vikaa latauksen kanssa."
	exit 1
else
	echo "Lataus ok."
fi

echo -e "Enkoodataan: $nimi\n"
# enkoodausta, muokkaa jos et tykkää tuloksesta, apuja löytyy:
# http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.html
# http://ffmpeg.mplayerhq.hu/ffmpeg-doc.html
ffmpeg -i ${temppi2} -ab 56 -ar 22050 -b 500 -s 320x240 -strict -1 ${nimi}.mpg
if [ -z "$nimi.mpg" ]; then
	echo "Jotain vikaa enkoodauksen kanssa."
	exit 1
else
	echo "Enkoodaus ok."
fi

video="$hakemisto/$nimi.mpg"
if [ -f "$video" ]; then
	echo -e "\nVideo tallennettu: $video"
	exit 0
else
	echo -e "\nVideo katos?"
	exit 1
fi

trap - INT TERM EXIT

exit $?

##
# Muutosloki:
# 06.09.2007 Versio 0.5 - YouTube muutti tyyliä, muututtiin mukana.. eli
# pitäs toimii YouTuben muutosten kanssa ja tuli vähän siistittyä koodia.
# xx.xx.xxxx Versio 0.4 - .
# 13.05.2007 Versio 0.3 - Sedillä parsimista fiksattu paremmaks.
# 05.05.2007 Versio 0.2 - pois välilyönnit nimiä sekottamasta,
# lisäks vähän tarkkuuden (strict) säätöä et hyväksytään jopa 15.0
# frameraten videot = nekin toimii ja kääntyy.
# 04.05.2007 Versio 0.1 valmis, eka toimiva versio.
##
# Tehtävää:
# - sotkuja pois..
##