Songtext von LyricsWiki

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

FWeinb

ehemals "ich"

Betreff: Songtext von LyricsWiki

BeitragSo, März 07, 2010 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich Heute mein iTunesLyrics "Programm" erneuert habe und dabei auch das Laden der Lyrics beschleunigt habe und ich denke, dass ~350ms pro Lyrics recht schnell sind, wollte ich die Funktion(en) einfach mal hier Veröffentlichen.

Es wird das RegExp Modul von Brucey benötigt, ihr könnte es auf seiner GoogleCode Seite finden.

BlitzMax: [AUSKLAPPEN]
SuperStrict

Import BRL.SocketStream
Import BaH.RegEx

Const Length:Int = 10
Global Codi:String[Length,2]
Codi[0,0] = "Ä"
Codi[0,1] = "%C3%84"
Codi[1,0] = "ä"
Codi[1,1] = "%C3%A4"
Codi[2,0] = "Ü"
Codi[2,1] = "%C3%9C"
Codi[3,0] = "ü"
Codi[3,1] = "%C3%BC"
Codi[4,0] = "Ö"
Codi[4,1] = "%C3%96"
Codi[5,0] = "ö"
Codi[5,1] = "%C3%B6"
Codi[6,0] = "'"
Codi[6,1] = "%27"
Codi[7,0] = Chr(34)
Codi[7,1] = "%22"
Codi[8,0] = "ó"
Codi[8,1] = "%C3%B3"
Codi[9,0] = "›"
Codi[9,1] = "%E2%80%BA"


'/-----Sample

Local Time:Int = MilliSecs()

Local NewTitle:String
Print GetSongtext("Hot Air Balloon","Owl City", NewTitle)
Print MilliSecs()-Time+"ms"

Print "New Title: "+NewTitle

'/------End

Function GetSongtext:String(Title:String,Artist:String,NewTitle:String Var,Capitals:Byte = 0)
Local tcp:TSocketStream = TSocketStream.CreateClient("lyrics.wikia.com",80)

If Not tcp Then Return 0
tcp.WriteLine "GET "+"/"+ Encoding(Artist.Trim().Replace(" ","_")+":"+Title.Trim().Replace(" ","_"))+" HTTP/1.0"
tcp.WriteLine "Host: lyrics.wikia.com"
tcp.WriteLine "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3"
tcp.WriteLine "Accept: text/html"
tcp.WriteLine "Accept-Language: de-de,de;q=0.8,en-us,en;q=0.3"
tcp.WriteLine "Accept-Encoding: Wflate"
tcp.WriteLine ""


Repeat
Until tcp.ReadLine() = ""
Local regex:TRegEx = TRegEx.Create("alt='phone' width='16' height='17'/></a></div>|<div class='lyricbox'>(.*)<!--")
Local Stream:String = LoadString(tcp)

Local match:TRegExMatch = regex.Find(Stream)

If match Then
If match.SubCount() = 2 Then 'LYRICS FOUND
If Capitals Then NewTitle = Title
Return ClearHTMLEntites (match.SubExp(1))
EndIf
Else 'LYRICS NOT FOUND
If Capitals Then Return ""
Return GetSongtext(Capitalize(Title),Artist,NewTitle,True)
EndIf
End Function

Function ClearHTMLEntites:String(Songtext:String)
Local Ende:Byte = False
Local tmpS:String,LastFound:Int
Local Found:Int
While Not Ende = True
Found = Songtext.Find("&#",LastFound)

If Found <> -1 Then
tmpS:+Chr(Int(Songtext[Found+2..Songtext.Find(";",Found)]))
Local tmpI:Int = Songtext.Find(";",Found) + 1
If Songtext[tmpI..tmpI+6] = "<br />" Or Songtext[tmpI..tmpI+5] = "<br /" Then
tmpS:+Chr(10)
EndIf
Else
If Songtext.Find("&#",Found + 1) <> -1 Then
Ende = True
EndIf
EndIf

LastFound = Found + 1

Wend
Return tmpS
End Function

Function Capitalize:String(Title:String,Char:String = " ")
Local NewString:String
NewString:+Title[0..1].ToUpper() 'First char must be a Capital letter
For Local i:Int = 1 To Title.Length-1
NewString:+Title[i..i+1]
If Title[i..i+1] = Char Then
i:+1
NewString:+Title[i..i+1].ToUpper()
EndIf
Next
Return NewString
End Function

Function Encoding:String(url:String)
For Local i:Int = 0 To Length - 1
url = url.Replace(Codi[i,0],Codi[i,1])
Next
Print URL
Return url
End Function


Wenn ihr eine Möglichkeit kennt es noch weiter zu beschleunigen wäre ich sehr dankbar wenn ihr diese hier Posten würdet. Wenn ihr den Code Verwendet, wäre ich über eine E-Mail (bzw. PN/PM) sehr froh.

MfG
ich

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group