当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : Shell 写的 rhythmbox 伪歌词同步
帖子发表于 : 2007-09-03 18:46 
头像

注册: 2007-09-03 18:34
帖子: 273
地址: 羊城通
送出感谢: 0 次
接收感谢: 0 次
这几天学习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 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-09-03 20:37 
头像

注册: 2005-11-06 1:51
帖子: 1795
地址: 七彩云世界
送出感谢: 0 次
接收感谢: 0 次
只能算,支持支持。


_________________
佛出寺,求索真世界 For_Truth:Free_Open_Share
OPEN GPG KEY:03D18D95


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译