LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1329|回复: 2

用脚本写了个歌词显示给audacious

[复制链接]
发表于 2008-1-20 17:09:39 | 显示全部楼层 |阅读模式
用terminal显示歌词.
所以先定义先启动一个term. 我用的是mlterm.

  1. #!/bin/bash
  2. if [ "$TERM" == "dumb" ]
  3. then
  4.         mlterm  -l 128 -O none -g 50x5+450+0 -T "audacious:Lyrics" -e $0 "$@" &
  5.         exit
  6. fi
  7. /usr/bin/audacious "$@" 2>/dev/null
复制代码

在audacious 加上songchange插件.每次歌开始是运行显示歌词的脚本:
  1. lyrics "%n" "%f" &
复制代码

lyrics是显示歌词的脚本, 如下.

  1. #!/bin/bash
  2. kill -9 `ps -C ${0##*/} |awk '!/'"$$"'/{print $1}'`
  3. lyricdir=$HOME/music/lyrics
  4. time0=`date +%s`
  5. getname()
  6. {
  7.         longname="`printf "${2//\%/\\x}"`"
  8.         longname="${longname#file:\/\/}"
  9.         if [ -f "${longname%.*}".lrc ]
  10.         then
  11.                 name="${longname%.*}".lrc
  12.                 return 0
  13.         fi
  14.         name2="${longname##*/}"
  15.         name2="${name2%.*}"
  16.         if [ -f "$lyricdir/$name2".lrc ]
  17.         then
  18.                 name="$lyricdir/$name2".lrc
  19.                 return 0
  20.         fi
  21.         singer="`echo ${1%% - *}|iconv -f utf8`"
  22.         if [ -f "${longname}" ]
  23.         then
  24.                 name="${longname%.*}".lrc
  25.                 return 1
  26.         fi
  27.         name2="`echo ${1##* - }|iconv -f utf8`"
  28.         name="$lyricdir/$name2".lrc
  29.         if [ -f "$lyricdir/$name2".lrc ]
  30.         then
  31.                 return 0
  32.         fi
  33.         longname="$name2"
  34.         return 1
  35. }
  36. showlyrics()
  37. {
  38.         clear
  39.         awk 'BEGIN{FS="]"}
  40.         /^\[[0-9]+:[0-9]+/ && $NF !~/^[\ \r]*$/{
  41.         for(i=1;i<NF;i++){
  42.                 sub("\[","",$(NF-i))
  43.                 num=split($(NF-i),time,":")
  44.                 axis=0
  45.                 for(j=0;j<num;j++){
  46.                         axis+=time[num-j]*60^j
  47.                 }
  48.                 printf("%d\t%s\n", axis, $NF)
  49.                 }
  50.         }
  51.         /^\[(ti|ar|al):/{sub("\[","",$1);
  52.                 print "0\t"$1;
  53.         }' "$name" |sort -n|(tFS="$IFS"; read a b; while [ "$a" ]
  54.         do
  55.                 while [ "$(($a-(`date +%s`-$time0)))" -ge 1 ]
  56.                 do
  57.                         echo -ne "$(($a-(`date +%s`-$time0))) \r"
  58.                         #sleep "1"
  59.                         comm=""
  60.                         IFS=""
  61.                         read -t 1 -n 1 comm <&2
  62.                         case "$comm" in
  63.                                 " " | "p")audacious -t
  64.                                 ptime=`date +%s`
  65.                                 comm=""
  66.                                 echo -ne "\rpause..."
  67.                                 read -n 1 comm <&2
  68.                                 audacious -t
  69.                                 time0=$((`date +%s`-$ptime+$time0))
  70.                                 echo -ne "\r         \r";;
  71.                                 "f" | "." | ">")audacious -f
  72.                                 exit;;
  73.                         esac
  74.                 done
  75.                 echo -e "$b"
  76.                 IFS="$tFS"
  77.                 read a b
  78.         done)
  79. }
  80. getname "$@" || getlrc-jpwy "$longname" "$singer"
  81. showlyrics
复制代码

getlrc-jpwj是下载歌词的脚本:

  1. #!/bin/bash
  2. #Usage: getlrc 歌名 [歌手 [专辑]]
  3. #   or: getlrc mp3文件名 [歌手 [专辑]]
  4. #可以设置mp3文件关联, 就可以直接用它"打开"mp3文件, 下载歌词
  5. #要求gnome-terminal, wget
  6. #lrcdir可能要适当修改.
  7. export LC_CTYPE=zh_CN.GBK
  8. if [ "$TERM" == dumb ]
  9. then
  10.         mlterm -e "$0" "$@"
  11.         exit 0
  12. fi

  13. logfile=/dev/null
  14. result=/tmp/a.htm
  15. cookies=/tmp/lrc_cookies
  16. list="/tmp/lrclist"
  17. lrcdir="$HOME/music/lyrics"
  18. lrcfile="${1%.mp3}"
  19. if [ "$lrcfile" == "$1" ]
  20. then
  21.         lrcfile="$lrcdir/$lrcfile"
  22. fi
  23. gm="`basename "$lrcfile"`"
  24. gm="${gm// /+}"
  25. gm="${gm//_/+}"
  26. zj="${3// /+}"
  27. gs="${2// /+}"
  28. searchanddown()
  29. {
  30. clear
  31. echo "歌名:$gm 歌手:$gs"
  32. wget -o $logfile -O $result --post-data='song='"$gm"'&singer='"$gs"'&album='"$zj"'&submit=%B8%E8%B4%CA%CB%D1%CB%F7' --referer="http://www.jpwy.net/gc/" http://www.jpwy.net/gc/search.php
  33. printf "%-4s%-18s%-14s%-12s\n" No. 歌名 歌手 专辑
  34. awk 'BEGIN{FS="(<[^>]+>|&nbsp;)+"; RS="</TR>"}
  35. /mp3/ && /sms/ && /list/ && /lrc/ { for (i=1;i<=NF;i++){printf( "%s\t", $i)};
  36. print "";
  37. num=split($0,link,""[^"]+ href="");
  38. sub("">.*","",link[num]);
  39. print link[num]>"/tmp/lrclist"
  40. }' "$result"|awk '{printf("%-4s%-18s%-14s%-12s\n", $1, $2, $3, $4)}'
  41. echo -n "下载序号(r重搜):"
  42. if [ "$xh"xx == "rxx" ]
  43. then
  44.         read xh
  45. else
  46.         read -t 10 xh
  47. fi
  48. if [ -z "$xh" ]
  49. then
  50.         xh=1
  51. elif [ "$xh" == "r" ]
  52. then
  53.     echo "输入歌名:"
  54.     read gm
  55.     echo "输入歌手:"
  56.     read gs
  57.     echo "输入专辑:"
  58.     read zj
  59.     searchanddown
  60.     exit 1
  61. fi
  62. url=`awk 'FNR=='"$xh"' {print}' /tmp/lrclist`
  63. if [ -z "$url" ]
  64. then
  65.         exit 1
  66. fi
  67. if wget -o $logfile -O "$lrcfile".lrc --referer="http://www.jpwy.net/gc/search.php" "$url"
  68. then
  69.         echo download lyric successful
  70.         sleep 2
  71.         exit 0
  72. fi
  73. }
  74. searchanddown
复制代码
发表于 2008-1-24 09:00:52 | 显示全部楼层
不错。不过如果用zenity之类的来弹出个窗口显示歌词,是否会更好些?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-24 13:06:02 | 显示全部楼层
zenity显示的内容可以改变吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表