MP3 Jukeboxで再生の制御をやらせてるスクリプト;~
こげな感じ((バージョン追従してない可能性あり。注意))。
 #!/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

Top Index Search Recent Backups  Help  RSS