#!/bin/bash
#
# auto-latest-copy.sh
# 一応、メインの処理が「最新ファイルの持ち出し処理」なのでそう名づけていますが、
# 他の処理を加えた為にあまり適切な名前とも言えなくなっています。
#
# このスクリプトはdevmonから呼ばれることを前提としています。
# とりあえずこのスクリプトはサンヨーのICレコーダー用です。
# 適宜修正すれば他社のICレコーダーや音楽プレーヤーでも使用できます。
#
# このスクリプトはICレコーダー(以下、携帯ストレージ)の中身の書き換え処理を、
# 携帯ストレージ側から受け渡されるフラグに従っておこないます。「携帯ストレージ
# の代理」となって処理をおこなうわけです。
#
# 現在採用しているフラグは「携帯ストレージ内のいくつかの所定のディレクトリに、
# 限度以下のごく小さいMP3ファイルが存在するか否か」です。MP3ファイルを自前で
# 作成・削除できる、ICレコーダーに適したやり方です。
#
# この手法によって「USBホスト機能のない携帯ストレージに擬似的にUSBホスト機能
# を与えることができる」と見ることもできるでしょう。
#
# ***************   処理の説明   ***************
# ■ VOICEディレクトリの中身によるフラグ＝処理全体の制御
# VOICEディレクトリ内に1秒以下の録音ファイルが
# ある場合……何も処理しない(単なるUSBストレージとして扱う)
# ない場合……処理(最新ファイルの持ち出し、MUSICディレクトリ内のサブディレクトリ入替、
# 　　　　　アンマウント)をおこなう
# ■ TUNER_AMディレクトリの中身によるフラグ＝アンマウントの制御
# TUNER_AMディレクトリ内に1秒以下の録音ファイルが
# ある場合……アンマウントしない
# ない場合……アンマウントする
# ■ TUNER_FMディレクトリの中身によるフラグ＝MUSICディレクトリ内のサブディレクトリ入替処理制御
# TUNER_FMディレクトリ内に1秒以下の録音ファイルが
# ある場合……MUSICディレクトリの中身をAタイプにする
# ない場合……MUSICディレクトリの中身をBタイプにする
#
# ※MUSICディレクトリの中身がAタイプの際、Bタイプ用の中身はtaihi_Bディレクトリに退避しておきます。
# ※MUSICディレクトリの中身がBタイプの際、Aタイプ用の中身はtaihi_Aディレクトリに退避しておきます。
# ※taihi_A、taihi_Bディレクトリの直下にはディレクトリのみを収めなければなりません。つまりMUSIC
# ディレクトリ直下にあるファイル(ディレクトリではない)を入れ替えることはできません。MUSICディレ
# クトリ直下のファイル(ディレクトリではない)はサブディレクトリに収める必要のない当座のものに限定
# して運用することを前提としています。たとえば、MUSICディレクトリ直下にはポッドキャストのファイ
# ルを置き、サブディレクトリ以下には音楽や英語学習教材等、まとまったファイルを置けばいいと思います。
# ※たとえMUSICディレクトリ内のサブディレクトリの入替処理を「指示」しても、入れ替えるべき対象が
# ない場合は入替をおこないません。
# サブディレクトリがなく、且つtaihi_?ディレクトリ
# ※Aタイプ時に自動生成されたプレイリストではなくカスタマイズしたプレイリストを使用したい場合は、
# 　listtaihi_AにカスタマイズしたMYLIST3.M3U、MYLIST4.M3U、MYLIST5.M3Uを置いておいて下さい。
# ※Bタイプ時に自動生成されたプレイリストではなくカスタマイズしたプレイリストを使用したい場合は、
# 　listtaihi_BにカスタマイズしたMYLIST3.M3U、MYLIST4.M3U、MYLIST5.M3Uを置いておいて下さい。
# ※MYLIST1.M3U、MYLIST2.M3UはMUSICディレクトリ直下のファイル専用(のつもり)です。make-playlist.sh
# はそのような仕様となっています。
# ※zenityコマンドが必要です。
#

PATH=${PATH}:/usr/local/bin:${HOME}/bin
MEDIAPATH=/media/disklessfun
COPYSH="/home/disklessfun/bin/latest-copy.sh"
COPYLOG="/tmp/latest-copy.log"
COMPLMSG="Copying complete, without errors."
export DISPLAY=:0.0
export LANG=ja_JP.UTF-8

command=${0##*/}  # 最後の/より後ろを取り出す
command=${command%\.*}  # 最後の.より前

LABEL=$1
mountpoint=
if test -n "${LABEL}"; then
mountpoint="${MEDIAPATH}/${LABEL}"
fi
if test -z "${mountpoint}"; then
#led-error on
TEXT="Unable to get mountpoint"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi
sleep 1
if ! test -d "${mountpoint}"; then
#led-error on
TEXT="${mountpoint} not exist"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi

#led-blue on

if ! test -d "${mountpoint}/VOICE"; then
#led-error on
TEXT="${mountpoint}/VOICE not exist"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi
if ! test -d "${mountpoint}/TUNER_FM"; then
#led-error on
TEXT="${mountpoint}/TUNER_FM not exist"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi
if ! test -d "${mountpoint}/TUNER_AM"; then
#led-error on
TEXT="${mountpoint}/TUNER_AM not exist"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi
if ! test -d "${mountpoint}/MUSIC"; then
#led-error on
TEXT="${mountpoint}/MUSIC not exist"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi


# VOICEディレクトリ内に極小容量の録音ファイルがある場合は何もせずに終わる
files=$(find ${mountpoint}/VOICE -name "*.MP3" -size -17000c|wc -l)
test ${files} -ge 1 && exit 0


# 最新ファイル持ち出し処理
echo -n > "${COPYLOG}"
"${COPYSH}" "${LABEL}" 2>&1|tee "${COPYLOG}"| \
(zenity --progress --pulsate --auto-close \
--title "devmon" --text "ファイル持ち出し処理中")
if !(egrep -q "^${COMPLMSG}$" "${COPYLOG}"); then
#led-error on
touch /tmp/Copying_Failure
TEXT="ファイル持ち出し処理中にエラーが発生"
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi

mkdir -p "${mountpoint}/taihi_A"
mkdir -p "${mountpoint}/taihi_B"
mkdir -p "${mountpoint}/listtaihi_A"
mkdir -p "${mountpoint}/listtaihi_B"
cd "${mountpoint}/MUSIC" || exit 1
dirs=$(find . ! -name "." -type d|wc -l) # ディレクトリのみ
files=$(find ${mountpoint}/TUNER_FM -name "*.MP3" -size -17000c|wc -l)
filesA=$(/bin/ls ${mountpoint}/taihi_A|wc -l 2>/dev/null)
filesB=$(/bin/ls ${mountpoint}/taihi_B|wc -l 2>/dev/null)

# TUNER_FMディレクトリ内に極小容量の録音ファイルが存在する場合
# MUSICディレクトリの中身をAタイプにする処理をおこなう
if test ${files} -ge 1; then
# taihi_Bが空であることを確認
if test ${filesB} -eq 0; then
# MUSICディレクトリ下にディレクトリがなく、且つ
# taihi_Aが空でなければ、
if !(test ${dirs} -eq 0 && test ${filesA} -eq 0); then
# 入れ替える
find . ! -name "." -type d -exec mv {} "${mountpoint}/taihi_B" \;
eval mv "${mountpoint}/taihi_A/*" .
make-playlist.sh
# カスタマイズしたプレイリストが必要であればlisttaihiに置いておく
eval cp -p "${mountpoint}/listtaihi_A/MYLIST{3,4,5}.M3U" .
fi
fi
# TUNER_FMディレクトリ内に極小容量の録音ファイルが存在しない場合
# MUSICディレクトリの中身をBタイプにする処理をおこなう
else
# taihi_Aが空であることを確認
if test ${filesA} -eq 0; then
# MUSICディレクトリ下にディレクトリがなく、且つ
# taihi_Bが空でなければ、
if !(test ${dirs} -eq 0 && test ${filesB} -eq 0); then
# 入れ替える
find . ! -name "." -type d -exec mv {} "${mountpoint}/taihi_A" \;
eval mv "${mountpoint}/taihi_B/*" .
make-playlist.sh
# カスタマイズしたプレイリストが必要であればlisttaihiに置いておく
eval cp -p "${mountpoint}/listtaihi_B/MYLIST{3,4,5}.M3U" .
fi
fi
fi

cd /media || exit 1
sync

# TUNER_AMディレクトリ内に極小容量の録音ファイルがある場合はアンマウントしない
files=$(find ${mountpoint}/TUNER_AM -name "*.MP3" -size -17000c|wc -l)
test ${files} -ge 1 && exit 0

# アンマウント
if test -n "${mountpoint}"; then
TEXT="`umount "${mountpoint}" 2>&1`"
if test $? -eq 0; then
touch /tmp/Ejection_Success
# アンマウントが成功したことを画面上に知らせる
(echo 0;sleep 0.1;echo 20;sleep 0.2;echo 60;sleep 0.2;echo 100;sleep 0.2)| \
zenity --progress --auto-close --title "devmon" --text "アンマウント成功"
else
#led-error on
touch /tmp/Ejection_Failure
echo "${TEXT}" > "/tmp/${command}.log"
zenity --error --title "devmon" --text "${TEXT}"
exit 1
fi
fi
#led-blue off
