有这样一个想法

sh/bash/dash/ksh/zsh等Shell脚本
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

有这样一个想法

#1

帖子 solcomo » 2008-05-16 14:47

显示歌词的脚本

按照lrc文件的时间标签把该行写入一个新文件
然后使用tail -f监视这个新文件达到动态显示歌词的效果
不知可否实现...
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#2

帖子 yaoms » 2008-05-16 14:51

。。。没必要这样费劲,,按照时间调用 osd 显示效果更好。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#3

帖子 bones7456 » 2008-05-16 14:51

以前就有个,不过这个搜索歌词的服务器好像加了限制,不能自动下载歌词了.但是显示没问题的,希望能找个好用的服务器,

代码: 全选

#!/bin/bash

TMPDIR=/tmp/lrcache
LRCDIR=/media/sda5/baidump3/lrc

STARTPLAYER(){
  ps -e | grep mocp >> /dev/null 2>&1
  if [ $? -ne "0" ] ; then
	mocp -p
  fi
  return $?
}

GETNAME(){
  echo `mocp -i | grep "^Title: " | sed -e "s/.*-\ //"`
#  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=`mocp -i | grep "CurrentTime" | sed -e 's/CurrentTime:\ //'`
    [ "$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)
echo $NM
while [ ! -s $LRCDIR/$NM".lrc" ] ; do
 DOWNLRC
 NM=$(GETNAME)
done
if [ -s $LRCDIR/$NM".lrc" ] ; then
    READLRC
    DISPLAY
fi
关注我的blog: ε==3
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#4

帖子 solcomo » 2008-05-16 14:57

:D 谢两位
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#5

帖子 xiooli » 2008-05-16 15:07

ls,我这儿写了一个可以下载lrc歌词文件的脚本,可以看看:viewtopic.php?t=120253&highlight=
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#6

帖子 bones7456 » 2008-05-16 15:09

哈哈,LZ或者是 xiooli 可以把这俩脚本合并一下哦...
关注我的blog: ε==3
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#7

帖子 solcomo » 2008-05-16 19:32

代码: 全选

#!/bin/bash 

TMPDIR=/home/como/.lyrics/tmp
LRCDIR=/home/como/.lyrics

READLRC(){ 
  NM="元若蓝 - 绿袖子.lrc"
  ifs=$IFS 
  IFS="NOTSPACE" 
  [ -d $TMPDIR ] || mkdir -p  $TMPDIR 
  awk '! /(\] *.?)$|^( *)$|^[^\[]/' $LRCDIR/$NM | 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="元若蓝 - 绿袖子.lrc"
  LAST="" 
  N=1 
  LRC="$(< $TMPDIR/$NM)" 
# clear 
  echo  -e "\033[;32m****** $NM ****** \033[0m " 
  echo "  " 
  while [ true ] ; do 
    TM=`mpc | grep "/" | awk -F" " '{print $3 }' | awk -F"/" '{print $1}'` 
    [ "$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 "5" ] ; then 
        N=1 
        clear 
        echo  -e "\033[;32m****** $NM ****** \033[0m " 
        echo "  " 
        echo $LAST 
      fi 
      LAST=$NOW 
      echo $NOW 
    fi 
    sleep 0.3 
  done 
} 

READLRC 
DISPLAY
想改一下
但是文件名有空格就会报错
ambiguous redirect
怎么办....
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#8

帖子 solcomo » 2008-05-16 19:38

代码: 全选

  LRC="$(< $TMPDIR/$NM)"
就是这步会出错
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#9

帖子 bones7456 » 2008-05-16 19:53

空格前加 \ 转义
关注我的blog: ε==3
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#10

帖子 solcomo » 2008-05-16 20:08

那如果我需要用GETNAME()获取名字呢
怎么加转义字符
echo `mpc playlist | grep ">" | sed -e "s/.*)\ //"`
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#11

帖子 solcomo » 2008-05-16 20:11

或者我应该把空格去掉 :lol:

代码: 全选

GETNAME(){ 
  echo `mpc playlist | grep ">" | sed -e "s/.*)\ //" -e 's/\( \+\)//g'` 
}
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
thword
帖子: 119
注册时间: 2007-04-09 12:19

#12

帖子 thword » 2008-05-16 20:28

solcomo 写了:

代码: 全选

  LRC="$(< $TMPDIR/$NM)"
就是这步会出错
写成这样

代码: 全选

LRC="$(< $TMPDIR/"$NM")"
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

#13

帖子 solcomo » 2008-05-16 20:46

:D 谢谢楼上...
很管用...要不我还得把括号给去掉- -..
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#14

帖子 xiooli » 2008-05-16 22:04

不错啊,lz这么快就实现了“跳动”效果 :D
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#15

帖子 bones7456 » 2008-05-16 22:08

呵呵,期待发个完整版
关注我的blog: ε==3
回复