落伍者站长论坛's Archiver

aboutplayer 发表于 2007-9-26 13:21

研究这长的歌词技术,今天才发现最精简的!

演示:[url=http://aboutplayer.com/box]http://aboutplayer.com/box[/url]

代码:
function lrcrun(){
  var rtl="|"+tl;
  if(rtl.indexOf("|"+Cs+"|") != -1){
   $("LrcDiv").scrollTop=$("T_"+Cs).offsetTop-parseInt($("LrcDiv").clientHeight/2)+9;
   if($("T_"+St)) $("T_"+St).className="a";
   $("T_"+Cs).className="b";
   St=Cs;
  }
}
function ldL() {if(MPlayer.playState==3) {Cs=Math.floor(MPlayer.controls.CurrentPosition+ffbb); lrcrun();} lrcT=setTimeout("ldL()", 1000);}

欢迎讨论!

老四 发表于 2007-9-26 13:33

:P

taioner 发表于 2007-9-26 13:45

:ohh:

htao 发表于 2007-9-26 13:57

:lol: 不错,值得分享

flymorn 发表于 2007-9-26 14:41

效果不错~~

52music 发表于 2007-9-26 22:37

比较喜欢他的方式

gto889 发表于 2007-9-27 00:43

不错,

新白娘子传奇 发表于 2007-9-27 00:54

不错!!!!

toutou 发表于 2007-9-27 00:58

牛人一个

布点 发表于 2007-9-27 03:48

楼主是这方面的专家

oklrc 发表于 2007-9-27 09:25

楼主是LRC方面的强人

pxl8 发表于 2007-9-27 09:46

作过记号............

xinnet 发表于 2007-9-27 11:47

不错

fish108 发表于 2007-9-27 12:20

*** 作者被禁止或删除 内容自动屏蔽 ***

aboutplayer 发表于 2007-9-27 19:32

大家过奖了!

hongfu 发表于 2007-9-27 19:40

*** 作者被禁止或删除 内容自动屏蔽 ***

yadnsb 发表于 2007-9-28 08:47

乱扯,根本是因为还有其他JS里有相关内容,楼主不厚道,贴出来的代码根本完成不了需要!

fyes 发表于 2007-9-28 11:02

关键是在服务器端已对歌词按时间标签进行了排序处理,客户端就省了这个步骤,代码量减少一大半以上,比如:
[url=http://aboutplayer.com/box/inc/lyrics.asp?song=孤单爱情海]http://aboutplayer.com/box/inc/lyrics.asp?song=孤单爱情海[/url]

[code]
<!--#include file="inc.asp"--><%
response.charset="gb2312"
Response.ContentType="application/xml"
Response.Write "<?xml version=""1.0"" encoding=""gb2312""?>"&vbNewLine

dim song
dim tPage,tContent
dim re,LinkArray,lrcContent
Dim TagStr,LrcStr,TagArray,LrcArray,TagCount,i
dim xmlDom,rootNode,itemNode

set xmlDom=Server.CreateObject("msxml2.FreeThreadedDOMDocument.3.0")
xmlDom.appendChild(XmlDom.createElement("root"))

song=request("song")
tPage="http://mp3.baidu.com/m?f=ms&tn=baidump3lyric&ct=150994944&lf=2&rn=10&word="&song&"&lm=-1&ie=gb2312"
tContent=getPage(tPage,"gb2312")
set re=new regexp
re.global=true
re.ignorecase=true
re.pattern="<a href=""[^>]+?""[^>]*>LRC歌词<\/a>"
set LinkArray=re.execute(tContent)

if LinkArray.Count>0 then
   lrcContent=getPage(getContent(LinkArray(0),"""","""",0),"gb2312")
   lrcContent=replace(replace(lrcContent,"www.51lrc.com","Lrc.Feiyes.Net"),"歌词吾爱","飞叶在线")
   FormatLrc
   for i=0 to TagCount
      set itemNode=xmlDom.documentElement.appendChild(xmlDom.createNode(1,"item",""))
      itemNode.appendChild(xmlDom.createNode(1,"time","")).text=ToInt(TagArray(i),0)
      itemNode.appendChild(xmlDom.createNode(1,"lrc","")).appendChild(xmlDom.createNode(4,"","")).text=LrcArray(i)
   next
else
     set itemNode=xmlDom.documentElement.appendChild(xmlDom.createNode(1,"item",""))
     itemNode.appendChild(xmlDom.createNode(1,"time","")).text="0000"
     itemNode.appendChild(xmlDom.createNode(1,"lrc","")).appendChild(xmlDom.createNode(4,"","")).text="当前歌曲没有歌词"
end if
response.write XmlDom.Xml

'获取每个时间标签及对应的歌词,主要对TagStr,LrcStr赋值
Sub FormatLrc
   Dim Re,i,j
   Dim RowArray,RowCount,LrcInRow,TagInRow
   TagStr=""
   LrcStr=""
   
   Set Re=New RegExp
   Re.Global=true
   Re.Ignorecase=true
   Re.Pattern="\[\d+:\d+(\.\d+)?\]([^\n|\r]*)"
   Set RowArray=Re.Execute(lrcContent)
   RowCount=RowArray.Count
   
   For i=0 To RowCount-1
       Re.Pattern="\[\d+:\d+(\.\d+)?\]"
       LrcInRow=Re.Replace(RowArray(i),"")
       Set TagInRow=Re.Execute(RowArray(i))
       For j=0 To TagInRow.Count-1
           TagStr=TagStr&"|-$-|"&Tag2Num(TagInRow(j))
           LrcStr=LrcStr&"|-$-|"&LrcInRow
       Next
   Next
   Set Re=Nothing
   ReOrderStr
End Sub

'对时间标签和对应的歌词字符串重新排序!
Sub ReOrderStr
  Dim i,j
  Dim TagT,LrcT
  TagArray=Split(TagStr,"|-$-|")
  LrcArray=Split(LrcStr,"|-$-|")
  TagCount=UBound(TagArray)
  
  For i=1 To TagCount-1
     For j=1 To i
        If TagArray(i+1)-TagArray(j)<0 Then
           '歌词对换
            LrcT=LrcArray(j)
            LrcArray(j)=LrcArray(i+1)
            LrcArray(i+1)=LrcT
           '时间标签对换
            TagT=TagArray(j)
            TagArray(j)=TagArray(i+1)
            TagArray(i+1)=TagT
        End If
     Next
  Next
End Sub

Function Tag2Num(TagStr)        '标签转换成数值
        Dim Pos1, Pos2
        Dim mi, se, ms
        TagStr = Replace(TagStr, "[", "")
        TagStr = Replace(TagStr, "]", "")
        Pos1 = Instr(TagStr, ":")
        Pos2 = Instr(TagStr, ".")
        mi = Left(TagStr, Pos1 - 1)
        If (Pos2 > 0) Then
                se = Mid(TagStr, Pos1 + 1, Pos2 - Pos1 - 1)
                ms = Mid(TagStr, Pos2 + 1)
                If (Len(ms) = 1) Then
                        ms = ms * 100
                ElseIf (Len(ms) = 2) Then
                           ms = ms * 10
                   End If
                Tag2Num = (mi * 60 + se) * 1000 + ms
        Else
                se = Mid(TagStr, Pos1 + 1)
                Tag2Num = (mi * 60 + se) * 1000
        End If
        Tag2Num=Tag2Num\1000
End Function
%>

[/code]

神奇ぁ 发表于 2007-9-28 12:36

看不动。

今晚在线 发表于 2007-9-28 19:54

[quote]原帖由 [i]fyes[/i] 于 2007-9-28 11:02 发表 [url=http://www.im286.com/redirect.php?goto=findpost&pid=21673835&ptid=2174962][img]http://www.im286.com/images/common/back.gif[/img][/url]
关键是在服务器端已对歌词按时间标签进行了排序处理,客户端就省了这个步骤,代码量减少一大半以上,比如:
[url]http://aboutplayer.com/box/inc/lyrics.asp?song=[/url]孤单爱情海


0 then
   lrcContent=getPage(getC ... [/quote]


我还纳闷呢,怎么都没时间分析的部分就能播LRC。。原来服务器端处理了

这样就破坏了LRC的原格式了。

个人不赞同这种做法!

页: [1] 2

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.