Shoutcast Stream Daten auslesen

  • Hallo zusammen :)

    ich hänge mal wieder fest :wacko:

    In meinem Script möchte ich unter anderem den aktuellen Titel und Interpreten, sowie die Zuhörerzahlen und eventuell auch den StreamStatus eines ShoutCastServers anzeigen lassen. Dazu habe ich das folgende Script gefunden, komme aber mit der Umsetzung nicht gnz klar :(

    Der erste Punkt ist, dass die entsprechende Seite inkl. Port aufgerufen wird. z.B.: http://81.169.150.50:9898/index.html Das kann ich ja nicht direkt so übernehmen oder?

    Der andere Punkt ist die Variable $sPost, wenn ich das richtig verstanden habe gibt diese vor welcher Bereich ausgelesen werden soll? Aber wie gebe ich das vor, wenn sich der Inhalt von der Länge ständig ändert?


    Spoiler anzeigen
    [autoit]

    #include <IE.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sURL = "http://81.169.150.50:9898/index.html"
    Global $sPost, $aReturn

    [/autoit] [autoit][/autoit] [autoit]

    _INetGetSourcePost($sURL, $sPost)
    MsgBox(0, "TEST", $aReturn[0] & @CRLF & $aReturn[1])

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### STREAMGET ###
    ;===============================================================================
    ;
    ; Function Name: _INetGetSourcePost()
    ; Description: Gets the source from an URL without writing a temp file and you can send a Post.
    ; Parameter(s): $sURL = The URL of the site.
    ; $sPost = The Post to send
    ; Requirement(s): -
    ; Return Value(s): On Success - Return a array with $aReturn[0] = Backheader and $aReturn[1] = Sourcecode
    ; On Failure - 0 and sets @ERROR
    ; @error = 1: Post or URL is nothing
    ; @error = 2: Error by RegularExpression
    ; @error = 3: $sHost or $sHttp1 is nothing
    ; @error = 4: Can not get IP of Host
    ; @error = 5: Can not connect to host
    ; @error = 6: Nothing can be send
    ; @error = 7: Connection abborted while receiving
    ; Author(s): GtaSpider
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _INetGetSourcePost($sURL, $sPost)
    Local $iSocket, $sHeader, $sRecv, $iIP, $sHost, $aRegExp, $sHttp1,$iErr,$iSend,$aReturn[2]

    [/autoit] [autoit][/autoit] [autoit]

    If $sURL = '' Or $sPost = '' Then Return SetError(1, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    If StringLeft($sURL, 7) <> 'http://' And StringLeft($sURL, 8) <> 'https://' Then $sURL = "http://" & $sURL
    If StringRight($sURL, 1) <> "/" Then $sURL &= "/"

    [/autoit] [autoit][/autoit] [autoit]

    $aRegExp = StringRegExp($sURL, "http?://(.*?)/", 3)
    If @error Then Return SetError(2, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $sHost = $aRegExp[0]
    If $sHost = '' Then Return SetError(3, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $sHttp1 = StringTrimLeft($sURL,StringInStr($sURL,"/",-1,3)-1)
    If $sHttp1 = '' Then Return SetError(3, 0, 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $sHeader = "POST " & $sHttp1 & " HTTP/1.1" & @CRLF & _
    "Host: " & $sHost & @CRLF & _
    "User-Agent: AutoIt v3" & @CRLF & _
    "Content-Length: " & StringLen($sPost) & @CRLF & @CRLF & $sPost

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    TCPStartup() ;If not already done
    $iIP = TCPNameToIP($sHost)
    If $iIP = '' Or StringInStr($iIP, ".") = 0 Then Return SetError(4, 0, 0)
    $iSocket = TCPConnect($iIP, 80)
    If @error Or $iSocket < 0 Then Return SetError(5, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $iSend = TCPSend($iSocket, $sHeader)
    If @error Or $iSend < 1 Then Return SetError(6, 0, 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $sRecv = TCPRecv($iSocket, 1024)
    $iErr = @error
    If $sRecv <> '' Then
    While 1
    $sRecv &= TCPRecv($iSocket, 1024)
    If @error Then ExitLoop 2
    WEnd
    EndIf
    If $iErr Then Return SetError(7,0,0)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $aReturn[0] = StringLeft($sRecv,StringInStr($sRecv,@CRLF&@CRLF)-1)
    $aReturn[1] = StringTrimLeft($sRecv,StringLen($aReturn[0])+4)
    Return $aReturn
    EndFunc ;==>_INetGetSourcePost
    #EndRegion ### STREAMGET ###

    [/autoit]

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • hmmmm .. wenn ich das inzwischen richtig verstehe bin ich damit eh komplett auf dem Holzweg :(

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Probier mal das hier:

    [autoit]

    #include <String.au3>

    [/autoit][autoit][/autoit][autoit]

    $sAdress = "http://81.169.150.50:9898/index.html"

    [/autoit][autoit][/autoit][autoit]

    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("GET", $sAdress, False)
    $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    $oHTTP.Send("")
    $sHTML = $oHTTP.ResponseText

    [/autoit][autoit][/autoit][autoit]

    $sTitel = _StringBetween($sHTML, "Current Song: </font></td><td><font class=default><b>", "</b>")
    $sStreamStatus = _StringBetween($sHTML, "Stream Status: </font></td><td><font class=default><b>", "</b>")

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite("> $sTitel = " & $sTitel[0] & @CRLF & "> $sStreamStatus = " & $sStreamStatus[0] & @CRLF)

    [/autoit]

    Aus $sTitel kannst du dann eben Titel + Interpreten auslesen, und aus $sStreamStatus die Zuhörerzahlen.

    Und bei $sTitel und $sStreamStatus darfst du nicht vergessen, das es Arrays sind und du das 1. Element, also [0], verwenden musst ;)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • @Pain: Wow ... Danke. :)

    Die Sache mit der COM-Geschichte kapier ich noch nicht so ganz, da muß ich mich noch weiter mit beschäftigen.

    Aber Dein Beispiel hat mir in ein paar Punkten die Augen geöffnet ... :) Danke

    @Alpine: Da blicke ich leider garnicht durch :( Ich schätzte mal dass mir dazu noch das Verständnis für die COM-Geschichte fehlt?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • @Pain: Wow ... Danke. :)

    Die Sache mit der COM-Geschichte kapier ich noch nicht so ganz, da muß ich mich noch weiter mit beschäftigen.

    Aber Dein Beispiel hat mir in ein paar Punkten die Augen geöffnet ... :) Danke

    @Alpine: Da blicke ich leider garnicht durch :( Ich schätzte mal dass mir dazu noch das Verständnis für die COM-Geschichte fehlt?


    Lies dir zum COM-Objekt evtl. mal diesen Wikipedia-Artikel durch, und ansonsten kannst ja immer noch Google nach genaueren Informationen fragen :D

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Werde ich machen ....

    Das Problem ist, dass ich das alles nicht so schnell verstehe. Dennin vielen Beschreibungen werden wieder andere Begriffe und Voraussetzungen erwähnt die ich noch nicht verstehe und so kommt man schnell von einem ins andere und irgendwann hat man 10 Seiten offen um nur ein Wort aus der ersten Seite zu verstehen :D

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • kleine Ergänzung zu der Lösung von PainTain:
    Im Status kann man noch HTML Code finden, den könntest du z.B. so löschen:

    [autoit]

    Func _removeHTML($s)
    Return StringRegExpReplace($s, "<.+?>", "")
    EndFunc

    [/autoit]

    PS: Falls du konkrete Fragen zu COM Objekten hast kannst du auch einfach fragen, der Wikipedia-Artikel scheint nur auf die technischen Details einzugehen, und nicht auf die Verwendung.

  • Nun habe ich noch ein Problemchen, wenn der Stream nicht läuft verändert sich der Quellcode und die Funktion kann anscheinend das _StringBetween nicht mehr ordentlich abarbeiten und damit schließt sich das Programm.

    Wie kann ich das abfangen ?

    Denn selbst ne If-Abfrage würde ja schon _StringBetween benötigen oder?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Öhm ... kapier ich grad nicht.

    Was genau frägst Du da ab ?

    Wenn eines der Arrays leer ist, dann Fehlermeldung und Return ansonsten Anzeigen ?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)

  • Wenn _StringBetween fehlschlägt dann wird 0 (= kein Array) zurückgegeben, und genau das frage ich ab. Das müsstest du natürlich für alle Arrays machen, die mit auf diese Weise erstellt werden.