Winamp und Xfire

  • Hallo!
    Ich bin grade dabei fuer mein Xfire ein Addon zu machen das es schon gibt ;)
    Ich wills halt einfach nur nachbaun, auch wenns einfach scheint :D

    Ich rede von dem Musicplugin, auf https://autoit.de/www.xfireplus.com kann man sich das holen.
    Des Bewirkt das man, wenn man musik hoert, seinen status auf den Titel + ein nerviges "http://xfireplus.com" dran. Darum auch der nachbau =)
    Also ich krieg zb "Oomph - Mein Herz http://xfireplus.com" als status.
    Nicht sehr prikelnd :D
    Naja ich wollte mir Winamp anfang und spaeter versuchen mehr Musikplayer zu unterstuetzen, unteranderem mienen geliebten VLC Media Player ;)

    Gut nun zu meinem eigentlichen anliegen:
    Nach den ersten 4 sekunden bin ich auf die Idee zu kommen nach einem Fenster mit "Winamp" drin zu suchen und mir, wenn vorhanden, den Titel geben zu lassen. Leider bekam ich "Playlist editor - Winamp" wieder ;)
    Also hab ich

    Code
    AutoItSetOption("WinTitleMatchMode", 4)


    Versucht und nach dem class name gesucht. Dies scheint ganz gut zu funzen. Aber ich weiß nicht ob der classname ueberall gleich ist (bin nicht so erfahren ^^) darum poste ich hier. Einfach mal Des kleine bissl Code mit eurem Winamp austesten und mir eine Rueckmeldung geben.

    Spoiler anzeigen
    [autoit]


    ;~ Erster Versuch: Ein WinAmp Fenster erkennen und den Titel so zu Filtern das das lied titel ding zurueckbleibt
    ;~ -Beginn: Suchen nach einem Fenster das eiglich nur des Winamp hauptfenster sein kann.
    ;~ -Dazu Filtere ich nach dem Speziellen classname und hoffe das es keine mutliplen fenster damit gibt :D
    ;~ -
    ;SCRIPT (so einfach es auch ist, ich habs so leicht nicht gepackt ;) IST VON leviathan!!
    AutoItSetOption("WinTitleMatchMode", 4) ; für "classname=CLASSNAME" um das Winampfenster zu bekommen

    dim $Title ; Varibale deklarieren
    $Title = WinGetTitle("classname=Winamp v1.x") ;ließt den Titel aus über classname vom Winampfenster also
    $Title = StringRegExpReplace ($Title, "[0-9]", "") ; das ist ein Regulärer Ausdruck - am besten mal wikipedia schauen, dieser löscht die Nummer von dem Track z.B. "2047. the hives - die all right - Winamp"
    $Title = StringTrimLeft ($Title, 2) ; Leerzeichenlöschen indem er vom String also dem Titel die ersten beiden chars von links löscht
    $Title = StringTrimRight ($Title, 9); das - Winamp löschen
    Msgbox(0,"",$Title)

    [/autoit]

    Nebenbei: So ein dummes Variablen spiel kommt bei mir immer rum :-/
    Hat wer tipps wie ich das etwas sinnvoller Strukturieren kann?

    Ps: Nicht gleich auspeitschen wenn ich was katastrophal falsch verwende :)
    Edit:
    Das ganze ist geplahnt zur uebung mit Controls ;) Wenn ich was mit Controls etc lese kommt mir das zu Kryptisch vor, deswegen will ich da mal was tun. Der status bei xfire scheint per controlfeld aenderbar, darum der ansatz :D
    Edit2:
    Die frage fuer mich ist, ob Class bei anderen Winamp fenstern auch einen uebereinstimmung findet, und so den Falschen titel filtert ;) Auch frage ich mich ob das was mit der Winamp version zu tun hat :) Meine version kenn ich leider nicht... muss mal gucken ^^

    HMPF Edit3:
    Sry @ 3tes mal edit, aber naja,
    Hab schon wen gefunden ders mir testet. Bei ihm kam ein "error: Variable used without declared" bei der $Fenster_Titel variable. Das schaetze ich mal kommt durch den classname.
    bei mir ist dieser "Winamp v1.x". darum ein anderer aufruf: an die tester die den selben error kriegen, bitte einmal Au3info ding dran lassen und mir den !genauen! classnamen liefern. Danköööö :D

    5 Mal editiert, zuletzt von Phillipk (25. April 2007 um 18:37)

  • Hi Phillipk,

    bin auch kein Profi-Coder, aber deinen Code verstehe ich nicht... :hm:

    Könntest Du den Code Zeile für Zeile kommentieren ?

    Spoiler anzeigen
    [autoit]

    ~ -
    AutoItSetOption("WinTitleMatchMode", 4)
    while 1
    sleep(1000)
    If WinExists("classname=Winamp v1.x") == 1 Then ; classname=Winamp v1.x ???
    $Fenster_Titel = WinGetTitle("classname=Winamp v1.x")
    $titel = StringSplit(""&$Fenster_Titel, "") ; (""&$Fenster_Titel, "") Warum die "" vor dem & ?
    $zahl = $titel[0]-11 ; $zahl = $titel[0]-11 Was soll das ergeben ? $title[0] ist ein Array, versuche es mit StringTrimRight und ohne Array
    ;Im nachfolgendem wird Auch am anfang die nummer abgezogen und das Wort wieder zusammengefuegt
    $titel[0] = 3 ; Das ergibt, dass $titel[0] den Wert 3 enthält und kein Wort...
    Dim $temp
    While $zahl > 0
    $temp = $temp&$titel[$titel[0]] ; $titel[$titel[0]] ???
    $titel[0] = $titel[0]+1
    $zahl = $zahl -1
    WEnd
    MsgBox(0, "", ""&$temp)
    EndIf
    MsgBox(0, "", ""&$Fenster_Titel) ; ""&$Fenster_Titel - "" zeigt nichts an, " " ein Leerzeichen
    $temp = ""
    WEnd

    [/autoit]

    Versuche doch mit dem Window Info Tool den Fenstertitel von Winamp zu ermitteln..., aber ich glaube das da nichts angezeigt wird, da Winamp kein eigentliches Fenster darstellt...

    Hast Du den Code getestet ? Eigentlich müsste es nur Fehlermeldungen hageln...
    Die Arrays brauchst Du nicht, geht auch nur mit Strings.
    Wenn Du beides mischt musst Du aufpassen, dass Du nichts durcheinander kriegst.


    Gruß
    Greenhorn


  • das mit classname und AutoItSetOption("WinTitleMatchMode", 4) geht eigentlich bei allen versionen bzw die ich bis jetzt getestet habe 5.x.x

    [autoit]


    AutoItSetOption("WinTitleMatchMode", 4)

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

    dim $Title
    $Title = WinGetTitle("classname=Winamp v1.x")
    $Title = StringRegExpReplace ($Title, "[0-9]", "")
    $Title = StringTrimLeft ($Title, 2)
    $Title = StringTrimRight ($Title, 9)
    Msgbox(0,"",$Title)

    [/autoit]

    du kannst noch unter dem StringTrimRight blah

    [autoit]


    $Title = StringSplit ($Title, "-")
    $Title[1] = StringTrimRight ($Title[1], 1)
    $Title[2] = StringTrimLeft ($Title[2], 1)

    [/autoit]

    setzen wenn du es noch anderes formatieren willst

  • Hi Greenhorn!
    Ich hab gewusst das sowas passiert ;) Aber so siehts immer aus, ich brauch mal professionelle hilfe und einen crashkurs "wie code ich richtig?"
    Ich werde es mal eben durcharbeiten und dann als edit hier reistellen ;)

    Aber erwarte keine guten komments, sonst muss ich zu lange ueberlegen :D
    Ich versuch lediglich verstaendlich zu erklaeren warum ich etwas tue x)

    Edit: Ist lang geworden...

    Spoiler anzeigen
    [autoit]


    AutoItSetOption("WinTitleMatchMode", 4)
    while 1
    sleep(1000)
    If WinExists("classname=Winamp v1.x") == 1 Then ; durch AutoItSetOption("WinTitleMatchMode", 4) ist es moeglich, alternativen zum Title zu suchen. in dem fall versuch ich mein gesuchtes fenster ueber die class zu filtern :D
    $Fenster_Titel = WinGetTitle("classname=Winamp v1.x")
    $titel = StringSplit(""&$Fenster_Titel, "") ; (""&$Fenster_Titel, "") Warum die "" vor dem & ? <- So hab ichs mal irgendwo gelesen und machs seitdem. Hab aber nochnicht versucht es ohne ' ""& ' zu veruschen =) Waer aber ne gute erleichterung
    $zahl = $titel[0]-11 ; $zahl = $titel[0]-11 Was soll das ergeben ? $title[0] ist ein Array, versuche es mit StringTrimRight und ohne Array <- Ich wollte den titel in mehrere arrays spalten die jeder einen buchstaben enthalten. $titel[0] wird dadurch zur anzahl der vorhandenen arrays.
    ;-11 ist fuer des laestige " - winamp" hinten dran. Richtig waere -9 aber irgendwie hab ich dann noch ein " -" hintendran, darum nochmal 2 weniger.
    ;und $zahl ist nur ein temporaerer wert fuer die while unten ;) ich will naehmlich das wort wieder zusammensetzen, ohne " - winamp" hinten dran^^
    $titel[0] = 3 ; Das ergibt, dass $titel[0] den Wert 3 enthält und kein Wort... <- das ist meine absicht. am anfang des titels ist immer die zahl den das lied in der playlist belegt. "1. Oomph - Mein Herz" als beispiel.
    ; und mit dem 3ten buchstaben soll das pusselspiel Beginnen. Mir faellt grade auf das es bei einem lied mit "10 -" schwer werden kann.... werds nochmal durchdenken, danke :D
    Dim $temp
    While $zahl > 0
    $temp = $temp&$titel[$titel[0]] ; $titel[$titel[0]] ??? <- $zahl bestimmt die durchgaenge in der while und da ich alle buchstaben zum zusammenpuzzeln durchgehen muss, nehm ich $titel[0] als momentane zahl. sie wird unten hochgezaehlt :D
    ;Wenn ich ein Winamp fenster habe mit dem titel "1 - Oomph - Mein Herz - Winamp" habe, fang ich beim 3ten Buchstaben, also "Mein" an. Dann gehe ich solange mit der while die arrays durch, und fuege diese hinten an $temp dran, bis ich ANZAHL ARRAYS -11 Hab (also ohne " - winamp") ... Umstaendlich, aber hilfreich wenn man sonst keine ahnung hat x)
    $titel[0] = $titel[0]+1
    $zahl = $zahl -1
    WEnd
    MsgBox(0, "", ""&$temp)
    EndIf
    MsgBox(0, "", ""&$Fenster_Titel) ; ""&$Fenster_Titel - "" zeigt nichts an, " " ein Leerzeichen <- Das ist da nur versehentlich drin ;) hab ich am anfang genutzt um zu gucken wie ich ein Winamp fenster ausfindig machen kann... aber bei mir zeigt es trotzdem noch den vollen titel an... 8|
    $temp = ""
    WEnd

    [/autoit]

    Edit2:
    @leviathan:
    Ehhhm ja ;) Ich kenne die Begriffe nicht so wirklich *schaem* aber habs auch nicht wirklich geschafft durch die Help datei da was rauszufinden...
    Kannst du mir eine Ablaufs erklaerung fuer deine Zeilen geben? :D

    2 Mal editiert, zuletzt von Phillipk (25. April 2007 um 18:14)

  • [autoit]


    AutoItSetOption("WinTitleMatchMode", 4) ; für "classname=CLASSNAME" um das Winampfenster zu bekommen

    dim $Title ; Varibale deklarieren
    $Title = WinGetTitle("classname=Winamp v1.x") ;ließt den Titel aus über classname vom Winampfenster also
    $Title = StringRegExpReplace ($Title, "[0-9]", "") ; das ist ein Regulärer Ausdruck - am besten mal wikipedia schauen, dieser löscht die Nummer von dem Track z.B. "2047. the hives - die all right - Winamp"
    $Title = StringTrimLeft ($Title, 2) ; Leerzeichenlöschen indem er vom String also dem Titel die ersten beiden chars von links löscht
    $Title = StringTrimRight ($Title, 9); das - Winamp löschen
    Msgbox(0,"",$Title)

    [/autoit]
  • Arrrrwwww geil :D
    Ich zerbrech mir 3 stunden den kopf wie ich das filter und die loesung... ist so... SIMPEL! :rofl: Genial, danke =)

    Okay wieder was gelernt. Ich arbeite nun mal dran wie ich des ganze dort (xfire) einfuege =)

    Ich hoffe aber das andere den code noch testen (ich edite ihn gleich mal lieber ^^ sonst gibts nochmehr leute die (verstaendlich!) nicht durchsteigen =)

  • wenn du fragen hast oder noch auch noch die Titel für foobar2000 und iTunes rausbekommen willst da hab ich auch ein Skript XD

    man freut sich immer wieder wenn man jemanden helfen kann

  • Hmm ich koennte mir vorstellen den string nach 3 zeichen einmal azuschneiden und dem ersten teil die zahlen wegnehmen. Dann wieder zusammenfuegen und " - winamp" hinten und den rest vorne abzuschneiden.
    Ansatz in etwa richtig? :D
    So wuerden zahlen im Titel selber geschohnt, aber es wird nur bis max 999 titel gehen. leute die mehr haben, kann ich nur zu ihrem RAM gratulieren...
    Ausserdem kann ich ihnen sagen das sie krank sind -.oO(ueber 1k lieder in der liste == Rly krank :D)

  • Damit kannst du den titel von Winamp auch auslesen.

    Einmal editiert, zuletzt von Nightraven (25. April 2007 um 21:10)

  • @Nightraven:
    So wars geplahnt=)
    Aber ich glaub das hatte sich mit der playlist gebissen, die ich offen hatte. ich hatte also nicht den Titel den ich wollte sondern Playlisteditor - Winamp...

    Ehm hab noch eine frage.
    Mein erster versuch den status @ xfire zu aendern sah ganz gut aus...
    Es war ein Edit feld, dem ich einfach nen neuen text gegebn hab. Problem: Der status wurde nicht "umgestellt" ich hab lediglich den mir sichtbaren text geaendert ...
    Hat jmd ne andere idee? ;) Tastenkombi gibts dafuer leider nicht. Ansonsten muesste ich mausclicks verwenden die ich auf jeden fall nicht haben wollte x)

    Ich hab mir ueberlegt die speicheradressen zu hacken aber das lieferte auch nicht die besten ergebnisse...

    Besteht die moeglichkeit des der momentane status in einer datei oder in der Reg zu finden ist? ;)

    Irgendwie muss es ja klappen, hab eine funktionueckelnde version hier :D

  • schau halt mal in Ordner nach oder Anwendungsdatein oder mitm Debug soweit gehen bis die Msgdrinne ist und Mem suchen

  • Zitat

    Original von Phillipk
    @Nightraven:
    So wars geplahnt=)
    Aber ich glaub das hatte sich mit der playlist gebissen, die ich offen hatte. ich hatte also nicht den Titel den ich wollte sondern Playlisteditor - Winamp...

    Nein Playlisteditor kommt nur wenn du vor Winamp kein leerzeichen machst.
    Mit Leerzeichen gehts ohne probleme (allerdings findet er dann auch z.B. ne .exe die irgendwas mit Winamp heißt^^)

  • Spoiler anzeigen
    [autoit]

    If ProcessExists("winamp.exe") Then
    $var = WinList()

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

    For $i = 1 to $var[0][0]
    If $var[$i][0] <> "" AND StringRight($var[$i][0], 6) = "WinAmp" Then
    $song = StringReplace($var[$i][0], " - WinAmp", "")
    $letters = Stringsplit($song, "")
    $count = getsong($letters)
    $letters = StringLeft($song, $count)
    $song = StringReplace($song, $letters, "")
    msgbox(0, "Playing:", $song)
    EndIf
    Next
    Else
    MsgBox(0, "WinAmp", "WinAmp is not running!")
    EndIf

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

    Func getsong($letters)
    For $x = 0 To $letters[0]
    If $letters[$x] = "." Then
    Return $x
    EndIf
    Next
    EndFunc

    [/autoit]

    hatte ich vor langer Zeit mal geschrieben..

  • Hey..Da ich mich mit AutoIt und XFire auskenne, kann ich dir da helfen.
    Bin ja auch Dev bei XFire Plus, kann dir also mal meine (noch nicht fertige) XFire UDF gerne geben:

    Spoiler anzeigen
    [autoit]

    #include-once
    Global $xfiredir = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Xfire","")
    ;---------------------------------------------------;
    ; ;
    ; XFire UDFs ;
    ; Author: XxXFaNtA ([email='webmaster@xxxfanta.com'][/email]) ;
    ; Version: 1.0 (©2006/2007) ;
    ; ;
    ; _XFireGame($sGame,$sKey,$sValue) ;
    ; $sgame = Game. Use "" for current Game ;
    ; $sKey = The Key. ;
    ; $sValue = The Value. ;
    ; ;
    ; _XFireSetStatus($sText) ;
    ; $sText = The Text to be displayed. ;
    ; ;
    ; _XFireSetSkin($sSkin) ;
    ; $sSkin = Name of the Skin ;
    ; ;
    ; _XFireGetStatus($sStatus) ;
    ; Returns current Status ;
    ; ;
    ; _XFireGetSkin($sSkin) ;
    ; Returns current Skin ;
    ; ;
    ; ;
    ;---------------------------------------------------;

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

    ;Return: 1 everything okay
    ; -1: No Xfire Found
    ; -2: XFire isn't running
    ; -3: No Game running
    ; -4: currently Playing a game
    ; -5: Other strange bugs..

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

    Func _XFireGame($sGame="",$sKey="",$sValue="")
    If $xfireDir = "" Then
    Return -1
    EndIf
    If NOT ProcessExists("xfire.exe") Then
    Return -2 ;;Xfire isn't running
    EndIf
    If IniRead(@AppDataDir &"\xfire\status.ini","STATUS","Summary",0) <> "In game" Then
    Return -3 ;;No Game Running
    ElseIf $sGame = "" AND IniRead(@AppDataDir &"\xfire\status.ini","STATUS","Summary",0) = "In game" Then
    Local $gameID = IniRead(@AppDataDir &"\xfire\status.ini","STATUS","InGame",0)
    Local $sGame = IniRead($xfiredir & "\xfire_games.ini",$gameID,"ShortName",0)
    EndIf
    ;;Run($xfiredir &"\xfire.exe /url xfire:game_stats?game="& $sGame &"&" & $sKey & "=" & $sValue) //das ist normal--aber ausnahme heute:
    Run($xfiredir &"\xfire.exe /url xfire:game_stats?game="& $sGame &"&" & $sKey & "=" & $sValue & "&" & "Game Type=" & $gameType[2])
    Return 1
    EndFunc

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

    Func _XFireSetStatus($sText)
    If $xfireDir = "" Then
    Return -1
    EndIf
    If NOT ProcessExists("xfire.exe") Then
    Return -2 ;;Xfire isn't running
    EndIf
    Run($xfiredir & "\xfire.exe /url xfire:status?text=" & $sText)
    Return 1
    EndFunc

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

    Func _XFireSetSkin($sSkin)
    If $xfireDir = "" Then
    Return -1
    ElseIf $xfiredir <> "" AND NOT ProcessExists("xfire.exe") Then
    Return -2 ;;Xfire isn't running
    EndIf
    Run($xfiredir & "\xfire.exe /url xfire:skin?name=" & $sSkin)
    Return 1
    EndFunc

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

    Func _XFireGetSkin()
    If $xfireDir = "" Then
    Return -1
    EndIf
    Local $sSkin = IniRead(@AppDataDir &"\xfire\XfireUser.ini","Skin","SkinName",0)
    If $sSkin = 0 Then
    Return -5 ;something went wrong Oo
    Else
    Return $sSkin
    EndIf
    EndFunc

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

    Func _XFireGetStatus()
    If $xfireDir = "" Then
    Return -1
    EndIf
    Local $sStatus = IniRead(@AppDataDir &"\xfire\status.ini","STATUS","Summary",0)
    If $sStatus <> "In game" Then
    Return $sStatus
    Else
    Return -4;;Currently Playing - can't read Status
    EndIf
    EndFunc

    [/autoit]

    Wenn du damit Hilfe brauchst, kannst du dich gerne bei mir melden:
    XFire: xxxfanta

    Hab noch viele Sachen zu dem Thema ;)

    MfG,
    FaNtA