#!/bin/bash
# doanload-radio.shやall-process-asx.shでダウンロードしたファイルを
# GUIでリスト表示するスクリプト
#
# 通常は引数なしで実行します。

BOTHMODE=false # 既着・新着を区別する・しないを制御する変数(trueの場合に区別しない)
# 日常的にlatest-copy.shを用いて携帯プレーヤーへ持ち出した上での試聴をおこなう場合は、
# BOTHMODEを初期状態のfalseのままで運用して既着・新着を区別した方が便利かもしれません。
# そうじゃない場合は、BOTHMODEはtrueに設定して、既着・新着を区別しない方が便利だと思わ
# れます。

DOCUMENTROOT=/home/disklessfun/Documents
FILELST="${DOCUMENTROOT}/Complete.lst" # ダウンロードしたファイル一覧
DONELST="${DOCUMENTROOT}/Done.lst"     # 既に持ち出したファイル一覧
PLAYER="totem" # 好みの再生コマンドを設定する
MAXLINES=50 # 最大表示行数
FIRSTLINEMSG="新着以外も一緒に表示する"
FLMSG=false
FORCEBOTH=false
ROWHEIGHT=23  # 各自の環境に合わせる
FIXHEIGHT=120 # 各自の環境に合わせる
HEIGHT=

# 二重起動チェック
SHELLNAME=${0##*/}  # 最後の/より後ろを取り出す
SHELLBASE=${SHELLNAME%\.*}
SHELLEXT=${SHELLNAME##*\.}
test "${SHELLBASE}" != "${SHELLEXT}" && SHELLEXT=".${SHELLEXT}"
PROCESSNUM=$(ps aux|grep -v "sh -c "|grep "${SHELLBASE}"|grep "${SHELLEXT}"|wc -l)
if test ${PROCESSNUM} -ge 3; then
echo "${SHELLNAME} now running."
exit
fi

length=${#DOCUMENTROOT}
indent=$(($length+2))
TEMPFILE1=$(mktemp) # FILELSTに存在チェックをかけたもの
TEMPFILE2=$(mktemp) # 存在チェック済みの新着リスト

# たとえ冒頭でBOTHMODE=falseを設定していても、
# 引数--bothmodeが与えられた場合、BOTHMODE=trueに設定します。
case "${1}" in
	--bothmode)BOTHMODE=true;;
	-h|--help)
	echo "${0} [--bothmode]";exit
	;;
esac


set_msg_all_files()
{
TITLE="最近のファイル一覧"
MSG="最近の${lines1}ファイルを表示しています。選択したファイルを再生することもできます。　　　　　"
}

set_msg_allready_arrived()
{
TITLE="新着ファイルはありません。"
MSG="とりあえず最近の${lines1}ファイルを表示します。選択したファイルを再生することもできます。　　"
}

set_msg_new_arrivals()
{
TITLE="新着ファイル一覧です。"
MSG="新着の${lines2}ファイルを表示しています。選択したファイルを再生することもできます。　　　　　"
}

gen_line_str_1()
{
for ((i=$lines1;i>0;i--))
do
line="$(tail -${i} "${TEMPFILE1}"|head -1|cut -b${indent}-)"
str=${str}" \"${line}\""
done
HEIGHT=$((${lines1}*$ROWHEIGHT+$FIXHEIGHT))
}

gen_line_str_2()
{
for ((i=$lines2;i>0;i--))
do
line="$(tail -${i} "${TEMPFILE2}"|head -1|cut -b${indent}-)"
str=${str}" \"${line}\""
done
HEIGHT=$(($((${lines2}+1))*$ROWHEIGHT+$FIXHEIGHT))
}


if !(test -e "${FILELST}"); then
	zenity --error --title "エラー" --text "ファイルComplete.lstがありません。"
	exit 1
fi

lines1=0
while read i
do
if test -e "${i}"; then
	echo "${i}" >> ${TEMPFILE1}
	lines1=$(($lines1+1))
else
	echo "${i} not found"
fi
done<"${FILELST}"

test ${lines1} -gt $MAXLINES && lines1=$MAXLINES
if test ${lines1} -eq 0; then
	zenity --error --title "エラー" --text "ダウンロードされたファイルがありません。"
exit 1
fi

lines2=0
if ! $BOTHMODE; then
	if test -e "${DONELST}"; then
		while read i
		do
		if (grep -q "$i"<"${DONELST}") then
			continue
		fi
		echo "${i}" >> ${TEMPFILE2}
		lines2=$(($lines2+1))
		done<${TEMPFILE1}
	else
		cp ${TEMPFILE1} ${TEMPFILE2}
		lines2=$lines1
	fi
fi

test ${lines2} -gt $MAXLINES && lines2=$MAXLINES
if test ${lines2} -eq 0; then
	rm ${TEMPFILE2}
	if $BOTHMODE; then
		set_msg_all_files
	else
		set_msg_allready_arrived
	fi
	str=
	gen_line_str_1
	rm ${TEMPFILE1}
else
	#rm ${TEMPFILE1} # 後で使うかもしれないので削除しない
	set_msg_new_arrivals
	str="${FIRSTLINEMSG} "
	FLMSG=true
	gen_line_str_2
	rm ${TEMPFILE2}
fi

ret=$(eval zenity --height ${HEIGHT} --list --title "${TITLE}" --text "${MSG}" \
--multiple --column "　" ${str})
test -z "${ret}" && rm -rf ${TEMPFILE1} && exit

# 以下5行はあるバージョンのzenityのlistのダブルクリック時バグ対応
testline=${ret%%|*}
testline2=${ret##*|}
if test "${testline}" = "${testline2}"; then
	ret=${testline}
fi

if $FLMSG; then
	if test "${ret//|/}" = "${ret}"; then
		if test "${ret}" = "${FIRSTLINEMSG}"; then
			FORCEBOTH=true
		fi
	fi
fi

if $FORCEBOTH; then
	set_msg_all_files
	str=
	gen_line_str_1
	rm ${TEMPFILE1}
	ret=$(eval zenity --height ${HEIGHT} --list --title "${TITLE}" --text "${MSG}" \
	--multiple --column "　" ${str})
	test -z "${ret}" && exit
else
	rm -rf ${TEMPFILE1}
fi

# 以下5行はあるバージョンのzenityのlistのダブルクリック時バグ対応
testline=${ret%%|*}
testline2=${ret##*|}
if test "${testline}" = "${testline2}"; then
	ret=${testline}
fi

if test "${ret//|/}" = "${ret}"; then
	str=\"$(grep "${ret}" "${FILELST}"|tail -1)\"
else
	str=
	for ((i=1;i<=$MAXLINES+1;i++))
	do
	line="$(echo "${ret}"|cut -d"|" -f$i)"
	test -z "${line}" && break
	if test "${line}" != "${FIRSTLINEMSG}"; then
		file="$(grep "${line}" "${FILELST}"|tail -1)"
		str=${str}" \"${file}\""
	fi
	done
fi

eval exec "${PLAYER}" "${str}" &
