Alek Posted March 3, 2008 Share Posted March 3, 2008 (edited) a simple Autoit mp3 player. bugs: -Slider doesn't always redraw after resizing the window for some reason. expandcollapse popup#include <GUIConstants.au3> #Include <GuiListView.au3> #include <Guilistbox.au3> #include <Sound.au3> #include <File.au3> #NoTrayIcon Opt("GUIOnEventMode", 1) Global $Song = "0" Global $Lenght Global $Old_Selected Global $Name_Prop = 10 Global $Artist_Prop = 16 Global $Genre_Prop = 20 Global $Album_Prop = 17 If @OSVersion = "WIN_VISTA" Then $Name_Prop = 21 $Artist_Prop = 13 $Genre_Prop = 16 $Album_Prop = 14 EndIf Dim $Old_Pos = 0 If Not FileExists(@ScriptDir & "\Data.dat") Or Not FileExists(@ScriptDir & "\Info.dat") Then If MsgBox(36 ,"A-Player","Do you want A-Player to create you a index of all your mp3 files??") = 6 Then $Dir = FileSelectFolder("Select a directory to scan for MP3 files","") If $Dir <> "" Then _Create_Index($Dir, @ScriptDir & "\Data.dat") _Create_Info(@ScriptDir & "\Data.dat") EndIf EndIf Else $Date = FileReadLine(@ScriptDir & "\Data.dat") $Date = StringSplit($Date, ":") If $Date[1] < @MDAY-2 Or $Date[2] < @MON Then If MsgBox(36 ,"A-Player","Do you want A-Player to create you a index of all your mp3 files??") = 6 Then $Dir = FileSelectFolder("Select a directory to scan for MP3 files","") If $Dir <> "" Then FileDelete(@ScriptDir & "\info.dat") _Create_Index($Dir, @ScriptDir & "\Data.dat") _Create_Info(@ScriptDir & "\Data.dat") EndIf EndIf EndIf EndIf $Taskbar_Gui = GUICreate("A-Player",20,20,-100,-100) $Form1 = GUICreate("A-Player", 625, 350, -1,-1,$WS_BORDER+$WS_MAXIMIZEBOX+$WS_SIZEBOX+$WS_MINIMIZEBOX, $WS_EX_TOOLWINDOW, $Taskbar_Gui) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") $List1 = GUICtrlCreateList("",5,5,140,270) $ListView1 = GUICtrlCreateListView("#|Name|Artist|Genre|Album", 150, 5, 465, 265) $Slider1 = GUICtrlCreateSlider(5, 275, 611, 25) $Slider2 = GUICtrlCreateSlider(520, 300, 100, 25) $Button1 = GUICtrlCreateButton("4", 5, 300, 35, 22, 0) $Button2 = GUICtrlCreateButton("<", 45, 300, 35, 22, 0) $Label1 = GUICtrlCreateLabel("Loading...",257,300,110,22,$SS_SUNKEN) $Label2 = GUICtrlCreateLabel("X", 510,300,20,20) GUICtrlSetResizing($ListView1, 102) GUICtrlSetResizing($List1, 290+64) GUICtrlSetResizing($Slider1, 70+512) GUICtrlSetResizing($Slider2, 68+768) GUICtrlSetResizing($Button1, 66+768) GUICtrlSetResizing($Button2, 66+768) GUICtrlSetResizing($Label1, 64+768) GUICtrlSetResizing($Label2, 68+768) GUICtrlSetFont($Button1, 14, 800, 0, "Webdings") GUICtrlSetFont($Button2, 14, 800, 0, "Webdings") GUICtrlSetFont($Label1, 12, 800) GUICtrlSetFont($Label2, 14, 800, 0, "Webdings") GUICtrlSetLimit($Slider2, 1000, 0) GUICtrlSetData($Slider2, 1000) GUICtrlSetOnEvent($Button1, "_Play") GUICtrlSetOnEvent($Button2, "_Stop") GUICtrlSetOnEvent($Slider2, "_Volumcontrol") Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($ListView1)] _GUICtrlListView_HideColumn($ListView1, 0) GUISetState(@SW_SHOW, $Taskbar_Gui) GUISetState(@SW_SHOW, $Form1) Dim $Data = _LibGetLibs(@ScriptDir & "\Info.dat") If Not @error Then For $x = 1 To $Data[0] GUICtrlSetData($List1, $Data[$x]) Next EndIf AdlibEnable("_SongTime",1000) DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1) While 1 If GUICtrlRead($List1) <> $Old_Selected Then $Old_Selected = GUICtrlRead($List1) $Data = _LibRead(@ScriptDir & "\info.dat",$Old_Selected) If Not @error Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) For $x = 1 To $Data[0] If $Data[$x] = "" Or Not Int($Data[$x]) Then ContinueLoop $S_Song = FileReadLine(@ScriptDir & "\Data.dat",$Data[$x]) GUICtrlCreateListViewItem($Data[$x] & "|" & _GetExtProperty($S_Song, $Name_Prop) & "|" & _GetExtProperty($S_Song,$Artist_Prop) & "|" & _GetExtProperty($S_Song,$Genre_Prop) &"|" & _GetExtProperty($S_Song,$Album_Prop), $ListView1) Next EndIf EndIf Sleep(10) _Searchcontrol() WEnd Func _Volumcontrol() mciSendString ("setaudio " & $Song & " output volume to " & GUICtrlRead($Slider2)) EndFunc Func _Play() If GUICtrlRead($Button1) = "4" Then If $Song = "0" And GUICtrlRead(GUICtrlRead($ListView1)) <> "" Then $Song = StringSplit(GUICtrlRead(GUICtrlRead($ListView1)), "|") $Song = FileReadLine(@ScriptDir & "\data.dat",$Song[1]) $Song = _SoundOpen($Song) $Lenght = TimeToSec(_Sound_Length($Song,1)) GUICtrlSetLimit($Slider1,$Lenght) _Volumcontrol() EndIf _SoundPlay($Song) GUICtrlSetData($Button1, ";") Else _SoundPause($Song) GUICtrlSetData($Button1, "4") EndIf EndFunc Func _Stop() _SoundStop($Song) _SoundClose($Song) $Song = 0 GUICtrlSetData($Button1, "4") EndFunc Func _Searchcontrol() Local $oldposx $nInfo = GUIGetCursorInfo($Form1) If $nInfo[4] = $Slider1 And WinActive($Form1) And _IsPressed(01) Then AdlibDisable() _SoundPause($Song) Do $nInfo = GUIGetCursorInfo($Form1) If $nInfo[0] <> $oldposx Then _SoundSeek($Song, 0, 0, GUICtrlRead($Slider1)) _SoundPlay($Song) Sleep(100) GUICtrlSetData($Label1, SecToTime(GUICtrlRead($Slider1)) & " / " & SecToTime($Lenght)) $oldposx = $nInfo[0] Else Sleep(10) EndIf Until _IsPressed(01) = 0 _SoundPlay($Song) AdlibEnable("_SongTime",1000) EndIf EndFunc Func _Create_Index($S_File_Path = "", $S_Index_File = -1) If $S_Index_File = -1 Then $S_Index_File = @ScriptDir & "\Index.dat" EndIf FileDelete($S_Index_File) FileWrite($S_Index_File,@MDAY & ":" & @MON & @CRLF) $S_Paths = $S_File_Path $File = FileOpen($S_Index_File,1) While $S_Paths $S_File_Path = StringSplit($S_Paths,"|") $S_Paths = "" For $x = 1 To $S_File_Path[0] If $S_File_Path[$x] <> "" Then $S_First_File = FileFindFirstFile($S_File_Path[$x] & "\*.*") While 1 $S_Files = FileFindNextFile($S_First_File) If @error Then ExitLoop If StringInStr(FileGetAttrib($S_File_Path[$x] & "\" & $S_Files), "D") Then $S_Paths &= $S_File_Path[$x] & "\" & $S_Files & "|" ElseIf StringRight($S_Files,3) = "mp3" Then If FileGetSize($S_File_Path[$x] & "\" & $S_Files)/1024 > 1000 Then FileWrite($File,$S_File_Path[$x] & "\" & $S_Files & @CRLF) EndIf EndIf WEnd EndIf Next Wend FileClose($File) Return 1 EndFunc Func _SongTime() $Pos = _SoundPos($Song,2)/1000 If $Pos <> $Old_Pos Then $Old_Pos = $Pos GUICtrlSetData($Slider1, $Pos) GUICtrlSetData($Label1, SecToTime($Pos) & " / " & SecToTime($Lenght)) EndIf If $Lenght > 0 And $Pos >= $Lenght And _SoundStatus($Song) = "stopped" Then Local $Sel_Index = _GUICtrlListView_GetSelectedIndices($ListView1) _Stop() If $Sel_Index = _GUICtrlListView_GetItemCount($ListView1)-1 Then _GUICtrlListView_SetItemSelected($ListView1,0) Else _GUICtrlListView_SetItemSelected($ListView1,$Sel_Index+1) EndIf _Play() $Old_Pos = 0 EndIf EndFunc Func TimeToSec($s_timer) Local $s_time = StringSplit($s_timer,":") If $s_time[0] <> 3 Then Return 0 Return ($s_time[1]*3600)+($s_time[2]*60)+$s_time[3] EndFunc Func SecToTime($s_timer) Local $s_Min Local $s_Sec = Floor($s_timer) While $s_Sec > 60 Select Case $s_Sec > 3599 $s_Min += 60 $s_Sec -= 3600 Case $s_Sec > 599 $s_Min += 10 $s_Sec -= 600 Case $s_Sec > 59 $s_Min += 1 $s_Sec -= 60 EndSelect WEnd Return StringFormat('%02d:%02d', $s_Min, $s_Sec) EndFunc ;######################################## ;_GetExtPrperty ; Author(s): Simucal (Simucal@gmail.com) ;Changed a bit to work better with my script. ;Returns "" insted of 0 on error ;######################################## Func _GetExtProperty($sPath, $iProp) Local $iExist, $sFile, $sDir, $oShellApp, $oDir, $oFile, $aProperty, $sProperty $iExist = FileExists($sPath) If $iExist = 0 Then SetError(1) Return "" Else $sFile = StringTrimLeft($sPath, StringInStr($sPath, "\", 0, -1)) $sDir = StringTrimRight($sPath, (StringLen($sPath) - StringInStr($sPath, "\", 0, -1))) $oShellApp = ObjCreate ("shell.application") $oDir = $oShellApp.NameSpace ($sDir) $oFile = $oDir.Parsename ($sFile) If $iProp = -1 Then Local $aProperty[35] For $i = 0 To 34 $aProperty[$i] = $oDir.GetDetailsOf ($oFile, $i) Next Return $aProperty Else $sProperty = $oDir.GetDetailsOf ($oFile, $iProp) If $sProperty = "" Then Return "" Else Return $sProperty EndIf EndIf EndIf EndFunc Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam) Local $tagNMHDR, $event, $hwndFrom, $code $tagNMHDR = DllStructCreate("int;int;int", $lParam) If @error Then Return 0 $code = DllStructGetData($tagNMHDR, 3) If $wParam = $ListView1 And $code = -3 Then _Stop() _Play() ElseIf $wParam = $ListView1 And $code = $LVN_COLUMNCLICK Then Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) _GUICtrlListView_SimpleSort ($ListView1, $B_DESCENDING, DllStructGetData($tInfo, "SubItem")) EndIf Return $GUI_RUNDEFMSG EndFunc Func _Exit() Exit EndFunc Func _LibWrite($s_File, $s_Lib, $s_Info) Local $s_Data, $s_File_Data Local $s_Lines = _FileCountLines($s_File) For $x = 1 To $s_Lines If StringLeft(FileReadLine($s_File, $x), StringLen($s_Lib)) = $s_Lib Then $s_Data = FileReadLine($s_File, $x) $s_File_Data = FileRead($s_File) FileDelete($s_File) FileWrite($s_File, StringReplace($s_File_Data, $s_Data, $s_Data & Chr(1) & $s_Info)) Return 1 EndIf Next FileWriteLine($s_File,$s_Lib & Chr(1) & $s_Info) Return 0 EndFunc Func _LibRead($s_File, $s_Lib) Local $s_Data Local $s_Lines = _FileCountLines($s_File) For $x = 1 To $s_Lines $s_Data = FileReadLine($s_File, $x) If StringLeft($s_Data , StringLen($s_Lib)) = $s_Lib Then $s_Data = StringSplit(StringReplace($s_Data ,$s_Lib & Chr(1), ""),Chr(1)) Return $s_Data EndIf Next SetError(1) Return 0 EndFunc Func _LibGetLibs($s_File) Local $s_Data[2] = [0,""] Local $s_File_Data Local $s_Lines = _FileCountLines($s_File) For $x = 1 To $s_Lines $s_File_Data = FileReadLine($s_File,$x) $s_Data[0] += 1 $s_Data[UBound($s_Data)-1] = StringLeft($s_File_Data, StringInStr($s_File_Data,Chr(1))) ReDim $s_Data[UBound($s_Data)+1] Next Return $s_Data EndFunc Func _Sound_Length($sSnd_id, $iMode = 1) ;Declare variables Local $iSnd_len_ms, $iSnd_len_min, $iSnd_len_hour, $iSnd_len_sec, $sSnd_len_format ;validate $iMode If $iMode <> 1 And $iMode <> 2 Then Return SetError(1, 0, 0) ;tell mci to use time in milliseconds mciSendString("set " & FileGetShortName($sSnd_id) & " time format miliseconds") ;recieve length of sound $iSnd_len_ms = mciSendString("status " & FileGetShortName($sSnd_id) & " length") ;assign modified data to variables $iSnd_len_min = Int($iSnd_len_ms / 60000) $iSnd_len_hour = Int($iSnd_len_min / 60) $iSnd_len_sec = Int(Int($iSnd_len_ms / 1000) - ($iSnd_len_min * 60)) ;assign formatted data to $sSnd_len_format $sSnd_len_format = StringFormat("%02i:%02i:%02i", $iSnd_len_hour, $iSnd_len_min, $iSnd_len_sec) ;return correct variable If $iMode = 1 Then Return $sSnd_len_format If $iMode = 2 Then Return $iSnd_len_ms EndFunc Func _Create_Info($s_File) Local $s_Name ,$s_Artist, $s_Song Local $Song_On_List = 1 Local $s_Songs = _FileCountLines($s_File) FileDelete(@ScriptDir & "\info.dat") If @error Then Return 0 For $x = 1 To $s_Songs $s_Song = FileReadLine($s_File, $x) $s_Name = _GetExtProperty($s_Song,$Name_Prop) If $s_Name <> "" Then $s_Artist = _GetExtProperty($s_Song,$Artist_Prop) If $s_Artist = "" Then $s_Artist = "Other" _LibWrite(@ScriptDir & "\info.dat", $s_Artist, $x) EndIf Next Return 1 EndFunc Edited March 4, 2008 by Alek [font="Impact"]Never fear, I is here.[/font] Link to comment Share on other sites More sharing options...
LIMITER Posted March 4, 2008 Share Posted March 4, 2008 Posible bug : when creating playlist, the name column shows the time instead of name and the artist and album columns are empty, and the genre column shows the artist ... :strange: Nice app though ! Check my player, (it's in the signature), you can find some useful things Link to comment Share on other sites More sharing options...
Alek Posted March 4, 2008 Author Share Posted March 4, 2008 Posible bug : when creating playlist, the name column shows the time instead of name and the artist and album columns are empty, and the genre column shows the artist ... :strange:Nice app though ! Check my player, (it's in the signature), you can find some useful things I'm guessing your running windows XPif so then i feared that that would happen :shopefully the new script fixed the problem, i cant really test it properly, it worked great on my computer (vista). [font="Impact"]Never fear, I is here.[/font] Link to comment Share on other sites More sharing options...
LIMITER Posted March 4, 2008 Share Posted March 4, 2008 Oh i see them ... Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now