#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(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) * 8) / ($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 (bugfix@autoit.de)
;----------------------------------------------------------------------------------------------------------------------
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() ###