Sign in to follow this  
Followers 0
ragnarok775

Playlist Maker [v2] (.m3u)

6 posts in this topic

#1 ·  Posted (edited)

Just a little program Ive been working on for the past couple days to hone my limited programming skills.

It is a pretty basic Playlist maker. Saves the file as an m3u. Any comments, criticism, or suggestions are welcome.

***EDIT

Update: Added an "Import" button so you can import another *.m3u file as suggested by dansxmods

If the playlist your importing uses only shortnames (file.mp3 rather than C:\blahblah\file.mp3)

it will stick the longname in there.

M3U_v2.au3 [old au3: 19]

M3U_v2.exe [old exe: 33]

#include <GUIConstantsEx.au3>
#include <ListboxConstants.au3>
#Include <GuiListBox.au3>
#include <WindowsConstants.au3>
#include <String.au3>

;HotKeySet("!o", "_ArDisplay")

Opt('MustDeclareVars', 1)

Global $guictrl[8]
Global $files[200]
Global $arraypos = 0
Global $last_selected
Global $name = "playlist.m3u"

_main()

Func _main()
    Local $msg
    Local $title = "M3U Creator"
    
    GUICreate($title, 700, 233)
    GUISetFont(7.5)
    GUISetState(@SW_SHOW)
    $guictrl[0] = GUICtrlCreateButton("Add ", 10, 40, 45)
    $guictrl[1] = GUICtrlCreateList("", 65, 10, 625, 225,  BitOR($WS_HSCROLL, $WS_VSCROLL, $LBS_EXTENDEDSEL))
    $guictrl[2] = GUICtrlCreateButton("Save ", 10, 70, 45)
    $guictrl[3] = GUICtrlCreateButton("Delete ", 10, 100, 45)
    $guictrl[4] = GUICtrlCreateButton(" ^ ", 20, 130, 25)
    $guictrl[5] = GUICtrlCreateButton(" v ", 20, 160, 25)
    $guictrl[6] = GUICtrlCreateButton("Clear", 10, 190, 45)
    
    $guictrl[7] = GUICtrlCreateButton("Import", 10, 10, 45)

    GUICtrlSetFont($guictrl[1], 8.5, "", "", "Courier New")

    While 1
        $msg = GUIGetMsg()
        
        Select
            Case $msg = $GUI_EVENT_CLOSE
                ExitLoop
            Case $msg = $guictrl[7]
                _Import()
            Case $msg = $guictrl[0]
                _OpenDialog()
            Case $msg = $guictrl[2]
                _Save($title)
            Case $msg = $guictrl[3]
                _Delete()
            Case $msg = $guictrl[4]
                _MoveUp()
            Case $msg = $guictrl[5]
                _MoveDown()
            Case $msg = $guictrl[6]
                _ClearArray()
        EndSelect
    WEnd
    
    GUIDelete()
EndFunc

Func _Import()
    Local $import
    Local $i = 0
    Local $filesize 
    Local $k = 0
    Local $skip = 0
    
    $import = FileOpenDialog("Select M3U file.", @WorkingDir, "Playlist (*.M3U)")
    $i = FileGetSize($import) - 1
    If @error Or $i = -1 Then
        MsgBox("", "Error", "File is empty")
        Return
    EndIf
    $filesize = StringLen(StringAddCR(FileRead($import, $i))) - $i + 1
    $i = 0
    
    Local $temp[$filesize]

    While $i < $filesize
        $skip = 0
        $k = 0
        $temp[$i] = FileReadLine($import, $i + 1)
        
        If StringInStr($temp[$i], "\") Then
        Else
            $temp[$i] = _StringInsert($temp[$i], @WorkingDir & "\", 0)
        EndIf
        While $k < $arraypos
            If $temp[$i] = $files[$k] Then
                MsgBox(0, "", '"' & $temp[$i] & '" is allready in the library')
                $skip = 1
            EndIf
            $k += 1
        WEnd
        $k = 0
        If $skip = 0 Then
            $files[$arraypos] = $temp[$i]
            $arraypos += 1
        EndIf
        $i += 1
    WEnd
    
    _UpdateList()
EndFunc

Func _OpenDialog()
    Local $odfile
    Local $pos
    Local $i = 1
    Local $k = 0
    Local $temp[200]
    Local $skip = 0
    
    $odfile = FileOpenDialog("Select Files", @WorkingDir, "Music (*.MP3; *.WMA; *.ASF; *.AC3; *.FLAC; *.OGG;*.M4A; *.MKA; *.TTA; *.WV; *.WAV)", 4)
    If @error Then Return

    If StringInStr($odfile, "|") Then
        $temp = StringSplit($odfile, "|")

        While $i < $temp[0]
            $skip = 0
            While $k < $arraypos
                If $temp[1] & "\" & $temp[$i + 1] = $files[$k] Then
                    MsgBox(0, "", '"' & $temp[$i + 1] & '" is allready in the library')
                    $skip = 1
                EndIf
                $k += 1
            WEnd
            $k = 0
            If $skip = 0 Then
                $files[$arraypos] = $temp[1] & "\" & $temp[$i + 1]
                $arraypos += 1
            EndIf
            $i += 1
        WEnd
    Else
        While $k < $arraypos
            If $odfile = $files[$k] Then
                MsgBox(0, "", '"' & $odfile & '" is allready in the library')
                $skip = 1
            EndIf
            $k += 1
        WEnd
        $k = 0
        If $skip = 0 Then
            $files[$arraypos] = $odfile
            $arraypos += 1
        EndIf
    EndIf
    
    _UpdateList()
EndFunc

Func _UpdateList()
    Local $i
    Local $strlen
    Local $horiz_fit
    Local $max_len = 0

    GUICtrlSetData($guictrl[1], "")
    While $i < $arraypos
        GUICtrlSetData($guictrl[1], $files[$i])
        $strlen = StringLen($files[$i])
        If $strlen > 88 Then
            If $strlen > $max_len Then
                $max_len = $strlen
            EndIf
        EndIf
        $i += 1
    WEnd
    $horiz_fit = Round($max_len * 7.08)
    _GUICtrlListBox_SetHorizontalExtent($guictrl[1], $horiz_fit)
    _GUICtrlListBox_SetSel($guictrl[1], $last_selected)
EndFunc

Func _Save(ByRef $title)
    Local $i = 0
    Local $saveas
    Local $file_name
    Local $overwrite
    Local $temp_namer[20]
    
    $saveas = FileSaveDialog("Save As", @WorkingDir, "Playlist (*.m3u)", "", $name)
    If @error Then Return
    If StringInStr($saveas, ".") Then
        $file_name = $saveas
    Else
        $file_name = $saveas & ".m3u"
    EndIf
        

    If FileExists($file_name) Then
        $overwrite = MsgBox(276, "Overwrite?", "Would you like to Overwrite this file?")
        If $overwrite = 6 Then
            FileDelete($file_name)
        Else
            Return
        EndIf
    EndIf
    
    While $i < $arraypos
        FileWriteLine($file_name, $files[$i])
        $i += 1
    WEnd
    
    $temp_namer = StringSplit($file_name, "\")
    $name = $temp_namer[$temp_namer[0]]

    If StringLen($title & " - " & $file_name) > 97 Then
        If StringLen($title & " - " & $temp_namer[1] & "\ . . . \" & $temp_namer[$temp_namer[0] - 2] & "\" & $temp_namer[$temp_namer[0] - 1] & "\" & $temp_namer[$temp_namer[0]]) > 97 Then
            WinSetTitle($title, "", $title & " - " & $temp_namer[1] & "\ . . . \" & $temp_namer[$temp_namer[0] - 1] & "\" & $temp_namer[$temp_namer[0]])
        Else
            WinSetTitle($title, "", $title & " - " & $temp_namer[1] & "\ . . . \" & $temp_namer[$temp_namer[0] - 2] & "\" & $temp_namer[$temp_namer[0] - 1] & "\" & $temp_namer[$temp_namer[0]])
        EndIf
    Else
        WinSetTitle($title, "", $title & " - " & $file_name)
    EndIf
EndFunc

Func _ClearArray()
    Local $i
    Local $clear
    
    $clear = MsgBox(276, "Clear playlist?", "Are you sure you want to clear your playlist?")
    If $clear = 6 Then
    Else
        Return
    EndIf
    
    GUICtrlSetData($guictrl[1], "")
    While $i < $arraypos
        $files[$i] = ""
        $i += 1
    WEnd
    $last_selected = ""
    $arraypos = 0
EndFunc

Func _Delete()
    Local $i = 0
    Local $k = 0
    Local $temp
    
    $temp = GUICtrlRead($guictrl[1])
    
    While $i < $arraypos
        If $temp = $files[$i] Then
            $files[$i] = ""
            $k = $i
            While $k < $arraypos
                $files[$k] = $files[$k + 1]
                $k += 1
            WEnd
            $arraypos -= 1
            $last_selected = $i
            _UpdateList()
            Return
        EndIf
        $i += 1
    WEnd
EndFunc

Func _MoveUp()
    Local $i
    Local $temp
    
    $temp = GUICtrlRead($guictrl[1])
    
    While $i < $arraypos
        If $temp = $files[$i] Then
            If $i = 0 Then
                MsgBox(0,"Error", "Sorry, This file is allready at the top of the list.")
                Return
            EndIf
            _Swap($i, $i - 1)
            Return
        EndIf
        $i += 1
    WEnd
EndFunc

Func _MoveDown()
    Local $i
    Local $temp
    
    $temp = GUICtrlRead($guictrl[1])
    
    While $i < $arraypos
        If $temp = $files[$i] Then
            If $i = $arraypos - 1 Then
                MsgBox(0,"Error", "Sorry, This file is allready at the bottom of the list.")
                Return
            EndIf
            _Swap($i, $i + 1)
            Return
        EndIf
        $i += 1
    WEnd
EndFunc

Func _Swap($pos1, $pos2)
    Local $temp
    
    If $pos1 > $pos2 Then
        $last_selected = $pos1 - 1
    Else
        $last_selected = $pos1 + 1
    EndIf
    $temp = $files[$pos1]
    $files[$pos1] = $files[$pos2]
    $files[$pos2] = $temp
    _UpdateList()
EndFunc


;Func _ArDisplay()
;   _ArrayDisplay($files)
;   MsgBox(0, "", $arraypos)
;EndFunc
Edited by ragnarok775

Share this post


Link to post
Share on other sites



Works Great! (For others, exe is safe =] )

Share this post


Link to post
Share on other sites

Great Work you should add an option to open a previously saved playlist for editing.

Daniel.

Share this post


Link to post
Share on other sites

Added an "Import" button :) ... see original post.

Share this post


Link to post
Share on other sites

Nice work mate.

Share this post


Link to post
Share on other sites

I don't know squat about scripts, but I'm trying to learn. If you could help me, I would appreciate it, and I'm not above bribery :).

I am trying to get the script to say save as (working directory name).m3u, instead of playlist.m3u. I can change the playlist.m3u to anything I want, but can't figure out how to get it to put it the directory name into the save field.

Also, I am trying to figure out how to get it to import as a shortname instead of a longname

(file1.mp3)

(file2.mp3)

etc.

instead of

(C:\Documents and Settings\x\x\x\x\x\file1.mp3)

(C:\Documents and Settings\x\x\x\x\x\file2.mp3)

etc.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0