#!/bin/bash -e
[ $# -lt 2 ] && echo "$0 mms://hogehoge place" && exit 1
URL=$1
PLACE=$2
DNONLY=false
DUPCHK=false
NODUPCHK=false
SKIP=false
while test -n "${3}"
do
	case "${3}" in
	--downloadonly)
	DNONLY=true
	shift
	;;
	--nodupchk)
	NODUPCHK=true
	shift
	;;
	*)break;;
	esac
done
LANG=C
test -z "${STARTTIME}" && STARTTIME=`date '+%Y%m%d%H%M'`
TARGETFILE=${URL##*/}  # 最後の/より後ろを取り出す
basename=${TARGETFILE%\.*}
TARGETEXT=${TARGETFILE##*\.}
cd "${PLACE}"
PLACE="`pwd`"
TEMPLOG=`mktemp`
export TMPDIR="${PLACE}"
TEMPFILE1="`mktemp`"

escapepattn()
{
local pattn=${1}
pattn="`echo "${pattn}"|sed -e 's/ /\\\ /'g`"
pattn="`echo "${pattn}"|sed -e 's/(/\\\(/'g`"
pattn="`echo "${pattn}"|sed -e 's/)/\\\)/'g`"
pattn="`echo "${pattn}"|sed -e 's/\[/\\\[/'g`"
pattn="`echo "${pattn}"|sed -e 's/\]/\\\]/'g`"
escapedmatchpattn=${pattn}
}
escapedmatchpattn=

sanitize_filename()
{
local fname=${1}
fname=$(echo "${fname}"|sed -e 's/〜/～/'g)
fname=$(echo "${fname}"|sed -e 's/»/-/'g)
fname=$(echo "${fname}"|sed -e 's/"/”/'g)
fname=$(echo "${fname}"|sed -e 's/\\/／/'g)
fname=$(echo "${fname}"|sed -e 's/?/？/'g)
fname=$(echo "${fname}"|sed -e 's/</＜/'g)
fname=$(echo "${fname}"|sed -e 's/>/＞/'g)
fname=$(echo "${fname}"|sed -e 's/:/：/'g)
fname=$(echo "${fname}"|sed -e 's/;/；/'g)
fname=$(echo "${fname}"|sed -e 's/|/｜/'g)
fname=$(echo "${fname}"|sed -e 's/,/，/'g)
fname=$(echo "${fname}"|sed -e 's/*/-/'g)
fname=$(echo "${fname}"|sed -e 's/\^/-/'g)
fname=$(echo "${fname}"|sed -e 's/ / /'g)
fname=$(echo "${fname}"|sed -e 's/—/―/'g)
fname=$(echo "${fname}"|sed -e 's/−/－/'g)
fname=$(echo "${fname}"|sed -e 's/ê/e/'g)
fname=$(echo "${fname}"|sed -e 's/ó/o/'g)
fname=$(echo "${fname}"|sed -e 's/@/＠/'g)
fname=$(echo "${fname}"|sed -e 's/\//-/'g)
fname=$(echo "${fname}"|sed -e 's/\[/(/'g)
fname=$(echo "${fname}"|sed -e 's/\]/)/'g)
fname=$(echo "${fname}"|sed -e 's/\%/-/'g)
echo "${fname}"
}

exitproc1(){
if test -e "${TEMPLOG}"; then
cat "${TEMPLOG}"
rm "${TEMPLOG}"
fi
rm -rf "${TEMPFILE1}" "${TEMPFILE2}" "${TEMPLNK1}" "${TEMPLNK2}";}

exitproc2(){ rm -rf "${TEMPFIFO}" "${TEMPFILE3}";}

trap '
exitproc1
exit 1
' 2 15

#if  [ -e ~/.profile ]; then
#	. ~/.profile
#else
#	. ~/.bash_profile
#fi
#unalias -a
echo "${URL}"
for i in 1 2 3 4 5; do
mplayer -dumpstream ${URL} -dumpfile "${TEMPFILE1}" 1>/dev/null 2>${TEMPLOG}
	cat ${TEMPLOG}
if grep -q "read error\:\: Interrupted system call" ${TEMPLOG}; then
	rm "${TEMPFILE1}"
	break
elif grep -q "404:Not Found" ${TEMPLOG}; then
	SKIP=true
	break
elif grep -q "No stream found to handle url" ${TEMPLOG}; then
	SKIP=true
	break
elif grep -q "read error\:\:" ${TEMPLOG}; then
	rm "${TEMPFILE1}"
	echo "Retry download"
	continue
elif grep -q "stream_chunck size is too small" ${TEMPLOG}; then
	break
elif grep -q "unknown object" ${TEMPLOG}; then
	break
else
	echo "Waiting to retry download"
	sleep 600
	continue
fi
done
if file "${TEMPFILE1}"|grep -q "ASCII text"; then
rm "${TEMPFILE1}"
fi
rm ${TEMPLOG}
if ${SKIP}; then
# この記述(スキップ)は本スクリプト単独で使用する場合には意味を持つが
# all-process.shから呼び出された場合には役に立たない。
# (理由はmplayerがエラー時にexit(2)する為)
rm -rf "${TEMPFILE1}"
echo "${URL}		skipped"
exit 1
fi
! test -s "${TEMPFILE1}" && rm -f "${TEMPFILE1}" && echo "Abort" && exit 1
##################################################
## asfbinコマンドでindex付加
## (asfbinコマンドは7bitパスしか許容しない為にリンクを使用)
#if test "${TARGETEXT}" = "wmv" || test "${TARGETEXT}" = "asf"; then 
#export TMPDIR=/tmp
#TEMPLNK1="`mktemp`"
#ln -sf "${TEMPFILE1}" "${TEMPLNK1}"
#if (asfbin -infohdr -i "${TEMPLNK1}"|grep -q "Stream \[.\]: Video") then
#export TMPDIR="${PLACE}"
#TEMPFILE2="`mktemp`"
#export TMPDIR=/tmp
#TEMPLNK2="`mktemp`"
#ln -sf "${TEMPFILE2}" "${TEMPLNK2}"
#asfbin -y -forceindex -i "${TEMPLNK1}" -o "${TEMPLNK2}" && \
#mv "${TEMPFILE2}" "${TEMPFILE1}"
#rm "${TEMPLNK2}"
#fi
#rm "${TEMPLNK1}"
#fi
##################################################
set +e
title="`get-wma-info.pl -tags -TITLE "${TEMPFILE1}"`"
testtitle="`echo "${title}"|tr -d '\000-\177'`"
if test -n "${testtitle}"; then
utf8title="`echo "${title}"|iconv -f UTF-16 -t UTF-8`"
else
utf8title=${title}
fi
utf8title="`echo ${utf8title}|tr -d '\n\r'`"
cp932title="`echo "${utf8title}"|iconv -f UTF-8 -t CP932`"
sample_rate="`get-wma-info.pl -info -sample_rate "${TEMPFILE1}"`"
set -e
if $PRIASX && test -n "${FILENAME}"; then
	# 環境変数PRIASXがtrueの場合、
	# 呼び出し元から渡されたファイル名を採用する
	fname=${FILENAME}
	FileName=${fname}
elif test -n "${utf8title}"; then
	# それ以外の場合で、ヘッダにタイトルが設定されている場合は
	# ファイル名にそのタイトルを設定
	fname=${utf8title}
	fname=$(sanitize_filename "${fname}")
	# サーバ側のミスでヘッダの更新がなされていない場合に
	# 誤って以前にダウンロードしたファイルが上書きされる
	# ことを防ぐ為に、念のためファイル名には時間を付加する。
	FileName="${fname}-${STARTTIME}"
elif test -n "${FILENAME}"; then
	# それ以外の場合で、環境変数FILENAMEが設定されている場合は
	# ファイル名にはFILENAMEを採用する。
	fname=${FILENAME}
	# この場合もファイル名にはファイル名には時間を付加する。
	FileName="${fname}-${STARTTIME}"
else
	# 環境変数FILENAMEも設定されていない場合、
	# ファイル名にはURLを加工したものを使用する。
	# (最初のケースのエラーケースもここに該当する)
	fname=${URL}
	fname="`basename "${fname}" .${TARGETEXT}`"
	fname="`echo ${fname}|tr ':/' '-'`"
	# 当然この場合もファイル名に時間を付加する。
	FileName="${fname}-${STARTTIME}"
fi

if ! $NODUPCHK; then
escapepattn "${fname}-*.${TARGETEXT}"
set +e
lastfile=$(eval ls -Atr ${escapedmatchpattn} 2>/dev/null|grep -v "${STARTTIME}.${TARGETEXT}" 2>/dev/null|tail -1)
set -e
[ "$lastfile" != "" ] && DUPCHK=true
fi

if $DUPCHK; then
set +e
if diff "${TEMPFILE1}" "$lastfile" >/dev/null 2>&1; then
	set -e
	rm "${TEMPFILE1}"
	echo "Duplicate:${lastfile} <-> ${FileName}.${TARGETEXT}"
	echo "Deleted."
	exit 1
fi
fi

set +e
chmod go+r "${TEMPFILE1}"
set -e
if ! test -e "${FileName}.${TARGETEXT}" || $PRIASX; then
mv "${TEMPFILE1}" "${FileName}.${TARGETEXT}"
else
mv "${TEMPFILE1}" "${fname}.${RANDOM}-${STARTTIME}.${TARGETEXT}"
fi
echo "Downloading: Done."
$DNONLY && exit 0

trap '
exitproc2
exit 1
' 2 15

export TMPDIR="${PLACE}"
TEMPFILE3="`mktemp`"
export TMPDIR=/tmp
enc_rate=44.1
if test -n "${sample_rate}"; then
testrate="`echo ${sample_rate}|tr -cd '0-9'`"
if test "${testrate}" = "${sample_rate}"; then
enc_rate=`echo "scale=2;${sample_rate} / 1000"|bc`
fi
fi
mplayer "${FileName}.${TARGETEXT}" -vo null -really-quiet -quiet \
-ao pcm:file=/dev/stdout | \
lame --nohist --resample ${enc_rate} -b 64 -c -o --add-id3v2 \
--tg 101 --tt "${cp932title}" - "${TEMPFILE3}"
set +e
chmod go+r "${TEMPFILE3}"
set -e
mv "${TEMPFILE3}" "${FileName}.mp3"
echo "Transcodeing: Done."
