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] [EINKLAPPEN] 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"
Local Time:Int = MilliSecs()
Local NewTitle:String Print GetSongtext("Hot Air Balloon","Owl City", NewTitle) Print MilliSecs()-Time+"ms"
Print "New Title: "+NewTitle
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 If Capitals Then NewTitle = Title Return ClearHTMLEntites (match.SubExp(1)) EndIf Else 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() 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
|