Nach vielen Tagen Scripten und Basteln ist es Erschaffen und Danke der Hilfe von Plattform seitigen Usern auch etwas Geworden
2 Programme
1: WL
2: WL Easy
WL & WL Easy (Gemeinsamkeiten):
Öffnet über den (WL"...")&(WL Easy "Ordner") Button ein FileSelectFolder() und nur darin enthaltene *.mp3 Dateien werden in die ListView eingefügt.
Diese ListView kann man nach Header Sortieren, Die Header sind
0 = Track Nr | 1 = Artis | 2 = Titel | 3 = Album |4 = Länge | 5 = Pfad
Aus der ListView werden dann die verschiedenen Item´s die für die Playlist benötigt werden aufgerufen und durch den FileSaveDialog() in die *.m3u Geschrieben
Soweit die Gemeinsamkeiten der Beiden.
WL (Unterschied zu WL Easy):
Der Unterschied liegt darin dass man in WL mehr Optionen einer Playlist hat
z.B.
*.wpl = Windows Media Player
*.pls = SongBird
*.xpsf = Video Lan (VLC)
*.m3u = Real Player | WinAmp und viele andere
Das verfahren ist daselbe wie bei WL Easy.
Hinweiss zu WL:
Es können Nun auch mehrere Playlists erstellt werden.
Ich hoffe damit sind erste Frage geklärt und Informationen aufgelistet, Falls ich was vergessen haben sollte (was passieren kann) einfach mitteilen.
Wichtig:Windows XP User werden mit der *.wpl schwierigkeiten haben, da WMP angibt das die *.wpl ungültig ist. Das liegt daran das der WMP 11 ein Problem mit Sonderzeichen hat und diese in HTML haben will.
Leider komm ich bis jetz noch nicht so genau darauf wie ich die HTML-UDF richtig verwenden soll in combination einer ListView.
Mein Tip dazu:
Erstellt ein *.m3u File welches ihr mit der Real Player CheckBox erstellen könnt.
Als ich mir die Hex der *.wpl von einem Win XP WMP angesehen habe ist mir was aufgefallen...
Die ersten 3 Bytes haben anscheinend Besondere angaben... oder einfach nur Datenmüll sind, der Benötig wird xD
Ich hoffe aber nun das der Bug für Win XP user behoben ist
Danksagungen sind im Script enthalten, falls ich jmd vergessen habe, MELDEN!
Hier die Codes:
WL 1.5
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=icons\prog01.ico
#AutoIt3Wrapper_outfile=WL.exe
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Fileversion=1.5.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Skilkor(http://www.autoit.de)(Hilfe: Oscar & i2c & Raupi & ohforf & Twodollarbillie)
#AutoIt3Wrapper_Res_Language=1031
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
;==============
#region ### include ###
#include <Array.au3>
#include <File.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <GuiImageList.au3>
#include <Misc.au3>
#include <EditConstants.au3>
#endregion ### include ###
;=============
#region ### Global ###
Global $XS_n, $aID3, $aFiles, $sPath, $sNewItem, $Duration, $iMode, $sString, $Create, $FolderSearch, $FilePath
Global $ahPlItem[1], $iPlCount = 0, $sID3Tags
#endregion ### Global ###
;=============
#region ### Global Checkbox ###
Global $ahCheckbox[5]
Global $BoxNames[5] = ['Windows Media Player', 'Songbird', 'WinAmp', 'VLC', 'RealPlayer']
Global $aFunktions[5] = ['_WMP', '_SongBird', '_WAmp', '_VLC', '_RPlayer']
Global $aLeft[6] = [24, 155, 220, 280, 325, 400]
Global $aTmp
#endregion ### Global Checkbox ###
;=============
#region ### GUI ###
$WL = GUICreate("WL Creater", 442, 460, -1, -1)
GUICtrlCreateGroup("", 8, 0, 425, 97)
GUICtrlCreateGroup("", 8, 89, 425, 344)
For $i = 0 To 4
StyleToggle(1)
$ahCheckbox[$i] = GUICtrlCreateCheckbox($BoxNames[$i], $aLeft[$i], 40, $aLeft[$i + 1] - $aLeft[$i], 20)
Next
$Tip = GUICtrlCreateLabel("Tip: Wählt eine Widergabelisten Art aus. Seht euch die Hilfe an", 24, 64, 203, 25)
$Create = GUICtrlCreateButton("Erstellen", 232, 64, 59, 25, $WS_GROUP)
$ClearListViewB = GUICtrlCreateButton("Liste Leeren", 296, 64, 67, 25, $WS_GROUP)
$FolderSearch = GUICtrlCreateButton("...", 400, 16, 19, 25, $WS_GROUP)
;~ $Hilfe = GUICtrlCreateButton("Hilfe",368,64,59,25,$WS_GROUP)
$Path = GUICtrlCreateInput("Path", 24, 16, 377, 21, $ES_READONLY)
;~ MsgBox(0,'Checkbox',$Tip)
#endregion ### GUI ###
;=============
#region ### Global ListView ###
Global $LV_Style = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
Global $LV_EX_STYLE = BitOR($LVS_EX_SUBITEMIMAGES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT)
Global $Header = 'Nr.|Artist|Title|Album|Länge|Path'
Global $ListView = GUICtrlCreateListView($Header, 16, 104, 409, 321, $LV_Style, $LV_EX_STYLE)
_GUICtrlListView_SetExtendedListViewStyle($ListView, $LV_EX_STYLE)
_GUICtrlListView_RegisterSortCallBack($ListView)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 32)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 1, 100)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, 100)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 3, 110)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 4, 50)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 5, 120)
#endregion ### Global ListView ###
;=============
#region ### Global ContextMenü ###
Global $ContextMenue = GUICtrlCreateContextMenu($ListView)
Global $DelItem = GUICtrlCreateMenuItem('Löschen', $ContextMenue)
Global $AddItem = GUICtrlCreateMenuItem('File hinzufügen', $ContextMenue)
Global $Import1 = GUICtrlCreateMenuItem('Playlist Importieren', $ContextMenue)
Global $ClearListViewM1 = GUICtrlCreateMenuItem('Liste Leeren', $ContextMenue)
Global $DualDel = GUICtrlCreateMenuItem('Doppelte Entfernen', $ContextMenue)
#endregion ### Global ContextMenü ###
;=============
#region ### Global Menü ###
Global $Menu = GUICtrlCreateMenu('Menü', -1, 0)
Global $Import = GUICtrlCreateMenuItem('Playlist Importieren', $Menu, 0)
Global $ClearListViewM = GUICtrlCreateMenuItem('Liste Leeren', $Menu, 0)
Global $Maske = GUICtrlCreateMenu('Maske', $Menu, 10)
Global $Normal = GUICtrlCreateMenuItem('Standard', $Maske, 1)
Global $Black = GUICtrlCreateMenuItem('Schwarz', $Maske, 2)
Global $Red = GUICtrlCreateMenuItem('Rot', $Maske, 3)
Global $HelpMenu = GUICtrlCreateMenu('?', -1, 10)
Global $HelpItem = GUICtrlCreateMenuItem('Hilfe', $HelpMenu, 0, 1)
GUISetState(@SW_SHOW)
#endregion ### Global Menü ###
;=============
#region ### GUI_Event ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $ListView
_GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView))
Case $Create
_Create()
Case $ClearListViewB, $ClearListViewM, $ClearListViewM1
_ClearListView()
Case $FolderSearch
_FolderSearch()
Case $HelpItem
_Hilfe()
Case $DelItem
_DeleteSelected()
Case $AddItem
_addFile()
Case $Import, $Import1
_Import()
Case $DualDel
_DualDel()
Case $Normal
_optNormal()
Case $Black
_optBlack()
Case $Red
_optRed()
EndSwitch
$dll = DllOpen("user32.dll")
If _IsPressed("2E") Then
_DeleteSelected()
EndIf
DllClose($dll)
WEnd
#endregion ### GUI_Event ###
;=============
#region ### _FolderSearch() ###
Func _FolderSearch()
$sPath = FileSelectFolder('Wähle einen MP3 Verzeichniss aus', '', 4, '', '')
ControlSetText('', '', $Path, $sPath)
$aFiles = _FileListToArray($sPath, '*.mp3', 1)
_GUICtrlListView_AddArray($aFiles, $ListView)
If Not @error Then
$Duration = 0
For $i = 1 To UBound($aFiles) - 1
_AddFileToListView($sPath & "\" & $aFiles[$i])
Next
EndIf
EndFunc ;==>_FolderSearch
#endregion ### _FolderSearch() ###
;=============
#region ### _addFile() ###
Func _addFile()
Local $aFiles
$sPath = FileOpenDialog('Wähle die *.mp3 Datei aus', '', '(*.mp3)', 4, '', '')
$aPaths = StringSplit($sPath, '|', 1)
If IsArray($aPaths) Then
_GUICtrlListView_BeginUpdate($ListView)
For $i = 1 To $aPaths[0]
$Duration = 0
_AddFileToListView($aPaths[$i])
;_GUICtrlListView_AddItem($ListView, $aPaths[$i])
Next
_GUICtrlListView_EndUpdate($ListView)
Else
_FehlerListViewItem()
EndIf
EndFunc ;==>_addFile
#endregion ### _addFile() ###
;=============
#region ### _AddFileToListView() ###
Func _AddFileToListView($sPath) ;$aID3Tag[1][1] für Titel | $aID3Tag[2][1] für Artist | $aID3Tag[3][1] für Album | $aID3Tag[4][1] für die Länge | $aID3Tag[5][1] für die Titel Nr | $iPlCount + 1 Listet die zahl der ListView Items auf
$sPath = StringReplace($sPath, @CR, "")
If Not FileExists($sPath) Then MsgBox(0, "Fehler", $sPath & " existiert nicht!")
Local $aID3, $sNewItem
$aID3 = _ReadID3Tag($sPath)
If Not @error Then
ReDim $ahPlItem[$iPlCount + 1]
$Duration += $aID3[4][1]
$sNewItem = $aID3[5][1] & '|' & $aID3[1][1] & '|' & $aID3[0][1] & '|' & $aID3[2][1] & '|' & $aID3[4][1] & '|' & $sPath; & '|' & $iPlCount + 1
$ahPlItem[$iPlCount] = GUICtrlCreateListViewItem($sNewItem, $ListView)
$iPlCount += 1
EndIf
EndFunc ;==>_AddFileToListView
#endregion ### _AddFileToListView() ###
;=============
#region ### _Hilfe() ###
Func _Hilfe()
MsgBox(4096, 'Hilfe', 'Wiedergabelisten Beschreibung' & @CRLF & @CRLF & 'Einfach auf den Button neben dem Langen' & @CRLF & 'Editfeld Klicken und Verzeichniss auswählen' & @CRLF & 'Dann auf Erstellen' & @CRLF & @CRLF & 'WL erstellt einmehrere Playlists' & @CRLF & 'z.B.' & @CRLF & '(*.wpl) - Windows Media Player' & @CRLF & '(*.pls) - Song Bird & Win Amp' & @CRLF & '(*.m3u) - Real Player' & @CRLF & '(*.xspf) - Video Lan (VLC)' & @CRLF & @CRLF & 'Ein Danke an:' & @CRLF & 'i2c: Für seine Hilfe und Ideen' & @CRLF & 'Raupi: Auch für seine Hilfe' & @CRLF & @CRLF & 'Createt by Skilkor')
EndFunc ;==>_Hilfe
#endregion ### _Hilfe() ###
;=============
#region ### _Fehler() ###
Func _Fehler()
MsgBox(48, 'Fehler', 'Keine Wiedergabelieste ausgewählt')
EndFunc ;==>_Fehler
#endregion ### _Fehler() ###
;=============
#region ### _FehlerListViewItem() ###
Func _FehlerListViewItem()
$msg = MsgBox(48 + 4, 'Fehler', 'Keine "*.mp3" Dateien Gefunden' & @CRLF & 'Neu Suchen?')
If $msg = 6 Then
_addFile()
EndIf
EndFunc ;==>_FehlerListViewItem
#endregion ### _FehlerListViewItem() ###
;=============
#region ### _FehlerListView() ###
Func _FehlerListView()
$msg = MsgBox(48 + 4, 'Fehler', 'Keine "*.mp3" einträge Gefunden' & @CRLF & 'Neu Suchen?')
If $msg = 6 Then
_FolderSearch()
EndIf
EndFunc ;==>_FehlerListView
#endregion ### _FehlerListView() ###
;=============
#region ### _Create() ###
Func _Create()
If _GUICtrlListView_GetItemCount($ListView) = 0 Then
_FehlerListView()
EndIf
For $i = 0 To 4
If BitAND(GUICtrlRead($ahCheckbox[$i]), $GUI_CHECKED) Then Call($aFunktions[$i])
;~ MsgBox(0,'Checkbox',$ahCheckbox[$i])
Next
EndFunc ;==>_Create
#endregion ### _Create() ###
;=============
#region ### _ListView() Leeren ###
Func _ClearListView()
_GUICtrlListView_DeleteAllItems($ListView)
EndFunc ;==>_ClearListView
#endregion ### _ListView() Leeren ###
;=============
#region ### _DeleteSelected ###
Func _DeleteSelected()
_GUICtrlListView_DeleteItemsSelected($ListView)
EndFunc ;==>_DeleteSelected
#endregion ### _DeleteSelected ###
;=============
#region ### _Import() ### von i2c (Teils Bsp)
Func _Import()
$FilePath = FileOpenDialog('Playlist Importieren', '', 'Alle Playlists (*.wpl;*.pls;*.xspf;*.m3u)|(*.wpl)|(*.pls)|(*.xspf)|(*.m3u)')
If StringRight($FilePath, 4) = ".wpl" Then
$hFile = FileOpen($FilePath)
$sRead = FileRead($hFile)
FileClose($hFile)
If Not @error Then
$aTmp = StringRegExp($sRead, '<media\ssrc=\"(.*?)\"', 3, 1)
If IsArray($aTmp) Then
$aFolder = StringRegExp($FilePath, "(.*)\\", 1, 1)
If IsArray($aFolder) Then
$aParent = StringRegExp($aFolder[0], "(.*)\\", 1, 1)
Else
MsgBox(0, "Fehler", "Datei konnte nicht importiert werden")
Return
EndIf
For $i = UBound($aTmp) - 1 To 0 Step -1
If StringLeft($aTmp[$i], 2) = '..' Then
$sTmp = $aParent[0] & StringTrimLeft($aTmp[$i], 2)
If Not FileExists($sTmp) Then
MsgBox(0, "Fehler", "Datei: " & $sTmp & @CRLF & "Datei existiert nicht")
_ArrayDelete($aTmp, $i)
Else
$aTmp[$i] = $sTmp
EndIf
EndIf
Next
EndIf
Else
MsgBox(0, "Fehler", "Datei konnte nicht importiert werden")
Return
EndIf
EndIf
If StringRight($FilePath, 4) = ".pls" Then ;Wen es eine *.pls Datei ist DANN
If MsgBox(4 + 48, '*.pls Fortfahren', 'Nur *.pls Playlist die mit >WL< erstellt wurden, "Solten" importiert werden' & @CRLF & 'Fortfahren?') = 7 Then ;Wenn NEIN dann Return
Return
EndIf
$hFile = FileOpen($FilePath) ;Öffne *.pls Playlist
$sRead = FileRead($hFile) ;Lesse *.pls Playlist
FileClose($hFile) ;Schliesse *.pls Playlist
If Not @error Then ;Wen nicht ERROR DANN
$aTmp = StringRegExp($sRead, 'File\d+\=(.*)', 3, 1) ;Dateipfade einlesen
EndIf
If StringLeft($aTmp[$i], 2) = '..' Then
For $i = UBound($aTmp) - 1 To 0 Step -1 ;~ Array rückwärts durchlaufen
If StringLeft($aTmp[$i], 2) = '..' Then ;~ wenn die ersten beiden Zeichen '..' sind, ist es ein relativer Pfad
$aCount = StringRegExp($aTmp[$i], '(\.\.\/)', 3, 1) ;~ zähle alle '../' im String um das Level des relativen Pfades herauszufinden
$aFolder = StringSplit($FilePath, "\") ;~ den Ordnerpfad (Playlist) an den \'s aufsplitten.
;~ Das Array mit den einzelnen Ordnern wieder in einen String umwandeln.
;~ Der 4te Parameter: (Anzahl Elemente von $aFolder)-Anzahl der relativen Pfadebenen in $aCount
;~ Ergebnis: Der Ordner, von dem aus der absolute Teil des relativen Dateipfads weiter zur MP3 führt.
$sTmp = _ArrayToString($aFolder, "\", 1, (UBound($aFolder) - 1) - UBound($aCount))
$aTmp[$i] = StringReplace($aTmp[$i], "../", "") ;~ Alle '../' aus dem relativen Pfad entfernen
$aTmp[$i] = StringReplace($aTmp[$i], "/", "\") ;~ '/' durch '\' ersetzen, damit ein anständiger Pfad draus wird
$sTmp = $sTmp & "\" & $aTmp[$i] ;~ Den absoluten Pfad aus dem gekürzten Pfad der Playlist und dem 'gesäuberten' Pfad der MP3 zusammenbauen
If Not FileExists($sTmp) Then ;~ Prüfen ob die Datei dort existiert
MsgBox(0, "Fehler", "Datei: " & $sTmp & @CRLF & "Datei existiert nicht")
_ArrayDelete($aTmp, $i) ;~ Wenn nicht, dann das Element aus dem Array löschen
Else
$aTmp[$i] = $sTmp ;~ wenn sie existiert, den Pfad in das Arrayelement schreiben
EndIf
EndIf
Next
EndIf
EndIf
If StringRight($FilePath, 5) = ".xspf" Then
$hFile = FileOpen($FilePath)
$sRead = FileRead($hFile)
FileClose($hFile)
If Not @error Then
$aTmp = StringRegExp($sRead, '<location>file\:///(.*)</location>', 3, 1)
If StringInStr($aTmp[$i], '/') Then ;%20 = ' ' %28 = '(' %29 = ')'
For $i = UBound($aTmp) - 1 To 0 Step -1
$aTmp[$i] = StringReplace($aTmp[$i], "/", "\")
$aTmp[$i] = StringReplace($aTmp[$i], "%20", " ")
$aTmp[$i] = StringReplace($aTmp[$i], "%28", "(")
$aTmp[$i] = StringReplace($aTmp[$i], "%29", ")")
Next
EndIf
Else
MsgBox(0, "Fehler", "Datei konnte nicht importiert werden")
Return
EndIf
EndIf
If StringRight($FilePath, 4) = '.m3u' Then
$hFile = FileOpen($FilePath)
$sRead = FileRead($hFile)
FileClose($hFile)
If Not @error Then
$aTmp = StringRegExp($sRead, '(.*\\.*)', 3, 1)
EndIf
EndIf
If IsArray($aTmp) Then
_GUICtrlListView_BeginUpdate($ListView)
For $i = 0 To UBound($aTmp) - 2
$Duration = 0
_AddFileToListView($aTmp[$i])
Next
_GUICtrlListView_EndUpdate($ListView)
Else
MsgBox(0, "Fehler", "Keine Daten zum importieren.")
Return
EndIf
EndFunc ;==>_Import
#endregion ### _Import() ### von i2c (Teils Bsp)
;=============
#region ### _DualDel() ###
Func _DualDel()
$count = _GUICtrlListView_GetItemCount($ListView)
Local $iLV[$count][6], $case
For $i = 0 To $count - 1
$tmp = _GUICtrlListView_GetItemTextArray($ListView, $i)
$iLV[$i][0] = $tmp[1]
$iLV[$i][1] = $tmp[2]
$iLV[$i][2] = $tmp[3]
$iLV[$i][3] = $tmp[4]
$iLV[$i][4] = $tmp[5]
$iLV[$i][5] = $tmp[6]
Next
_GUICtrlListView_BeginUpdate($ListView)
For $i = 0 To $case = 1
_Array2DDblDel($iLV, $case)
Next
_GUICtrlListView_DeleteAllItems($ListView)
For $i = 0 To UBound($iLV) - 1
_AddFileToListView($iLV[$i][5])
Next
_GUICtrlListView_EndUpdate($ListView)
EndFunc ;==>_DualDel
#endregion ### _DualDel() ###
;=============
#region ### _WMP() ### *.wpl
Func _WMP()
Local $sSaveFilename, $hFile, $iCount = _GUICtrlListView_GetItemCount($ListView)
If $iCount = 0 Then Return
$sSaveFilename = FileSaveDialog('Wähle einen Namen für die MP3-Playlist', @DesktopDir, 'Windows Media Player-Playlist (*.wpl)', 18, '')
$Folder = $sSaveFilename
$aFolder = StringSplit($Folder, "\")
If IsArray($aFolder) Then $Folder = $aFolder[$aFolder[0] - 1] & "\" & $aFolder[$aFolder[0]]
If Not @error Then
If StringRight($sSaveFilename, 4) <> '.wpl' Then $sSaveFilename &= '.wpl'
$hFile = FileOpen($sSaveFilename, 128 + 2)
If $hFile <> -1 Then
FileWrite($hFile, '<?wpl version="1.0"?>' & @CRLF)
FileWrite($hFile, '<smil>' & @CRLF)
FileWrite($hFile, ' <head>' & @CRLF)
FileWrite($hFile, ' <meta name="Generator" content="Microsoft Windows Media Player -- "/>' & @CRLF)
FileWrite($hFile, ' <meta name="ItemCount" content="' & $iPlCount & '"/>' & @CRLF)
FileWrite($hFile, ' <meta name="TotalDuration" content="' & $Duration & '"/>' & @CRLF)
FileWrite($hFile, ' <author/>' & @CRLF)
FileWrite($hFile, ' <title>' & $Folder & '</title>' & @CRLF)
FileWrite($hFile, ' </head>' & @CRLF)
FileWrite($hFile, ' <body>' & @CRLF)
FileWrite($hFile, ' <seq>' & @CRLF)
For $i = 0 To $iCount
FileWriteLine($hFile, ' <media src="' & _GUICtrlListView_GetItemText($ListView, $i, 5) & '"/>')
Next
FileWrite($hFile, ' </seq>' & @CRLF)
FileWrite($hFile, ' </body>' & @CRLF)
FileWrite($hFile, '</smil>' & @CRLF)
FileClose($hFile)
EndIf
EndIf
EndFunc ;==>_WMP
#endregion ### _WMP() ### *.wpl
;=============
#region ### _SongBird() ### *.pls
Func _SongBird()
Local $sSaveFilename, $hFile, $iCount = _GUICtrlListView_GetItemCount($ListView)
If $iCount = 0 Then Return
$sSaveFilename = FileSaveDialog('Wähle einen Namen für die MP3-Playlist', @DesktopDir, 'SongBird-Playlist (*.pls)', 18, '')
If Not @error Then
If StringRight($sSaveFilename, 4) <> '.pls' Then $sSaveFilename &= '.pls'
$hFile = FileOpen($sSaveFilename, 2)
If $hFile <> -1 Then
FileWrite($hFile, '[playlist]' & @CRLF)
FileWrite($hFile, 'NumberOfEntries=1' & @CRLF & @CRLF)
For $i = 0 To $iCount
FileWriteLine($hFile, 'File' & $i + 1 & '=' & _GUICtrlListView_GetItemText($ListView, $i, 5))
FileWriteLine($hFile, 'Title' & $i + 1 & '=' & _GUICtrlListView_GetItemText($ListView, $i, 1) & ' - ' & _GUICtrlListView_GetItemText($ListView, $i, 2))
FileWriteLine($hFile, 'Length' & $i + 1 & '=' & _GUICtrlListView_GetItemText($ListView, $i, 4) & @CRLF & @CRLF)
Next
FileWrite($hFile, @CRLF & 'Version=2' & @CRLF)
FileClose($hFile)
EndIf
EndIf
EndFunc ;==>_SongBird
#endregion ### _SongBird() ### *.pls
;=============
#region ### _WAMP() ### *.m3u
Func _WAMP()
Local $sSaveFilename, $hFile, $iCount = _GUICtrlListView_GetItemCount($ListView)
If $iCount = 0 Then Return
$sSaveFilename = FileSaveDialog('Wähle einen Namen für die MP3-Playlist', @DesktopDir, 'MP3-Playlist (*.m3u)', 18, '')
If Not @error Then
If StringRight($sSaveFilename, 4) <> '.m3u' Then $sSaveFilename &= '.m3u'
$hFile = FileOpen($sSaveFilename, 2)
If $hFile <> -1 Then
FileWrite($hFile, '#EXTM3U' & @CRLF)
For $i = 0 To $iCount - 1
FileWriteLine($hFile, '#EXTINF:' & _GUICtrlListView_GetItemText($ListView, $i, 4) & ',' & _GUICtrlListView_GetItemText($ListView, $i, 1) & ' - ' & _GUICtrlListView_GetItemText($ListView, $i, 2) & ' - ' & 'Track Nr' & _GUICtrlListView_GetItemText($ListView, $i, 0) & ' end')
FileWriteLine($hFile, _GUICtrlListView_GetItemText($ListView, $i, 5))
Next
FileClose($hFile)
EndIf
EndIf
EndFunc ;==>_WAMP
#endregion ### _WAMP() ### *.m3u
;=============
#region ### _VLC() ### *.xspf
Func _VLC()
Local $sSaveFilename, $hFile, $iCount = _GUICtrlListView_GetItemCount($ListView)
If $iCount = 0 Then Return
$sSaveFilename = FileSaveDialog('Wähle einen Namen für die MP3-Playlist', @DesktopDir, 'VLC-Playlist (*.xspf)', 18, '')
$Folder = $sSaveFilename
$aFolder = StringSplit($Folder, "\")
If IsArray($aFolder) Then $Folder = $aFolder[$aFolder[0] - 1] & "\" & $aFolder[$aFolder[0]]
If Not @error Then
If StringRight($sSaveFilename, 4) <> '.xspf' Then $sSaveFilename &= '.xspf'
$hFile = FileOpen($sSaveFilename, 128 + 2)
If $hFile <> -1 Then
FileWrite($hFile, '<?xml version="1.0" encoding="UTF-8"?>' & @CRLF)
FileWrite($hFile, '<playlist version="1" xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/">' & @CRLF)
FileWrite($hFile, ' <title>' & $Folder & '</title>' & @CRLF)
FileWrite($hFile, ' <trackList>' & @CRLF)
For $i = 0 To $iCount - 1
FileWriteLine($hFile, ' <track>')
FileWriteLine($hFile, ' <location>file:///' & _GUICtrlListView_GetItemText($ListView, $i, 5) & '</location>')
FileWriteLine($hFile, ' <title>' & _GUICtrlListView_GetItemText($ListView, $i, 2) & '</title>')
FileWriteLine($hFile, ' <creator>' & _GUICtrlListView_GetItemText($ListView, $i, 1) & '</creator>')
FileWriteLine($hFile, ' <album>' & _GUICtrlListView_GetItemText($ListView, $i, 3) & '</album>')
FileWriteLine($hFile, ' <trackNum>' & _GUICtrlListView_GetItemText($ListView, $i, 0) & '</trackNum>')
FileWriteLine($hFile, ' <image>file:///' & '' & '</image>')
FileWriteLine($hFile, ' <extension application="http://www.videolan.org/vlc/playlist/0">')
FileWriteLine($hFile, ' <vlc:id>' & _GUICtrlListView_GetItemText($ListView, $i, 0) & '</vlc:id>')
FileWriteLine($hFile, ' </extension>')
FileWriteLine($hFile, ' </track>')
Next
FileWrite($hFile, ' </trackList>' & @CRLF)
FileWrite($hFile, ' <extension application="http://www.videolan.org/vlc/playlist/0">' & @CRLF)
If $hFile <> -1 Then
For $i = 0 To $iCount - 2
FileWriteLine($hFile, ' <vlc:item tid="' & _GUICtrlListView_GetItemText($ListView, $i, 0) & '" />')
Next
FileWrite($hFile, ' </extension>' & @CRLF)
FileWrite($hFile, '</playlist>')
FileClose($hFile)
EndIf
EndIf
EndIf
EndFunc ;==>_VLC
#endregion ### _VLC() ### *.xspf
;=============
#region ### _RPlayer() ### *.m3u
Func _RPlayer()
Local $sSaveFilename, $hFile, $iCount = _GUICtrlListView_GetItemCount($ListView)
If $iCount = 0 Then Return
$sSaveFilename = FileSaveDialog('Wähle einen Namen für die MP3-Playlist', @DesktopDir, 'MP3-Playlist (*.m3u)', 18, '')
If Not @error Then
If StringRight($sSaveFilename, 4) <> '.m3u' Then $sSaveFilename &= '.m3u'
$hFile = FileOpen($sSaveFilename, 2)
If $hFile <> -1 Then
FileWrite($hFile, '#EXTM3U' & @CRLF)
For $i = 0 To $iCount - 1
FileWriteLine($hFile, '#EXTINF:' & _GUICtrlListView_GetItemText($ListView, $i, 4) & ',' & _GUICtrlListView_GetItemText($ListView, $i, 1) & ' - ' & _GUICtrlListView_GetItemText($ListView, $i, 2) & ' - ' & 'Track Nr' & _GUICtrlListView_GetItemText($ListView, $i, 0) & ' end')
FileWriteLine($hFile, _GUICtrlListView_GetItemText($ListView, $i, 5))
Next
FileClose($hFile)
EndIf
EndIf
EndFunc ;==>_RPlayer
#endregion ### _RPlayer() ### *.m3u
;=============
#region ### _ID3Tag() ### Von Oscar
Func _ReadID3Tag($sPath)
If Not FileExists($sPath) Then Return SetError(1, 0, 0)
Local $hFile, $sData, $sID3Header, $iID3HeaderSize = 0, $iOffset, $iSize, $tmp
Local $aID3v2Tags[8] = ['TIT2', 'TPE1', 'TALB', 'TYER', 'TLEN', 'TRCK', 'TCON', 'TENC']
Local $aID3[11][2] = [ _
['Title', ''],['Artist', ''],['Album', ''],['Year', ''], _
['Length', '0'],['Track', ''],['Genre', ''],['Encoder', ''], _
['MPEG-Version', ''],['Bitrate', ''],['Sample-Freq.', '']]
Local $aMP3Version[4] = ['MPEG2.5', 'Reserved', 'MPEG2', 'MPEG1']
Local $aMP3Layer[4] = ['Reserved', 'Layer III', 'Layer II', 'Layer I']
Local $aMP3Bitrate[5][16] = [ _
[000, 032, 064, 096, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 000], _
[000, 032, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 384, 000], _
[000, 032, 040, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 000], _
[000, 032, 048, 056, 064, 080, 096, 112, 128, 144, 160, 176, 192, 224, 256, 000], _
[000, 008, 016, 024, 032, 040, 048, 056, 064, 080, 096, 112, 128, 144, 160, 000]]
Local $aSampleFreq[3][4] = [[44100, 48000, 32000, 0],[22050, 24000, 16000, 0],[11025, 12000, 8000, 0]]
Local $sMP3FrameHeader, $iMP3Version, $sMP3Version, $sMP3Layer, $iMP3Bitrate, $iMP3SampleFreq
Local $iVBRFrames = -1, $iVBRFilesize, $iVBRFlags
$hFile = FileOpen($sPath, 16)
If $hFile = -1 Then Return SetError(2, 0, 0)
$sData = Binary(FileRead($hFile, 4))
If BinaryMid($sData, 1, 3) = '0x494433' Then ; ID3 v2.x Kennung gefunden
If (BinaryMid($sData, 4, 1) = '0x03') Or (BinaryMid($sData, 4, 1) = '0x04') Then ; nur v2.3 und 2.4
FileRead($hFile, 2) ; 2 Bytes überspringen
For $i = 0 To 3 ; berechne ID3-Headergröße (4 Bytes, jedoch nur jeweils die unteren 7 Bit)
$iID3HeaderSize = BitShift($iID3HeaderSize, -7) + BitAND(Binary(FileRead($hFile, 1)), 0x7F)
Next
If $iID3HeaderSize > 0 Then
$sID3Header = Binary(FileRead($hFile, $iID3HeaderSize)) ; lese gesamten ID3-Header
For $i = 0 To 7
$iOffset = StringInStr(BinaryToString($sID3Header), $aID3v2Tags[$i]) ; Offset zu dem ID3-Tag
If $iOffset > 0 Then
$iSize = Hex(BinaryMid($sID3Header, $iOffset + 4, 4)) ; Größe des ID3-Frames
$tmp = BinaryMid($sID3Header, $iOffset + 11, Dec($iSize) - 1)
If BinaryMid($tmp, 1, 2) = '0xFFFE' Then
For $x = 3 To BinaryLen($tmp) Step 2
$aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 2), 2)
Next
Else
For $x = 1 To BinaryLen($tmp)
$aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 1))
Next
EndIf
$aID3[$i][1] = StringReplace($aID3[$i][1], Chr(0), '')
EndIf
Next
EndIf
Do
$sData = String(FileRead($hFile, 1))
If @error Then ExitLoop
If BitAND($sData, 0xff) = 0xff Then
FileSetPos($hFile, -1, 1)
$sData = String(FileRead($hFile, 4))
EndIf
Until BitAND($sData, 0xFFE00000) = 0xFFE00000
Else
FileClose($hFile)
Return SetError(3, 0, 0)
EndIf
Else ; ID3 v1.x
$iOffset = FileGetPos($hFile)
FileSetPos($hFile, -128, 2)
$sID3Header = BinaryToString(FileRead($hFile, 3))
If $sID3Header = 'TAG' Then
$aID3[0][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[1][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[2][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[3][1] = StringReplace(BinaryToString(FileRead($hFile, 4)), Chr(0), '')
EndIf
FileSetPos($hFile, $iOffset, 0)
EndIf
$sMP3FrameHeader = String($sData)
If BitAND($sMP3FrameHeader, 0xFFE00000) <> 0xFFE00000 Then
FileClose($hFile)
Return SetError(4, 0, 0) ; keine MP3-Datei, dann Return
EndIf
$iMP3Version = BitShift(BitXOR($sMP3FrameHeader, 0xFFE00000), 19) ; welche MP3-Version
$sMP3Version = $aMP3Version[$iMP3Version] ; in Textform
$sMP3Layer = $aMP3Layer[BitShift(BitAND($sMP3FrameHeader, 0x60000), 17)] ; welcher Layer
$aID3[8][1] = $sMP3Version & ' / ' & $sMP3Layer ; ins Ausgabe-Array
$iMP3Bitrate = BitShift(BitAND($sMP3FrameHeader, 0xF000), 12) ; Bitraten-Index auslesen
Switch $sMP3Version ; je nach MPEG-Version Bitrate aus der Tabelle holen
Case 'MPEG1'
$aID3[9][1] = $aMP3Bitrate[$iMP3Version - ($iMP3Version > 1)][$iMP3Bitrate]
Case 'MPEG2', 'MPEG2.5'
If $sMP3Layer = 'Layer I' Then
$aID3[9][1] = $aMP3Bitrate[3][$iMP3Bitrate]
Else
$aID3[9][1] = $aMP3Bitrate[4][$iMP3Bitrate]
EndIf
EndSwitch
$iMP3SampleFreq = BitShift(BitAND($sMP3FrameHeader, 0xC00), 10) ; Sample-Frequenz-Index auslesen
$aID3[10][1] = $aSampleFreq[2 - ($iMP3Version - ($iMP3Version > 1))][$iMP3SampleFreq] ; und Wert aus der Tabelle holen
Do ; evtl. Leerbytes überspringen
$tmp = FileRead($hFile, 1)
If @error Then ExitLoop
Until $tmp <> 0x00 Or @error
If $tmp = 0x58 And BinaryToString(FileRead($hFile, 3)) = 'ing' Then ; MP3 mit VBR (Xing-Header gefunden)?
$iVBRFlags = '0x' & Hex(FileRead($hFile, 4)) ; VBR-Flags auslesen
If BitAND($iVBRFlags, 0x3) Then ; wenn die Einträge vorhanden sind, dann...
$iVBRFrames = Dec(Hex(FileRead($hFile, 4))) ; Anzahl der VBR-Frames auslesen
$iVBRFilesize = Dec(Hex(FileRead($hFile, 4))) ; Dateigröße auslesen
$aID3[4][1] = $iVBRFrames * 1152 / $aID3[10][1] * 1000 ; VBR Laufzeit
$aID3[9][1] = 'VBR ~' & Int($iVBRFilesize * 8 / ($aID3[4][1] / 1000) / 1000) ; VBR durchschnittliche Bitrate
EndIf
Else
If $aID3[4][1] = 0 Then $aID3[4][1] = (FileGetSize($sPath) * / ($aID3[9][1] * 1000) * 1000 ; alternative CBR Laufzeit
$aID3[9][1] = 'CBR ' & $aID3[9][1]
EndIf
$aID3[4][1] = Int($aID3[4][1] / 1000) ; Laufzeit
$aID3[9][1] &= ' kBit/s'
$aID3[10][1] &= ' Hz'
FileClose($hFile)
Return $aID3
EndFunc ;==>_ReadID3Tag
#endregion ### _ID3Tag() ### Von Oscar
;=============
#region ### _Array2DDblDel ### von BugFix
;----------------------------------------------------------------------------------------------------------------------
; Function _Array2DDblDel(ByRef $ARRAY [, $CASESENS=0])
;
; Description - From an 1D/2D Array will delete double entries (2D -> combination by '[n][0]' to '[n][x]').
; - Autodetection 1D/2D Array
; - By using string, you can choose case sensitivity.
;
; Parameter $ARRAY: Array to sort
; optional $CASESENS: Case sensitivity off[0] or on[1] (default 0)
;
; Return Succes ByRef Array without doubles
; Count of doubles
; Failure 0 and set @error = 1; no array
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _Array2DDblDel(ByRef $ARRAY, $CASESENS = 0)
Local $arTmp[1] = [''], $dbl = 0, $count = 0, $x, $l, $val, $valTmp, $i, $k
If (Not IsArray($ARRAY)) Then
SetError(1)
Return 0
EndIf
Local $Ubound2nd = UBound($ARRAY, 2)
If @error = 2 Then
For $i = 0 To UBound($ARRAY) - 1
$dbl = 0
For $k = 0 To UBound($arTmp) - 1
Switch $CASESENS
Case 0
If $arTmp[$k] = $ARRAY[$i] Then
$dbl = 1
$count += 1
EndIf
Case 1
If $arTmp[$k] == $ARRAY[$i] Then
$dbl = 1
$count += 1
EndIf
EndSwitch
Next
If $dbl = 0 Then
If $arTmp[0] = "" Then
$arTmp[0] = $ARRAY[$i]
Else
ReDim $arTmp[UBound($arTmp) + 1]
$arTmp[UBound($arTmp) - 1] = $ARRAY[$i]
EndIf
Else
$dbl = 0
EndIf
Next
Else
ReDim $arTmp[1][$Ubound2nd]
$arTmp[0][0] = ''
$x = 0
For $i = 0 To UBound($ARRAY) - 1
$dbl = 0
$val = ''
$valTmp = ''
For $l = 0 To $Ubound2nd - 1
$val &= $ARRAY[$i][$l]
Next
For $k = 0 To UBound($arTmp) - 1
For $l = 0 To $Ubound2nd - 1
$valTmp &= $arTmp[$k][$l]
Next
Switch $CASESENS
Case 0
If $valTmp = $val Then
$dbl = 1
$count += 1
EndIf
Case 1
If $valTmp == $val Then
$dbl = 1
$count += 1
EndIf
EndSwitch
$valTmp = ''
Next
If $dbl = 0 Then
If $x = 1 Then ReDim $arTmp[UBound($arTmp) + 1][$Ubound2nd]
For $l = 0 To $Ubound2nd - 1
If $arTmp[0][0] = '' Or $x = 0 Then
$arTmp[0][$l] = $ARRAY[0][$l]
If $l = $Ubound2nd - 1 Then $x = 1
Else
$arTmp[UBound($arTmp) - 1][$l] = $ARRAY[$i][$l]
$x = 2
If $l = $Ubound2nd - 1 Then $x = 1
EndIf
Next
Else
$dbl = 0
EndIf
Next
EndIf
$ARRAY = $arTmp
Return $count
EndFunc ;==>_Array2DDblDel
#endregion ### _Array2DDblDel ### von BugFix
;=============
#region ### _optNormal() ###
Func _optNormal()
GUISetBkColor(0xF0F0F0, $WL) ;GUI farbe standard
GUICtrlSetColor(10, 0x000000) ;Tip text farbe schwarz
For $i = 0 To UBound($ahCheckbox) - 1
GUICtrlSetColor($ahCheckbox[$i], 0x000000)
StyleToggle(0)
Next
EndFunc ;==>_optNormal
#endregion ### _optNormal() ###
;=============
#region ### _optBlack() ###
Func _optBlack()
GUISetBkColor(0x000000, $WL)
GUICtrlSetColor(10, 0xFFFFFF) ;Tip text farbe weiss
For $i = 0 To UBound($ahCheckbox) - 1
GUICtrlSetColor($ahCheckbox[$i], 0xFFFFFF)
StyleToggle(0)
Next
EndFunc ;==>_optBlack
#endregion ### _optBlack() ###
;=============
#region ### _optRed() ###
Func _optRed()
GUISetBkColor(0xFF0000, $WL)
GUICtrlSetColor(10, 0x000000)
For $i = 0 To UBound($ahCheckbox) - 1
GUICtrlSetColor($ahCheckbox[$i], 0x000000)
StyleToggle(0)
Next
EndFunc ;==>_optRed
#endregion ### _optRed() ###
;=============
#region ### _SytelToggle() ###
Func StyleToggle($Off = 1)
If Not StringInStr(@OSType, "WIN_7") Then Return 0
If $Off Then
$XS_n = DllCall("uxtheme.dll", "int", "GetThemeAppProperties")
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
Return 1
ElseIf IsArray($XS_n) Then
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", $XS_n[0])
$XS_n = ""
Return 1
EndIf
Return 0
EndFunc ;==>StyleToggle
#endregion ### _SytelToggle() ###
=================
WL Easy
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=icons\prog.ico
#AutoIt3Wrapper_outfile=WL Easy.exe
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Fileversion=1.1.0.1
#AutoIt3Wrapper_Res_LegalCopyright=(Hilfe: Oscar & i2c & Raupi & ohforf & Twodollarbillie) Skilkor(http://www.autoit.de)
#AutoIt3Wrapper_Res_Language=1031
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
;==============
#Region ### include ###
#include <Array.au3>
#include <File.au3>
#include <ButtonConstants.au3>;
#include <GUIConstantsEx.au3>;
#include <StaticConstants.au3>;
#include <WindowsConstants.au3>;
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <GuiImageList.au3>
#EndRegion ### include ###
;=============
#Region ### GUI ###
GUICreate('WL Easy', 394, 357, 645, 393)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlCreateGroup('', 8, 0, 377, 41)
GUICtrlCreateGroup('', 8, 40, 377, 313)
$Create = GUICtrlCreateButton('Create', 160, 8, 75, 25, $WS_GROUP)
$Hilfe = GUICtrlCreateButton('Hilfe', 304, 8, 75, 25, $WS_GROUP)
$Folder = GUICtrlCreateButton("Ordner", 16, 8, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### GUI ###
;=============
#Region ### Global ###
Global $aID3, $aFiles, $sPath, $sNewItem
Global $ahPlItem[1], $iPlCount = 0, $sID3Tags
Global $LV_Style = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
Global $LV_EX_STYLE = BitOR($LVS_EX_SUBITEMIMAGES, $LVS_EX_DOUBLEBUFFER)
Global $ListView = GUICtrlCreateListView('Nr.|Artist|Title|Album|Länge|Path', 16, 48, 361, 297, $LV_Style, $LV_EX_STYLE)
_GUICtrlListView_SetExtendedListViewStyle($ListView, $LV_EX_STYLE)
_GUICtrlListView_RegisterSortCallBack($ListView)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xDDDDDD)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 32)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 1, 100)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, 100)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 3, 110)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 4, 50)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 5, 120)
#EndRegion ### Global ###
;=============
#Region ### GUI Event ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $ListView
_GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView))
Case $Create
_Create()
Case $Hilfe
_Hilfe()
Case $Folder
_FolderSearch()
;~ _Create()
EndSwitch
WEnd
#EndRegion ### GUI Event ###
;=============
#Region ### _Fehler() ###
Func _Fehler()
MsgBox(48, 'Fehler', 'Keine Wiedergabelieste ausgewählt')
EndFunc ;==>_Fehler
#EndRegion ### _Fehler() ###
;=============
#Region _Hilfe() ###
Func _Hilfe()
MsgBox(4096,'Hilfe','Wiedergabelisten Beschreibung'&@CRLF&@CRLF&'Einfach auf Ordner Klicken und Verzeichniss auswählen'&@CRLF&'Dann auf Create'&@CRLF&@CRLF&'WL Easy erstellt ein "*.m3u" File,welches von'&@CRLF&'mehreren Playern verwendet werden kann z.B.'&@CRLF&'- Windows Media Player'&@CRLF&'- Song Bird'&@CRLF&'- Real Player'&@CRLF&'- Video Lan (VLC)'&@CRLF&'- Win Amp'&@CRLF&'und viele andere'&@CRLF&@CRLF&'Ein Danke an:'&@CRLF&'i2c:Für seine Hilfe und Ideen'&@CRLF&'Raupi:Auch für seine Hilfe'&@CRLF&'ohforf:Auch für seine Hilfe'&@CRLF&@CRLF&'Createt by Skilkor')
EndFunc ;==>_Hilfe
#EndRegion _Hilfe() ###
;=============
#Region ### _FolderSearch() ###
Func _FolderSearch()
$sPath = FileSelectFolder('Wähle einen MP3 Verzeichniss aus', '', 4, '', '')
$aFiles = _FileListToArray($sPath, '*.mp3', 1) ; Array mit den MP3-Dateinamen
_GUICtrlListView_AddArray($aFiles, $ListView)
If Not @error Then
For $i = 1 To UBound($aFiles) - 1
_AddFileToListView($sPath & "\" & $aFiles[$i])
Next
EndIf
EndFunc ;==>_FolderSearch
#EndRegion ### _FolderSearch() ###
;=============
#Region ### _AddFileToListView() ###
Func _AddFileToListView($sPath) ;$aID3Tag[5][1] für die Titel Nr | $aID3Tag[2][1] für Artist | $aID3Tag[1][1] für Titel | $aID3Tag[3][1] für Album
If Not FileExists($sPath) Then Return
Local $aID3, $sNewItem
$aID3 = _ReadID3Tag($sPath)
If Not @error Then
ReDim $ahPlItem[$iPlCount + 1]
$sNewItem = $aID3[5][1] & '|' & $aID3[1][1] & '|' & $aID3[0][1] & '|' & $aID3[2][1] & '|' & $aID3[4][1] & '|' & $sPath
$ahPlItem[$iPlCount] = GUICtrlCreateListViewItem($sNewItem, $ListView)
$iPlCount += 1
EndIf
EndFunc
#EndRegion ### _AddFileToListView() ###
;=============
#Region ### _Create() ###
Func _Create()
Local $sSaveFilename,$hFile, $iCount = _GUICtrlListView_GetItemCount($ListView)
If $iCount = 0 Then Return
$sSaveFilename = FileSaveDialog('Wähle einen Namen für die MP3-Playlist', @DesktopDir, 'MP3-Playlist (*.m3u)', 18, '')
If Not @error Then
If StringRight($sSaveFilename, 4) <> '.m3u' Then $sSaveFilename &= '.m3u'
$hFile = FileOpen($sSaveFilename, 2)
If $hFile <> -1 Then
FileWrite($hFile, '#EXTM3U' & @CRLF)
For $i = 0 To $iCount - 1
FileWriteLine($hFile, '#EXTINF:' & _GUICtrlListView_GetItemText($ListView,$i,4) & ',' & _GUICtrlListView_GetItemText($ListView,$i,1) & ' - ' & _GUICtrlListView_GetItemText($ListView,$i,2)& ' - ' & 'Track Nr ' & _GUICtrlListView_GetItemText($ListView,$i,0) & ' end')
FileWriteLine($hFile, _GUICtrlListView_GetItemText($ListView,$i,5))
Next
FileClose($hFile)
EndIf
EndIf
EndFunc
#EndRegion ### _Create() ###
;=============
#Region ### ID3Tag ### Von Oscar
Func _ReadID3Tag($sPath)
If Not FileExists($sPath) Then Return SetError(1, 0, 0)
Local $hFile, $sData, $sID3Header, $iID3HeaderSize = 0, $iOffset, $iSize, $tmp
Local $aID3v2Tags[8] = ['TIT2', 'TPE1', 'TALB', 'TYER', 'TLEN', 'TRCK', 'TCON', 'TENC']
Local $aID3[11][2] = [ _
['Title', ''],['Artist', ''],['Album', ''],['Year', ''], _
['Length', '0'],['Track', ''],['Genre', ''],['Encoder', ''], _
['MPEG-Version', ''],['Bitrate', ''],['Sample-Freq.', '']]
Local $aMP3Version[4] = ['MPEG2.5', 'Reserved', 'MPEG2', 'MPEG1']
Local $aMP3Layer[4] = ['Reserved', 'Layer III', 'Layer II', 'Layer I']
Local $aMP3Bitrate[5][16] = [ _
[000, 032, 064, 096, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 000], _
[000, 032, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 384, 000], _
[000, 032, 040, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 000], _
[000, 032, 048, 056, 064, 080, 096, 112, 128, 144, 160, 176, 192, 224, 256, 000], _
[000, 008, 016, 024, 032, 040, 048, 056, 064, 080, 096, 112, 128, 144, 160, 000]]
Local $aSampleFreq[3][4] = [[44100, 48000, 32000, 0],[22050, 24000, 16000, 0],[11025, 12000, 8000, 0]]
Local $sMP3FrameHeader, $iMP3Version, $sMP3Version, $sMP3Layer, $iMP3Bitrate, $iMP3SampleFreq
Local $iVBRFrames = -1, $iVBRFilesize, $iVBRFlags
$hFile = FileOpen($sPath, 16)
If $hFile = -1 Then Return SetError(2, 0, 0)
$sData = Binary(FileRead($hFile, 4))
If BinaryMid($sData, 1, 3) = '0x494433' Then ; ID3 v2.x Kennung gefunden
If (BinaryMid($sData, 4, 1) = '0x03') Or (BinaryMid($sData, 4, 1) = '0x04') Then ; nur v2.3 und 2.4
FileRead($hFile, 2) ; 2 Bytes überspringen
For $i = 0 To 3 ; berechne ID3-Headergröße (4 Bytes, jedoch nur jeweils die unteren 7 Bit)
$iID3HeaderSize = BitShift($iID3HeaderSize, -7) + BitAND(Binary(FileRead($hFile, 1)), 0x7F)
Next
If $iID3HeaderSize > 0 Then
$sID3Header = Binary(FileRead($hFile, $iID3HeaderSize)) ; lese gesamten ID3-Header
For $i = 0 To 7
$iOffset = StringInStr(BinaryToString($sID3Header), $aID3v2Tags[$i]) ; Offset zu dem ID3-Tag
If $iOffset > 0 Then
$iSize = Hex(BinaryMid($sID3Header, $iOffset + 4, 4)) ; Größe des ID3-Frames
$tmp = BinaryMid($sID3Header, $iOffset + 11, Dec($iSize) - 1)
If BinaryMid($tmp, 1, 2) = '0xFFFE' Then
For $x = 3 To BinaryLen($tmp) Step 2
$aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 2), 2)
Next
Else
For $x = 1 To BinaryLen($tmp)
$aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 1))
Next
EndIf
$aID3[$i][1] = StringReplace($aID3[$i][1], Chr(0), '')
EndIf
Next
EndIf
Do
$sData = String(FileRead($hFile, 1))
If @error Then ExitLoop
If BitAND($sData, 0xff) = 0xff Then
FileSetPos($hFile, -1, 1)
$sData = String(FileRead($hFile, 4))
EndIf
Until BitAND($sData, 0xFFE00000) = 0xFFE00000
Else
FileClose($hFile)
Return SetError(3, 0, 0)
EndIf
Else ; ID3 v1.x
$iOffset = FileGetPos($hFile)
FileSetPos($hFile, -128, 2)
$sID3Header = BinaryToString(FileRead($hFile, 3))
If $sID3Header = 'TAG' Then
$aID3[0][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[1][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[2][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[3][1] = StringReplace(BinaryToString(FileRead($hFile, 4)), Chr(0), '')
EndIf
FileSetPos($hFile, $iOffset, 0)
EndIf
$sMP3FrameHeader = String($sData)
If BitAND($sMP3FrameHeader, 0xFFE00000) <> 0xFFE00000 Then
FileClose($hFile)
Return SetError(4, 0, 0) ; keine MP3-Datei, dann Return
EndIf
$iMP3Version = BitShift(BitXOR($sMP3FrameHeader, 0xFFE00000), 19) ; welche MP3-Version
$sMP3Version = $aMP3Version[$iMP3Version] ; in Textform
$sMP3Layer = $aMP3Layer[BitShift(BitAND($sMP3FrameHeader, 0x60000), 17)] ; welcher Layer
$aID3[8][1] = $sMP3Version & ' / ' & $sMP3Layer ; ins Ausgabe-Array
$iMP3Bitrate = BitShift(BitAND($sMP3FrameHeader, 0xF000), 12) ; Bitraten-Index auslesen
Switch $sMP3Version ; je nach MPEG-Version Bitrate aus der Tabelle holen
Case 'MPEG1'
$aID3[9][1] = $aMP3Bitrate[$iMP3Version - ($iMP3Version > 1)][$iMP3Bitrate]
Case 'MPEG2', 'MPEG2.5'
If $sMP3Layer = 'Layer I' Then
$aID3[9][1] = $aMP3Bitrate[3][$iMP3Bitrate]
Else
$aID3[9][1] = $aMP3Bitrate[4][$iMP3Bitrate]
EndIf
EndSwitch
$iMP3SampleFreq = BitShift(BitAND($sMP3FrameHeader, 0xC00), 10) ; Sample-Frequenz-Index auslesen
$aID3[10][1] = $aSampleFreq[2 - ($iMP3Version - ($iMP3Version > 1))][$iMP3SampleFreq] ; und Wert aus der Tabelle holen
Do ; evtl. Leerbytes überspringen
$tmp = FileRead($hFile, 1)
If @error Then ExitLoop
Until $tmp <> 0x00 Or @error
If $tmp = 0x58 And BinaryToString(FileRead($hFile, 3)) = 'ing' Then ; MP3 mit VBR (Xing-Header gefunden)?
$iVBRFlags = '0x' & Hex(FileRead($hFile, 4)) ; VBR-Flags auslesen
If BitAND($iVBRFlags, 0x3) Then ; wenn die Einträge vorhanden sind, dann...
$iVBRFrames = Dec(Hex(FileRead($hFile, 4))) ; Anzahl der VBR-Frames auslesen
$iVBRFilesize = Dec(Hex(FileRead($hFile, 4))) ; Dateigröße auslesen
$aID3[4][1] = $iVBRFrames * 1152 / $aID3[10][1] * 1000 ; VBR Laufzeit
$aID3[9][1] = 'VBR ~' & Int($iVBRFilesize * 8 / ($aID3[4][1] / 1000) / 1000) ; VBR durchschnittliche Bitrate
EndIf
Else
If $aID3[4][1] = 0 Then $aID3[4][1] = (FileGetSize($sPath) * / ($aID3[9][1] * 1000) * 1000 ; alternative CBR Laufzeit
$aID3[9][1] = 'CBR ' & $aID3[9][1]
EndIf
$aID3[4][1] = Int($aID3[4][1] / 1000) ; Laufzeit
$aID3[9][1] &= ' kBit/s'
$aID3[10][1] &= ' Hz'
FileClose($hFile)
Return $aID3
EndFunc ;==>_ReadID3Tag
#EndRegion ### ID3Tag ### Von Oscar
Ich hoffe das die Playlists korrekt sind, Rückmeldung immer gerne
***Edit***
18.03.2011 - Auf Wunsch hab ich noch einige Funktionen hinzugefügt:
Menü & ContextMenü (Menü oben, ContextMenü,rechtsklick in die ListView)
Funktion1 - Playlist Importieren (Importirt Erstellte Playlists. Es wird Empfohlen, Playlists zu Importieren die mit >WL< erstellt wurden (Betrifft *.wpl(Windows Media Player) & *.pls(Songbird) | da diese die eigenschaften haben einen Realativen Pfad anzugeben))
Funktion2 - Liste Leeren (Alle ListView Elemente Löschen)
Funktion3 - Maske (Ändert die GUI farbe)
ContextMenü
Funktion1 - Löschen (Löscht das Markierte ListView Element)
Funktion2 - File Hinzufügen (Fügt ein neues *.mp3 nach wahl ein)
Funktion3 - Playlist Importieren
Funktion4 - Liste Leeren
Funktion5 - Doppelte Entfernen (Löschen dopelter ListView Elemente. Damit ist gemeint, das wen es 2x den selbigen Song enthält, einer Gelöscht wird)
Diese Funktionen werden NICHT auf WL Easy übertragen. Da WL Easy noch schlichter und einfacher bleiben soll als WL selbst
07.03.2011 - Das Markieren und Löschen von Items in der ListView ist nun möglich via "Del" taste oder Rechtsklick auf das Item-->"Löschen"
07.03.2011 - WL erneut überarbeitet, Bug für Win XP User sollte nun Behoben sein
06.03.2011 - WL überarbeitet, Es können nun mehrere Playlists erstellt werden
06.03.2011 - Bei WL hab ich noch ein Clear ListView eingeparkt das ermöglicht es die Liste zu leeren und das prog nicht immer neu gestartet werden muss
06.03.2011 - Nochmals WL.au3 & WL.7z UpDate (Und nun hoff ich sind dieFehler bei der .wpl für den WMP behoben für den WMP win XP)
05.03.2011 - WL.au3 & WL.7z UptoDate (Fehler mit WMP bei Win XP Hoffentlich behoben)
05.03.2011 - WL.7z hinzugefügt (Beinhaltet 2 Ordner WL (Inhalt: WL.au3|WL.exe|icon)) WL Easy (Inhalt: WL Easy.au3|WL Easy.exe|icon)))
05.03.2011 - Beschreibungen und Angaben hinzugefügt
Grüsse
Skilkor