Winamp Playliste erstellen

  • hey,

    ich versuche gerade ein kleines prog. zu schreiben mit dem ich mir eine playliste für winamp erstellen kann.
    abspeicherbar muss diese gar nicht umbedingt sein, dass klappt dann aus dem winamp heraus.

    hier mal die basis version.

    Spoiler anzeigen
    [autoit]


    #include<GuiListView.au3>
    #include<GUIConstantsEx.au3>
    #include<ListViewConstants.au3>
    #Include <File.au3>
    #Include <Array.au3>
    #include<ButtonConstants.au3>

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

    ;Form1
    $Form1 = GUICreate("Aufnahmen", 1000, 700, 195, 112)

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

    ;Auswahl
    Global $path = "D:\Mp3\MP3s\"
    Global $Header = "Titel"
    Global $ListView = GUICtrlCreateListView($header, 0, 20, 600, 300, $LVS_SHOWSELALWAYS)
    GUICtrlSetFont($ListView, 16)
    Global $hLVHandle = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Titel", 595, 0)
    $red = GUICtrlCreateButton("Tab", 10, 400, 100, 60)
    GUICtrlSetBkColor($red, "0xFF0000")
    $green = GUICtrlCreateButton("Untab", 130, 400, 100, 60)
    GUICtrlSetBkColor($green, "0x006400")
    $yellow = GUICtrlCreateButton("Übergeben", 250, 400, 100, 60)
    GUICtrlSetBkColor($yellow, "0xFFFF00")
    $blue = GUICtrlCreateButton("Zurück", 370, 400, 100, 60)
    GUICtrlSetBkColor($blue, "0x0000FF")
    GUISetState(@SW_SHOW)

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


    $FileList=_FileListToArray($path)
    If @Error=1 Then
    MsgBox (0,"","No Files\Folders Found.")
    Exit
    EndIf
    ;_ArrayDisplay($FileList,"$FileList")
    ;MsgBox(1, "", $Filelist[5])
    For $i = 1 to $FileList[0]
    GUICtrlCreateListViewItem($Filelist[$i] , $ListView)
    Next

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

    While 1
    $Msg = GUIGetMsg(1)
    Switch $Msg[0]
    Case $GUI_EVENT_CLOSE ; Fenster schließen
    Exit
    case $red
    $Item = _GUICtrlListView_GetItemText($hLVHandle, _GUICtrlListView_GetSelectedIndices($hLVHandle))
    ;msgbox(1, "", $path & $item)
    ShellExecute($path & $item)
    EndSwitch
    Wend

    [/autoit]

    aber irgendwie komme ich an diesem punkt mangels guter ideen nicht weiter.
    wenn ich in der listbox per strg+klick mehrere items markiere wird trotzdem nur der erste titel übergeben. irgendwie komisch ich dachte _GUICtrlListView_GetItemText($hLVHandle, _GUICtrlListView_GetSelectedIndices($hLVHandle)) gibt alle markierten zurück? dem scheint aber leider nicht so zu sein.

    ich hab noch übelegt markierte items per buttonsklick in ein zweites listview zu übertragen und dann den inhalt des ganzen zweiten listviews an winamp zu übergeben (vielleicht aus den infos des zweiten listview eine playliste im winamp format erstellen und über shellexecute aufrufen?).
    mit einem listview wäre es halt einfacher, aber leider bekomme ich mehrere markierte items eben nicht übergeben.


    am ende sollte das ganze prog. wieder nur über 4 farbtasten, die hoch/runter + links/recht tasten und eine ok taste bedienbar sein (über eine fernbedienung eben).

    wie würdet ihr sowas lösen? freue mich schon auf eure vorschläge.

    gruß nuts

    P.S. winamp fernsteuern geht vermutlich am einfachsten über controlsend?

    • Offizieller Beitrag

    _GUICtrlListView_GetSelectedIndices($hLVHandle) gibt ein Array zurück. Das kann man nicht einfach als Übergabeparameter für _GUICtrlListView_GetItemText() verwenden.
    So geht es aber:

    Spoiler anzeigen
    [autoit]


    #include<GuiListView.au3>
    #include<GUIConstantsEx.au3>
    #include<ListViewConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include<ButtonConstants.au3>

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

    ;Form1
    $Form1 = GUICreate("Aufnahmen", 1000, 700, 195, 112)

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

    ;Auswahl
    Global $path = "D:\Mp3\MP3s\"
    Global $Header = "Titel"
    Global $ListView = GUICtrlCreateListView($Header, 0, 20, 600, 300, $LVS_SHOWSELALWAYS)
    GUICtrlSetFont($ListView, 16)
    Global $hLVHandle = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Titel", 595, 0)
    $red = GUICtrlCreateButton("Tab", 10, 400, 100, 60)
    GUICtrlSetBkColor($red, "0xFF0000")
    $green = GUICtrlCreateButton("Untab", 130, 400, 100, 60)
    GUICtrlSetBkColor($green, "0x006400")
    $yellow = GUICtrlCreateButton("Übergeben", 250, 400, 100, 60)
    GUICtrlSetBkColor($yellow, "0xFFFF00")
    $blue = GUICtrlCreateButton("Zurück", 370, 400, 100, 60)
    GUICtrlSetBkColor($blue, "0x0000FF")
    GUISetState(@SW_SHOW)

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

    $FileList = _FileListToArray($path)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    ;_ArrayDisplay($FileList,"$FileList")
    ;MsgBox(1, "", $Filelist[5])
    For $i = 1 To $FileList[0]
    GUICtrlCreateListViewItem($FileList[$i], $ListView)
    Next

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

    While 1
    $Msg = GUIGetMsg(1)
    Switch $Msg[0]
    Case $GUI_EVENT_CLOSE ; Fenster schließen
    Exit
    Case $red
    $aIndex = _GUICtrlListView_GetSelectedIndices($hLVHandle, 1)
    $Playlist = ''
    For $i = 1 To $aIndex[0]
    $Playlist &= $path & _GUICtrlListView_GetItemTextString($hLVHandle, $aIndex[$i]) & @CRLF
    Next
    FileWrite($path & 'playlist.m3u', $Playlist)
    MsgBox(1, "", $Playlist)
    ;~ ShellExecute($path & 'playlist.m3u')
    EndSwitch
    WEnd

    [/autoit]
  • so bin schon ein stück weitergekommen.

    Spoiler anzeigen
    [autoit]


    #include<GuiListView.au3>
    #include<GUIConstantsEx.au3>
    #include<ListViewConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include<ButtonConstants.au3>

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

    ;Form1
    $Form1 = GUICreate("Aufnahmen", 1000, 750, 50, 10)

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

    ;Auswahl
    Global $path = "D:\Mp3\MP3s\"
    Global $playlistpath = "D:\Mp3\MP3s\playlist.m3u"
    Global $Header = "Titel"
    Global $Header2 = "Playlist"
    Global $ListView = GUICtrlCreateListView($Header, 0, 5, 800, 300, $LVS_SHOWSELALWAYS)
    Global $Listview2 = GUICtrlCreateListView($Header2, 0, 320, 800, 250, $LVS_SHOWSELALWAYS)
    GUICtrlSetFont($ListView, 16)
    GUICtrlSetFont($ListView2, 16)
    Global $hLVHandle = GUICtrlGetHandle($ListView)
    Global $hLVHandle2 = GUICtrlGetHandle($ListView2)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Titel", 700, 0)
    _GUICtrlListView_SetColumn($hLVHandle2, 0, "Playlist", 700, 0)

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

    $red = GUICtrlCreateButton("Hinzufügen", 10, 600, 100, 60)
    GUICtrlSetBkColor($red, "0xFF0000")
    $green = GUICtrlCreateButton("Remove", 130, 600, 100, 60)
    GUICtrlSetBkColor($green, "0x006400")
    $yellow = GUICtrlCreateButton("Remove All", 250, 600, 100, 60)
    GUICtrlSetBkColor($yellow, "0xFFFF00")
    $blue = GUICtrlCreateButton("Abpsielen", 370, 600, 100, 60)
    GUICtrlSetBkColor($blue, "0x0000FF")

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

    GUISetState(@SW_SHOW)

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

    $FileList = _FileListToArray($path)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    For $i = 1 To $FileList[0]
    GUICtrlCreateListViewItem($FileList[$i], $ListView)
    Next

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

    Global $aRecords
    $read = _FileReadToArray($playlistpath, $aRecords)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.",1)
    Else
    For $i = 1 To $arecords[0]
    GUICtrlCreateListViewItem($arecords[$i], $Listview2)
    Next
    Endif

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

    While 1
    $Msg = GUIGetMsg(1)
    Switch $Msg[0]
    Case $GUI_EVENT_CLOSE ; Fenster schließen
    Exit

    Case $red
    $aIndex = _GUICtrlListView_GetSelectedIndices($hLVHandle, 1)
    $Playlist = ''
    For $i = 1 To $aIndex[0]
    $Playlist &= $path & _GUICtrlListView_GetItemTextString($hLVHandle, $aIndex[$i]) & @CRLF
    Next
    FileWrite($path & 'playlist.m3u', $Playlist)
    ;MsgBox(1, "", $Playlist)

    _GUICtrlListView_DeleteAllItems($hLVHandle2)
    ;Dim $aRecords
    $read = _FileReadToArray($playlistpath, $aRecords)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    EndIf
    For $i = 1 To $arecords[0]
    GUICtrlCreateListViewItem($arecords[$i], $Listview2)
    Next
    case $green
    _GUICtrlListView_DeleteItemsSelected($hLVHandle2)

    case $yellow
    _GUICtrlListView_DeleteAllItems($hLVHandle2)
    FileDelete($playlistpath)
    case $blue
    ShellExecute($path & 'playlist.m3u')

    EndSwitch
    WEnd

    [/autoit]


    beim grünen button, also dem der das ausgewählte item löschen soll hab ich noch ein kleines problem.
    dort müsste dann die playliste überschrieben werden und zwar mit allen sich noch im listview2 befindenden items.
    ich hab jetzt aber bei den Listview funktionen nichts passendes gefunden.

    allgemein wäre es schöner wenn man statt dem ersten listview eine art browser hätte mit dem man durch die verzeichnisse seines computer browsen kann.
    hat sowas schonmal jemand innerhalb einer gui gemacht und lust mir zumindest den ansatz zu erklären?

    Einmal editiert, zuletzt von nuts (12. Dezember 2008 um 16:10)

  • und damit kann ich einen dateibrowser erstellen? ist mir jetzt nicht ganz klar.
    mir fällt jetzt kein geeignetes freeware prog. ein aber vielleicht kennt jemand den dvbviewer ge? dort gibts so einen dateibrwoser für die mediendateiwiedergabe, imho auch über ein listview realisiert. so in der art stelle ich mir das vor.

    beim ersten problem mit dem greenbutton bin ich auch noch nicht weitergekommen.
    muss mir jetzt nochmal in ruhe die hilfe ansehen, vielleicht finde ich da was passendes. eure vorschläge sind aber weiterhin erwünscht :D

    edit \ um das zweite problem mal einzugrenzen:
    ich möchte alle items in einem listview in ein array laden, danach müsste ichs allein schaffen.

    mit _GUICtrlListView_GetItemTextArray schaffe ich es nur das markierte item ins array zu holen? kann aber irgendwie nicht sein, denn für 1 item bräuchte man ja keins?
    vermutlich scheitere ich am zweiten parameter für diese funktion, welcher wäre den richtig für alle items im listview?

    Einmal editiert, zuletzt von nuts (12. Dezember 2008 um 17:40)

  • mhm mit der forumsuche bin ich auch nicht weitergekommen.
    ist es nicht möglich aus einem listview alle items zurückzubekommen? wenn nein: hat jemand eine andere idee? irgendwie muss ich auch einzelne eintrage der playliste löschen können :(
    sonst macht mein skript wenig sinn.

    • Offizieller Beitrag

    Alle Items aus dem Listview:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>

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

    _Main()

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

    Func _Main()
    Local $hListView, $hButton, $msg, $aItem
    GUICreate("ListView", 400, 300)
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 200)
    GUICtrlCreateListViewItem("line1|data1|more1", $hListView)
    GUICtrlCreateListViewItem("line2|data2|more2", $hListView)
    GUICtrlCreateListViewItem("line3|data3|more3", $hListView)
    GUICtrlCreateListViewItem("line4|data4|more4", $hListView)
    GUICtrlCreateListViewItem("line5|data5|more5", $hListView)
    $hButton = GUICtrlCreateButton("Show All", 160, 250, 80, 24)
    GUISetState()
    Do
    $msg = GUIGetMsg()
    If $msg = $hButton Then
    $aItem = _GUICtrlListView_GetAllItems($hListView)
    _ArrayDisplay($aItem)
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()
    EndFunc ;==>_Main

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

    Func _GUICtrlListView_GetAllItems($hListView)
    Local $iItem, $iCount, $aTemp
    If Not IsHWnd($hListView) Then $hListView = GUICtrlGetHandle($hListView)
    If Not IsHWnd($hListView) Then Return SetError(1, 0, 0)
    $iItem = _GUICtrlListView_GetItemCount($hListView)
    $iCount = _GUICtrlListView_GetColumnCount($hListView)
    Local $aAllItem[$iItem][$iCount]
    For $i = 0 To $iItem-1
    $aTemp = _GUICtrlListView_GetItemTextArray($hListView, $i)
    For $j = 1 To $aTemp[0]
    $aAllItem[$i][$j-1] = $aTemp[$j]
    Next
    Next
    Return $aAllItem
    EndFunc

    [/autoit]

    Einzelne Einträge aus dem Listview löschen: _GUICtrlListView_DeleteItem($hWnd, $index)

  • hey,

    sorry für die späte rückmeldung und danke für die funktion.
    so wie ich das jetzt gesehen hab gibts noch einen bug wenn ich das letzte item aus dem listview lösche.
    ist jetzt wieder eine etwas kompliziertere funktion geworden und ich muss das aber erstmal selbst durchprobieren.
    melde mich wieder.

    gruß nuts

    • Offizieller Beitrag

    Stimmt, wenn gar kein Listview-Eintrag mehr vorhanden ist, gibt's eine Fehlermeldung.
    Hab die Funktion angepasst:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>

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

    _Main()

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

    Func _Main()
    Local $hListView, $hButton, $msg, $aItem
    GUICreate("ListView", 400, 300)
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 200)
    GUICtrlCreateListViewItem("line1|data1|more1", $hListView)
    GUICtrlCreateListViewItem("line2|data2|more2", $hListView)
    GUICtrlCreateListViewItem("line3|data3|more3", $hListView)
    GUICtrlCreateListViewItem("line4|data4|more4", $hListView)
    GUICtrlCreateListViewItem("line5|data5|more5", $hListView)
    $aItem = _GUICtrlListView_GetAllItems($hListView)
    For $i = 0 To 98
    _GUICtrlListView_AddArray($hListView, $aItem)
    Next
    $hButton = GUICtrlCreateButton("Show All", 160, 250, 80, 24)
    GUISetState()
    Do
    $msg = GUIGetMsg()
    If $msg = $hButton Then
    $aItem = _GUICtrlListView_GetAllItems($hListView)
    If IsArray($aItem) Then _ArrayDisplay($aItem)
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()
    EndFunc ;==>_Main

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

    Func _GUICtrlListView_GetAllItems($hListView)
    Local $iItem = _GUICtrlListView_GetItemCount($hListView)
    Local $iCount = _GUICtrlListView_GetColumnCount($hListView)
    If $iItem = 0 Then Return SetError(1, 0, 0)
    Local $aAllItems[$iItem][$iCount], $aTemp
    For $i = 0 To $iItem - 1
    $aTemp = _GUICtrlListView_GetItemTextArray($hListView, $i)
    For $j = 1 To $aTemp[0]
    $aAllItems[$i][$j - 1] = $aTemp[$j]
    Next
    Next
    Return $aAllItems
    EndFunc ;==>_GUICtrlListView_GetAllItems

    [/autoit]
  • ah super.
    ich hänge grad noch etwas an der weiterverarbeitung des array's (das ist ein zweidimensionales?, irgendwie fehlt mir die info wieviele items jetzt im array sind).
    mal sehn vielleicht krieg ich das alleine hin.

  • aha so funktioniert das ganze schonmal :D

    Spoiler anzeigen
    [autoit]


    #include<GuiListView.au3>
    #include<GUIConstantsEx.au3>
    #include<ListViewConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include<ButtonConstants.au3>

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

    ;Form1
    $Form1 = GUICreate("Aufnahmen", 1000, 750, 50, 10)

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

    ;Auswahl
    Global $path = "D:\Mp3\MP3s\"
    Global $playlistpath = "D:\Mp3\MP3s\playlist.m3u"
    Global $Header = "Titel"
    Global $Header2 = "Playlist"
    Global $ListView = GUICtrlCreateListView($Header, 0, 5, 800, 300, $LVS_SHOWSELALWAYS)
    Global $Listview2= GUICtrlCreateListView($Header2, 0, 320, 800, 250, $LVS_SHOWSELALWAYS)
    GUICtrlSetFont($ListView, 16)
    GUICtrlSetFont($ListView2, 16)
    Global $hLVHandle = GUICtrlGetHandle($ListView)
    Global $hLVHandle2 = GUICtrlGetHandle($ListView2)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Titel", 700, 0)
    _GUICtrlListView_SetColumn($hLVHandle2, 0, "Playlist", 700, 0)

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

    $red = GUICtrlCreateButton("Hinzufügen", 10, 600, 100, 60)
    GUICtrlSetBkColor($red, "0xFF0000")
    $green = GUICtrlCreateButton("Remove", 130, 600, 100, 60)
    GUICtrlSetBkColor($green, "0x006400")
    $yellow = GUICtrlCreateButton("Remove All", 250, 600, 100, 60)
    GUICtrlSetBkColor($yellow, "0xFFFF00")
    $blue = GUICtrlCreateButton("Abpsielen", 370, 600, 100, 60)
    GUICtrlSetBkColor($blue, "0x0000FF")

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

    GUISetState(@SW_SHOW)

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

    $FileList = _FileListToArray($path)

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

    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    For $i = 1 To $FileList[0]
    GUICtrlCreateListViewItem($FileList[$i], $ListView)
    Next

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

    Global $aRecords
    $read = _FileReadToArray($playlistpath, $aRecords)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.",1)
    Else
    For $i = 1 To $arecords[0]
    GUICtrlCreateListViewItem($arecords[$i], $Listview2)
    Next
    Endif

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

    While 1
    $Msg = GUIGetMsg(1)
    Switch $Msg[0]
    Case $GUI_EVENT_CLOSE ; Fenster schließen
    Exit

    Case $red
    $aIndex = _GUICtrlListView_GetSelectedIndices($hLVHandle, 1)
    ;_ArrayDisplay($aindex)
    Local $Playlist = ''
    For $i = 1 To $aIndex[0]
    $Playlist &= $path & _GUICtrlListView_GetItemTextString($hLVHandle, $aIndex[$i]) & @CRLF
    Next
    FileWrite($path & 'playlist.m3u', $Playlist)
    ;MsgBox(1, "", $Playlist)

    _GUICtrlListView_DeleteAllItems($hLVHandle2)
    ;Dim $aRecords
    $read = _FileReadToArray($playlistpath, $aRecords)
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    EndIf
    For $i = 1 To $arecords[0]
    GUICtrlCreateListViewItem($arecords[$i], $Listview2)
    Next
    case $green
    _GUICtrlListView_DeleteItemsSelected($hLVHandle2)

    $all = _GUICtrlListView_GetAllItems($ListView2)

    $count = Ubound($all)
    FileDelete($playlistpath)
    for $i = 0 to $count -1
    FileWriteLine($playlistpath, $all[$i][0])

    Next

    case $yellow
    _GUICtrlListView_DeleteAllItems($hLVHandle2)
    FileDelete($playlistpath)
    case $blue
    ShellExecute($path & 'playlist.m3u')

    EndSwitch
    WEnd

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

    Func _GUICtrlListView_GetAllItems($hListView)
    Local $iItem = _GUICtrlListView_GetItemCount($hListView)
    Local $iCount = _GUICtrlListView_GetColumnCount($hListView)
    If $iItem = 0 Then Return SetError(1, 0, 0)
    Local $aAllItems[$iItem][$iCount], $aTemp
    For $i = 0 To $iItem - 1
    $aTemp = _GUICtrlListView_GetItemTextArray($hListView, $i)
    For $j = 1 To $aTemp[0]
    $aAllItems[$i][$j - 1] = $aTemp[$j]
    Next
    Next
    Return $aAllItems
    EndFunc ;==>_GUICtrlListView_GetAllItems

    [/autoit]

    vielen dank für die hilfe oscar.