- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
こげな感じ((バージョン追従してない可能性あり。注意))。
#!/bin/sh
#######################
#
# Simple MP3 Jukebox
# KAWAMATA, Yoshihiro
# kaw@on.rim.or.jp
#
#######################
#=====
# utility functions / routines
#=====
# terminate process
#
terminate () {
[ $# -ne 0 ] && echo "$@"
rm -rf ctrl/playing
[ -r ctrl/finish ] && . ctrl/finish
}
# trap for ^C
#
trap 'terminate "Aborted by user" ; exit' 2
# check flags,
# fetch a file,
# play it
#
# Usage: play_one_action { local_file | URL }
#
play_one_action () {
[ $# -eq 0 ] && return
# halt, reboot or exit
#
if [ -f ctrl/halt ]; then
terminate "Halting..."
rm -f ctrl/halt
/sbin/shutdown -hp now
elif [ -f ctrl/reboot ]; then
terminate "Rebooting..."
rm -f ctrl/reboot
/sbin/shutdown -r now
elif [ -f ctrl/restart ]; then
terminate "Restarting scipt..."
rm -f ctrl/restart
exec $progfile
elif [ -f ctrl/exit ]; then
terminate "Exiting..."
rm -f ctrl/exit
exit
fi
# clean non-MP3 file and empty directories under spool
#
if [ -f ctrl/clean ]; then
echo "Clearning dirs..."
rm -f ctrl/clean
find $src $dest oneshot oneshot_finished -type f \! \( -iname '*.mp3' -o -iname '*.url' \) -print0 | xargs -0 rm -f
for d in $src $dest oneshot oneshot_finished; do
(cd $d && find . -type d -print | sort -r | xargs rmdir >/dev/null 2>&1)
done
fi
# pause playing
#
if [ -f ctrl/pause ]; then
echo "Pausing..."
while [ -f ctrl/pause ]; do
sleep 15
done
fi
# play MP3 file
#
# ... invoke MP3 player with high priority
#
case "$1" in
http://*.mp3|ftp://*.mp3)
#
# Cats are buffers against network stall.
# Please adjust its numbers, if necessary.
#
ftp -o - "$1" |cat|cat|cat| nice -n -15 /usr/local/bin/mpg123 $opts -
;;
*.[Mm][Pp]3)
if [ -f "$1" ]; then
nice -n -15 /usr/local/bin/mpg123 $opts "$1"
else
echo "Cannot find $1"
fi
;;
esac
}
# move played file to another directory.
# directory hierarchy preserved.
#
# Usage: movefile srcpath desttop
#
movefile () {
[ $# -lt 2 ] && return
destdir=$2/${1#*/}
destdir=${destdir%[^/]*}
if [ -d $destdir ]; then
mv $1 $destdir
else
su mp3play -c "mkdir -p $destdir" && mv $1 $destdir
fi
}
#=====
# Running code from here
#=====
# Base and current directory is where script placed.
#
progfile=$0
cd `dirname $progfile` || exit 1
# check if another player running
#
if mkdir ctrl/playing; then
date > ctrl/playing/started
chmod 0000 ctrl/playing
else
echo "Another player running"
exit 1
fi
# remove stale files
#
rm -f ctrl/exit ctrl/reboot ctrl/halt
# user initialization
#
[ -r ctrl/init ] && . ctrl/init
#=====
# main loop ... play MP3 and its control
#=====
while :; do
# parameters to MP3 player
#
unset opts
[ -f ctrl/mpg123opts ] && opts=`cat ctrl/mpg123opts`
# We have two spool directories for infinite loop
# ... spool0 and spool1.
#
# set direction of file movement
# between two spools
# when every MP3 file played
#
if [ -f ctrl/reverse ]; then
src=spool1
dest=spool0
else
src=spool0
dest=spool1
fi
# playlist is symlink to spool for playing.
#
rm -f playlist
ln -s $src playlist
# for every MP3 files
# control and/or playing
#
for playfile in `find $src -type f \( -iname '*.mp3' -o -iname '*.url' \) | sort`; do
# retrieve resource location
#
case "$playfile" in
*.[Uu][Rr][Ll])
mp3reslist=`cat $playfile`
;;
*.[Mm][Pp]3)
mp3reslist=$playfile
;;
esac
# for every MP3 resource ...
#
for mp3res in $mp3reslist; do
# perform one shot playlist
#
for oneshot in `find oneshot -type f \( -iname '*.mp3' -o -iname '*.url' \) | sort`; do
# retrieve resource location
#
case "$oneshot" in
*.[Uu][Rr][Ll])
oneshot_mp3res=`cat $oneshot`
;;
*.[Mm][Pp]3)
oneshot_mp3res=$oneshot
;;
esac
for os_mp3 in $oneshot_mp3res; do
play_one_action $os_mp3
# restart at current spool
#
if [ -f ctrl/rescan ]; then
break 2
fi
done
movefile $oneshot oneshot_finished
done
play_one_action $mp3res
# restart at current spool
#
if [ -f ctrl/rescan ]; then
echo "Recanning playlist..."
break 2
fi
done
# move played file to the other spool
#
movefile $playfile $dest
done
# pause when no MP3 files in spools
#
if [ X"$playfile" = X ]; then
noplay=Z$noplay
echo "No file to play : $noplay"
if [ $noplay = ZZ ]; then
echo "Now sleeping for 60 secs..."
sleep 60
noplay=""
fi
else
noplay=""
fi
# role change of spools
# (not changing when rescan)
#
if [ -f ctrl/rescan ]; then
rm -f ctrl/rescan
else
if [ -f ctrl/reverse ]; then
rm -f ctrl/reverse
else
touch ctrl/reverse
fi
fi
done