+ -
当前位置:首页 → 问答吧 → 文本内批量搜索?

文本内批量搜索?

时间:2011-07-21

来源:互联网

很长时间没听歌,最近心血来潮打算听听,发现以前听歌最佳伴侣--lrcdis(感谢几位大牛贡献)不好用了,貌似是网站版式更新了下载不到歌词?具体不记得了。
gnome-osd显示歌词一直很喜欢,可是它在我电脑上用不了。
gnome-osd挂了,意味着以前用过的osd-lyrics也不能用了,没有跟MPD配套的歌词显示插件,搜也没搜到好用的脚本,自己拿shell整了一个,终端显示,凑活用着。
代码:
[liwei@myhost ~] $ >>_ cat bin/mpdlyric
#!/bin/bash
# Show lyric when playing music with mpd
# 2011/07/17
# wiewi,[email protected]
# Download function!! # Finished on July 20,Wednesday

# Lyric dir
LYRIC=$HOME/.lyrics

# Temp files
SEARCH=$HOME/tmp/search

# Notify timeout
TIMEOUT=1000

# Player Status
STATUS=$(mpc status| sed -n '2p' | awk '{print $1}' | sed 's/[^a-zA-Z]//g')

GetInfo(){

# Song info
SONG=$(mpc --format %title% | sed -n '1p')
ARTIST=$(mpc --format %artist% | sed -n '1p')
NAME=$(echo $SONG | sed "s/$ARTIST//" | sed 's/\-//g'|sed 's/(.*)//g')

# 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=$(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')
   if [ "$SONG_PREV" != "$SONG" ];then
       SONG_PREV=$SONG
       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=$(mpc status | grep '/' | awk -F '/' '{print $2}' | awk '{print $2}')
       TEXT=$(cat "$FILE" | grep $TIME | sed 's/\[[^]]*]//g')
       CURRENT=$(mpc current)

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

         # 换到下一句歌词
         if [ -n "$TEXT" -a "$TEXT" != "$TEXT_PREV" ];then
# Notify 方式还没完善
#       notify-send -t $TIMEOUT -- "$TEXT"
              sleep 0.5
              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 :
do
case $STATUS in
    playing) GetInfo
             [ -f "$FILE" ] || Download;
             ShowLyric;;
    *) echo "MPD not running!" && exit 1;;
esac
done

大概效果就是这样了,比较土,本人菜鸟,欢迎拍砖
附件:

2011-07-21-22-49-00.png [ 118.79 KiB | 被浏览 6 次 ]

作者: wiewi   发布时间: 2011-07-21