#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=icons\prog00.ico
#AutoIt3Wrapper_outfile=WL Easy.exe
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Fileversion=1.2.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>
#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, $DelItem
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, $LVS_EX_FULLROWSELECT)
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)
Global $ContextMenue = GUICtrlCreateContextMenu($ListView)
Global $DelItem = GUICtrlCreateMenuItem("Löschen", $ContextMenue)
#EndRegion ### Global ###
;=============
#Region ### HotKeySet ###
HotKeySet('{DELETE}','_DeleteSelected')
#EndRegion ### HotKeySet ###
;=============
#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()
		Case $DelItem
			_DeleteSelected()
	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 ### _ListView() Leeren ###
Func _ClearListView()
	$MsgBox = MsgBox(4,'','Sollen die einträge gelöscht werden?')

	If $MsgBox = 6 Then
		_GUICtrlListView_DeleteAllItems($ListView)
	EndIf
EndFunc
#EndRegion ### _ListView() Leeren ###
;=============
#Region ### _DeleteSelected ###
Func _DeleteSelected()
	_GUICtrlListView_DeleteItemsSelected($ListView)
EndFunc
#EndRegion ### _DeleteSelected ###
;=============
#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
	_ClearListView()
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) * 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