[原创]一个播放文件夹里MP3音乐的脚本

sh/bash/dash/ksh/zsh等Shell脚本
jlu-windy
帖子: 19
注册时间: 2008-03-27 16:37
送出感谢: 0
接收感谢: 0

[原创]一个播放文件夹里MP3音乐的脚本

#1

帖子 jlu-windy » 2008-08-31 16:58

一直感觉Rhythmbox用的时候不怎么舒服,貌似连MP3文件名在列表里都不能显示(反正我没找到。。)
所以闲着自己写了一个自己用。
用法很简单: 脚本名 音乐目录
然后有一些操作:
a) level up
s) level down -.-
d) 查看当前 level
l) 列出播放列表
c)清除屏幕
n) 下一首
m) 上一首
-) 减小音量
+) 增加音量
q) 退出
要说一下的是,level在这里的含义,当它为1时,你按下[1-9]就会自己播放第[1-9]首音乐
为2时,你就得按两个数字播放第10-99首音乐,按下a可以使level升级,s则相反,d查看当前level
下面是代码,(如果有什么疑问或讨论在这里留言或给我发EMAIL:lyfi2003@sina.com)
请不要说这东西有没用,过时不过时的话题,因为这仅仅是练习,谢谢~
补充一下,后台调用的是mplayer,如果没有安装就无法正常使用,不过可以自己改一下代码。just for fun


1)新添加改变音量大小快捷键,注意会影响系统音量(其实就是调整系统音量);



2)谢谢提醒,已经修复文件夹有空格无法正常播放的bug;



3)更改信号28为29,以防止发送信号冲突


4) 添加支持wma播放
代码:

代码: 全选

#!/bin/bash
myplayer (){             #后台调用播放音乐函数
   if which mplayer >/dev/null;then
   exec   mplayer "$1" >&/dev/null #用exec调用替换进程
   fi 
   }
rmNumfile(){
   if [ -f .num ];then
      rm .num
   fi
}
rmMenufile(){
   if [ -f .menu ];then
      rm .menu
   fi
}
#define some signals
sigNext=25
sigPre=26
sigExit=27
sigNum=29
#
#you can add some more

#以下为操作处理函数
next(){
#   kill -$sigNext $1
#   echo "kill -$sigNext $1"
   echo "下一个..."
   kill -$sigNext $1
}
pre(){
#   echo "kill -$sigPre $1"
   echo "上一个..."
   kill -$sigPre $1
}
myexit(){
   echo "接收到退出信号,请稍等..."
   kill -$sigExit $1
   sleep 2
   echo "主进程退出!"
}
csnum(){
   
   echo "选中第$(cat .num) 首。"
#   echo "`expr $1 - 1`" > .num
   kill -$sigNum $2
}
getkey(){
   local state substate oldstate
   state=1
   oldstate=$state
      rmNumfile
      rmMenufile
#   echo mypid=$$      #主进程ID
   getkeypid=$1
      trap "rmNumfile; rmMenufile; kill -$sigexit $getkeypid;" 2 3
   while true
      do
       read -s -n 1 ans
#      echo $ans
      case "$ans" in
         [nN]|[jJ])
              next $getkeypid
              ;;
         [mM]|[kK])
            pre $getkeypid
            ;;
         q|Q)
            myexit $getkeypid
                   exit 0
            ;;
         [0-9]) if [ "$state" == "1" ];then
            echo -n "$ans" >> .num
            csnum $ans $getkeypid
            state="$oldstate"
            elif [ "$state" == "2" ];then
            echo -n "$ans" >>.num
            state=`expr "$state" - 1`
            elif [ "$state" -eq "3" ];then
             echo -n "$ans" >.num
            state=`expr "$state" - 1`
            else
               echo "an error accur"
            fi
            ;;
         a|A)  if [ "$oldstate" -lt "3" ];then
                      oldstate=`expr "$oldstate" + 1`
               echo "now level $oldstate"
            else
               echo " now level $oldstate"
            fi
               state=$oldstate
               rmNumfile   
            ;;
         s|S) if [ "$oldstate" -gt "1" ];then
               oldstate=`expr "$oldstate" - 1`
               echo "now level $oldstate"
            else
               echo "now level $oldstate"
            fi
               state=$oldstate
               rmNumfile   
            ;;
         d|D) echo "now level $oldstate"
            ;;
         l)   clear
                 cat .menu|more
            ;;
         L)   clear
                 cat .menu
            ;;
         c|C)  clear
            ;;
         -|_)  amixer set Master 7%- >& /dev/null
                   ;;
         +|=)  amixer set Master 7%+ >& /dev/null
                   ;;
         *) echo no such op;;
         esac
      done
}

NothingPlay(){
   echo There is nothing mp3,please input Q to exit!
}

getpid(){         #暂时没用到的函数
   ppid=$(ps aux|grep "myplayer" |grep -v "grep")
      if [ "$ppid" == "" ];then
         return -1;
           fi
      pid=$(echo $ppid |awk '{print $2}')
      return $pid
}

killpid(){
   kill -9 "$1" >&/dev/null
      return "$?"
}
myUsage(){
   cat << EOF

      Usage: $APP_NAME [MusicDIRCTORY]

      Start playing Music.(version $APP_VERSION)
      @GPL

           -h, --help              display this help and exit

      some operations for example:
      a)  level up
      s)  level down :)
      d)  show current level
      l)  list  menu
      n)  next
      m)  pre
            -) volume down
           +) volume up
      q)  exit
      for more message,please send email to lyfi2003@sina.com
EOF

}
#信号处理部分
#do_sigNum(){
#   if [ "$glNum" != "" ]
#      then
#         n=`expr $glNum + 0 ` #转换为数字
#      else
#      n=1               #从头开始
#      fi
#      killpid $mplayerpid
#}
runAskey(){                  #后台守护进程
#定义本地变量
   local line n playing;
#   在此进行信号挂载
   trap 'killpid  $mplayerpid;rmNumfile;rmMenufile;exit 0;' $sigExit
   trap 'killpid  $mplayerpid ;' $sigNext
   trap ' n=`expr "$n" - 2`;killpid $mplayerpid ;' $sigPre
#   trap ' n=`awk \' NR==1 {print $1;}\' .num`;killpid $mplayerpid;' $sigNum
   trap ' n=$((($(cat .num) - 1))) ;rmNumfile;killpid $mplayerpid;' $sigNum
#   echo $1   
   if [ ! -d "$1" ]
      then
         myUsage
         echo "please input Q to exit"
         exit 0
   fi
       
   line=`ls "$1"|egrep 'mp3$|wma$'   |wc -l`
   
   if [ "$line" == "0" ]
      then
         NothingPlay
         exit 0
   fi
   n=1
        ls "$1"|egrep  'mp3|wma'|awk '{print NR,$0}' | tee .menu
   while [ "$n" -le "$line" ]
      do
      playing=$(ls "$1"|egrep 'mp3|wma'|sed  -n ''"$n"'p')
         echo "正在播放:$playing            下一首:$(ls "$1"|egrep 'mp3|wma'|sed -n ''"$((($n+1)))"'p')"
   if [ -f "$1"/"$playing" ];then            #调整目录结构
   myplayer "$1"/"$playing"&
   else
       if [ -f "$1""$playing" ];then
      myplayer "$1""$playing" &
      fi

   fi
   mplayerpid="$!"   
#   echo "mplayerpid=$mplayerpid" 保存音乐进程ID
   wait $mplayerpid           #等待音乐结束
      sleep 2
      n=`expr "$n" + 1` #播放下一首
      echo "请等待..."
      done
      echo "播放完毕,按 ‘q‘以退出!"
      while :
         do
         sleep 10
         done
}
APP_NAME="${0##*[\\/]}"
APP_VERSION="0.0"
directory="$1"
if [ "$2" == "--show" ];then
runAskey "$directory"
else
$0 "$1" --show &          #启动后台守护进程
#echo "pid=$!"
if [ "$1" != "-h" ];then
         if [ "$1" != "--help" ];then
          getkey $!                 #启动前台接收操作
    fi
fi
fi
[/code]
上次由 jlu-windy 在 2008-09-03 11:44,总共编辑 9 次。
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#2

帖子 xiooli » 2008-08-31 17:08

不错,lz用

代码: 全选

xxxx
括起来吧,这样代码会好看些。
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#3

帖子 yjcong » 2008-08-31 17:47

”后台守护进程“会占用多少的cpu?
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#4

帖子 xiooli » 2008-08-31 17:50

yjcong 写了:”后台守护进程“会占用多少的cpu?
你说的是那个trap?那个几乎不占cpu吧。
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#5

帖子 bones7456 » 2008-08-31 17:51

不错哦~
关注我的blog: ε==3
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#6

帖子 yjcong » 2008-08-31 18:02

怎么回事??

some operations for example:
a) level up
s) level down :)
d) show current level
l) list menu
n) next
m) pre
q) exit
for more message,please send email to lyfi2003@sina.com
please input Q to exit
选中第2首。
./mppp: line 47: kill: (11416) - No such process
now level 1
选中第2首。
./mppp: line 47: kill: (11416) - No such process
选中第11首。
./mppp: line 47: kill: (11416) - No such process
选中第102首。
./mppp: line 47: kill: (11416) - No such process
now level 1
下一个...
./mppp: line 30: kill: (11416) - No such process
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
jlu-windy
帖子: 19
注册时间: 2008-03-27 16:37
送出感谢: 0
接收感谢: 0

#7

帖子 jlu-windy » 2008-08-31 18:23

楼上,用法如下:
脚本名 + 文件夹
例如: pplay ~/Music
pplay是脚本名
如果加参数是 -h --help 或者没加参数就会出帮助信息,而不会自动退出
如果你想退出 按q就可以了。
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#8

帖子 yjcong » 2008-08-31 18:28

我没有办法用9和0调节声音了
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
jlu-windy
帖子: 19
注册时间: 2008-03-27 16:37
送出感谢: 0
接收感谢: 0

#9

帖子 jlu-windy » 2008-08-31 18:53

嗯,这个问题我也正在考虑呢。不知道谁有mplayer进程的信号处理方面的资料,也许可以实现。

还有交互问题还不是很满意。那个KILL输出难道是内核给的,重定向也不好使,谁有好的方案大家可以一起商量。

刚才我按二楼意见重新调整了一下格式,看着清楚一些。谢谢二楼提醒。
上次由 jlu-windy 在 2008-08-31 19:02,总共编辑 1 次。
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#10

帖子 yjcong » 2008-08-31 19:02

jlu-windy 写了:嗯,这个问题我也正在考虑呢。不知道谁有mplayer进程的信号处理方面的资料,也许可以实现。
刚才我按二楼意见重新调整了一下格式,看着清楚一些。谢谢二楼提醒。


可以,比如,shift+9 和shift+0
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
jlu-windy
帖子: 19
注册时间: 2008-03-27 16:37
送出感谢: 0
接收感谢: 0

#11

帖子 jlu-windy » 2008-08-31 19:07

不是快捷键冲突问题,是没办法去控制mplayer进程,而让它改变音量。
如果去改变系统音量就没什么意义了。(已经添入调整音乐的代码了)
上次由 jlu-windy 在 2008-09-01 14:48,总共编辑 1 次。
头像
adagio
论坛版主
帖子: 22120
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球
送出感谢: 7 次
接收感谢: 74 次

#12

帖子 adagio » 2008-08-31 19:17

代码: 全选

      Usage: pp [MusicDIRCTORY]

      Start playing Music.(version 0.0)
      @GPL

           -h, --help              display this help and exit

      some operations for example:
      a)  level up
      s)  level down :)
      d)  show current level
      l)  list  menu
      n)  next
      m)  pre
      q)  exit
      for more message,please send email to lyfi2003@sina.com
please input Q to exit
下一个...
./pp: line 30: kill: (634) - 没有该进程
下一个...
./pp: line 30: kill: (634) - 没有该进程
接收到退出信号,请稍等...
./pp: line 39: kill: (634) - 没有该进程
主进程退出!


为什么我的只看到这个,就是不响啊? :oops:
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#13

帖子 yjcong » 2008-08-31 19:19

脚本+文件夹
不是加mp3文件
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
adagio
论坛版主
帖子: 22120
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球
送出感谢: 7 次
接收感谢: 74 次

#14

帖子 adagio » 2008-08-31 19:21

我肯定是文件夹啊 :shock:
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手
jlu-windy
帖子: 19
注册时间: 2008-03-27 16:37
送出感谢: 0
接收感谢: 0

#15

帖子 jlu-windy » 2008-08-31 19:34

好了,改变音量的添进来了
代码如下:
amixer set Master 10%-
amixer set Master 10%+
在我机子调试ok ,大家若有不好使的可以去google看看自己机子的声卡类型。
回复

回到 “Shell脚本”