#!/bin/bash
#
# ストリーミング放送をローカルにダウンロードするスクリプト
# 
# 動作に必要なモジュール(radiodownload-setを用いた半自動インストールを推奨)
# download-wma.sh
# nkf fdupes mplayer lame 各パッケージ(mplayerとlameはdownload-wma.sh用)
# Perl Audio::WMAモジュール(download-wma.sh用)
#
# 他に、オプションとして、afsbinコマンド(Linux用はバイナリで入手できます)を導入し、
# 所定のコメントアウトを外せば、WMVファイルへのインデックス付加機能および
# WMVファイルからのWMAファイル抽出機能を追加することができます。
# (インデクッス付加機能を追加する場合はdownload-wma.sh内のコメントアウトを外す)
#
[ $# -lt 2 ] && echo "$0 [-A, --asxurlidentifiable] [-T, --transcode] \
http://program-homepage place" && exit 1
PRIASX=false
TRCODE=false
while test -n "${1}"
do
case "${1}" in
-A|--asxurlidentifiable)
PRIASX=true
shift;;
-T|--transcode)
TRCODE=true
shift;;
*)break;;
esac
done

URL=$1
PLACE=$2

exitproc2(){ rm -rf "${TMPFILE6}";}

#
# videonewsディレクトリとfreeディレクトリとの間で重複ファイルがあった場合、
# videonewsディレクトリ側のファイルを削除します。
#
fdups-delete-videonews()
{
if ! test -e "${DOCUMENTROOT}/VideoNews/free"; then
return
fi
fdupes -R "${DOCUMENTROOT}/VideoNews" 2>/dev/null| \
grep -v -e "/free/" -e "^$"|while read i
do
set -x
rm "${i}"
set +x
done
}

#
# videonewsの50kbpsのWMVファイル用およびWMAファイル用のasxファイルを削除します。
#
delete-needless-videonews()
{
if ! test -e "${DOCUMENTROOT}/VideoNews/videonews"; then
return
fi
if ! test -e "${DOCUMENTROOT}/VideoNews/free"; then
return
fi
find -L "${DOCUMENTROOT}/VideoNews" -maxdepth 2 -name "*.asx"|while read -r i
do
if (grep -q -e .wma -e _50.wmv -e _50\..wmv "${i}"); then
set -x
rm "${i}"
set +x
fi
done
}

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}"
}

downfiles()
{
rm *.asx *.wvx *.wax

protocol=${URL%%//*}  # 最初の//より前を取り出す
urlrest=${URL#*//}  # 最初の//より後ろを取り出す
urltop=${urlrest%%/*}  # 最初の/より前を取り出す
urltop=${protocol}//${urltop}
TMPFILE1="`mktemp`"
TMPFILE2="`mktemp`"
${WGET} -O "${TMPFILE1}" ${URL}
if test $? -eq 0; then
trap '
exitproc2
exit 1
' 2 15
TMPFILE6="`mktemp`"
cat ${TMPFILE1}|nkf -e -Lu > "${TMPFILE6}"
perlscript="$(echo "my \$file=\"${TMPFILE6}\";open (SFH, \"<\$file\"); \
undef $/;my \$Src=<SFH>;close(SFH);\$Src=~s/<!--.*?-->//sg; \
\$Src=~s/a\ href\=/a\ href\=\\n/isg; \
\$Src=~s/a\s+.+href\=/a\ href\=\\n/ig; \
\$Src=~s/a.+\s+href\=/a\ href\=\\n/ig; print \$Src;")"
perlcmdline="$(echo perl -e \'${perlscript}\')"
eval ${perlcmdline} > "${TMPFILE1}"
rm "${TMPFILE6}"
trap 1 2 15
grep -e \.asx -e \.wvx -e \.wax "${TMPFILE1}">"${TMPFILE2}"
while read -r line
do
if (echo "${line}"|egrep "^http\://"|grep -qv "&id\="); then
	TARGETURL=${line%%\"*}  # 最初の"より前の文字列を取り出す   
else
	testline=${line#*url=*}  # 最初のurlより後ろの文字列
	if test "${line}" != "${testline}" ; then
		line=${testline}  # url=が含まれている場合
	else
		line=${line#*href*}  # 最初のhrefより後ろの文字列を取り出す
	fi
	line=${line#*\"*}  # 最初の"より後ろの文字列を取り出す
	line=${line%%\"*}  # 最初の"より前の文字列を取り出す   
	#testline=${line%*\.${TARGETEXT}}  # 指定拡張子の切取を試みる
	testline=${line%\.*}  # 最後の.より前の文字列を取り出す
	if test "${line}" != "${testline}" ; then  # 切取に成功した場合
		testline=${line%*//*}  # //が含まれているかチェック
		if test "${line}" != "${testline}" ; then
			TARGETURL=${line}  # //が含まれている場合
		else
			if test "x${line:0:1}" = "x/"; then
			# 絶対パスで指定されている場合
			TARGETURL=${urltop}${line} 
			else
			# 相対パスで指定されている場合
			urlrest=${URL%/*}  # 最後の/より前の文字列を取り出す
			TARGETURL=${urlrest}/${line}
			fi
		fi
	else
		continue
	fi
fi

	TARGETFILE=${TARGETURL##*/}
	TARGETFILE=$(sanitize_filename "${TARGETFILE}")
	TARGETFILE="${TARGETFILE%\.*}.asx"

	${WGET} -N -O "${TARGETFILE}" "${TARGETURL}"
	test $? -ne 0 && test -e "${TARGETFILE}" && rm "${TARGETFILE}"
	test -e "${TARGETFILE}" && ! test -s "${TARGETFILE}" && rm "${TARGETFILE}"
	if test -e "${TARGETFILE}"; then
		size=$(stat -c %s "${TARGETFILE}")
		if test ${size} -ge 1000; then
			echo "Not an asx file ${TARGETFILE}, removing..."
			rm "${TARGETFILE}"
		fi
	fi


done<"${TMPFILE2}"
fi
rm "${TMPFILE1}" "${TMPFILE2}"
}

process_asx()
{
find . -maxdepth 1 -type f -name "*.asx"|sort|while read -r i
do
TARGETFILE=${i##*/}  # 最後の/より後ろを取り出す
basename=${TARGETFILE%\.*}
echo "${TARGETFILE}"

line="$(cat "${TARGETFILE}"|nkf -w -Lu|grep -i "ref href"|tail -1)"
testline=${line#*href*}  # 最初のhrefより後ろの文字列を取り出す
if test "${testline}" != "${line}"; then
line=${testline}
else
line=${line#*HREF*}  # 最初のHREFより後ろの文字列を取り出す
fi
line=${line#*\"*}  # 最初の"より後ろの文字列を取り出す
line=${line%%\"*}  # 最初の"より前の文字列を取り出す   
URL="${line}"
line="$(cat "${TARGETFILE}"|nkf -w -Lu|grep \<TITLE|tail -1)"
line=${line#*TITLE>*}  # TITLE>より後ろの文字列を取り出す
line=${line%%</TITLE*}  # </TITLEより前の文字列を取り出す   
TITLE="${line}"
line="$(cat "${TARGETFILE}"|nkf -w -Lu|grep \<Title|tail -1)"
line=${line#*Title>*}  # Title>より後ろの文字列を取り出す
line=${line%%</Title*}  # </Titleより前の文字列を取り出す   
Title="${line}"
if test -n "${TITLE}" && test -n "${Title}"; then
fname="${TITLE} ${Title}"
elif test -n "${TITLE}"; then
fname="${TITLE}"
elif test -n "${Title}"; then
fname="${Title}"
else
fname=${basename}  # 多分このようなケースはないだろう
fi
fname=$(sanitize_filename "${fname}")
while [ "$(echo "${fname}"|cut -b1)" == "-" ]
do
fname=$(echo "${fname}"|sed -e 's/^-//')
done
urlsuffix=${URL##*/}  # 最後の/より後ろ
TARGETEXT=${urlsuffix##*\.}
urlsuffix=${urlsuffix%\.*}  # 最後の.より前
suffixlen=${#urlsuffix}
testsuffix=$(echo ${urlsuffix}|tr -d '0-9')
testsuffixlen=${#testsuffix}
testsuffixlen=$((testsuffixlen+3))
if $PRIASX && test ${testsuffixlen} -le ${suffixlen}; then
	# PRIASXがtrueかつ
	# urlsuffixに数字が3個以上含まれている場合はユニーク識別子としての
	# 価値を持つと判断してそれをファイル名の一部に使用する
	filesuffix=${urlsuffix}
	# このような命名をおこなう場合はダウンロード前に重複チェックが
	# おこなえる
	if test -e "${fname}-${filesuffix}.${TARGETEXT}"; then
	echo "${fname}-${filesuffix}.${TARGETEXT} already exists"
	continue  # next one
	fi
else
	# 上記以外の場合は代わりのユニーク識別子として
	# asxのファイル名と時間をファイル名の一部に使用する
	filesuffix=${basename}
	PRIASX=false
fi
export PRIASX
export FILENAME="${fname}-${filesuffix}"

if $PRIASX; then
	if $TRCODE; then
		echo "filename:${FILENAME}"
		download-wma.sh ${URL} . --nodupchk
		if test $? -eq 0; then
			if test "${TARGETEXT}" == "wmv"; then
				echo "`pwd`/${fname}-${filesuffix}.${TARGETEXT}" >> "${FILELST}"
			fi
			echo "`pwd`/${FILENAME}.mp3" >> "${FILELST}"
	#		led-orange on
		fi
	else
		echo "filename:${FILENAME}"
		download-wma.sh ${URL} . --downloadonly --nodupchk
		if test $? -eq 0; then
			echo "`pwd`/${FILENAME}.${TARGETEXT}" >> "${FILELST}"
	#		led-orange on
# afsbinコマンドを導入していれば有効にできる
#			if test "${TARGETEXT}" == "wmv"; then
#				extract-wma-from-wmv.sh "${fname}-${filesuffix}.${TARGETEXT}"
#				if test -e "${fname}-${filesuffix}.wma"; then
#					echo "`pwd`/${fname}-${filesuffix}.wma" >> "${FILELST}"
#				fi
#			fi
		fi
	fi
else
	if $TRCODE; then
		echo "temporary filename:${FILENAME}-${STARTTIME}"
		download-wma.sh ${URL} .
		if test $? -eq 0; then
			if test "${TARGETEXT}" == "wmv"; then
				matchpattn="*-${STARTTIME}.${TARGETEXT}"
				echo "`pwd`/`ls -tr ${matchpattn}|tail -1`" >> "${FILELST}"
			fi
			matchpattn="*-${STARTTIME}.mp3"
			echo "`pwd`/`ls -tr ${matchpattn}|tail -1`" >> "${FILELST}"
	#		led-orange on
		fi
	else
		echo "temporary filename:${FILENAME}-${STARTTIME}"
		download-wma.sh ${URL} . --downloadonly
		if test $? -eq 0; then
			matchpattn="*-${STARTTIME}.${TARGETEXT}"
			FileName="`ls -tr ${matchpattn}|tail -1`"
			echo "`pwd`/${FileName}" >> "${FILELST}"
	#		led-orange on
# afsbinコマンドを導入していれば有効にできる
#			if test "${TARGETEXT}" == "wmv"; then
#				extract-wma-from-wmv.sh "${FileName}"
#				FileName="${FileName%\.*}.wma"
#				if test -e "${FileName}"; then
#					echo "`pwd`/${FileName}" >> "${FILELST}"
#				fi
#			fi
		fi
	fi
fi
done
}


LANG=C
export FILENAME=
PATH=${PATH}:/usr/local/bin
WGET="wget -t 1 -T 15"
DOCUMENTROOT=/home/disklessfun/Documents
FILELST="${DOCUMENTROOT}/Complete.lst"
STARTTIME=`date '+%Y%m%d%H%M'`;export STARTTIME
mkdir -p "${PLACE}" || exit 1
cd "${PLACE}" || exit 1
LOGDIR="${DOCUMENTROOT}/01_logs"
mkdir -p "${LOGDIR}"

# 同一ディレクトリを対象にした二重起動をチェック
SHELLNAME=${0##*/}  # 最後の/より後ろを取り出す
PROCESSNUM=$(ps aux|grep -v "sh -c "|grep "${SHELLNAME}"|grep "${PLACE}"|wc -l)
if test ${PROCESSNUM} -ge 3; then
echo "Duplicate process, exiting..."
exit
fi

downfiles
fdups-delete-videonews
delete-needless-videonews
process_asx
