Shell 写的 rhythmbox 伪歌词同步

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
yingfei
帖子: 273
注册时间: 2007-09-03 18:34
来自: 羊城通

Shell 写的 rhythmbox 伪歌词同步

#1

帖子 yingfei » 2007-09-03 18:46

这几天学习shell , 为rhythmbox写了个伪歌词同步的脚本,
完全是新手练习, bug 多多, 大家别见笑.
PS:自动下载歌词的那个网站歌词质量不怎么好.
占 小于0.7%的CPU和 小于600k的内存.

没有实用价值, 只为学习Shell

代码: 全选

#!/bin/bash

TMPDIR=$HOME/.lrcache
LRCDIR=$HOME/lrc

STARTPLAYER(){ 
  ps -e | grep rhythmbox >> /dev/null 2>&1
  if [ $? -ne "0" ] ; then
    rhythmbox-client  --no-present
    sleep 0.2
    rhythmbox-client --hide
  fi
  rhythmbox-client --play
  return $?
}

GETNAME(){
  rhythmbox-client --print-playing --no-start |  \
  awk '{ gsub(/\.mp3|\.wma|\.MP3|\.WMA/,"",$NF);print $NF }'
}

DOWNLRC(){
  [ -d $TMPDIR ] || mkdir -p  $TMPDIR
  NM=$(GETNAME) 
  echo $NM
  SNM=`echo $NM | iconv -f utf8 -t gbk`
  wget "http://lrc.bzmtv.com/so.asp?go=go&y=1&key=$SNM" \
                 -O $TMPDIR/$NM".tmp" >> /dev/null 2>&1
  iconv -f gbk -t utf8 $TMPDIR/$NM".tmp" > $TMPDIR/$NM
  egrep "> *$NM *<" $TMPDIR/$NM >> /dev/null 2>&1
  if [ $? -ne "0" ] ; then
    echo "not found "
    rm -f $TMPDIR/$NM $TMPDIR/$NM".tmp"
    sleep 15
  else 
    URL=`awk -F"> *$NM *<" \
         '{if (FLAG == 1 && $0 ~/lrc.gif/ ) \
            { h=index($0,"lrc_db");n=index($0,".lrc")-h+4; \
              print substr($0,h,n);exit; \ 
            }else if (NF > 1 ) FLAG=1  }' $TMPDIR/$NM ` 

    URL="http://lrc.bzmtv.com/$URL"
    [ -d $LRCDIR ] || mkdir -p $LRCDIR
    wget "$URL" -O "$LRCDIR/$NM" ## >> /dev/null 2>&1
    iconv -f gbk -t utf8 "$LRCDIR/$NM" >  $LRCDIR/$NM".lrc"
    rm -f  $LRCDIR/$NM
    echo "download success"
    rm -f $TMPDIR/$NM
  fi
}

READLRC(){
  ifs=$IFS
  IFS="NOTSPACE"
  [ -d $TMPDIR ] || mkdir -p  $TMPDIR
  awk '! /(\] *.?)$|^( *)$|^[^\[]/' $LRCDIR/$(GETNAME)".lrc" | while read LINE
  do
    echo $LINE | awk -F"]" '{ \
        if (NF > 2){ \
          for (i = 1; i < NF; i++){  \
            print $i"]"$NF; \
          }
         }else{ print $0; }\
        }'
  done | sort > $TMPDIR/$NM 
  IFS=$ifs
}

DISPLAY(){
  NM=$(GETNAME)
  LAST=""
  N=1
  LRC="$(< $TMPDIR/$NM)"
  clear
  echo  -e "\033[;34m****** $NM ****** \033[0m "
  echo "  "
  while [ true ] ; do
    if [ $NM != $(GETNAME) ] ; then
      NM=$(GETNAME)
      while [ ! -s $LRCDIR/$NM".lrc" ] ; do
        DOWNLRC
        NM=$(GETNAME)
      done
      [ -s $LRCDIR/$NM".lrc" ] && [ ! -s $TMPDIR/$NM ] &&  READLRC
      LRC="$(< $TMPDIR/$NM)"
      clear
      echo  -e "\033[;34m****** $NM ****** \033[0m "
      echo "  "
      N=1
    fi
    TM=`rhythmbox-client  --print-playing-format %te --no-start`
    [ "$TM" = ""  ] && break 
    NOW=`echo "$LRC" | sed -n "/$TM/p" |cut -d"]" -f 2`
    if [ "$NOW" != ""  -a  "$NOW" != "$LAST" ] ; then
      N=`expr $N + 1`
      if [ $N -ge "9" ] ; then
        N=1
        clear
        echo  -e "\033[;34m****** $NM ****** \033[0m "
        echo "  "
        echo $LAST
        echo "  "
      fi
      LAST=$NOW
      echo $NOW
      echo "   "
    fi
    sleep 0.3
  done
}


[ "$1" = "reload" ] && rm -f "$TMPDIR/*"
clear
STARTPLAYER
NM=$(GETNAME)
while [ ! -s $LRCDIR/$NM".lrc" ] ; do
 DOWNLRC 
 NM=$(GETNAME)
done

if [ -s $LRCDIR/$NM".lrc" ] ; then 
    READLRC
    DISPLAY
fi

感谢 Shely, AutumnCat 等人的热心指导
上次由 yingfei 在 2007-09-03 21:08,总共编辑 1 次。
头像
fortruth
帖子: 1795
注册时间: 2005-11-06 1:51
来自: 七彩云世界
联系:

#2

帖子 fortruth » 2007-09-03 20:37

只能算,支持支持。
佛出寺,求索真世界 For_Truth:Free_Open_Share
OPEN GPG KEY:03D18D95
回复