show lyric for deadbeef 显示歌词(分享)

sh/bash/dash/ksh/zsh等Shell脚本
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

show lyric for deadbeef 显示歌词(分享)

#1

帖子 我就是我2 » 2011-08-06 21:14

其实,下午的时候,已经写好,论坛抽风,发不了。先发在博客上了。现在补发到论坛。
http://wp.me/p1JAvk-jo


修改自 viewtopic.php?f=21&t=339043 1楼 感谢wiewi
为简洁起见,我把主体和函数分开了。
我只是修改很少的一部分。函数我还没看完呢。:-(
比较难的可能是如何获取播放状态吧。
下面是 Deadbeef music player 的一个问题。

I haven’t looked at DeaDBeeF’s command line options, but is there one that will output its status? Then you’d just need a script with an if conditional:

!#/bin/bash
if `deadbeef –state` = “PLAY” #replace this with whatever code is necessary to find out if DeaDBeeF is playing
deadbeef –pause
else
deadbeef –play
endif

…and that’s your play/pause toggle.

我自己想办法解决了。

Chow Daniel
我真是笨啊。檢查播放狀態不一定要直接從程序給出的命令行中得出​。如果1秒前的播放位置和現在不同,那麽它就是“正在播放”
about an hour ago ·

主体部分
文件名 lyric4deadbeef.sh
[bash]
#!/bin/bash
# modified from mpdlyric by wiewi,[email protected]
# Show lyric when playing music with deadbeef
# 2011/07/17
# contributor wiewi,[email protected]
# 2011/08/06
# modified by Danny Chow, [email protected]
# Download function!!
# Finished on July 20,Wednesday
# Last modifed August 6,Saturday
. functions.main
# Lyric dir
[ -d $HOME/.lyrics ] || mkdir $HOME/.lyrics -v

LYRIC=$HOME/.lyrics

# Temp files
[ -d $HOME/tmp ] || mkdir $HOME/tmp -v
SEARCH=$HOME/tmp/search

# Notify timeout
TIMEOUT=1000
case $1 in
-n) CMD='notify-send -t $TIMEOUT -- $TEXT'
;;
*) CMD='echo $TEXT'
;;
esac

Getstatus
while :
do
case $STATUS in
playing) GetInfo
[ -f "$FILE" ] || Download;
ShowLyric;;
*) echo "Deadbeef is not running!" && exit 1;;
esac
done
[/bash]

函数部分
文件名 functions.main
[bash]
#!/bin/bash
# functions for lyric4deadbeef

###### include functions ######
###### Getstatus() GetInfo() ShowLyric() Download() Wait() ######

# modified from mpdlyric by wiewi,[email protected]
# Show lyric when playing music with deadbeef
# 2011/07/17
# contributor wiewi,[email protected]
# 2011/08/06
# modified by Danny Chow, [email protected]
# Download function!!
# Finished on July 20,Wednesday
# Last modifed August 6,Saturday
Getstatus(){
before=$(deadbeef --nowplaying %e 2>/dev/null)
after=$(sleep 1;deadbeef --nowplaying %e 2>/dev/null)
[ $before != $after ] && STATUS="playing"
echo $STATUS
}
GetInfo(){

# Song info
SONG=$(deadbeef --nowplaying %t 2>/dev/null)
ARTIST=$(deadbeef --nowplaying %a 2>/dev/null)
NAME=$SONG

# LRC file
FILE=$LYRIC/`echo $NAME | tr -d ' '`.lrc
}

Download(){
# 从gougou搜索歌词文件并下载
#gougou will lead to the site used below

GetInfo;

PERIOD=''
[ -f "$SEARCH" ] && rm -f $SEARCH

# “歌曲名 歌手” 搜索 管道写法参考lrcdis脚本
wget -c -T 10 "http://www.lrc123.com/?keyword=$NAME $ARTIST&" -O $SEARCH > /dev/null 2>&1 | iconv -f GBK

URL=`cat $SEARCH | grep -B1 '下载' | grep color | sed -n '1p'| sed 's/<[^>]*>//g' | tr -d ' '|sed 's/\\r//'`

# 第一种方式搜索不到,使用“歌曲名” 搜索
if [ -z "$URL" ];then
wget -c -T 10 "http://www.lrc123.com/?keyword=$NAME&" -O $SEARCH > /dev/null 2>&1 | iconv -f GBK
fi
URL=`cat $SEARCH | grep -B1 '下载' | grep color | sed -n '1p'| sed 's/<[^>]*>//g' | tr -d ' '|sed 's/\\r//'`

if [ -z "$URL" ];then
# 两种方式都搜索不到
echo "LRC not found!" # && exit 1
SONG_PREV=$(deadbeef --nowplaying %t 2>/dev/null)
Wait;

else
# 有搜索结果,那么下载歌词文件
wget -c -T 10 $URL -O "$FILE" > /dev/null 2>&1| iconv -f GBK
fi

}

Wait(){
# 对于下载不到歌词的曲目,每隔1秒重新读取播放器信息,一旦切换到下首,则重新尝试Download歌词
while :
do
sleep 1
GetInfo
if [ "$SONG_PREV" != "$SONG" ];then
SONG_PREV=$SONG
[ -f "$FILE" ] || Download;
ShowLyric;
fi
done
}
ShowLyric(){
# [ -f "$FILE" ] || Download;
#eval "$CMD" "\n$NAME - $ARTIST\n"
echo -e "\n$NAME - $ARTIST\n"
notify-send "$NAME - $ARTIST"
while :
do
if [ ! "`file $FILE | grep -i utf-8`" ];then
iconv -f GBK -t UTF-8 $FILE -o $FILE
fi
TIME=$(deadbeef --nowplaying %e 2>/dev/null)
TEXT=$(cat "$FILE" | grep $TIME | sed 's/\[[^]]*]//g')
CURRENT=$(deadbeef --nowplaying %t 2>/dev/null)

if [ -z "$PREV" -o "$CURRENT" = "$PREV" ];then
PREV=$CURRENT

# 换到下一句歌词
if [ -n "$TEXT" -a "$TEXT" != "$TEXT_PREV" ];then
# Notify 方式有问题,歌词更新太慢,即使指定了timeout问题依旧
# notify-send -t $TIMEOUT -- "$TEXT"
# echo $TEXT
sleep 0.8
eval "$CMD"
TEXT_PREV="$TEXT"
fi
# 歌曲切换
else
PREV=''
GetInfo
# eval "$CMD" "\n$NAME - $ARTIST\n"
echo -e "\n$NAME - $ARTIST\n"
notify-send "$NAME - $ARTIST"

[ -f "$FILE" ] || Download;
continue
fi
sleep 0.3
done
}
[/bash]

时间紧,暂时到此。水平有限,可能修改得不够好。

使用办法
把前面的代码保存为 lyric4deadbeef.sh 或者你喜欢的名字
后面的代码保存为 functions.main (和 lyric4deadbeef.sh同一个目录下)
然后

代码: 全选

	chmod +x  lyric4deadbeef.sh  functions.main
当然,不想分开也是可以的。把函数部分并在lyric4deadbeef.sh中的 #!/bin/bash 后面,去掉行 . functions.main
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
charliephil
帖子: 4
注册时间: 2011-07-23 3:29

Re: show lyric for deadbeef 显示歌词(分享)

#2

帖子 charliephil » 2011-08-07 0:28

解决了,不过这个脚本里面有些事前的变量好像和接口要先说明吧。
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

Re: show lyric for deadbeef 显示歌词(分享)

#3

帖子 wiewi » 2011-08-07 14:42

支持折腾,生命在于折腾 :em11
话说还是第一次听说deadbeef这个东西,改天试试
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#4

帖子 我就是我2 » 2011-08-07 17:41

解决了,不过这个脚本里面有些事前的变量好像和接口要先说明吧。
答:我目前不懂这个,你问原作者吧。我是修改者。

添加了几行代码,以便在使用xterm执行这个脚本时,显示当前曲目。
添加在函数 ShowLyric() 和下载函数 “# 两种方式都搜索不到”之后

代码: 全选

   GetInfo;
   echo -ne "\033]0;$SONG-$ARTIST\007"
代码合并,两个文件管理起来麻烦,所以就合并了。
在启动时可以这样

代码: 全选

xterm -e "foo.sh"
然后,就会显示当前播放曲目在标题了。

先上图,再上码。 :em06
not_found.jpg
not_found.jpg (12.33 KiB) 查看 1737 次
not_found1.jpg
not_found1.jpg (14.4 KiB) 查看 1737 次


[bash]
#!/bin/bash
###### include functions
###### Getstatus() GetInfo() ShowLyric() Download() Wait()

# modified from mpdlyric by wiewi,[email protected]
# Show lyric when playing music with deadbeef
# 2011/07/17
# contributor wiewi,[email protected]
# 2011/08/06
# modified by Danny Chow, [email protected]
# Download function!!
# Finished on July 20,Wednesday
# Last modifed August 7,Sunday

Getstatus(){
before=$(deadbeef --nowplaying %e 2>/dev/null)
after=$(sleep 1;deadbeef --nowplaying %e 2>/dev/null)
[ $before != $after ] && STATUS="playing"
echo $STATUS
}

GetInfo(){
# Song info
SONG=$(deadbeef --nowplaying %t 2>/dev/null)
ARTIST=$(deadbeef --nowplaying %a 2>/dev/null)
NAME=$SONG
# LRC file
FILE=$LYRIC/`echo $NAME | tr -d ' '`.lrc
}

Download(){
# 从gougou搜索歌词文件并下载
#gougou will lead to the site used below

GetInfo;

PERIOD=''
[ -f "$SEARCH" ] && rm -f $SEARCH

# “歌曲名 歌手” 搜索 管道写法参考lrcdis脚本
wget -c -T 10 "http://www.lrc123.com/?keyword=$NAME $ARTIST&" -O $SEARCH > /dev/null 2>&1 | iconv -f GBK

URL=`cat $SEARCH | grep -B1 '下载' | grep color | sed -n '1p'| sed 's/<[^>]*>//g' | tr -d ' '|sed 's/\\r//'`

# 第一种方式搜索不到,使用“歌曲名” 搜索
if [ -z "$URL" ];then
wget -c -T 10 "http://www.lrc123.com/?keyword=$NAME&" -O $SEARCH > /dev/null 2>&1 | iconv -f GBK
fi
URL=`cat $SEARCH | grep -B1 '下载' | grep color | sed -n '1p'| sed 's/<[^>]*>//g' | tr -d ' '|sed 's/\\r//'`

if [ -z "$URL" ];then
# 两种方式都搜索不到
echo "LRC not found!" # && exit 1
GetInfo;
echo -ne "\033]0;$SONG-$ARTIST\007"
SONG_PREV=$(deadbeef --nowplaying %t 2>/dev/null)
Wait;

else
# 有搜索结果,那么下载歌词文件
wget -c -T 10 $URL -O "$FILE" > /dev/null 2>&1| iconv -f GBK
fi

}

Wait(){
# 对于下载不到歌词的曲目,每隔1秒重新读取播放器信息,一旦切换到下首,则重新尝试Download歌词
while :
do
sleep 1
GetInfo
if [ "$SONG_PREV" != "$SONG" ];then
SONG_PREV=$SONG
[ -f "$FILE" ] || Download;
ShowLyric;
fi
done
}
ShowLyric(){
# [ -f "$FILE" ] || Download;
#eval "$CMD" "\n$NAME - $ARTIST\n"
GetInfo;
echo -ne "\033]0;$SONG-$ARTIST\007"
echo -e "\n$NAME - $ARTIST\n"
notify-send "$NAME - $ARTIST"
while :
do
if [ ! "`file $FILE | grep -i utf-8`" ];then
iconv -f GBK -t UTF-8 $FILE -o $FILE
fi
TIME=$(deadbeef --nowplaying %e 2>/dev/null)
TEXT=$(cat "$FILE" | grep $TIME | sed 's/\[[^]]*]//g')
CURRENT=$(deadbeef --nowplaying %t 2>/dev/null)

if [ -z "$PREV" -o "$CURRENT" = "$PREV" ];then
PREV=$CURRENT

# 换到下一句歌词
if [ -n "$TEXT" -a "$TEXT" != "$TEXT_PREV" ];then
# Notify 方式有问题,歌词更新太慢,即使指定了timeout问题依旧
# notify-send -t $TIMEOUT -- "$TEXT"
# echo $TEXT
sleep 0.8
eval "$CMD"
TEXT_PREV="$TEXT"
fi
# 歌曲切换
else
PREV=''
GetInfo
# eval "$CMD" "\n$NAME - $ARTIST\n"
echo -ne "\033]0;$SONG-$ARTIST\007"
echo -e "\n$NAME - $ARTIST\n"
notify-send "$NAME - $ARTIST"

[ -f "$FILE" ] || Download;
continue
fi
sleep 0.3
done
}
# Lyric dir
[ -d $HOME/.lyrics ] || mkdir $HOME/.lyrics -v

LYRIC=$HOME/.lyrics

# Temp files
[ -d $HOME/tmp ] || mkdir $HOME/tmp -v
SEARCH=$HOME/tmp/search

# Notify timeout
TIMEOUT=1000
case $1 in
-n) CMD='notify-send -t $TIMEOUT -- $TEXT'
;;
*) CMD='echo $TEXT'
;;
esac

Getstatus
while :
do
case $STATUS in
playing) GetInfo
[ -f "$FILE" ] || Download;
ShowLyric;;
*) echo "Deadbeef is not running!" && exit 1;;
esac
done
[/bash]

参考资料 如何變更 xterm 的主題
上次由 我就是我2 在 2011-08-07 18:35,总共编辑 2 次。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
qy117121
论坛版主
帖子: 50587
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#5

帖子 qy117121 » 2011-08-07 17:44

osd-lyrics 支持deadbeef的,最新的0.4.1 也可以下载到歌词了,我还是用这个了
渠月 · QY   
本人只会灌水,不负责回答问题
无聊可以点一下→ http://u.nu/ubuntu

邮箱 [email protected]
头像
wtry
帖子: 923
注册时间: 2009-03-18 9:26

Re: show lyric for deadbeef 显示歌词(分享)

#6

帖子 wtry » 2011-08-07 19:47

qy117121 写了:osd-lyrics 支持deadbeef的,最新的0.4.1 也可以下载到歌词了,我还是用这个了

这是真的吗??????

有图才有真相
头像
qy117121
论坛版主
帖子: 50587
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#7

帖子 qy117121 » 2011-08-07 19:50

wtry 写了:
qy117121 写了:osd-lyrics 支持deadbeef的,最新的0.4.1 也可以下载到歌词了,我还是用这个了

这是真的吗??????

有图才有真相
真的,我更新到0.4.1 后,用deadbeef听歌时打开了,osd-lyrics 发现支持deadbeef了,而且歌词可以从千千和虾米搜索了
http://code.google.com/p/osd-lyrics/downloads/list
正在用arch没装osd-lyrics 就不上图了 :em06
渠月 · QY   
本人只会灌水,不负责回答问题
无聊可以点一下→ http://u.nu/ubuntu

邮箱 [email protected]
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#8

帖子 月下叹逍遥 » 2011-08-07 19:52

KDE字体好虚……
浮生七十今三十,从此凄惶未可知
头像
qy117121
论坛版主
帖子: 50587
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#9

帖子 qy117121 » 2011-08-07 20:05

刚在arch 下装了osd-lyrics 发现不支持deadbeef :em06
换到ubuntu11.04 下截了张图
Screenshot-1.png
渠月 · QY   
本人只会灌水,不负责回答问题
无聊可以点一下→ http://u.nu/ubuntu

邮箱 [email protected]
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

Re: show lyric for deadbeef 显示歌词(分享)

#10

帖子 wiewi » 2011-08-07 20:14

qy117121 写了:刚在arch 下装了osd-lyrics 发现不支持deadbeef :em06
换到ubuntu11.04 下截了张图
附件 Screenshot-1.png 已经无效
我rp这么差?
2011-08-07-20-13-32.png
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
头像
qy117121
论坛版主
帖子: 50587
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#11

帖子 qy117121 » 2011-08-07 20:17

我在arch 里是用yaourt安装的osd-lyrics-git 20110731版本的,没有设置播放器也不会自动退出的
不过和ubuntu里不一样,不支持deadbeef :em06
(ubuntu版的osd-lyrics 的支持列表里也没有写deadbeef,我的deadbeef是以前编译安装的)
渠月 · QY   
本人只会灌水,不负责回答问题
无聊可以点一下→ http://u.nu/ubuntu

邮箱 [email protected]
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

Re: show lyric for deadbeef 显示歌词(分享)

#12

帖子 wiewi » 2011-08-07 20:29

qy117121 写了:我在arch 里是用yaourt安装的osd-lyrics-git 20110731版本的,没有设置播放器也不会自动退出的
不过和ubuntu里不一样,不支持deadbeef :em06
(ubuntu版的osd-lyrics 的支持列表里也没有写deadbeef,我的deadbeef是以前编译安装的)
更新到20110807,效果真是好,比我那个山寨的脚本顺眼多了,都不想换回去了
可是mpd还是没反应,难道我的mpd被抛弃了。。。
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: show lyric for deadbeef 显示歌词(分享)

#13

帖子 我就是我2 » 2011-08-07 22:04

显示歌词脚本这事,并不在于能显示得多好。
我现在还在慢慢学习shell. :em06
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
373992900
帖子: 4202
注册时间: 2010-06-14 13:37

Re: show lyric for deadbeef 显示歌词(分享)

#14

帖子 373992900 » 2011-08-07 22:14

支持一下
头像
INUYASHA
帖子: 366
注册时间: 2007-03-16 15:42

Re: show lyric for deadbeef 显示歌词(分享)

#15

帖子 INUYASHA » 2011-08-14 17:43

arch:deadbeef 0.5.1-1 osdlyrics 0.4.1-1
附件
屏幕截图 - 2011年08月14日 - 17时39分31秒.png
回复