Jump to content
Synapsee

AutoIt Radio Player v0.0.0.8 Update of 30 apr 2016

Recommended Posts

AutoIt Radio Player
Last : v0.0.0.8
Tested only on W7X64

Screenshot.jpg.6f20062c096ab558c90d37d66

Changelog :

Spoiler

v0.0.0.8 - last version

v0.0.0.7 - first public version

==========>  AutoIt Radio Player v0.0.0.8.zip <==========

Personal Message :

     This is my first script posted. Any comment are welcome. Give me your best web radio i will try add them !

Install/Use :

Spoiler

-Unzip
-Run "AutoIt Radio Player.au3"
-Use MouseWheel for change volume
          Note : On first start : volume = 4%
-Use MouseLeft for drag gui
-Use RightClick for change station

Add a station :

Spoiler

How add a station :

-Go to config.ini

-Add : [Station Name]

-Possible optional label start key :
CurrentArtist
CurrentAlbum
CurrentTitle
NextArtist
NextAlbum
NextTitle
ListenersCount

-Possible optional label end key :
Link=URL
Start=StringBefore
End=StringAfter
BetweenNum=TargetOccurence (def=0)
Split=StringForSplit
NumSplit=TargetSplitNumber

-Necessary
SoundLink=URL

-Optional
CoverLink=URL
CoverLinkStart=StringBefore
CoverLinkEnd=StringAfter
CoverLinkBetweenNum=TargetOccurence (def=0)
CoverLinkBefore=PathBefore

Unsolved problem :

      When the coverGUI go outside the monitor and comeback inside, a part of current cover disapear : I have no idea how fix that
    
TODO :

     Make coverGUI mouse resizable (while script running) : any idea are welcome
     Crop some pixel of cover : any idea are welcome

Related Posts/Bin :

Main Code :

;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7;All Warning
;-w 5 = local var declared but not used : Removed for Curl.au3
;-d = as Opt("MustDeclareVars", 1) : Removed for Bass.au3
#AutoIt3Wrapper_Au3Check_Parameters=-w 1 -w 2 -w 3 -w- 4 -w 6 -w- 7

#Region ;==> #include

    #include <Array.au3>;_ArrayAdd
    #include <GuiButton.au3>;_GUICtrlButton_SetImage()
    #include <GuiMenu.au3>;$MNS_MODELESS
    #include <GUIConstants.au3>;$WS_POPUP
    #include <GDIplus.au3>;_GDIPlus_BitmapCreateFromStream()
    #include <Memory.au3>;$GMEM_MOVEABLE
    #include <String.au3>;_StringBetween()

    #include <AutoIt Radio Player\include\Bass.au3>;_BASS_ChannelPlay()
    #include <AutoIt Radio Player\include\BassConstants.au3>;$BASS_CONFIG_NET_PLAYLIST
    #include <AutoIt Radio Player\include\Curl.au3>;Curl_Data_Get()

#EndRegion ;==> #include

#Region ;==> Func for Bass.au3

Local $MusicHandle

Func _Audio_play($MusicHandle)
    _BASS_ChannelPlay($MusicHandle, 1)
EndFunc

Func _Audio_stop($MusicHandle)
    _BASS_ChannelStop($MusicHandle)
EndFunc

Func _Audio_init_stop($MusicHandle)
    _BASS_StreamFree($MusicHandle)
    _BASS_Free()
EndFunc

Func _Audio_init_start()
    If _BASS_STARTUP(@ScriptDir & "\AutoIt Radio Player\include\bass.dll") Then
        If _BASS_Init(0, -1, 44100, 0) Then
            If _BASS_SetConfig($BASS_CONFIG_NET_PLAYLIST, 1) = 0 Then
                SetError(3)
            EndIf
        Else
            SetError(2)
        EndIf
    Else
        SetError(@error)
    EndIf
EndFunc

Func _Set_volume($volume)
    _BASS_SetConfig($BASS_CONFIG_GVOL_STREAM, $volume * 100)
EndFunc

Func _Set_url($file)
    If FileExists($file) Then
        $MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, 0)
    Else
        $MusicHandle = _BASS_StreamCreateURL($file, 0, 1)
    EndIf
    If @error Then
        Return SetError(1)
    EndIf
    Return $MusicHandle
EndFunc

#EndRegion ;==> Func for Bass.au3

Global Const $SC_DRAGMOVE = 0xF012;Global

#Region ;==> Func from AutoIt Forum

; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayMultiColSort
; Description ...: Sort 2D arrays on several columns
; Syntax.........: _ArrayMultiColSort(ByRef $aArray, $aSortData[, $iStart = 0[, $iEnd = 0]])
; Parameters ....: $aArray    - The 2D array to be sorted
;                  $aSortData - 2D array holding details of the sort format
;                               Format: [Column to be sorted, Sort order]
;                                   Sort order can be either numeric (0/1 = ascending/descending) or a ordered string of items
;                                   Any elements not matched in string are left unsorted after all sorted elements
;                  $iStart    - Element of array at which sort starts (default = 0)
;                  $iEnd      - Element of array at which sort endd (default = 0 - converted to end of array)
; Requirement(s).: v3.3.8.1 or higher
; Return values .: Success: No error
;                  Failure: @error set as follows
;                            @error = 1 with @extended set as follows (all refer to $sIn_Date):
;                                1 = Array to be sorted not 2D
;                                2 = Sort data array not 2D
;                                3 = More data rows in $aSortData than columns in $aArray
;                                4 = Start beyond end of array
;                                5 = Start beyond End
;                            @error = 2 with @extended set as follows:
;                                1 = Invalid string parameter in $aSortData
;                                2 = Invalid sort direction parameter in $aSortData
; Author ........: Melba23
; Remarks .......: Columns can be sorted in any order
; Example .......; Yes
; ===============================================================================================================================
Func _ArrayMultiColSort(ByRef $aArray, $aSortData, $iStart = 0, $iEnd = 0)

    ; Errorchecking
    ; 2D array to be sorted
    If UBound($aArray, 2) = 0 Then
        Return SetError(1, 1, "")
    EndIf
    ; 2D sort data
    If UBound($aSortData, 2) <> 2 Then
        Return SetError(1, 2, "")
    EndIf
    If UBound($aSortData) > UBound($aArray) Then
        Return SetError(1, 3)
    EndIf
    ; Start element
    If $iStart < 0 Then
        $iStart = 0
    EndIf
    If $iStart >= UBound($aArray) - 1 Then
        Return SetError(1, 4, "")
    EndIf
    ; End element
    If $iEnd <= 0 Or $iEnd >= UBound($aArray) - 1 Then
        $iEnd = UBound($aArray) - 1
    EndIf
    ; Sanity check
    If $iEnd <= $iStart Then
        Return SetError(1, 5, "")
    EndIf

    Local $iCurrCol, $iChunk_Start, $iMatchCol

    ; Sort first column
    __AMCS_SortChunk($aArray, $aSortData, 0, $aSortData[0][0], $iStart, $iEnd)
    If @error Then
        Return SetError(2, @extended, "")
    EndIf
    ; Now sort within other columns
    For $iSortData_Row = 1 To UBound($aSortData) - 1
        ; Determine column to sort
        $iCurrCol = $aSortData[$iSortData_Row][0]
        ; Create arrays to hold data from previous columns
        Local $aBaseValue[$iSortData_Row]
        ; Set base values
        For $i = 0 To $iSortData_Row - 1
            $aBaseValue[$i] = $aArray[$iStart][$aSortData[$i][0]]
        Next
        ; Set start of this chunk
        $iChunk_Start = $iStart
        ; Now work down through array
        For $iRow = $iStart + 1 To $iEnd
            ; Match each column
            For $k = 0 To $iSortData_Row - 1
                $iMatchCol = $aSortData[$k][0]
                ; See if value in each has changed
                If $aArray[$iRow][$iMatchCol] <> $aBaseValue[$k] Then
                    ; If so and row has advanced
                    If $iChunk_Start < $iRow - 1 Then
                        ; Sort this chunk
                        __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1)
                        If @error Then
                            Return SetError(2, @extended, "")
                        EndIf
                    EndIf
                    ; Set new base value
                    $aBaseValue[$k] = $aArray[$iRow][$iMatchCol]
                    ; Set new chunk start
                    $iChunk_Start = $iRow
                EndIf
            Next
        Next
        ; Sort final section
        If $iChunk_Start < $iRow - 1 Then
            __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1)
            If @error Then
                Return SetError(2, @extended, "")
            EndIf
        EndIf
    Next

EndFunc   ;==>_ArrayMultiColSort

; #FUNCTION# ====================================================================================================================
; Name...........: __AMCS_SortChunk
; Description ...: Sorts array section
; Author ........: Melba23
; Remarks .......:
; ===============================================================================================================================
Func __AMCS_SortChunk(ByRef $aArray, $aSortData, $iRow, $iColumn, $iChunkStart, $iChunkEnd)

    Local $aSortOrder

    ; Set default sort direction
    Local $iSortDirn = 1
    ; Need to prefix elements?
    If IsString($aSortData[$iRow][1]) Then
        ; Split elements
        $aSortOrder = StringSplit($aSortData[$iRow][1], ",")
        If @error Then
            Return SetError(1, 1, "")
        EndIf
        ; Add prefix to each element
        For $i = $iChunkStart To $iChunkEnd
            For $j = 1 To $aSortOrder[0]
                If $aArray[$i][$iColumn] = $aSortOrder[$j] Then
                    $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn]
                    ExitLoop
                EndIf
            Next
            ; Deal with anything that does not match
            If $j > $aSortOrder[0] Then
                $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn]
            EndIf
        Next
    Else
        Switch $aSortData[$iRow][1]
            Case 0, 1
                ; Set required sort direction if no list
                If $aSortData[$iRow][1] Then
                    $iSortDirn = -1
                Else
                    $iSortDirn = 1
                EndIf
            Case Else
                Return SetError(1, 2, "")
        EndSwitch
    EndIf

    ; Sort the chunk
    Local $iSubMax = UBound($aArray, 2) - 1
    __ArrayQuickSort2D($aArray, $iSortDirn, $iChunkStart, $iChunkEnd, $iColumn, $iSubMax)

    ; Remove any prefixes
    If IsString($aSortData[$iRow][1]) Then
        For $i = $iChunkStart To $iChunkEnd
            $aArray[$i][$iColumn] = StringTrimLeft($aArray[$i][$iColumn], 3)
        Next
    EndIf

EndFunc   ;==>__AMCS_SortChunk

Func _ReduceMemory()
    Local $aReturn = DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
    If @error = 1 Then
        Return SetError(1, 0, 0)
    EndIf
    Return $aReturn[0]
EndFunc   ;==>_ReduceMemory

; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlus_ImageLoadFromHGlobal
; Description ...: Creates an Image object based on movable HGlobal memory block
; Syntax.........: _GDIPlus_ImageLoadFromHGlobal($hGlobal)
; Parameters ....: $hGlobal - Handle of a movable HGlobal memory block
; Return values .: Success    - Pointer to a new Image object
;                 Failure     - 0 and either:
;                 |@error and @extended are set if DllCall failed:
;                 | -@error = 1 if could not create IStream
;                 | -@error = 2 if DLLCall to create image failed
;                 |$GDIP_STATUS contains a non zero value specifying the error code
; Author ........: ProgAndy
; Modified.......:
; Remarks .......: After you are done with the object, call _GDIPlus_ImageDispose to release the object resources.
;                 The HGLOBAL will be owned by the image and freed automatically when the image is disposed.
; Related .......: _GDIPlus_ImageLoadFromStream, _GDIPlus_ImageDispose
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _GDIPlus_ImageLoadFromHGlobal($hGlobal)
    Local $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $hGlobal, "bool", True, "ptr*", 0)
    If @error Or $aResult[0] <> 0 Or $aResult[3] = 0 Then Return SetError(1, @error, 0)
    Local $hImage = DllCall($__g_hGDIPDll, "uint", "GdipLoadImageFromStream", "ptr", $aResult[3], "int*", 0)
    Local $error = @error
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    Local $aCall = DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $aResult[3], "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
    If $error Then Return SetError(2, $error, 0)
    If $hImage[2] = 0 Then Return SetError(3, 0, $hImage[2])
    Return $hImage[2]
EndFunc   ;==>_GDIPlus_ImageLoadFromHGlobal

; #FUNCTION# ====================================================================================================================
; Name...........: _MemGlobalAllocFromBinary
; Description ...: Greates a movable HGLOBAL memory block from binary data
; Syntax.........: _MemGlobalAllocFromBinary($bBinary)
; Parameters ....: $bBinary - Binary data
; Return values .: Success    - Handle of a new movable HGLOBAL
;                 Failure     - 0 and set @error:
;                 |1  - no data
;                 |2  - could not allocate memory
;                 |3  - could not set data to memory
; Author ........: ProgAndy
; Modified.......:
; Remarks .......:
; Related .......: _MemGlobalAlloc, _MemGlobalFree, _MemGlobalLock
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _MemGlobalAllocFromBinary(Const $bBinary)
    Local $iLen = BinaryLen($bBinary)
    If $iLen = 0 Then Return SetError(1, 0, 0)
    Local $hMem = _MemGlobalAlloc($iLen, $GMEM_MOVEABLE)
    If @error Or Not $hMem Then Return SetError(2, 0, 0)
    DllStructSetData(DllStructCreate("byte[" & $iLen & "]", _MemGlobalLock($hMem)), 1, $bBinary)
    If @error Then
        _MemGlobalUnlock($hMem)
        _MemGlobalFree($hMem)
        Return SetError(3, 0, 0)
    EndIf
    _MemGlobalUnlock($hMem)
    Return $hMem
EndFunc   ;==>_MemGlobalAllocFromBinary

#EndRegion ;==> Func from AutoIt Forum

;INI Location
Local $Config_INI = "AutoIt Radio Player\Config.ini"
Local $Save_INI = "AutoIt Radio Player\Save.ini"

;Get $aRadio and $aLabel <===========================================That part need improve
Local $aINISections = IniReadSectionNames($Config_INI)
Local $aRadio[0][8]
Local $aLabel[0][11]
For $i = 1 To UBound($aINISections) - 1
    If $aINISections[$i] <> "GUI" Then

        ;For $aRadio
        Local $SoundLink = "", $CoverLink = "", $CoverLinkStart = "", $CoverLinkEnd = "", $CoverLinkBetweenNum = "", $CoverLinkBefore = "", $Default = 0

        ;For $aLabel
        Local $CurrentArtistLink = "", $CurrentArtistStart = "", $CurrentArtistEnd = "", $CurrentArtistBetweenNum = 0, $CurrentArtistSplit = "", $CurrentArtistNumSplit = ""
        Local $CurrentAlbumLink = "", $CurrentAlbumStart = "", $CurrentAlbumEnd = "", $CurrentAlbumBetweenNum = 0, $CurrentAlbumSplit = "", $CurrentAlbumNumSplit = ""
        Local $CurrentTitleLink = "", $CurrentTitleStart = "", $CurrentTitleEnd = "", $CurrentTitleBetweenNum = 0, $CurrentTitleSplit = "", $CurrentTitleNumSplit = ""
        Local $NextArtistLink = "", $NextArtistStart = "", $NextArtistEnd = "", $NextArtistBetweenNum = 0, $NextArtistSplit = "", $NextArtistNumSplit = ""
        Local $NextAlbumLink = "", $NextAlbumStart = "", $NextAlbumEnd = "", $NextAlbumBetweenNum = 0, $NextAlbumSplit = "", $NextAlbumNumSplit = ""
        Local $NextTitleLink = "", $NextTitleStart = "", $NextTitleEnd = "", $NextTitleBetweenNum = 0, $NextTitleSplit = "", $NextTitleNumSplit = ""
        Local $ListenersCountLink = "", $ListenersCountStart = "", $ListenersCountEnd = "", $ListenersCountBetweenNum = 0, $ListenersCountSplit = "", $ListenersCountNumSplit = ""
        Local $controlID1 = "", $controlID2 = ""

        Local $Sec = IniReadSection($Config_INI, $aINISections[$i])
        For $y = 1 To UBound($Sec) - 1
            Assign($Sec[$y][0], $Sec[$y][1])
        Next

        ;$aRadio
        _ArrayAdd($aRadio, $aINISections[$i] & "|" & $SoundLink & "|" & $CoverLink & "|" & $CoverLinkStart & "|" & $CoverLinkEnd & "|" & $CoverLinkBetweenNum & "|" & $CoverLinkBefore & "|" & $Default)

        ;$aLabel
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Current" & "|" & "Artist" & "|" & $CurrentArtistLink & "|" & $CurrentArtistStart & "|" & $CurrentArtistEnd & "|" & $CurrentArtistBetweenNum & "|" & $CurrentArtistSplit & "|" & $CurrentArtistNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Current" & "|" & "Album" & "|" & $CurrentAlbumLink & "|" & $CurrentAlbumStart & "|" & $CurrentAlbumEnd & "|" & $CurrentAlbumBetweenNum & "|" & $CurrentAlbumSplit & "|" & $CurrentAlbumNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Current" & "|" & "Title" & "|" & $CurrentTitleLink & "|" & $CurrentTitleStart & "|" & $CurrentTitleEnd & "|" & $CurrentTitleBetweenNum & "|" & $CurrentTitleSplit & "|" & $CurrentTitleNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Next" & "|" & "Artist" & "|" & $NextArtistLink & "|" & $NextArtistStart & "|" & $NextArtistEnd & "|" & $NextArtistBetweenNum & "|" & $NextArtistSplit & "|" & $NextArtistNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Next" & "|" & "Album" & "|" & $NextAlbumLink & "|" & $NextAlbumStart & "|" & $NextAlbumEnd & "|" & $NextAlbumBetweenNum & "|" & $NextAlbumSplit & "|" & $NextAlbumNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Next" & "|" & "Title" & "|" & $NextTitleLink & "|" & $NextTitleStart & "|" & $NextTitleEnd & "|" & $NextTitleBetweenNum & "|" & $NextTitleSplit & "|" & $NextTitleNumSplit & "|" & $controlID1 & "|" & $controlID2)
        _ArrayAdd($aLabel, $aINISections[$i] & "|" & "Listeners" & "|" & "Count" & "|" & $ListenersCountLink & "|" & $ListenersCountStart & "|" & $ListenersCountEnd & "|" & $ListenersCountBetweenNum & "|" & $ListenersCountSplit & "|" & $ListenersCountNumSplit & "|" & $controlID1 & "|" & $controlID2)

    EndIf
Next
Global $aRadio_Sort[][] = [[0, 0], [1, 0]]
_ArrayMultiColSort($aRadio, $aRadio_Sort)
Local $aLabel2[0][11]
For $i = 0 To UBound($aLabel) - 1
    If $aLabel[$i][3] <> "" Then
        Local $fill = $aLabel[$i][0]
        For $y = 1 To UBound($aLabel, 2) - 1
            $fill = $fill & "|" & $aLabel[$i][$y]
        Next
        _ArrayAdd($aLabel2, $fill)
    EndIf
Next
$aLabel = $aLabel2
;_ArrayDisplay($aRadio)
;_ArrayDisplay($aLabel)

;Init/Opt
Opt("GUIOnEventMode", 1)
_Audio_init_start()
_GDIPlus_Startup()

;Icon
Local $IcoFile = @ScriptDir & "\AutoIt Radio Player\img\icon.ico"
Local $IcoNumber = -1
TraySetIcon($IcoFile, $IcoNumber)

;Get Default Station
Local $def_selected = 0
For $r = 0 To UBound($aRadio) - 1
    If $aRadio[$r][0] = IniRead($Save_INI, @ComputerName, "Default_Radio", "default") Then
        $def_selected = 1
        $aRadio[$r][7] = 1
    EndIf
Next
If $def_selected = 0 Then
    $aRadio[0][7] = 1
EndIf

;ConsoleWrite("Start" & @CRLF)

;Get $Radio_Name, $Radio_SoundLink, $Radio_CoverLink, $Radio_CoverLink_Start, $Radio_CoverLink_End, $Radio_CoverLink_BetweenNum, $Radio_CoverLink_Before
Local  $Radio_Name, $Radio_SoundLink, $Radio_CoverLink
Local  $Radio_CoverLink_Start, $Radio_CoverLink_End, $Radio_CoverLink_BetweenNum, $Radio_CoverLink_Before
For $r = 0 To UBound($aRadio) - 1
    If $aRadio[$r][7] = 1 Then
        $Radio_Name = $aRadio[$r][0]
        $Radio_SoundLink = $aRadio[$r][1]
        $Radio_CoverLink = $aRadio[$r][2]
        $Radio_CoverLink_Start = $aRadio[$r][3]
        $Radio_CoverLink_End = $aRadio[$r][4]
        $Radio_CoverLink_BetweenNum = $aRadio[$r][5]
        $Radio_CoverLink_Before = $aRadio[$r][6]
    EndIf
Next

;Declare
Local $PlayerGUI, $CoverGUI;GUI
Local $PlayPause, $Close;Button
Local $Play = 1;PlayStatus ($Play = 1 = Autoplay)
Local $Volume_Label, $VolumePercent, $Previous_VolumePercent;Volume
Local $Previous_Cover_Read;PreviousRead
Local $BASS_ErrorGetCode

;$Config_INI\GUI
Local $CoverSize = IniRead($Config_INI, "GUI", "CoverSize", 150)
Local $PlayerBorder = IniRead($Config_INI, "GUI", "PlayerBorder", 10)

;ConsoleWrite("Build GUI" & @CRLF)

;Build GUI
_Build_PlayerGUI()
_Build_CoverGUI()

;ConsoleWrite("Show GUI" & @CRLF)

GUISetState(@SW_SHOW, $PlayerGUI)
If $Radio_CoverLink <> "" Then
    GUISetState(@SW_SHOW, $CoverGUI)
EndIf

_Set_volume(0)

;GetPlayerDATA() - GetCoverDATA() - Start Sound
GetPlayerDATA();Start Sound too with resume on disconnect
AdlibRegister("GetPlayerDATA", 8000)
If $Radio_CoverLink <> "" Then
    GetCoverDATA()
    AdlibRegister("GetCoverDATA", 8000)
EndIf

;ConsoleWrite("GUIRegisterMsg" & @CRLF)
GUIRegisterMsg($WM_MOUSEWHEEL, "_WM_MOUSEWHEEL");for set volume
GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN");for drag gui

#Region ;==> Internal Func

Func _Build_CoverGUI()

    ;ConsoleWrite("Build CoverGUI" & @CRLF)

    If $Radio_CoverLink <> "" Then
        $CoverGUI = GUICreate("AutoIt Radio Cover", _;Title
                $CoverSize, _ ;X
                $CoverSize, _ ;Y
                IniRead($Save_INI, @ComputerName, "Cover_X", -1), _;Left
                IniRead($Save_INI, @ComputerName, "Cover_Y", -1), _;Top
                $WS_POPUP, $WS_EX_TOPMOST);Style
        GUISetBkColor(0x000000, $CoverGUI);Black BkColor
        GUISetIcon($IcoFile, $IcoNumber, $CoverGUI)
    Else
        $CoverGUI = ""
    EndIf

EndFunc ;==>_Build_CoverGUI

Func _Build_PlayerGUI()

    ;ConsoleWrite("Build PlayerGUI" & @CRLF)

    ;Clean previous stored ControlID
    For $r = 0 To UBound($aLabel) - 1
        $aLabel[$r][9] = ""
        $aLabel[$r][10] = ""
    Next

    ;$LabelCount
    Local $LabelCount = 0
    For $r = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$r][0] Then
            $LabelCount = $LabelCount + 1
        EndIf
    Next

    ;$LabelY
    If $LabelCount * 13 + $PlayerBorder * 2 < 50 Then
        Local $LabelY = 10 * 3
    Else
        $LabelY = $LabelCount * 13
    EndIf

    ;$PlayerGUI
    $PlayerGUI = GUICreate("AutoIt Radio Player", _
            $PlayerBorder + 260 + 50 + 10 + $PlayerBorder * 2, _;X
            $PlayerBorder + $LabelY + $PlayerBorder, _;Y
            IniRead($Save_INI, @ComputerName, "Title_X", -1), _;Left
            IniRead($Save_INI, @ComputerName, "Title_Y", -1), _;Top
            $WS_POPUP, $WS_EX_TOPMOST);Style
    GUISetBkColor(0x000000, $PlayerGUI);Black BkColor
    GUISetIcon($IcoFile, $IcoNumber, $PlayerGUI)

    ;$Contextmenu
    Local $ContextMenu = GUICtrlCreateContextMenu(-1)
    Local $hCM = GUICtrlGetHandle($ContextMenu)
    _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
    Local $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
    GUICtrlSetOnEvent($ContextMenu_Item1, "ContextMenu_ChangeRadio")
    GUICtrlCreateMenuItem("", $ContextMenu);Add separator
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][7] = 0 Then
            GUICtrlCreateMenuItem($aRadio[$r][0], $ContextMenu)
            GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
        EndIf
    Next

    ;GUICtrlCreateLabel
    $LabelCount = 0
    Local $Previous_Type = ""
    For $r = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$r][0] Then
            If $Previous_Type <> $aLabel[$r][1] Then
                $Previous_Type = $aLabel[$r][1]
                $aLabel[$r][10] = GUICtrlCreateLabel($aLabel[$r][1], $PlayerBorder, 13 * $LabelCount + $PlayerBorder, 50, 13, $SS_CENTERIMAGE)
                GUICtrlSetColor($aLabel[$r][10], 0xFFFFFF);White TextColor
                GUICtrlSetOnEvent($aLabel[$r][10], "_WM_LBUTTONDOWN")
                $ContextMenu = GUICtrlCreateContextMenu($aLabel[$r][10])
                $hCM = GUICtrlGetHandle($ContextMenu)
                _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
                $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
                GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
                GUICtrlCreateMenuItem("", $ContextMenu);Add separator
                For $r2 = 0 To UBound($aRadio) - 1
                    If $aRadio[$r2][7] = 0 Then
                        GUICtrlCreateMenuItem($aRadio[$r2][0], $ContextMenu)
                        GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
                    EndIf
                Next
            EndIf
            $aLabel[$r][9] = GUICtrlCreateLabel("", $PlayerBorder + 50, 13 * $LabelCount + $PlayerBorder, 260, 13, $SS_CENTERIMAGE)
            $LabelCount = $LabelCount + 1
            GUICtrlSetColor($aLabel[$r][9], 0xFFFFFF);White TextColor
            GUICtrlSetOnEvent($aLabel[$r][9], "_WM_LBUTTONDOWN")
            $ContextMenu = GUICtrlCreateContextMenu($aLabel[$r][9])
            $hCM = GUICtrlGetHandle($ContextMenu)
            _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
            $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
            GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
            GUICtrlCreateMenuItem("", $ContextMenu);Add separator
            For $r2 = 0 To UBound($aRadio) - 1
                If $aRadio[$r2][7] = 0 Then
                    GUICtrlCreateMenuItem($aRadio[$r2][0], $ContextMenu)
                    GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
                EndIf
            Next
        EndIf
    Next

    ;GUICtrlCreateLabel Volume
    $Volume_Label = GUICtrlCreateLabel("0", $PlayerBorder, $PlayerBorder, 260 + 50, $LabelY, "")
    GUICtrlSetColor($Volume_Label, 0xFFFFFF);White TextColor
    GUICtrlSetOnEvent($Volume_Label, "_WM_LBUTTONDOWN")
    GUICtrlSetState($Volume_Label, $GUI_HIDE)

    ;$Volume_Label Contextmenu
    $ContextMenu = GUICtrlCreateContextMenu($Volume_Label)
    $hCM = GUICtrlGetHandle($ContextMenu)
    _GUICtrlMenu_SetMenuStyle($hCM, BitXOR(_GUICtrlMenu_GetMenuStyle($hCM), $MNS_MODELESS))
    $ContextMenu_Item1 = GUICtrlCreateMenuItem($Radio_Name, $ContextMenu)
    GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
    GUICtrlCreateMenuItem("", $ContextMenu);Add separator
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][7] = 0 Then
            Local $Item = GUICtrlCreateMenuItem($aRadio[$r][0], $ContextMenu)
            GUICtrlSetOnEvent(-1, "ContextMenu_ChangeRadio")
        EndIf
    Next

    ;$Close
    $Close = GUICtrlCreateButton("Close", _
            $PlayerBorder * 2 + 260 + 50, _;Left
            $PlayerBorder, _;Top
            10, _;X
            10, _;Y
            $BS_BITMAP);Style
    _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Close.bmp")
    GUICtrlSetOnEvent($Close, "_Close")
    GUICtrlSetOnEvent($GUI_EVENT_CLOSE, "_Close")

    ;$PlayPause
    $PlayPause = GUICtrlCreateButton("Play/Pause", _
            $PlayerBorder * 2 + 260 + 50, _;Left
            $PlayerBorder + 10 + 10, _;Top
            10, _;X
            10, _;Y
            $BS_BITMAP);Style
    _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\Stop.bmp")
    GUICtrlSetOnEvent($PlayPause, "_PlayPause")

EndFunc ;==>_Build_PlayerGUI

Func _Close()
    _Audio_init_stop($MusicHandle)
    _GDIPlus_Shutdown()
    Exit
EndFunc ;==>_Close

Func _PlayPause()

    ;Change $Play
    If $Play = 1 Then
        $Play = 0
    Else
        $Play = 1
    EndIf

    Local $Msg = GUIGetCursorInfo($PlayerGUI)

    ;Change Button Image
    If $Play = 1 Then
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopp.bmp");Mouse Pressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopo.bmp");Mouse Over
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stop.bmp");Nothing
        EndIf
    Else
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playp.bmp");Mouse Pressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playo.bmp");Mouse Over
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\play.bmp");Nothing
        EndIf
    EndIf

    ;Play Sound
    If $Play = 0 Then
        _Audio_stop($MusicHandle)
    Else
        $MusicHandle = _Set_url($Radio_SoundLink)
        _Audio_play($MusicHandle)
    EndIf

EndFunc ;==>_PlayPause

Func _RemoveVolumeLabel()

    AdlibUnRegister("_RemoveVolumeLabel")

    ;Show Others Label
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then
            GUICtrlSetState($aLabel[$i][9], $GUI_SHOW)
        EndIf
    Next
    Local $Previous_Type = ""
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then
            If $Previous_Type <> $aLabel[$i][1] Then
                $Previous_Type = $aLabel[$i][1]
                GUICtrlSetState($aLabel[$i][10], $GUI_SHOW)
            EndIf
            GUICtrlSetState($aLabel[$i][9], $GUI_SHOW)
        EndIf
    Next

    ;Hide Volume Label
    GUICtrlSetState($Volume_Label, $GUI_HIDE)

EndFunc ;==>_RemoveVolumeLabel

Func _Save_Change_Volume()

    AdlibUnRegister("_Save_Change_Volume")

    _Set_volume($VolumePercent);Set

    IniWrite($Save_INI, @ComputerName, "Volume", $VolumePercent);Save

EndFunc ;==>_Save_Change_Volume

Func _WM_LBUTTONDOWN()

    ;Move GUI
    If WinActive("AutoIt Radio Cover") Then
        _SendMessage($CoverGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    Else
        _SendMessage($PlayerGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    EndIf

    ;Save GUI pos
    Local $Player_pos = WinGetPos("AutoIt Radio Player")
    Local $Cover_pos = WinGetPos("AutoIt Radio Cover")
    IniWrite($Save_INI, @ComputerName, "Title_X", $Player_pos[0])
    IniWrite($Save_INI, @ComputerName, "Title_Y", $Player_pos[1])
    If $Radio_CoverLink <> "" Then
        IniWrite($Save_INI, @ComputerName, "Cover_X", $Cover_pos[0])
        IniWrite($Save_INI, @ComputerName, "Cover_Y", $Cover_pos[1])
    EndIf

EndFunc   ;==>_WM_LBUTTONDOWN

Func _WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)

    AdlibUnRegister("_RemoveVolumeLabel")

    If GUICtrlGetState($Volume_Label) <> 80 Then

        ;Show $Volume_Label
        GUICtrlSetState($Volume_Label, $GUI_SHOW)

        ;Hide Others Label
        Local $Previous_Type = ""
        For $i = 0 To UBound($aLabel) - 1
            If $Radio_Name = $aLabel[$r][0] Then
                If $Previous_Type <> $aLabel[$i][1] Then
                    $Previous_Type = $aLabel[$i][1]
                    GUICtrlSetState($aLabel[$i][10], $GUI_HIDE)
                EndIf
                GUICtrlSetState($aLabel[$i][9], $GUI_HIDE)
            EndIf
        Next

    EndIf

    ;Change $VolumePercent
    Local $WheelDelta = BitShift($wParam, 16) / 120
    $VolumePercent = $VolumePercent + 4 * $WheelDelta
    If $WheelDelta > 0 Then
        If $VolumePercent > 100 Then $VolumePercent = 100
    Else
        If $VolumePercent < 0 Then $VolumePercent = 0
    EndIf
    If $Previous_VolumePercent <> $VolumePercent Then
        $Previous_VolumePercent = $VolumePercent
        GUICtrlSetData($Volume_Label, $VolumePercent)
    EndIf

    ;Change\Save Sound
    AdlibRegister("_Save_Change_Volume", 50)

    ;Hide $Volume_Label in 3s
    AdlibRegister("_RemoveVolumeLabel", 3000)

    Return $GUI_RUNDEFMSG

EndFunc   ;==>_WM_MOUSEWHEEL

Func ContextMenu_ChangeRadio()

    $Previous_Cover_Read = ""

    Local $NewRadioName = GUICtrlRead(@GUI_CtrlId, 1)

    ;Maybe the next radio have no cover so delete it
    If $Radio_CoverLink <> "" Then
        GUIDelete($CoverGUI)
        AdlibUnRegister("GetCoverDATA")
    EndIf

    ;Maybe the $PlayerGUI need resize so delete it
    GUIDelete($PlayerGUI)
    AdlibUnRegister("GetPlayerDATA")

    _Audio_stop($MusicHandle)

    ;Remove Default Radio Tag
    For $r = 0 To UBound($aRadio) - 1
        $aRadio[$r][7] = 0
    Next

    ;Set $NewRadioName to Default
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][0] = $NewRadioName Then
            $aRadio[$r][7] = 1
            IniWrite($Save_INI, @ComputerName, "Default_Radio", $aRadio[$r][0])
        EndIf
    Next

    ;Get $Radio_Name, $Radio_SoundLink, $Radio_CoverLink, $Radio_CoverLink_Start, $Radio_CoverLink_End, $Radio_CoverLink_BetweenNum, $Radio_CoverLink_Before
    For $r = 0 To UBound($aRadio) - 1
        If $aRadio[$r][7] = 1 Then
            $Radio_Name = $aRadio[$r][0]
            $Radio_SoundLink = $aRadio[$r][1]
            $Radio_CoverLink = $aRadio[$r][2]
            $Radio_CoverLink_Start = $aRadio[$r][3]
            $Radio_CoverLink_End = $aRadio[$r][4]
            $Radio_CoverLink_BetweenNum = $aRadio[$r][5]
            $Radio_CoverLink_Before = $aRadio[$r][6]
        EndIf
    Next

    ;ConsoleWrite("Build GUI" & @CRLF)

    ;Build GUI
    _Build_PlayerGUI()
    _Build_CoverGUI()

    ;ConsoleWrite("Show GUI" & @CRLF)

    GUISetState(@SW_SHOW, $PlayerGUI)
    If $Radio_CoverLink <> "" Then
        GUISetState(@SW_SHOW, $CoverGUI)
    EndIf

    ;GetPlayerDATA() - GetCoverDATA()
    GetPlayerDATA()
    AdlibRegister("GetPlayerDATA", 8000)
    If $Radio_CoverLink <> "" Then
        GetCoverDATA()
        AdlibRegister("GetCoverDATA", 8000)
    EndIf

EndFunc ;==>ContextMenu_ChangeRadio

Func UseCurl($Link, $Timeout, $binary = 0, $write = 0, $file = "")

    Local $Error = ""
    Local $Data = ""
    Local $Curl = Curl_Easy_Init()
    If Not $Curl Then Return

    If $write = 0 Then

        ;Read Mode

        ; How to get html or header data?
        ;   1. Set $CURLOPT_WRITEFUNCTION and $CURLOPT_HEADERFUNCTION to Curl_DataWriteCallback()
        ;   2. Set $CURLOPT_WRITEDATA or $CURLOPT_HEADERDATA to any number as identify
        ;   3. Use Curl_Data_Get() to read the returned data in binary format
        ;   4. Use Curl_Data_Cleanup() to remove the data

        Local $Html = $Curl ; any number as identify
        Local $Header = $Curl + 1 ; any number as identify

        Curl_Easy_Setopt($Curl, $CURLOPT_URL, $Link)
        Curl_Easy_Setopt($Curl, $CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A')
        Curl_Easy_Setopt($Curl, $CURLOPT_FOLLOWLOCATION, 1)
        Curl_Easy_Setopt($Curl, $CURLOPT_ACCEPT_ENCODING, "")
        Curl_Easy_Setopt($Curl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback())
        Curl_Easy_Setopt($Curl, $CURLOPT_WRITEDATA, $Html)
        Curl_Easy_Setopt($Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback())
        Curl_Easy_Setopt($Curl, $CURLOPT_HEADERDATA, $Header)
        Curl_Easy_Setopt($Curl, $CURLOPT_COOKIE, "tool=curl; script=autoit; fun=yes;")
        Curl_Easy_Setopt($Curl, $CURLOPT_TIMEOUT, $Timeout)
        Curl_Easy_Setopt($Curl, $CURLOPT_SSL_VERIFYPEER, 0)

        Local $Code = Curl_Easy_Perform($Curl)
        If $Code = $CURLE_OK Then
            ;ConsoleWrite("Content Type: " & Curl_Easy_GetInfo($Curl, $CURLINFO_CONTENT_TYPE) & @LF)
            ;ConsoleWrite("Download Size: " & Curl_Easy_GetInfo($Curl, $CURLINFO_SIZE_DOWNLOAD) & @LF)

            $Data = BinaryToString(Curl_Data_Get($Html))
            $Error = ""

            ;MsgBox(0, 'Header', BinaryToString(Curl_Data_Get($Header)))
            ;MsgBox(0, 'Html', BinaryToString(Curl_Data_Get($Html)))
        Else
            ;ConsoleWrite(Curl_Easy_StrError($Code) & @LF)

            $Data = ""
            $Error = Curl_Easy_StrError($Code)

        EndIf

        Curl_Easy_Cleanup($Curl)
        Curl_Data_Cleanup($Header)
        Curl_Data_Cleanup($Html)

    Else

        ;Write Mode

    EndIf

    Local  $aray[2] = [$Data,$Error]
    return $aray

EndFunc

Func GetCoverDATA()

    ;ConsoleWrite("GetCoverDATA (Start)" & @CRLF)

    ;Get $RealCoverLink
    If $Radio_CoverLink_Start = "" Then
        ;ConsoleWrite("$RealCoverLink = $Radio_CoverLink" & @CRLF)
        Local $RealCoverLink = $Radio_CoverLink
    Else
        ;ConsoleWrite("$RealCoverLink <> $Radio_CoverLink" & @CRLF)
        ;UseCurl($Link, $Timeout, $binary = 0, $write = 0, $file = "")
        Local $aray = UseCurl($Radio_CoverLink, 5)
        Local $Data = $aray[0]
        Local $Error = $aray[1]
        If $Error <> "" then
            ;ConsoleWrite("$Error = " & $Error & @CRLF)
        EndIf
        Local $Between = _StringBetween($Data, $Radio_CoverLink_Start, $Radio_CoverLink_End)
        If @error <> 0 Then
            $Between = ""
        Else
            $Between = $Between[$Radio_CoverLink_BetweenNum]
        EndIf
        $RealCoverLink = $Radio_CoverLink_Before & $Between
        $RealCoverLink = StringReplace($RealCoverLink, " ","%20")
    EndIf
    ;ConsoleWrite("$RealCoverLink = " & $RealCoverLink & @CRLF)

    ;UseCurl($Link, $Timeout, $binary = 0, $write = 0, $file = "")
    Local $Cover_Read = UseCurl($RealCoverLink, 5, 1)

    $Cover_Read = $Cover_Read[0]

    If $Cover_Read <> $Previous_Cover_Read and $Cover_Read <> "" Then

        $Previous_Cover_Read = $Cover_Read

        Local $hMem = _MemGlobalAllocFromBinary($Cover_Read)
        Local $hImage = _GDIPlus_ImageLoadFromHGlobal($hMem)
        Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($CoverGUI)
        _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $CoverSize, $CoverSize)
        _GDIPlus_GraphicsDispose($hGraphics)
        _GDIPlus_ImageDispose($hImage)

    EndIf

    ;ConsoleWrite("GetCoverDATA (End)" & @CRLF)

EndFunc ;==>GetCoverDATA()

Func GetPlayerDATA()

    _ReduceMemory()

    ;ConsoleWrite("GetPlayerDATA (Start)" & @CRLF)

    ;Assign
    Local  $Previous_Data, $Previous_DataLink
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then

            If $Previous_DataLink <> $aLabel[$i][3] Then

                Local $aray = UseCurl($aLabel[$i][3], 5)
                Local $Data = $aray[0]
                Local $Error = $aray[1]

                $Previous_Data = $Data
                $Previous_DataLink = $aLabel[$i][3]

            Else

                $Data = $Previous_Data
                $Previous_DataLink = $aLabel[$i][3]

            EndIf

            Local $Between = _StringBetween($Data, $aLabel[$i][4], $aLabel[$i][5])
            If @error <> 0 Then
                $Between = ""
            Else
                If Not ($aLabel[$i][6] > Ubound($Between)-1) Then
                    $Between = $Between[$aLabel[$i][6]]
                Else
                    $Between = ""
                EndIf
            EndIf
            If $aLabel[$i][7] <> "" Then
                Local $Split = StringSplit($Between, $aLabel[$i][7], 1)
                If $Split[0] < $aLabel[$i][8] Then
                    Local $Info = ""
                Else
                    $Info = $Split[$aLabel[$i][8]]
                EndIf
            Else
                $Info = $Between
            EndIf

            If $Data = "" Then
                $Info = $Error
            EndIf

            $Info = StringReplace($Info, "â·", "·")
            $Info = StringReplace($Info, "apos;", "'")
            Assign($aLabel[$i][1] & $aLabel[$i][2], $Info)

        EndIf
    Next

    If _BASS_ChannelIsActive($MusicHandle) <> 1 and $Play = 1 Then

        _Audio_stop($MusicHandle)

        ;ConsoleWrite("Start playing sound" & @CRLF)
        $Play = 1
        $MusicHandle = _Set_url($Radio_SoundLink)
        _Audio_play($MusicHandle)

        ;ConsoleWrite("Set Volume" & @CRLF)
        $VolumePercent = IniRead($Save_INI, @ComputerName, "Volume", 4)
        $Previous_VolumePercent = $VolumePercent
        _Set_volume($VolumePercent)

    EndIf

    ;Update Ctrl
    For $i = 0 To UBound($aLabel) - 1
        If $Radio_Name = $aLabel[$i][0] Then
            If Eval($aLabel[$i][1] & $aLabel[$i][2]) <> GUICtrlRead($aLabel[$i][9]) Then
                GUICtrlSetData($aLabel[$i][9], Eval($aLabel[$i][1] & $aLabel[$i][2]))
            EndIf
        EndIf
    Next

    ;ConsoleWrite("GetPlayerDATA (End)" & @CRLF)

EndFunc ;==>GetPlayerDATA()

#EndRegion ;==> Internal Func

While 1

    Local $Msg = GUIGetCursorInfo($PlayerGUI)

    If $Msg[4] = $Close Then
        If $Msg[2] = 1 Then
            _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Closep.bmp");MousePressed
        Else
            _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Closeo.bmp");MouseOver
        EndIf
    Else
        _GUICtrlButton_SetImage($Close, @ScriptDir & "\AutoIt Radio Player\Img\Close.bmp");Nothing
    EndIf

    If $Play = 1 Then
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopp.bmp");MousePressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stopo.bmp");MouseOver
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\stop.bmp");Nothing
        EndIf
    Else
        If $Msg[4] = $PlayPause Then
            If $Msg[2] = 1 Then
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playp.bmp");MousePressed
            Else
                _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\playo.bmp");MouseOver
            EndIf
        Else
            _GUICtrlButton_SetImage($PlayPause, @ScriptDir & "\AutoIt Radio Player\Img\play.bmp");Nothing
        EndIf
    EndIf

    Sleep(100)

WEnd


;1075 v0.0.0.8 30/04/2016 01:55

 

Edited by Synapsee

Share this post


Link to post
Share on other sites

I've tryd it but it won't play anything (no sound).

But (since I ran your program) now every program I use that uses bass.dll won't give any sound when not compiled on my pc.

When I compile the script everything works ok but not when I started from the code, everything than works ok but no sound,

So how can I fixed this!!!!

 

EDIT

I've fixed this to run this small script

$VolumeTarget = "autoit3.exe"

ShellExecute("nircmdc.exe", 'setappvolume "' & $VolumeTarget & '" ' & 10, @ScriptDir & "\AutoIt Radio Player\dep", "", @SW_HIDE)

I don't think this is the right way to make a program!!!

Edited by nend

Share this post


Link to post
Share on other sites

Hi nend and thx for spend time on my script but i can't understand.

Have u try mousewheel up/down ? This don't change the volume ?

Quote

Install/Use :

-Use MouseWheel for change volume
          Note : On first start : volume = 4%

When u use that :

Quote
$VolumeTarget = "autoit3.exe"

ShellExecute("nircmdc.exe", 'setappvolume "' & $VolumeTarget & '" ' & 10, @ScriptDir & "\AutoIt Radio Player\dep", "", @SW_HIDE)

 

This set your volume @ 100% or 10% ?

Set the volume @ 50% should be :

ShellExecute("nircmdc.exe", 'setappvolume "' & $VolumeTarget & '" ' & 50/100, @ScriptDir & "\AutoIt Radio Player\dep", "", @SW_HIDE)

Edit :

Quote

But (since I ran your program) now every program I use that uses bass.dll won't give any sound when not compiled on my pc.

ok, i understand better, sorry for this problem, i will look arround use bass.dll instead of change the "autoit3.exe" volume lvl.

Edited by Synapsee

Share this post


Link to post
Share on other sites

The problem is that the nircmdc.exe set al the audio volume for all autoit scripts.

If u use Bass.dll for your project it will work a lot better.

When I started this script all my scripts didn't work properly anymore, but by exmanine your script I realized that the command niccmdc take over every au3 script audio.

I will check your script again (with the mouse wheel) and come back on it.

EDIT:

I've try'd it again but the same issue, program won't react and no sound (even with mousewheel)

But now I didn't get the sound back and needed a system recovery to get it work again.

For now I won't test it again until you get rid of nircmdc.

Edited by nend

Share this post


Link to post
Share on other sites

Hey, thx for reply <3

This is strange, the script is probably stuck somewhere on spacetime

Can u see gui ? gui is feeded with cover/data ? can u see close button ? can u drag gui ? can u rightclic ? the gui hang ? when u mousewheel u see current volume % appear ?

I work on a new version with more console return, this will help a lot for this case.

Actually i progress on curl stuff, because i can't set timeout for the iniread($coverlink) but with curl i can : )

Edited by Synapsee

Share this post


Link to post
Share on other sites

Here the same problem program hangs and kills the audio I have to kill it in the taskmanager to stop the program (windows 10 64 bits).

I see the gui but the I can do anything, did you see the pm I send you?

It's very simpel to rebuild this app with bass.dll and than you don't have this problem.

Edited by nend

Share this post


Link to post
Share on other sites
Quote

did you see the pm I send you?

No, i don't know how i can see it. I see u posted on my profile but where ? this is the ask ^^ Can't find

Quote

It's very simpel to rebuild this app with bass.dll and than you don't have this problem.

It's sure i need use bass.dll but the program hangs for another reason i think. And I have no hang on start on my computer.

I think the best is wait for another version with more debug stuff for find where the script stuck.

Share this post


Link to post
Share on other sites
1 hour ago, Synapsee said:

Can u see gui ? yes

gui is feeded with cover/data ? yes

can u see close button ? yes, but when i click nothing appens 

can u drag gui ?  no

can u rightclic ? yes

the gui hang ?  no i don't think

when u mousewheel u see current volume % appear ? no

 

20160428151121e6jte.png

Edited by wakillon

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Last ver : v0.0.0.8

AutoIt Radio Player v0.0.0.8.zip

Changelog :

Spoiler

-Better code practice
          Replace dim with local
          Use #AutoIt3Wrapper_Au3Check_Parameters=-w 1 -w 2 -w 3 -w- 4 -w 6 -w- 7
          Improve some comment

-Replace SoundPlay\nircmd with Bass.dll usage
          SoundPlay\nircmd is a novice usage, Bass.dll usage is better
          Now if an event like disconnect appear the sound resume.
          Thx to nend, ..., No ! Big Thx to nend ;)

-Replace InetRead/_InetGetSource with Curl.au3 usage
          InetRead/_InetGetSource seems limited with timeout management
          Both replaced with Curl_Easy_Perform()
          Set all timeout to 5s
          If timeout is reached about tracktitle for sample you will see now "timeout was reached" (curl error return)

TODO :

Spoiler

-Update first post

-About Timeout/ GUI-blocking
          Curl_Easy_Perform() seems better but not the best for GUI Hang while timeout is not reached.
          I need study about Curl.au3 for use Curl_Multi_Perform() (study the non-GUI-blocking technique sample).
                    This is done. Curl.au3\Curl_Example_Multi.au3 rocks ;)

-Add right clic functionnality for a Website Station shorcut.
          This is done with _WinAPI_AssocQueryString(".html", $ASSOCSTR_EXECUTABLE)

-Add right clic functionnality for a gui for add/del station or any other label.
          i will probably use _FileReadToArray, _FileWriteFromArray for save the gui data.
                    In progress...

 

or any other label explain :

          Current : TrackTiTle
          Coffee Ready : Yes/No
          Weather : 26 Degres

Current RightClic :

          Current Station (onclic station switch)
          Separator
          Station A (onclic station switch)
          Station B (onclic station switch)

Next Target RightClic :

          Current Station
                    Website (open the station url)
                    Load (change to this station)
          Separator
          Station A
                     Website (open the station url)
                     Load (change to this station)
          Station B
                    Website (open the station url)
                    Load (change to this station)
          Separator
          Config (load a nice gui for manage the list station)

Console return :

Spoiler

Console should return :

Start
Build GUI
Build PlayerGUI
Build CoverGUI
Show GUI
GetPlayerDATA (Start)
Start playing sound
Set Volume
GetPlayerDATA (End)
GetCoverDATA (Start)
$RealCoverLink = http://imglink.jpg
GetCoverDATA (End)
GUIRegisterMsg

And a while with :

GetPlayerDATA (Start)
GetPlayerDATA (End)

GetCoverDATA (Start)
$RealCoverLink = http://imglink.jpg
GetCoverDATA (End)

Related link :

bass.dll source : http://www.un4seen.com/bass.html (v2.4.12.1)

bass.au3 source : bass related forum post (patch 9.2/Constant from 9.0)

nice autoit program for help with Curl.au3 usage by wakillon : Mp3SearchEngine

nice autoit program "radio related" by nend : http://trayradio.com/

Edited by Synapsee

Share this post


Link to post
Share on other sites
10 hours ago, wakillon said:

Now i can drag gui and volume is displayed but i have no sound...

It's probably related to v0.0.0.7 (nircmd.exe use).

Try up sound on the windows mixer panel (While Player running).

%windir%\System32\SndVol.exe

57265693366f6_mixerfix.jpg.ec133a7364418

Share this post


Link to post
Share on other sites

hi argumentum,

Quote

every second ?

for the moment it's all 8s :

...
AdlibRegister("GetCoverDATA", 8000)
...
AdlibRegister("GetPlayerDATA", 8000)
...

i will add a config GUI where u can config this timing for each downloaded DATA.

Quote

Opt("TrayAutoPause", 0)

Not a bad idea, just discover that, seems a good improve for make autoit trayicon more easy to use. Thx u for sharing and testing : )

Share this post


Link to post
Share on other sites

I'm trying some Bass Plugin scripts since yesterday and note that i have no sound !

So, intriged by this problem, I made the connection with your script where i have no sound too.

After having verified my sound card drivers, uninstall and reinstall, there is no changes...

In the meantime i have used my Mp3SearchEngine who use bass.dll and i have sound...

So a bit lost, i did not understand why some scripts "works" and others not !

And i realize that Mp3SearchEngine was compiled and other not.

So i compile my script and run it and...i get sound ! and same for yours too !

So be reassured your last version works well ;)

 

Now, I have to find why i have a sound problem running "Bass" script not compiled...:sweating:


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Start a not compiled script, start play a sound (you should have no sound). and do that :

 

Edit ; nircmd.exe have set "autoit3.exe" sound to 0%

when u compile a script "yourscript.exe" the sound is at 100% but if not compiled windows see him like "autoit3.exe"  and sound is at 0%

Edited by Synapsee

Share this post


Link to post
Share on other sites

I got it to this path C:\Windows\WinSxS\x86_microsoft-windows-audio-volumecontrol_31bf3856ad364e35_6.3.9600.17415_none_5b14d0ca22da016a\SndVol.exe

and sound is back thanks.

So, it was nircmd.exe who was responsible of this problem ?


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

C:\Windows\WinSxS\x86_microsoft-windows-audio-volumecontrol_31bf3856ad364e35_6.3.9600.17415_none_5b14d0ca22da016a\SndVol.exe

good job !

 

Not really, u start my v0.0.0.7, nircmd set autoit3.exe @ 0%, after a error appear, you close the script, the sound is always at 0%

set the autoit3.exe volume directly is just a bad idea because this affect all not compiled script.

But nircmd.exe have do the good job, its more a bad use of him. Bass seems set volume only for the current script so it's clearly better.

I'm really sorry for that problem, im happy see you resolve it ; )

 

I'm continue dev my script, i learn a lot every day, i have add some functionnality with a gui for config, etc...

My dream now it's add something like that : https://autoit.de/index.php/Thread/23204-Audio-Visualization-Collection/ while playing radio ; )

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

  • Similar Content

    • By panlatv
      Hello everybody (and sorry for my bad english)

      I try to get the position of a contextmenu (GUICtrlCreateContextMenu) on a TreeView, with ControlGetPos, but i can't.
      Someone can help me ? Thank you :)

      PS: I need the position to select item wtih rightclick before read the text of the item, because rightclick don't select item (only leftclick).
       
    • By CYCho
      zPlayer is the name I used when I introduced the early version of this palyer in my blog back in early 2009 and, therefore, has nothing to do with the mobile media player of the same name which started marketing in 2015.
      After I retired from active duty in 2002 I spent much time listening to music. First I started with CD's and LP's, then quickly moved on to mp3 files. I converted many of my CD's to mp3 and I collected many more from various sources which were freely available at the time. As the number of my mp3 files grew, I put them in folders according to their genres and my favorite classifications. I mainly used Windows Media Player to listen to them and I slowly began to dislike wmp because it had massive user interface while I just wanted to listen to music in the background while I was doing other work in the foreground, hopping between folders from time to time. It was the time I was beginning to learn AutoIt and I thought I should make my own player with AutoIt. Coming from a sales career with no experience in programming, it was not an easy task. Somehow, after about 2 years of learning and trying, I had my own audio player which worked with only hotkeys without any graphical interface. I gave it to some of my friends who were not as computer-savvy as I. They liked it but definitely wanted something to clcik with mouse. So I came up with very rude gui which took a form similar to what it is now.
      The attached source files include one au3 file, one icon file and 14 jpg files. The jpg files are used for drawing a graphical player and are fileinstalled in @DocumentsCommonDir folder. This player uses WMPlayer.OCX as its engine and supports all audio file formats supported by wmp and additional codecs installed. I would like to thank @Bilgus for kind answers to my questions and would appreciate it if anyone could review the code and give me any suggestion. This player works for me, but I don't know whether the code is presentable as an example. I am posting this here with a hope to learn much from AutoIt community.
      PS: 1. An error (Variable used before declaration) was reported and corrected - 02:00 hours GMT,  March 14, 2019
            2. An error in tray menu was corrected -10:00 hours GMT, March14, 2019
            3. AutoIt3Wrapper_Au3Check_Parameters definition was added at the top of the code and all ensuing errors were corrected. - 00:10 hours GMT, March 16 2019
            4. Some features were added. - 10:30 hours GMT, March 18, 2019
                a. Jumping to new play-back position in a file
                b. Support for a manually made playlist
                c. Ctrl+Alt+h hotkey to trigger a help message box
            5. The minimum resizing width of playlist window was set at 450. - 01:10 hours GMT, March 23, 2019
            6. Problems associated with actions taken while in 'paused' status was addressed. - 07:40 GMT, April 12, 2019
            7. An error was found and corrected in restoring previous play-back environment when the mode was 'Shuffled.' - 11:00 GMT, April 17, 2019


      Please see Downloads section of this forum for source code files.
       
    • By Rex
      Some time ago I needed a way to uploade images to imgur, from one of my programs, and took a look at there API.
      Don't know if anyone can/would use it, but here is my code
       
      #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 ; #INDEX# ======================================================================================================================= ; Title .........: IMGUR Curl udf ; AutoIt Version : 1.0 ; Description ...: Uploads files to imgur using curl, and returns imgur url, deletion key, imgsize ect. in an array ; Author(s) .....: Rex ; =============================================================================================================================== #include-once #include <curl.au3> ; By Ward #include <JSON.au3> ; by Ward ; #FUNCTION# ==================================================================================================================== ; Name...........: _Imgur ; Description ...: Allows the user to uploade images to Imgur, or delete an already uploaded image using the images DeleteHash ; Syntax.........: _Imgur($AuthKey, True/False, $vData) ; Parameters ....: $AuthKey - API key from Imgur ; $bImg_Up - If true an image uploade is expected, if False a DeleteHas is expected ; $vData - The image to uploade, or the DeleteHash that was returned from Imgur at Image uploade ; Return values .: Success - An Array containing: ID, Datetime, type, animated, width, height, size, deletehash and url ; Failur - Sets @Error to 1 if no AuthKey is provided ; Failur - Sets @Error to 2 if $bImg_Up = True but no Image data is provided ; Failur - Sets @Error to 3 if $bImg_Up = True but $vData isn't Binary ; Failur - Sets @Error to 4 if $bImg_Up = False but no DeleteHash is provided ; Failur - Sets @Error to 5 if the API returns 400 -> Bad Request ; Failur - Sets @Error to 6 if the API returns 403 -> Permission Denied ; Failur - Sets @Error to 7 if the API returns 413 -> Data to large ; Failur - Sets @Error to 8 if the API returns 415 -> Unsupported data ; Failur - Sets @Error to 9 if Curl returns no Curl ; Failur - Sets @Error to 10 and returns Curl error msg if Curl fails ; Failur - Sets @Error to 11 If StringRegExp failed on the header (no array) ; Author ........: Rex ; Modified.......: ; Remarks .......: Needs Curl, Json And BinaryCall by Ward - Base64Encode By Ward and _EPOCH_Decrypt by Trancexx ; Is includede in the UDF is self ; Related .......: ; Link ..........: ; Example .......: $dFile = FileOpenDialog('Open', @ScriptDir, 'Image Files (*.jpg;*.jpeg;*.png;*.bmp;*.gif)', 1) ; Browse image ; $hData = FileOpen($dFile, 16) ; Open as binary ; $dData = FileRead($hData) ; Read the data ; FileClose($hData) ; Close the FileHandle ; $aData = _Imgur('APIKEY', True, $dData) ; Uploade the Image ; ; $aDelete = _Imgur('APIKEY', False, 'DELETEHASH') ; ; =============================================================================================================================== Func _Imgur($sAuthKey, $bImg_Up = True, $vData = '') ; Performe some error checking Select Case $sAuthKey = '' ; If no authkey is provided Return SetError(1, 0, -1) ; We set error to 1 Case $vData = '' And $bImg_Up = True ; If no image data is sendt Return SetError(2, 0, -1) ; We sent error to 2 Case $vData <> '' And $bImg_Up = True And IsBinary($vData) = 0 ; If $vData isn't binary Return SetError(3, 0, -1) ; We sent error to 3 Case $vData = '' And $bImg_Up = False ; If no deleta hash was send Return SetError(4, 0, -1) ; We sent error to 4 EndSelect Local $aResult[9] ; Return array Local $ProgressCallback = DllCallbackGetPtr(DllCallbackRegister("ShowProgress", "int:cdecl", "ptr;uint64;uint64;uint64;uint64")) Local $Curl = Curl_Easy_Init() If Not $Curl Then Return SetError(9, 0, -1) Local $sHtml = $Curl Local $sHeader = $Curl + 1 ; any number as identify Local $sList = Curl_Slist_Append(0, "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0") $sList = Curl_Slist_Append($sList, 'Referer: http://imgur.com/') $sList = Curl_Slist_Append($sList, 'Type: Base64') $sList = Curl_Slist_Append($sList, "Authorization: client-ID " & $sAuthKey) Curl_Easy_Setopt($Curl, $CURLOPT_HTTPHEADER, $sList) ; If $bImg_Up is true we uploads the image If $bImg_Up = True Then $dImage = _Base64Encode($vData) ; Convert the image to Base64 Curl_Easy_Setopt($Curl, $CURLOPT_URL, "https://api.imgur.com/3/upload/") ; If we wants to uploade an image Curl_Easy_Setopt($Curl, $CURLOPT_POST, 1) Curl_Easy_Setopt($Curl, $CURLOPT_COPYPOSTFIELDS, $dImage) Else ; If no img we expect a delete Curl_Easy_Setopt($Curl, $CURLOPT_URL, "https://api.imgur.com/3/image/" & $vData) ; If we wants to delete an image Curl_Easy_Setopt($Curl, $CURLOPT_CUSTOMREQUEST, 'DELETE') ; When we deletes an image EndIf ; Get header Curl_Easy_Setopt($Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($Curl, $CURLOPT_HEADERDATA, $sHeader) Curl_Easy_Setopt($Curl, $CURLOPT_FOLLOWLOCATION, 1) ; Checks use this to see the respons from server, and get img url/delete hash ect. Curl_Easy_Setopt($Curl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($Curl, $CURLOPT_WRITEDATA, $sHtml) Curl_Easy_Setopt($Curl, $CURLOPT_TIMEOUT, 30) Curl_Easy_Setopt($Curl, $CURLOPT_SSL_VERIFYPEER, 0) Curl_Easy_Setopt($Curl, $CURLOPT_NOPROGRESS, 0) Curl_Easy_Setopt($Curl, $CURLOPT_XFERINFOFUNCTION, $ProgressCallback) Local $Code = Curl_Easy_Perform($Curl) If $Code <> $CURLE_OK Then Return SetError(10, 0, Curl_Easy_StrError($Code)) EndIf ;ConsoleWrite(@CRLF & 'HEADER: ' & BinaryToString(Curl_Data_Get($sHeader)) & @CRLF) ;ConsoleWrite(@CRLF & 'HTML RAW: ' & BinaryToString(Curl_Data_Get($sHtml)) & @CRLF) ; Check what the header returns $aHeader = StringRegExp(BinaryToString(Curl_Data_Get($sHeader)), 'HTTP/1.1 (400|403|413|415|200)', 1) If IsArray($aHeader) Then Select Case $aHeader[0] = 400 ; If 403 then Permission Denied Return SetError(5, 0, -1) Case $aHeader[0] = 403 ; If 403 then Permission Denied Return SetError(6, 0, -1) Case $aHeader[0] = 413 ; If 413 then the data is to large Return SetError(7, 0, -1) Case $aHeader[0] = 415 ; If 415 then the data is unsupported Return SetError(8, 0, -1) Case $aHeader[0] = 200 ; If 200 uploade/delete was a sucess ; Decode the json returned from imgur Local $sJson = Json_Decode(BinaryToString(Curl_Data_Get($sHtml))) ; If deleting an image we only needs to return Sucess - IMGUR returns Sucess If $bImg_Up = False Then ReDim $aResult[1] ; Slim down the array $aResult[0] = 'Success' Return $aResult EndIf ; If an image was uploaded then we need to return some data to the user $aResult[0] = Json_Get($sJson, '["data"]["id"]') ; Imgur image id ; Date time the image was uploaded, it's returned in unix timestamp, so we converts it to regular time stamp $aResult[1] = _EPOCH_Decrypt(Json_Get($sJson, '["data"]["datetime"]')) ; Type of uploaded image $aResult[2] = Json_Get($sJson, '["data"]["type"]') ; Was the image animated $aResult[3] = Json_Get($sJson, '["data"]["animated"]') ; Width of the image $aResult[4] = Json_Get($sJson, '["data"]["width"]') ; Height of the image $aResult[5] = Json_Get($sJson, '["data"]["height"]') ; Size of the image $aResult[6] = Json_Get($sJson, '["data"]["size"]') ; Delete hash of the image $aResult[7] = Json_Get($sJson, '["data"]["deletehash"]') ; Image link $aResult[8] = Json_Get($sJson, '["data"]["link"]') Curl_Easy_Cleanup($Curl) Curl_Data_Cleanup($Curl) Curl_Slist_Free_All($sList) Return $aResult EndSelect Else ; If the Regexp failed Return SetError(11, 1, -1) EndIf EndFunc ;==>_Imgur Func ShowProgress($Ptr, $dltotal, $dlnow, $ultotal, $ulnow) ProgressSet(Int($ulnow / $ultotal * 100), '% Sendt = ' & Int($ulnow / $ultotal * 100)) Return 0 EndFunc ;==>ShowProgress ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: _EPOCH_Decrypt ; Description ...: Converts Epoch Time to human time ; Syntax ........: _EPOCH_Decrypt(TIMESTAMP) ; Return values .: Convertede timestamp ; Author ........: Trancexx ; Modified ......: ; Remarks .......: ; =============================================================================================================================== Func _EPOCH_Decrypt($iEpochTime) ; By trancexx forum thread: https://www.autoitscript.com/forum/topic/83667-epoch-time/ Local $iDayToAdd = Int($iEpochTime / 86400) Local $iTimeVal = Mod($iEpochTime, 86400) If $iTimeVal < 0 Then $iDayToAdd -= 1 $iTimeVal += 86400 EndIf Local $i_wFactor = Int((573371.75 + $iDayToAdd) / 36524.25) Local $i_xFactor = Int($i_wFactor / 4) Local $i_bFactor = 2442113 + $iDayToAdd + $i_wFactor - $i_xFactor Local $i_cFactor = Int(($i_bFactor - 122.1) / 365.25) Local $i_dFactor = Int(365.25 * $i_cFactor) Local $i_eFactor = Int(($i_bFactor - $i_dFactor) / 30.6001) Local $aDatePart[3] $aDatePart[2] = $i_bFactor - $i_dFactor - Int(30.6001 * $i_eFactor) $aDatePart[1] = $i_eFactor - 1 - 12 * ($i_eFactor - 2 > 11) $aDatePart[0] = $i_cFactor - 4716 + ($aDatePart[1] < 3) Local $aTimePart[3] $aTimePart[0] = Int($iTimeVal / 3600) $iTimeVal = Mod($iTimeVal, 3600) $aTimePart[1] = Int($iTimeVal / 60) $aTimePart[2] = Mod($iTimeVal, 60) Return StringFormat("%.2d/%.2d/%.2d %.2d:%.2d:%.2d", $aDatePart[0], $aDatePart[1], $aDatePart[2], $aTimePart[0], $aTimePart[1], $aTimePart[2]) EndFunc ;==>_EPOCH_Decrypt ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: _Base64Encode ; Description ...: Encodes data into Base64 ; Syntax ........: _Base64Encode(Data, Linebreak) ; Return values .: Base64 Encodede string ; Author ........: Ward ; Modified ......: ; Remarks .......: ; =============================================================================================================================== Func _Base64Encode($Data, $LineBreak = 76) ; By Ward Local $Opcode = '0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737' $Opcode &= '475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1' $Opcode &= 'E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F' $Opcode &= '90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E' $Opcode &= '5BC9C21000' Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]") DllStructSetData($CodeBuffer, 1, $Opcode) $Data = Binary($Data) Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]") DllStructSetData($Input, 1, $Data) $LineBreak = Floor($LineBreak / 4) * 4 Local $OputputSize = Ceiling(BinaryLen($Data) * 4 / 3) $OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4 Local $Ouput = DllStructCreate("char[" & $OputputSize & "]") DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _ "ptr", DllStructGetPtr($Input), _ "int", BinaryLen($Data), _ "ptr", DllStructGetPtr($Ouput), _ "uint", $LineBreak) Return DllStructGetData($Ouput, 1) EndFunc ;==>_Base64Encode I have added Wards curl, json and BinaryCall to the att. zip file.
       
      Cheers
      /Rex
      Includes.zip
    • By Silas
      Hello everyone,
      First, watch the screenshot I attached:

      The background beneath the radios is that a value is subtracted from Player 1, and added to player 2, in the case of the screenshot I made.
      You can see that I created 2 radio groups. On the upper part, radio 1 and 2, and on the lower part radio 5 and 6. Now I automated the buttons in such a way ,that when in group 1 player 1 is selected, player 2 in group 2 automatically gets checked for you. Same thing when checking player 2 in the upper part: player 1 gets checked on the lower part. I did this because there is no reason selecting player 1 or 2 twice, because nothing will change. Now that runs smoothly using this script:
      If GUICtrlRead($Radio1)=1 And Not BitAND(GUICtrlGetState($Radio6),1) And Not BitAND(GUICtrlGetState($Radio5),1) Then GUICtrlSetState($Radio6,1) If GUICtrlRead($Radio2)=1 And Not BitAND(GUICtrlGetState($Radio5),1) And Not BitAND(GUICtrlGetState($Radio6),1) Then GUICtrlSetState($Radio5,1) If GUICtrlRead($Radio5)=1 And Not BitAND(GUICtrlGetState($Radio2),1) And Not BitAND(GUICtrlGetState($Radio1),1) Then GUICtrlSetState($Radio2,1) If GUICtrlRead($Radio6)=1 And Not BitAND(GUICtrlGetState($Radio1),1) And Not BitAND(GUICtrlGetState($Radio2),1) Then GUICtrlSetState($Radio1,1) But there is a problem when clicking on a radio in group 2, the lower one. It is very hard to check one, because for some reason the radio get's deselected instantly most of the time. I already tried to prevent it by using the second BitAND() in the codes I shared (It doesn't check the radio automatically if the other radio in the other group is selected, meaning that the user want's to switch the radios). But it didn't work.
      Does somebody know why you sometimes can't check radio 5 or 6 (the lower part)?
    • By Surya
      Hi everyone its been loooong since I posted here 
      I have been trying to convert this curl executable parameters into autoit using the winhttp com object;
      curl -F data_file=@my_audio_file.mp3 -F model=en-US "https://api.speechmatics.com/v1.0/user/41049/jobs/?auth_token=MmQ5MTk4jdsgjhgghstOGU5YS00OWFhLWghdgjshgdhbshj017###" any ideas guys
       
      PS: I am excited to post here after a looong time
×
×
  • Create New...