Jump to content

Recommended Posts

Posted (edited)

Hi everybody , I hope you are doing great 🙂

I have this project about a Jukebox but my GUI is not working right it's not loading and playing the videos or songs and also it's not saving the info on the .DB file also not showing the albums picture.

 

please help me out I'm a newbe don't know much about programing just a lil bit but just don't know anything about databases or .db 

just to let you know this is not a comercial software I want to give it out for free to anybody so you are free to use it and mode the code to improve it or to make it yours

the code is below just to let you know I have a code for a different version of the software that works meaning play songs and videos 

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ListViewConstants.au3>
#include <GuiListView.au3>
#include <GuiComboBox.au3>
#include <StaticConstants.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <File.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <Misc.au3>

; ============================================================
; ROCKOLA FOREVER PRO - AutoIt
; Motor multimedia: Windows Media Player ActiveX
; Biblioteca persistente: SQLite
; Modos: Cliente / Administrador
; ============================================================

Opt("GUIOnEventMode", 0)
Opt("TrayAutoPause", 0)

Global Const $APP_NAME = "ROCKOLA FOREVER PRO"
Global Const $DB_FILE = @ScriptDir & "\RockolaForever.db"
Global Const $PLAYLIST_FILE = @ScriptDir & "\RockolaForever.m3u"
Global Const $ADMIN_PIN_DEFAULT = "1234"
Global Const $PRICE_PER_SONG = 1

Global $g_hDB = -1
Global $g_oWMP = 0
Global $g_hGUI = 0
Global $g_bAdmin = False
Global $g_iCredits = 0
Global $g_iCurrentTrack = -1
Global $g_iCurrentSongID = -1
Global $g_bRandom = False
Global $g_bRepeat = False
Global $g_bUpdating = False
Global $g_sCurrentCover = ""
Global $g_aQueue[1]
Global $g_iQueueCount = 0
Global $g_iQueuePos = -1
Global $g_aVisibleIDs[1]
Global $g_iVisibleCount = 0

; Controls
Global $idSearch, $idGenre, $idResults, $idRequest
Global $idCredits, $idNowPlaying, $idTime, $idProgress
Global $idVolume, $idQueue, $idCover, $idStatus
Global $idAdmin, $idScan, $idAddFolder, $idAddCredits
Global $idAutoStart, $idExit, $idRandom, $idRepeat
Global $idRemoveSong, $idRefresh, $idModeClient, $idModeAdmin
Global $idPlayerHost

_Main()

Func _Main()
    If Not _InitDatabase() Then
        MsgBox(16, $APP_NAME, "No se pudo iniciar la base de datos SQLite.")
        Exit
    EndIf

    _CreateGUI()
    _RefreshGenres()
    _RefreshSongs()
    _RefreshCredits()

    While 1
        Local $msg = GUIGetMsg()

        Switch $msg
            Case $GUI_EVENT_CLOSE, $idExit
                ExitLoop

            Case $idSearch
                _RefreshSongs()

            Case $idGenre
                _RefreshSongs()

            Case $idRequest
                _RequestSelectedSong()

            Case $idScan, $idAddFolder
                If _RequireAdmin() Then _ScanFolder()

            Case $idAddCredits
                If _RequireAdmin() Then _AddCreditsDialog()

            Case $idAutoStart
                If _RequireAdmin() Then _ToggleAutoStart()

            Case $idAdmin
                _AdminLogin()

            Case $idRefresh
                _RefreshGenres()
                _RefreshSongs()
                _RefreshCredits()

            Case $idRemoveSong
                If _RequireAdmin() Then _RemoveSelectedSong()

            Case $idRandom
                $g_bRandom = Not $g_bRandom
                GUICtrlSetData($idRandom, "ALEATORIO: " & _OnOff($g_bRandom))

            Case $idRepeat
                $g_bRepeat = Not $g_bRepeat
                GUICtrlSetData($idRepeat, "REPETIR: " & _OnOff($g_bRepeat))

            Case $idVolume
                If IsObj($g_oWMP) Then $g_oWMP.settings.volume = GUICtrlRead($idVolume)

            Case $idModeClient
                _ShowClientMode()

            Case $idModeAdmin
                If _RequireAdmin() Then _ShowAdminMode()

            Case $idResults
                ; La selección se procesa con el botón PEDIR CANCIÓN.
        EndSwitch

        _UpdatePlayback()
        Sleep(100)
    WEnd

    If IsObj($g_oWMP) Then
        $g_oWMP.controls.stop()
        $g_oWMP.close()
        $g_oWMP = 0
    EndIf

    If $g_hDB <> -1 Then _SQLite_Close()
    _SQLite_Shutdown()
    GUIDelete($g_hGUI)

EndFunc

; -------------------- DATABASE --------------------

Func _InitDatabase()
  Global $SQL =  _SQLite_Startup()
    If @error Then Return False

    $g_hDB = _SQLite_Open($DB_FILE)
    If @error Then Return False

    _SQLite_Exec($g_hDB, "PRAGMA journal_mode=WAL;")
    _SQLite_Exec($g_hDB, "PRAGMA synchronous=NORMAL;")
    _SQLite_Exec($g_hDB, "CREATE TABLE IF NOT EXISTS songs (" & _
            "id INTEGER PRIMARY KEY AUTOINCREMENT," & _
            "path TEXT UNIQUE NOT NULL," & _
            "title TEXT, artist TEXT, album TEXT, genre TEXT);")
    _SQLite_Exec($g_hDB, "CREATE INDEX IF NOT EXISTS idx_songs_title ON songs(title);")
    _SQLite_Exec($g_hDB, "CREATE INDEX IF NOT EXISTS idx_songs_artist ON songs(artist);")
    _SQLite_Exec($g_hDB, "CREATE INDEX IF NOT EXISTS idx_songs_genre ON songs(genre);")
    _SQLite_Exec($g_hDB, "CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT);")
    _SQLite_Exec($g_hDB, "INSERT OR IGNORE INTO settings(key,value) VALUES('credits','0');")
    _SQLite_Exec($g_hDB, "INSERT OR IGNORE INTO settings(key,value) VALUES('admin_pin','" & $ADMIN_PIN_DEFAULT & "');")
    _SQLite_Exec($g_hDB, "CREATE TABLE IF NOT EXISTS playlog (" & _
            "id INTEGER PRIMARY KEY AUTOINCREMENT, song_id INTEGER, played_at TEXT DEFAULT CURRENT_TIMESTAMP);")
    Return True
EndFunc

Func _SQLQ($s)
    Return "'" & StringReplace(String($s), "'", "''") & "'"
EndFunc

Func _GetSetting($key, $default = "")

    Local $aResult, $iRows, $iCols

    _SQLite_GetTable2d( _
        $g_hDB, _
        "SELECT value FROM settings WHERE key=" & _SQLQ($key) & ";", _
        $aResult, _
        $iRows, _
        $iCols)

    If @error Then Return $default

    If UBound($aResult) < 2 Then Return $default

    Return $aResult[1][0]

EndFunc

Func _SetSetting($key, $value)
    _SQLite_Exec($g_hDB, "INSERT OR REPLACE INTO settings(key,value) VALUES(" & _
            _SQLQ($key) & "," & _SQLQ($value) & ");")
EndFunc

Func _RefreshCredits()
    $g_iCredits = Int(_GetSetting("credits", "0"))
    GUICtrlSetData($idCredits, "CRÉDITOS DISPONIBLES: " & $g_iCredits)
EndFunc

; -------------------- GUI --------------------

Func _CreateGUI()
    $g_hGUI = GUICreate($APP_NAME, @DesktopWidth, @DesktopHeight, 0, 0, _
            BitOR($WS_POPUP, $WS_CLIPCHILDREN))
    GUISetBkColor(0x10131B, $g_hGUI)

    GUICtrlCreateLabel("ROCKOLA FOREVER PRO", 22, 12, 650, 48)
    GUICtrlSetFont(-1, 27, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0x00D9FF)

    GUICtrlCreateLabel("MÚSICA • VIDEO • ENTRETENIMIENTO", 27, 58, 500, 24)
    GUICtrlSetFont(-1, 11, 600)
    GUICtrlSetColor(-1, 0xAAB4C5)

    $idModeClient = GUICtrlCreateButton("MODO CLIENTE", 690, 20, 145, 48)
    $idModeAdmin = GUICtrlCreateButton("ADMINISTRADOR", 845, 20, 165, 48)
    $idAdmin = GUICtrlCreateButton("ACCESO ADMIN", 1020, 20, 150, 48)

    ; Área multimedia. El control ActiveX de WMP se crea en esta zona.
    GUICtrlCreateLabel("REPRODUCIENDO AHORA", 22, 98, 500, 25)
    GUICtrlSetFont(-1, 13, 700)
    GUICtrlSetColor(-1, 0xFFFFFF)

    $g_oWMP = ObjCreate("WMPlayer.OCX")
    If Not IsObj($g_oWMP) Then
        MsgBox(16, $APP_NAME, "Windows Media Player ActiveX no está disponible." & @CRLF & _
                "Activa la característica Windows Media Player y vuelve a ejecutar.")
        Exit
    EndIf

    $idPlayerHost = GUICtrlCreateObj($g_oWMP, 22, 130, 700, 410)
    With $g_oWMP
        .uiMode = "none"
        .enableContextMenu = False
        .settings.autoStart = False
        .settings.volume = 80
        .settings.mute = False
        .stretchToFit = True
        .windowlessVideo = True
    EndWith

    $idCover = GUICtrlCreatePic("", 750, 130, 160, 160)
    GUICtrlSetBkColor($idCover, 0x202633)

    GUICtrlCreateLabel("BIBLIOTECA", 930, 125, 200, 28)
    GUICtrlSetFont(-1, 14, 700)
    GUICtrlSetColor(-1, 0x00D9FF)

    $idSearch = GUICtrlCreateInput("", 930, 160, 330, 42, $ES_AUTOHSCROLL)
    GUICtrlSetFont($idSearch, 14, 400)
    GUICtrlSetTip($idSearch, "Buscar por canción o artista")

    $idGenre = GUICtrlCreateCombo("Todos los géneros", 930, 210, 330, 40, $CBS_DROPDOWNLIST)
    GUICtrlSetFont($idGenre, 12, 400)

    $idResults = GUICtrlCreateListView("CANCIÓN|ARTISTA|GÉNERO", 930, 260, 330, 280, _
            BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS))
    _GUICtrlListView_SetColumnWidth($idResults, 0, 135)
    _GUICtrlListView_SetColumnWidth($idResults, 1, 110)
    _GUICtrlListView_SetColumnWidth($idResults, 2, 75)
    GUICtrlSetFont($idResults, 10, 400)

    $idNowPlaying = GUICtrlCreateLabel("Selecciona una canción", 22, 552, 760, 30)
    GUICtrlSetFont($idNowPlaying, 14, 700)
    GUICtrlSetColor($idNowPlaying, 0xFFFFFF)

    $idStatus = GUICtrlCreateLabel("SISTEMA LISTO", 22, 585, 500, 22)
    GUICtrlSetColor($idStatus, 0x00D9FF)

    $idTime = GUICtrlCreateLabel("00:00 / 00:00", 650, 585, 130, 22)
    GUICtrlSetColor($idTime, 0xFFFFFF)

    $idProgress = GUICtrlCreateProgress(22, 610, 760, 14)
    $idVolume = GUICtrlCreateSlider(22, 638, 240, 35)
    GUICtrlSetLimit($idVolume, 100, 0)
    GUICtrlSetData($idVolume, 80)
    GUICtrlCreateLabel("VOLUMEN", 270, 645, 100, 22)
    GUICtrlSetColor(-1, 0xFFFFFF)

    $idQueue = GUICtrlCreateList("", 750, 570, 250, 125)
    GUICtrlSetBkColor($idQueue, 0x202633)
    GUICtrlSetColor($idQueue, 0xFFFFFF)

    $idCredits = GUICtrlCreateLabel("CRÉDITOS: 0", 1015, 535, 250, 28)
    GUICtrlSetFont($idCredits, 15, 800)
    GUICtrlSetColor($idCredits, 0xFFD700)

    $idRequest = GUICtrlCreateButton("PEDIR CANCIÓN (1 CRÉDITO)", 1015, 570, 250, 60)
    GUICtrlSetFont($idRequest, 15, 800)

    $idScan = GUICtrlCreateButton("ESCANEAR", 22, 695, 130, 45)
    $idAddFolder = GUICtrlCreateButton("AGREGAR MÚSICA", 160, 695, 130, 45)
    $idAddCredits = GUICtrlCreateButton("CRÉDITOS", 298, 695, 130, 45)
    $idAutoStart = GUICtrlCreateButton("AUTO INICIO", 436, 695, 130, 45)
    $idRefresh = GUICtrlCreateButton("ACTUALIZAR", 574, 695, 130, 45)
    $idRemoveSong = GUICtrlCreateButton("ELIMINAR", 712, 695, 130, 45)
    $idRandom = GUICtrlCreateButton("ALEATORIO: OFF", 850, 695, 130, 45)
    $idRepeat = GUICtrlCreateButton("REPETIR: OFF", 988, 695, 130, 45)
    $idExit = GUICtrlCreateButton("SALIR", 1126, 695, 100, 45)

    _ShowClientMode()
    GUISetState(@SW_SHOW, $g_hGUI)
EndFunc

Func _ShowClientMode()
    $g_bAdmin = False
    _AdminControls(False)
EndFunc

Func _ShowAdminMode()
    $g_bAdmin = True
    _AdminControls(True)
EndFunc

Func _AdminControls($show)
    Local $aControls = [$idScan, $idAddFolder, $idAddCredits, $idAutoStart, $idRemoveSong]
    For $i = 0 To UBound($aControls) - 1
        If $show Then
            GUICtrlSetState($aControls[$i], $GUI_SHOW)
        Else
            GUICtrlSetState($aControls[$i], $GUI_HIDE)
        EndIf
    Next
EndFunc

; -------------------- LIBRARY --------------------

Func _RefreshGenres()
    Local $aResult, $rows, $cols

_SQLite_GetTable2d( _
    $g_hDB, _
    "SELECT DISTINCT genre FROM songs WHERE genre<>'' ORDER BY genre;", _
    $aResult, _
    $rows, _
    $cols)

If Not @error Then
    For $i = 1 To UBound($aResult) - 1
        _GUICtrlComboBox_AddString($idGenre, $aResult[$i][0])
    Next
EndIf
EndFunc

Func _RefreshSongs()
    If $g_bUpdating Then Return
    $g_bUpdating = True

    _GUICtrlListView_DeleteAllItems($idResults)
    ReDim $g_aVisibleIDs[1]
    $g_iVisibleCount = 0

    Local $search = StringStripWS(GUICtrlRead($idSearch), 3)
    Local $genre = GUICtrlRead($idGenre)
    Local $sql = "SELECT id,title,artist,genre FROM songs WHERE 1=1 "

    If $search <> "" Then
        $sql &= "AND (title LIKE " & _SQLQ("%" & $search & "%") & _
                " OR artist LIKE " & _SQLQ("%" & $search & "%") & _
                " OR album LIKE " & _SQLQ("%" & $search & "%") & ") "
    EndIf
    If $genre <> "" And $genre <> "Todos los géneros" Then
        $sql &= "AND genre=" & _SQLQ($genre) & " "
    EndIf
    $sql &= "ORDER BY title COLLATE NOCASE LIMIT 3000;"

    Local $aResult, $rows, $cols

_SQLite_GetTable2d($g_hDB, $sql, $aResult, $rows, $cols)

If Not @error Then

    For $i = 1 To UBound($aResult) - 1

        Local $id = $aResult[$i][0]
        Local $title = $aResult[$i][1]
        Local $artist = $aResult[$i][2]
        Local $g = $aResult[$i][3]

    Next

EndIf

    $g_bUpdating = False
EndFunc

Func _ScanFolder()
    Local $folder = FileSelectFolder("Selecciona la carpeta principal de música y videos", "")
    If @error Or $folder = "" Then Return

    GUICtrlSetData($idStatus, "ESCANEANDO BIBLIOTECA...")

    Local $patterns = "*.mp3;*.wma;*.wav;*.aac;*.m4a;*.mp4;*.avi;*.wmv;*.mpg;*.mpeg;*.mov;*.asf;*.3gp"
    Local $files = _FileListToArrayRec($folder, $patterns, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)

    If @error Then
        MsgBox(48, $APP_NAME, "No se encontraron archivos compatibles.")
        Return
    EndIf

    Local $added = 0
    For $i = 1 To $files[0]
        If _IndexFile($files[$i]) Then $added += 1
        If Mod($i, 50) = 0 Then
            GUICtrlSetData($idStatus, "ESCANEANDO: " & $i & " / " & $files[0])
            Sleep(1)
        EndIf
    Next

    _RefreshGenres()
    _RefreshSongs()
    GUICtrlSetData($idStatus, "ESCANEO TERMINADO. NUEVOS ARCHIVOS: " & $added)
    MsgBox(64, $APP_NAME, "Escaneo terminado." & @CRLF & _
            "Archivos encontrados: " & $files[0] & @CRLF & _
            "Nuevos registros: " & $added)
EndFunc

Func _IndexFile($path)
    If Not FileExists($path) Then Return False

    Local $media = $g_oWMP.newMedia($path)
    If Not IsObj($media) Then Return False

    Local $title = $media.getItemInfo("Title")
    Local $artist = $media.getItemInfo("Author")
    Local $album = $media.getItemInfo("WM/AlbumTitle")
    Local $genre = $media.getItemInfo("WM/Genre")

    If $title = "" Then $title = _FileBaseName($path)
    If $artist = "" Then $artist = "Artista desconocido"
    If $album = "" Then $album = ""
    If $genre = "" Then $genre = "Sin categoría"

    Local $sql = "INSERT OR IGNORE INTO songs(path,title,artist,album,genre) VALUES(" & _
            _SQLQ($path) & "," & _SQLQ($title) & "," & _SQLQ($artist) & "," & _
            _SQLQ($album) & "," & _SQLQ($genre) & ");"
    _SQLite_Exec($g_hDB, $sql)
    Return (@error = 0)
EndFunc

Func _FileBaseName($path)
    Local $name = StringTrimLeft($path, StringInStr($path, "\", 0, -1))
    Local $dot = StringInStr($name, ".", 0, -1)
    If $dot > 0 Then $name = StringLeft($name, $dot - 1)
    Return $name
EndFunc

Func _RemoveSelectedSong()
    Local $sel = _GUICtrlListView_GetSelectedIndices($idResults, True)
    If Not IsArray($sel) Or $sel[0] = 0 Then Return
    Local $row = Int($sel[1])
    If $row < 0 Or $row >= $g_iVisibleCount Then Return
    If MsgBox(36, $APP_NAME, "¿Eliminar esta canción de la biblioteca?") <> 6 Then Return
    _SQLite_Exec($g_hDB, "DELETE FROM songs WHERE id=" & $g_aVisibleIDs[$row] & ";")
    _RefreshGenres()
    _RefreshSongs()
EndFunc

; -------------------- CREDITS / CUSTOMER REQUESTS --------------------

Func _RequestSelectedSong()
    Local $sel = _GUICtrlListView_GetSelectedIndices($idResults, True)
    If Not IsArray($sel) Or $sel[0] = 0 Then
        MsgBox(48, $APP_NAME, "Primero selecciona una canción.")
        Return
    EndIf

    Local $row = Int($sel[1])
    If $row < 0 Or $row >= $g_iVisibleCount Then Return

    _RefreshCredits()
    If $g_iCredits < $PRICE_PER_SONG Then
        MsgBox(48, $APP_NAME, "No tienes créditos suficientes." & @CRLF & _
                "Solicita créditos al encargado.")
        Return
    EndIf

    Local $songID = $g_aVisibleIDs[$row]
    Local $aResult, $rows, $cols

_SQLite_GetTable2d( _
    $g_hDB, _
    "SELECT path,title,artist FROM songs WHERE id=" & $songID & ";", _
    $aResult, _
    $rows, _
    $cols)

If @error Then Return

If UBound($aResult) < 2 Then Return

_QueueSong( _
    $songID, _
    $aResult[1][0], _
    $aResult[1][1], _
    $aResult[1][2])
    GUICtrlSetData($idStatus, "CANCIÓN AGREGADA A LA COLA")
EndFunc

Func _QueueSong($songID, $path, $title, $artist)
    ReDim $g_aQueue[$g_iQueueCount + 1]
    $g_aQueue[$g_iQueueCount] = $path
    $g_iQueueCount += 1
    GUICtrlSetData($idQueue, $title & " - " & $artist & "|")

    If $g_iQueuePos = -1 Or Not IsObj($g_oWMP) Or $g_oWMP.playState = 1 Or $g_oWMP.playState = 8 Then
        $g_iQueuePos = $g_iQueueCount - 1
        _PlayPath($path, $songID, $title, $artist)
    EndIf
EndFunc

Func _AddCreditsDialog()
    Local $amount = InputBox("Agregar créditos", "Cantidad de créditos a agregar:", "10")
    If @error Then Return
    If Not StringIsInt($amount) Or Int($amount) < 1 Or Int($amount) > 100000 Then
        MsgBox(48, $APP_NAME, "Introduce una cantidad válida.")
        Return
    EndIf
    _RefreshCredits()
    _SetSetting("credits", String($g_iCredits + Int($amount)))
    _RefreshCredits()
EndFunc

; -------------------- PLAYER --------------------

Func _PlayPath($path, $songID, $title, $artist)
    If Not FileExists($path) Then Return
    $g_iCurrentSongID = $songID
    $g_oWMP.controls.stop()
    $g_oWMP.URL = $path
    $g_oWMP.controls.play()

    GUICtrlSetData($idNowPlaying, $title & "  —  " & $artist)
    GUICtrlSetData($idStatus, "REPRODUCIENDO")
    _ShowAlbumCover($path)
    _SQLite_Exec($g_hDB, "INSERT INTO playlog(song_id) VALUES(" & Int($songID) & ");")
EndFunc

Func _ShowAlbumCover($path)
    ; Busca carátula local en la carpeta del archivo.
    ; Nombres aceptados: cover.jpg, folder.jpg, front.jpg, album.jpg
    Local $folder = StringLeft($path, StringInStr($path, "\", 0, -1))
    Local $names[4] = ["cover.jpg", "folder.jpg", "front.jpg", "album.jpg"]
    Local $cover = ""
    For $i = 0 To UBound($names) - 1
        If FileExists($folder & $names[$i]) Then
            $cover = $folder & $names[$i]
            ExitLoop
        EndIf
    Next

    If $cover <> "" Then
        GUICtrlSetImage($idCover, $cover)
        $g_sCurrentCover = $cover
    Else
        GUICtrlSetImage($idCover, "")
        $g_sCurrentCover = ""
    EndIf
EndFunc

Func _UpdatePlayback()
    If Not IsObj($g_oWMP) Then Return

    Local $state = $g_oWMP.playState
    Local $duration = 0, $position = 0

    If IsObj($g_oWMP.currentMedia) Then
        $duration = Int($g_oWMP.currentMedia.duration)
        $position = Int($g_oWMP.controls.currentPosition)
    EndIf

    If $duration > 0 Then
        GUICtrlSetData($idProgress, Int(($position / $duration) * 100))
        GUICtrlSetData($idTime, _TimeText($position) & " / " & _TimeText($duration))
    Else
        GUICtrlSetData($idProgress, 0)
        GUICtrlSetData($idTime, "00:00 / 00:00")
    EndIf

    Static $lastState = -1
    If $state = 8 And $lastState <> 8 Then
        If $g_bRepeat Then
            $g_oWMP.controls.play()
        Else
            _PlayNextQueued()
        EndIf
    EndIf
    $lastState = $state

    If $state = 3 Then
        GUICtrlSetData($idStatus, "REPRODUCIENDO")
    ElseIf $state = 2 Then
        GUICtrlSetData($idStatus, "EN PAUSA")
    ElseIf $state = 1 Then
        If $g_iQueueCount > 0 Then GUICtrlSetData($idStatus, "LISTO")
    EndIf
EndFunc

Func _PlayNextQueued()
    If $g_iQueueCount = 0 Then Return
    Local $next = $g_iQueuePos + 1
    If $g_bRandom And $g_iQueueCount > 1 Then
        $next = Random(0, $g_iQueueCount - 1, 1)
    EndIf
    If $next >= $g_iQueueCount Then
        $g_iQueuePos = -1
        GUICtrlSetData($idStatus, "COLA TERMINADA")
        Return
    EndIf

    $g_iQueuePos = $next
    Local $path = $g_aQueue[$next]
   Local $aResult, $rows, $cols

_SQLite_GetTable2d( _
    $g_hDB, _
    "SELECT id,title,artist FROM songs WHERE path=" & _SQLQ($path) & ";", _
    $aResult, _
    $rows, _
    $cols)
    If Not @error And UBound($aResult) > 1 Then

    _PlayPath( _
        $path, _
        $aResult[1][0], _
        $aResult[1][1], _
        $aResult[1][2])

Else

    _PlayPath($path, -1, _FileBaseName($path), "")

EndIf
EndFunc

Func _TimeText($seconds)
    Return StringFormat("%02d:%02d", Int($seconds / 60), Mod($seconds, 60))
EndFunc

; -------------------- ADMIN / AUTOSTART --------------------

Func _AdminLogin()
    Local $pin = InputBox("Acceso de administrador", "Introduce el PIN de administrador:")
    If @error Then Return
    If $pin = _GetSetting("admin_pin", $ADMIN_PIN_DEFAULT) Then
        _ShowAdminMode()
        MsgBox(64, $APP_NAME, "Modo administrador activado.")
    Else
        MsgBox(16, $APP_NAME, "PIN incorrecto.")
    EndIf
EndFunc

Func _RequireAdmin()
    If $g_bAdmin Then Return True
    _AdminLogin()
    Return $g_bAdmin
EndFunc

Func _ToggleAutoStart()
    Local $shortcut = @StartupDir & "\Rockola Forever PRO.lnk"
    If FileExists($shortcut) Then
        FileDelete($shortcut)
        MsgBox(64, $APP_NAME, "Inicio automático desactivado.")
    Else
        FileCreateShortcut(@ScriptFullPath, $shortcut, @ScriptDir, "", _
                "Rockola Forever PRO", "", "", 0)
        If FileExists($shortcut) Then
            MsgBox(64, $APP_NAME, "Inicio automático activado.")
        Else
            MsgBox(16, $APP_NAME, "No se pudo crear el acceso directo.")
        EndIf
    EndIf
EndFunc

Func _OnOff($value)
    If $value Then Return "ON"
    Return "OFF"
EndFunc

 

Edited by EliasL
Posted (edited)

this is the code of the different version that I mentioned that works but i wanna go to another level so please help!

 

 

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SliderConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <GuiListBox.au3>

Opt("GUIOnEventMode", 0)

; ==========================================
; ROCKOLA FOREVER - REPRODUCTOR MULTIMEDIA
; Motor: Windows Media Player ActiveX
; ==========================================

Global $oWMP
Global $aPlaylist[1]
Global $iTotal = 0
Global $iCurrent = -1
Global $bRandom = False
Global $bRepeat = False
Global $bChanging = False
Global $iLastState = -1

Global $hGUI, $idList, $idVideo
Global $idPlay, $idPause, $idStop
Global $idNext, $idPrev
Global $idAdd, $idFolder, $idRemove
Global $idSave, $idLoad, $idRandom, $idRepeat
Global $idVolume, $idProgress
Global $idTitle, $idTime, $idStatus
Global $idFull, $idClear

; ==========================================
; INTERFAZ
; ==========================================

$hGUI = GUICreate("ROCKOLA FOREVER | Multimedia Player", 1200, 760)

GUISetBkColor(0x10131B, $hGUI)

GUICtrlCreateLabel("ROCKOLA FOREVER", 20, 12, 500, 42)
GUICtrlSetFont(-1, 25, 800, 0, "Arial")
GUICtrlSetColor(-1, 0x00D9FF)

GUICtrlCreateLabel("SISTEMA MULTIMEDIA PROFESIONAL", 24, 55, 400, 20)
GUICtrlSetFont(-1, 10, 400)
GUICtrlSetColor(-1, 0xAAAAAA)

; ==========================================
; REPRODUCTOR DE VIDEO
; ==========================================

GUICtrlCreateLabel("PANTALLA MULTIMEDIA", 25, 95, 450, 25)
GUICtrlSetFont(-1, 12, 700)
GUICtrlSetColor(-1, 0xFFFFFF)

$oWMP = ObjCreate("WMPlayer.OCX")

If Not IsObj($oWMP) Then
    MsgBox(16, "Error", "No se pudo iniciar Windows Media Player." & @CRLF & _
            "Verifica que esté instalado y registrado.")
    Exit
EndIf

$idVideo = GUICtrlCreateObj($oWMP, 20, 125, 760, 430)

With $oWMP
    .uiMode = "none"
    .enableContextMenu = False
    .windowlessVideo = True
    .stretchToFit = True
    .settings.autoStart = False
    .settings.volume = 80
    .settings.mute = False
EndWith

; ==========================================
; LISTA DE CANCIONES
; ==========================================

GUICtrlCreateLabel("BIBLIOTECA MUSICAL", 805, 95, 350, 25)
GUICtrlSetFont(-1, 13, 700)
GUICtrlSetColor(-1, 0x00D9FF)

$idList = GUICtrlCreateList("", 800, 125, 380, 430, _
        BitOR($WS_BORDER, $WS_VSCROLL, $LBS_NOTIFY))

GUICtrlSetBkColor($idList, 0x202633)
GUICtrlSetColor($idList, 0xFFFFFF)
GUICtrlSetFont($idList, 10, 400, 0, "Arial")

; ==========================================
; INFORMACION DE REPRODUCCION
; ==========================================

$idTitle = GUICtrlCreateLabel("Selecciona una canción", 25, 565, 750, 28)
GUICtrlSetFont($idTitle, 13, 700)
GUICtrlSetColor($idTitle, 0xFFFFFF)

$idStatus = GUICtrlCreateLabel("LISTO PARA REPRODUCIR", 25, 598, 400, 20)
GUICtrlSetColor($idStatus, 0x00D9FF)

$idTime = GUICtrlCreateLabel("00:00 / 00:00", 650, 598, 130, 20)
GUICtrlSetColor($idTime, 0xFFFFFF)

$idProgress = GUICtrlCreateProgress(25, 625, 755, 12)
GUICtrlSetData($idProgress, 0)

; ==========================================
; BOTONES PRINCIPALES
; ==========================================

$idPrev = GUICtrlCreateButton("|< ANTERIOR", 25, 660, 130, 42)
$idPlay = GUICtrlCreateButton("? REPRODUCIR", 165, 660, 155, 42)
$idPause = GUICtrlCreateButton("|| PAUSAR", 330, 660, 120, 42)
$idStop = GUICtrlCreateButton("¦ DETENER", 460, 660, 120, 42)
$idNext = GUICtrlCreateButton("SIGUIENTE >|", 590, 660, 150, 42)

; ==========================================
; VOLUMEN
; ==========================================

GUICtrlCreateLabel("VOLUMEN", 805, 575, 100, 20)
GUICtrlSetColor(-1, 0xFFFFFF)

$idVolume = GUICtrlCreateSlider(805, 598, 350, 35, $TBS_HORZ)
GUICtrlSetLimit($idVolume, 100, 0)
GUICtrlSetData($idVolume, 80)

; ==========================================
; BIBLIOTECA Y OPCIONES
; ==========================================

$idAdd = GUICtrlCreateButton("+ AGREGAR ARCHIVOS", 805, 650, 175, 38)
$idFolder = GUICtrlCreateButton("+ AGREGAR CARPETA", 990, 650, 175, 38)

$idRemove = GUICtrlCreateButton("QUITAR", 805, 695, 85, 35)
$idClear = GUICtrlCreateButton("LIMPIAR", 895, 695, 85, 35)
$idSave = GUICtrlCreateButton("GUARDAR LISTA", 985, 695, 105, 35)
$idLoad = GUICtrlCreateButton("CARGAR LISTA", 1095, 695, 85, 35)

$idRandom = GUICtrlCreateButton("ALEATORIO: OFF", 800, 50, 130, 30)
$idRepeat = GUICtrlCreateButton("REPETIR: OFF", 940, 50, 120, 30)
$idFull = GUICtrlCreateButton("PANTALLA COMPLETA", 1070, 50, 120, 30)

GUISetState(@SW_SHOW, $hGUI)

; ==========================================
; BUCLE PRINCIPAL
; ==========================================

While 1

    Local $iMsg = GUIGetMsg()

    Switch $iMsg

        Case $GUI_EVENT_CLOSE
            ExitLoop

        Case $idAdd
            _AddFiles()

        Case $idFolder
            _AddFolder()

        Case $idRemove
            _RemoveSelected()

        Case $idClear
            _ClearPlaylist()

        Case $idSave
            _SavePlaylist()

        Case $idLoad
            _LoadPlaylist()

        Case $idPlay
            _PlaySelected()

        Case $idPause
            $oWMP.controls.pause()

        Case $idStop
            $oWMP.controls.stop()

        Case $idNext
            _NextTrack()

        Case $idPrev
            _PreviousTrack()

        Case $idRandom
            $bRandom = Not $bRandom
            GUICtrlSetData($idRandom, "ALEATORIO: " & _
                    ($bRandom ? "ON" : "OFF"))

        Case $idRepeat
            $bRepeat = Not $bRepeat
            GUICtrlSetData($idRepeat, "REPETIR: " & _
                    ($bRepeat ? "ON" : "OFF"))

        Case $idFull
            $oWMP.fullScreen = True

        Case $idVolume
            $oWMP.settings.volume = GUICtrlRead($idVolume)

        Case $idList
            If _GUICtrlListBox_GetCaretIndex($idList) >= 0 Then
                _PlaySelected()
            EndIf

    EndSwitch

    _UpdatePlayer()

    Sleep(100)

WEnd

; ==========================================
; AGREGAR ARCHIVOS
; ==========================================

Func _AddFiles()

    Local $sFiles = FileOpenDialog( _
            "Seleccionar música y videos",@HomePath, "Archivos multimedia (*.mp3;*.wma;*.wav;*.aac;*.m4a;" & "*.mp4;*.avi;*.wmv;*.mpg;*.mpeg;*.mov;*.mkv;*.asf;*.flv;*.3gp)", 4 + 1)

    If @error Then Return

    Local $aFiles = StringSplit($sFiles, "|")

    If $aFiles[0] = 1 Then
        _AddTrack($sFiles)
    Else
        For $i = 2 To $aFiles[0]
            _AddTrack($aFiles[1] & "\" & $aFiles[$i])
        Next
    EndIf

EndFunc

; ==========================================
; AGREGAR CARPETA COMPLETA
; ==========================================

Func _AddFolder()

    Local $sFolder = FileSelectFolder( _
            "Selecciona la carpeta musical", "", 1)

    If @error Then Return

    Local $aFiles = _FileListToArrayRec( _
            $sFolder, _
            "*.mp3;*.wma;*.wav;*.aac;*.m4a;*.mp4;*.avi;*.wmv;" & _
            "*.mpg;*.mpeg;*.mov;*.mkv;*.asf;*.flv;*.3gp", _
            $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)

    If @error Then
        MsgBox(48, "Biblioteca", "No se encontraron archivos multimedia.")
        Return
    EndIf

    For $i = 1 To $aFiles[0]
        _AddTrack($aFiles[$i])
    Next

    MsgBox(64, "Rockola Forever", _
            "Se agregaron " & $aFiles[0] & " archivos.")

EndFunc

; ==========================================
; INSERTAR CANCION
; ==========================================

Func _AddTrack($sPath)

    If Not FileExists($sPath) Then Return

    For $i = 0 To $iTotal - 1
        If StringLower($aPlaylist[$i]) = StringLower($sPath) Then Return
    Next

    ReDim $aPlaylist[$iTotal + 1]

    $aPlaylist[$iTotal] = $sPath
    $iTotal += 1

    GUICtrlSetData($idList, $sPath)

    GUICtrlSetData($idStatus, _
            "CANCIONES EN BIBLIOTECA: " & $iTotal)

EndFunc

; ==========================================
; REPRODUCIR SELECCION
; ==========================================

Func _PlaySelected()

    Local $iSelected = _GUICtrlListBox_GetCaretIndex($idList)

    If $iSelected < 0 Or $iSelected >= $iTotal Then Return

    _PlayTrack($iSelected)

EndFunc

Func _PlayTrack($iIndex)

    If $iIndex < 0 Or $iIndex >= $iTotal Then Return

    If Not FileExists($aPlaylist[$iIndex]) Then Return

    $iCurrent = $iIndex

    $bChanging = True

    $oWMP.controls.stop()
    $oWMP.URL = $aPlaylist[$iCurrent]

    $oWMP.controls.play()

    _GUICtrlListBox_SetCurSel($idList, $iCurrent)

    GUICtrlSetData($idTitle, _
            "REPRODUCIENDO: " & _
            StringTrimLeft($aPlaylist[$iCurrent], _
            StringInStr($aPlaylist[$iCurrent], "\", 0, -1)))

    GUICtrlSetData($idStatus, "REPRODUCIENDO")

    $iLastState = -1

    $bChanging = False

EndFunc

; ==========================================
; SIGUIENTE CANCION
; ==========================================

Func _NextTrack()

    If $iTotal = 0 Then Return

    Local $iNext

    If $bRandom And $iTotal > 1 Then
        Do
            $iNext = Random(0, $iTotal - 1, 1)
        Until $iNext <> $iCurrent
    Else
        $iNext = $iCurrent + 1
        If $iNext >= $iTotal Then $iNext = 0
    EndIf

    _PlayTrack($iNext)

EndFunc

; ==========================================
; CANCION ANTERIOR
; ==========================================

Func _PreviousTrack()

    If $iTotal = 0 Then Return

    Local $iPrev = $iCurrent - 1

    If $iPrev < 0 Then $iPrev = $iTotal - 1

    _PlayTrack($iPrev)

EndFunc

; ==========================================
; ACTUALIZAR REPRODUCTOR
; ==========================================

Func _UpdatePlayer()

    If Not IsObj($oWMP) Then Return
    If $bChanging Then Return

    Local $iState = $oWMP.playState

    Local $iDuration = 0
    Local $iPosition = 0

    If IsObj($oWMP.currentMedia) Then
        $iDuration = Int($oWMP.currentMedia.duration)
        $iPosition = Int($oWMP.controls.currentPosition)
    EndIf

    If $iDuration > 0 Then

        GUICtrlSetData($idProgress, _
                Int(($iPosition / $iDuration) * 100))

        GUICtrlSetData($idTime, _
                _FormatTime($iPosition) & " / " & _
                _FormatTime($iDuration))

    Else
        GUICtrlSetData($idProgress, 0)
        GUICtrlSetData($idTime, "00:00 / 00:00")
    EndIf

    ; Detectar final de canción o video
    If $iState = 8 And $iLastState <> 8 Then

        If $bRepeat Then
            $oWMP.controls.play()
        Else
            _NextTrack()
        EndIf

    EndIf

    $iLastState = $iState

    If $iState = 3 Then
        GUICtrlSetData($idStatus, "REPRODUCIENDO")
    ElseIf $iState = 2 Then
        GUICtrlSetData($idStatus, "EN PAUSA")
    ElseIf $iState = 1 Then
        GUICtrlSetData($idStatus, "DETENIDO")
    EndIf

EndFunc

; ==========================================
; FORMATO DE TIEMPO
; ==========================================

Func _FormatTime($iSeconds)

    Local $iMin = Int($iSeconds / 60)
    Local $iSec = Mod($iSeconds, 60)

    Return StringFormat("%02d:%02d", $iMin, $iSec)

EndFunc

; ==========================================
; QUITAR ELEMENTO
; ==========================================

Func _RemoveSelected()

    Local $iSelected = _GUICtrlListBox_GetCaretIndex($idList)

    If $iSelected < 0 Or $iSelected >= $iTotal Then Return

    For $i = $iSelected To $iTotal - 2
        $aPlaylist[$i] = $aPlaylist[$i + 1]
    Next

    $iTotal -= 1
    ReDim $aPlaylist[$iTotal]

    _RefreshList()

    If $iCurrent = $iSelected Then
        $oWMP.controls.stop()
        $iCurrent = -1
        GUICtrlSetData($idTitle, "Selecciona una canción")
    ElseIf $iCurrent > $iSelected Then
        $iCurrent -= 1
    EndIf

EndFunc

; ==========================================
; LIMPIAR BIBLIOTECA
; ==========================================

Func _ClearPlaylist()

    $oWMP.controls.stop()

    $iTotal = 0
    $iCurrent = -1

    ReDim $aPlaylist[1]

    _RefreshList()

    GUICtrlSetData($idTitle, "Selecciona una canción")
    GUICtrlSetData($idStatus, "BIBLIOTECA VACIA")

EndFunc

; ==========================================
; ACTUALIZAR LISTA
; ==========================================

Func _RefreshList()

    GUICtrlSetData($idList, "")

    For $i = 0 To $iTotal - 1
        GUICtrlSetData($idList, $aPlaylist[$i])
    Next

    GUICtrlSetData($idStatus, _
            "CANCIONES EN BIBLIOTECA: " & $iTotal)

EndFunc

; ==========================================
; GUARDAR LISTA M3U
; ==========================================

Func _SavePlaylist()

    Local $sFile = FileSaveDialog( _
            "Guardar lista de reproducción", _
            @MyDocumentsDir, _
            "Listas M3U (*.m3u)", 16, "Mi_Rockola.m3u")

    If @error Then Return

    If StringRight(StringLower($sFile), 4) <> ".m3u" Then
        $sFile &= ".m3u"
    EndIf

    Local $hFile = FileOpen($sFile, 2)

    If $hFile = -1 Then Return

    FileWriteLine($hFile, "#EXTM3U")

    For $i = 0 To $iTotal - 1
        FileWriteLine($hFile, $aPlaylist[$i])
    Next

    FileClose($hFile)

    MsgBox(64, "Rockola Forever", "Lista guardada correctamente.")

EndFunc

; ==========================================
; CARGAR LISTA M3U
; ==========================================

Func _LoadPlaylist()

    Local $sFile = FileOpenDialog( _
            "Abrir lista de reproducción", _
            @MyDocumentsDir, _
            "Listas M3U (*.m3u)", 1)

    If @error Then Return

    Local $aLines

    If Not _FileReadToArray($sFile, $aLines) Then Return

    _ClearPlaylist()

    For $i = 1 To $aLines[0]

        Local $sLine = StringStripWS($aLines[$i], 3)

        If $sLine = "" Then ContinueLoop
        If StringLeft($sLine, 1) = "#" Then ContinueLoop

        If FileExists($sLine) Then
            _AddTrack($sLine)
        EndIf

    Next

    MsgBox(64, "Rockola Forever", "Lista cargada correctamente.")

EndFunc

; ==========================================
; CERRAR PROGRAMA
; ==========================================

$oWMP.controls.stop()
$oWMP.close()
$oWMP = 0

GUIDelete($hGUI)

Exit

 

Edited by EliasL

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
×
×
  • Create New...