[i=s] 本帖最后由 im叶飞 于 2012-2-29 08:39 编辑 [/i]
很久没有纠结 歌词问题了,用过lrcdis (膜拜大牛)只是网上搜歌词的能力挂了 于是google下 修下 都能用了 当然没有lrcdis 那么功能强大对于mpd 可以自用这个
[code]#!/bin/bash
# Lyric dirLYRIC=$HOME/.lyrics
# Temp filesSEARCH=$HOME/.lyrics/tmp
# Notify timeoutTIMEOUT=1000
# Player StatusSTATUS=$(mpc status| sed -n '2p' | awk '{print $1}' | sed 's/[^a-zA-Z]//g')
GetInfo(){
# Song infoSONG=$(mpc --format %title% | sed -n '1p' 2>/dev/null)ARTIST=$(mpc --format %artist% | sed -n '1p' 2>/dev/null)
NAME=$(echo $SONG | sed "s/$ARTIST//" 2>/dev/null | sed 's/\-//g'|sed 's/(.*)//g')
# LRC fileFILE=$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=$(mpc --format %title% | sed -n '1p') Wait;
else # 有搜索结果,那么下载歌词文件 wget -c -T 10 $URL -O "$FILE" > /dev/null 2>&1| iconv -f GBK fi
}
Wait(){ # 对于下载不到歌词的曲目,每隔1秒重新读取播放器信息,一旦切换到下首,则重新尝试Download歌词while :do sleep 1# SONG=$(mpc --format %title% | sed -n '1p') GetInfo if [ "$SONG_PREV" != "$SONG" ];then SONG_PREV=$SONG [ -f "$FILE" ] || Download; ShowLyric; fidone}
#GetSecond(){ # 得到形如4:24的时间的秒数#min=`echo "$1" | cut -d ':' -f1`#sec=`echo "$1" | cut -d ':' -f2`#res=`echo "$min*60 + $sec" | bc`#}
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=`mpc status | grep '/' | awk -F '/' '{print $2}' | awk '{print $2}'` TEXT=`[ -f "$FILE" ] && cat "$FILE" | grep $TIME | sed 's/\[[^]]*]//g'|sed 's/\\r//'` CURRENT=`mpc current` 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}
case $1 in -n) CMD='notify-send -t $TIMEOUT -- $TEXT' ;; *) CMD='echo $TEXT' ;;esac
while :docase $STATUS in playing) GetInfo [ -f "$FILE" ] || Download; ShowLyric;; *) echo "MPD not running!" && exit 1;;esacdone[/code]
mocp的
[code]#!/bin/bash
# Lyric dirLYRIC=$HOME/.lyrics
# Temp filesSEARCH=$HOME/.lyrics/tmp
# Notify timeoutTIMEOUT=1000
# Player StatusSTATUS=$(mocp -i | grep ^State | sed 's/State: //')
GetInfo(){
# Song infoSONG=$(mocp -i | grep ^Title | sed 's/Title: //')ARTIST=$(mocp -i | grep ^Artist | sed 's/Artist: //')NAME=$(mocp -i | grep ^SongTitle | sed 's/SongTitle: //')
# LRC fileFILE=$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=$(mocp -i | grep ^Title | sed 's/Title: //') Wait;
else # 有搜索结果,那么下载歌词文件 wget -c -T 10 $URL -O "$FILE" > /dev/null 2>&1| iconv -f GBK fi
}
Wait(){ # 对于下载不到歌词的曲目,每隔1秒重新读取播放器信息,一旦切换到下首,则重新尝试Download歌词while :do sleep 1# SONG=$(mpc --format %title% | sed -n '1p') GetInfo if [ "$SONG_PREV" != "$SONG" ];then SONG_PREV=$SONG [ -f "$FILE" ] || Download; ShowLyric; fidone}
#GetSecond(){ # 得到形如4:24的时间的秒数#min=`echo "$1" | cut -d ':' -f1`#sec=`echo "$1" | cut -d ':' -f2`#res=`echo "$min*60 + $sec" | bc`#}
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=$(mocp -i | grep ^CurrentTime | sed 's/CurrentTime: //') TEXT=$(cat "$FILE" | grep $TIME | sed 's/\[[^]]*]//g') CURRENT=$(mocp -i | grep ^CurrentSec | sed 's/CurrentSec: //')
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}
case $1 in -n) CMD='notify-send -t $TIMEOUT -- $TEXT' ;; *) CMD='echo $TEXT' ;;esac
while :docase $STATUS in PLAY) GetInfo [ -f "$FILE" ] || Download; ShowLyric;; *) echo "MOC not running!" && exit 1;;esacdone[/code]
歌词服务器是 123lrc 如果你的可以该成9ilrc 修改方式将所有 http://www.lrc123.com/?的内容改成 http://www.9ilrc.com/search.php?
还可以支持其他的播放器 注意修改 $SONG $ARTIST等变量即可
alick 于 2012-02-29 10:22:19发表:
(e:e2s
aibss 于 2012-02-29 08:55:17发表:
沙发支持