[原创]一个播放文件夹里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
论坛版主
帖子: 22110
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球
送出感谢: 7 次
接收感谢: 75 次

#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
论坛版主
帖子: 22110
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球
送出感谢: 7 次
接收感谢: 75 次

#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脚本”