File "MyWebradios.bas"
Path: /MyWebradios/MyWebradios.bas
File size: 29.37 KB
MIME-type:
Charset: utf-8
#DIM ALL
#COMPILER PBWIN 9
#COMPILE EXE "MyWebradios.exe"
#RESOURCE "mwr.pbr"
$MWR = "MyWebradios"
$VER = "1.0"
#INCLUDE ONCE "Win32Api.inc"
#INCLUDE ONCE "inc\Bass.inc"
#INCLUDE ONCE "inc\Ini.inc"
#INCLUDE ONCE "inc\Registry.inc"
#INCLUDE ONCE "inc\Icon.inc"
#INCLUDE ONCE "inc\SavePos.inc"
#INCLUDE ONCE "inc\Tooltip.inc"
#INCLUDE ONCE "inc\ResFont.inc"
#INCLUDE ONCE "inc\DragnDrop.inc"
#INCLUDE ONCE "inc\CreateShortcut.inc"
#INCLUDE ONCE "inc\RTF.inc"
'------------------------------------------------------------------------------
GLOBAL g_hDlg AS DWORD ' dialog handle
GLOBAL g_tLock AS CRITICAL_SECTION ' thread lock structure
GLOBAL g_dwRequest AS DWORD ' request number/counter
GLOBAL g_hStream AS DWORD ' stream handle
GLOBAL g_szProxy AS ASCIIZ*256 ' proxy server
GLOBAL g_stURL() AS STRING ' stream URLs
GLOBAL g_stIco() AS STRING ' stream icons
GLOBAL g_stCurMwr AS STRING ' .mwr file used for this session
GLOBAL g_stInfo AS STRING ' stream information
GLOBAL g_icosz AS LONG ' icons size
GLOBAL g_autoplay AS LONG ' autoplay option
GLOBAL g_lastplay AS LONG ' last radio played
GLOBAL g_magick AS LONG ' ImgMagick installed or not
GLOBAL g_readme AS LONG ' show readme at startup
'------------------------------------------------------------------------------
MACRO FI_INI = LEFT$(EXE.FULL$, -3) + "ini"
MACRO FI_LOG = LEFT$(EXE.FULL$, -3) + "log"
MACRO FI_MWR_1 = RTRIM$(EXE.PATH$,"\") + "\Progressive.mwr"
MACRO FI_MWR_2 = RTRIM$(EXE.PATH$,"\") + "\Classics.mwr"
MACRO WIN_BG_COL = GETSYSCOLOR(%COLOR_BTNFACE)
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION WebFName(BYVAL url AS STRING) AS STRING
' return the file name from an internet url
LOCAL i AS LONG
i = INSTR(-1, url, "/")
FUNCTION = MID$(url, i+1)
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB LogMe(BYVAL e AS STRING)
LOCAL ff AS LONG
LOCAL t, r AS STRING
IF NOT EXIST(FI_LOG) THEN EXIT SUB
' Timestamp
t = DATE$
t = "["+RIGHT$(t,4)+LEFT$(t,2)+MID$(t,4,2)+"-"
t += "-"+REMOVE$(TIME$,":")
t += ","+FORMAT$((TIMER*1000) MOD 1000, "000")+"] "
' Get existing log
ff = FREEFILE
OPEN FI_LOG FOR BINARY ACCESS READ LOCK SHARED AS #ff
GET$ #ff, LOF(#ff), r
CLOSE #ff
' Append text (at the top!)
r = t + e + $CRLF + LEFT$(r,4096)
ff = FREEFILE
OPEN FI_LOG FOR BINARY ACCESS WRITE LOCK WRITE AS #ff
PUT$ #ff, r
CLOSE #ff
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB ErrorMsg(BYVAL stMsg AS STRING)
LogMe stMsg + " (error code: " + FORMAT$(BASS_ErrorGetCode()) + ")"
DIALOG SET TEXT g_hDlg, "Error - " + $MWR + $SPC + $VER
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB DoMeta()
' Update stream title from metadata
LOCAL pMeta AS ASCIIZ PTR
LOCAL stMeta AS STRING
LOCAL lgPtr AS LONG
LOCAL stArtist AS STRING
LOCAL stTitle AS STRING
pMeta = BASS_ChannelGetTags (g_hStream, %BASS_TAG_META)
IF pMeta THEN 'got Shoutcast metadata
stMeta = @pMeta
IF LEFT$(stMeta, 13) = "StreamTitle='" THEN
stMeta = MID$(stMeta, 14)
lgPtr = INSTR(stMeta, "';")
IF lgPtr THEN
stMeta = LEFT$(stMeta, lgPtr - 1)
END IF
END IF
ELSE
pMeta = BASS_ChannelGetTags(g_hStream, %BASS_TAG_OGG)
IF pMeta THEN 'got Icecast/OGG tags
stMeta = @pMeta
DO UNTIL LEN(stMeta) = 0
IF LCASE$(LEFT$(stMeta, 7)) = "artist=" THEN
stArtist = MID$(stMeta, 8)
ELSEIF LCASE$(LEFT$(stMeta, 6)) = "title=" THEN
stTitle = MID$(stMeta, 7)
END IF
pMeta = pMeta + LEN(stMeta) + 1
stMeta = @pMeta
LOOP
IF LEN(stArtist) AND LEN(stTitle) THEN
stMeta = stTitle + " - by " + stArtist
ELSEIF LEN(stArtist) THEN
stMeta = stArtist
ELSEIF LEN(stTitle) THEN
stMeta = stTitle
END IF
END IF
END IF
g_stInfo = TRIM$(stMeta)
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB MetaSync(BYVAL lgHandle AS LONG, BYVAL lgChannel AS LONG, _
BYVAL lgData AS LONG, BYVAL lgUser AS LONG)
CALL DoMeta
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB EndSync(BYVAL lgHandle AS LONG, BYVAL lgChannel AS LONG, _
BYVAL lgData AS LONG, BYVAL lgUser AS LONG)
DIALOG SET TEXT g_hDlg, $MWR + $SPC + $VER ' not playing
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB StatusProc(BYVAL pBuffer AS ASCIIZ PTR, _
BYVAL dwLength AS DWORD, _
BYVAL dwUser AS DWORD)
LOCAL stStatus AS STRING
IF pBuffer AND (dwLength = 0) AND (dwUser = g_dwRequest) THEN
stStatus = @pBuffer
LogMe stStatus
END IF
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
THREAD FUNCTION OpenURL(BYVAL pURL AS ASCIIZ PTR) AS LONG
LOCAL hStream AS DWORD
LOCAL dwRequest AS DWORD
LOCAL szURL AS ASCIIZ*256
szURL = @pURL
LogMe "Opening webradio "+$DQ+TRIM$(szURL)+$DQ
EnterCriticalSection(g_tLock) 'Make sure only 1 thread at a time can do the following
INCR g_dwRequest 'Increment the request counter for this request
dwRequest = g_dwRequest
LeaveCriticalSection(g_tlock)
KillTimer(g_hDlg, 0) 'stop prebuffer monitoring
BASS_StreamFree(g_hStream) 'close old stream
hStream = BASS_StreamCreateURL (szURL, 0, %BASS_STREAM_BLOCK OR %BASS_STREAM_STATUS OR %BASS_STREAM_AUTOFREE, _
CODEPTR(StatusProc), BYVAL dwRequest) 'open URL
EnterCriticalSection(g_tLock)
IF dwRequest <> g_dwRequest THEN 'there is a newer request, discard this stream
LeaveCriticalSection(g_tLock)
IF hStream THEN BASS_StreamFree(hStream)
EXIT FUNCTION
END IF
g_hStream = hStream 'this is now the current stream
LeaveCriticalSection(g_tLock)
IF g_hStream = 0 THEN 'failed to open
ErrorMsg("Cannot open stream")
ELSE
SetTimer(g_hDlg, 0, 50, 0) 'start prebuffer monitoring
END IF
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB FileDropped(BYVAL myfile AS STRING)
LOCAL ff AS LONG
IF EXIST(myfile) AND RIGHT$(LCASE$(myfile),4) = ".mwr" THEN
' Create batch file to restart with new webradios list
ff = FREEFILE
OPEN LocalAppData() + EXE.NAME$ + ".bat" FOR OUTPUT AS #ff
PRINT #ff, "TimeOut 1"
PRINT #ff, "start " + $DQ+$DQ + $SPC + $DQ+EXE.FULL$+$DQ + $SPC + $DQ+myfile+$DQ
CLOSE #ff
ff = SHELL(LocalAppData() + EXE.NAME$ + ".bat", 6) ' minimized without focus
' Close ourselves
PostMessage g_hDlg, %WM_SYSCOMMAND, %SC_CLOSE, 0
SLEEP 500
ExitProcess(12345)
ELSE
BEEP
END IF
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
CALLBACK FUNCTION ProcMain() AS LONG
STATIC szURL AS ASCIIZ*256
STATIC hIcon AS DWORD
STATIC hFont AS DWORD
STATIC nfoUrl AS STRING
STATIC nfoName AS STRING
STATIC nfoString AS STRING
STATIC nfoLength AS DOUBLE
STATIC nfoOffset AS DOUBLE
STATIC idResFont AS DOUBLE
STATIC isPlaying AS LONG
LOCAL lgCheck AS LONG
LOCAL dwProgress AS DWORD
LOCAL pText AS ASCIIZ PTR
LOCAL stText AS STRING
LOCAL hThread AS DWORD
LOCAL i, w, h AS LONG
CB_SAVEPOS()
CB_DRAGNDROP()
SELECT CASE CB.MSG
CASE %WM_TIMER
'-------------------------------------------
' Timer to display the readme box
IF CB.WPARAM = 2 THEN
KillTimer(CB.HNDL, 2)
ShowReadme CB.HNDL
CONTROL SET FOCUS CB.HNDL, 9
' Timer to display stream information
ELSEIF CB.WPARAM = 1 THEN
IF g_stInfo = "" THEN EXIT FUNCTION
IF REMOVE$(g_stInfo, ANY "0123456789- ") = "" THEN g_stInfo = TRIM$(nfoUrl)
IF g_stInfo = "" THEN g_stInfo = TRIM$(nfoName)
w = MAX(148, (UBOUND(g_stURL)+1)*(g_icosz+6)-6)
stText = SPACE$(MAX(2*LEN(g_stInfo), 2*w\11)) + g_stInfo
IF nfoString <> stText THEN
nfoString = stText
nfoOffset = 0
GRAPHIC ATTACH CB.HNDL, 3
GRAPHIC SET FONT hFont
GRAPHIC TEXT SIZE nfoString TO nfoLength, h
END IF
GRAPHIC ATTACH CB.HNDL, 3, REDRAW ' information panel
GRAPHIC CLEAR WIN_BG_COL
FOR i = 0 TO w STEP 11
GRAPHIC RENDER "BMP1", (i, 0) - (i+10, 19)
NEXT
nfoOffset += 4
IF nfoOffset > nfoLength THEN nfoOffset = 0
GRAPHIC SET FONT hFont
GRAPHIC COLOR %BLACK, -2
GRAPHIC SET POS (-nfoOffset, -2)
GRAPHIC PRINT nfoString
GRAPHIC REDRAW
' Timer to get the percentage of the buffer filled when loading is in progress
ELSEIF CB.WPARAM = 0 THEN
dwProgress = BASS_StreamGetFilePosition(g_hStream, %BASS_FILEPOS_BUFFER) _
* 100 / BASS_StreamGetFilePosition(g_hStream, %BASS_FILEPOS_END) ' Percentage of buffer filled
' Over 75% full (or end of download)...
IF (dwProgress > 75) OR (BASS_StreamGetFilePosition(g_hStream, %BASS_FILEPOS_CONNECTED) = 0) THEN
KillTimer(CB.HNDL, 0) ' Finished prebuffering, stop monitoring
' Update dialog icon with webradio icon
ARRAY SCAN g_stURL(), =(szURL), TO i : DECR i
DialogSetIconFile CB.HNDL, g_stIco(i)
SetIni g_stCurMwr, "MwrConfig", "LastPlayed", FORMAT$(i+1)
' Get the broadcast name from metadata
pText = BASS_ChannelGetTags(g_hStream, %BASS_TAG_ICY)
IF pText = 0 THEN ' No ICY tags, try HTTP...
pText = BASS_ChannelGetTags(g_hStream, %BASS_TAG_HTTP)
END IF
IF pText THEN
stText = @pText
DO UNTIL LEN(stText) = 0
IF LEFT$(stText, 9) = "icy-name:" THEN
nfoName = MID$(stText, 10)
DIALOG SET TEXT CB.HNDL, nfoName + " - " + $MWR + $SPC + $VER
ELSEIF LEFT$(stText, 8) = "icy-url:" THEN
nfoUrl = MID$(stText, 9)
END IF
pText = pText + LEN(stText) + 1
stText = @pText
LOOP
END IF
IF LEN(stText) = 0 THEN
DIALOG SET TEXT CB.HNDL, PATHNAME$(NAME, g_stIco(i)) + " - " + $MWR + $SPC + $VER
END IF
' Get the stream information and set sync for subsequent titles
DoMeta()
BASS_ChannelSetSync(g_hStream, %BASS_SYNC_META, 0, CODEPTR(MetaSync), BYVAL 0)
BASS_ChannelSetSync(g_hStream, %BASS_SYNC_OGG_CHANGE, 0, CODEPTR(MetaSync), BYVAL 0)
BASS_ChannelSetSync(g_hStream ,%BASS_SYNC_END, 0, CODEPTR(EndSync), BYVAL 0)
SetTimer(g_hDlg, 1, 50, 0) ' Trigger timer to display stream nfo
' Show pause button
GRAPHIC ATTACH CB.HNDL, %IDOK
GRAPHIC CLEAR WIN_BG_COL
GRAPHIC BOX (0, 0) - (3, 7),,, %BLACK, %BLACK
GRAPHIC BOX (4, 0) - (7, 7),,, %BLACK, %BLACK
' Play the stream!
BASS_ChannelPlay(g_hStream, 0)
isPlaying = 1
END IF
END IF
CASE %WM_INITDIALOG
'-------------------------------------------
IF BASS_Init(-1, 44100, 0, CB.HNDL, BYVAL 0) = 0 THEN
ErrorMsg "Cannot initialize output device"
?"Fatal error - See log file", %MB_ICONERROR, EXE.NAME$
DIALOG POST CB.HNDL, %WM_DESTROY, 0, 0
END IF
BASS_SetConfig(%BASS_CONFIG_NET_PLAYLIST, 1) ' enable playlist processing
BASS_SetConfig(%BASS_CONFIG_NET_PREBUF, 0) ' minimize automatic pre-buffering
BASS_SetConfigPtr(%BASS_CONFIG_NET_PROXY, g_szProxy) ' setup proxy server location
InitializeCriticalSection(g_tLock)
idResFont = AddResFont("FNT1")
FONT NEW "Square Dot-Matrix", 28, 0 TO hFont
FOR i = LBOUND(g_stURL) TO UBOUND(g_stURL)
SetTooltip CB.HNDL, 10+i, PATHNAME$(NAME,g_stIco(i))
NEXT
SetTooltip CB.HNDL, 6, "Stop"
SetTooltip CB.HNDL, %IDOK, "Pause/Resume"
SetTooltip CB.HNDL, 7, "Edit .mwr"
SetTooltip CB.HNDL, 9, "About..."
IF ISTRUE g_readme THEN SetTimer(g_hDlg, 2, 1000, 0)
IF ISTRUE g_autoplay THEN
CONTROL SET CHECK CB.HNDL, 8, 1 ' checkbox checked
IF g_lastplay >= LBOUND(g_stURL) _
AND g_lastplay <= UBOUND(g_stURL) THEN
szURL = g_stURL(g_lastplay)
THREAD CREATE OpenURL(VARPTR(szURL)) TO hThread
END IF
END IF
CASE %WM_SETCURSOR ' change cursor to link-hand when hovering over controls
'-------------------------------------------
i = GetDlgCtrlId(CB.WPARAM)
IF i = %IDOK OR (i >= 6 AND i <= 9) THEN
SetCursor LoadCursor(%NULL, BYVAL %IDC_HAND)
SetWindowLong CB.HNDL, %dwl_msgresult, 1
FUNCTION = 1
END IF
CASE %WM_COMMAND
'-------------------------------------------
SELECT CASE CB.CTL
CASE %IDCANCEL ' User hit Escape key
DIALOG END CB.HNDL
CASE 3 ' Information panel
CONTROL SET FOCUS CB.HNDL, 9
CASE %IDOK ' Button "Pause music"
isPlaying = 1 - isPlaying
GRAPHIC ATTACH CB.HNDL, %IDOK
GRAPHIC CLEAR WIN_BG_COL
IF ISTRUE isPlaying THEN
GRAPHIC BOX (0, 0) - (3, 7),,, %BLACK, %BLACK
GRAPHIC BOX (4, 0) - (7, 7),,, %BLACK, %BLACK
SetTimer(g_hDlg, 1, 50, 0)
IF ISTRUE g_hStream THEN BASS_ChannelPlay(g_hStream, 0)
ELSE
GRAPHIC ELLIPSE (0, 0) - (7, 7), %RED, %RED
KillTimer(CB.HNDL, 1)
IF ISTRUE g_hStream THEN BASS_ChannelPause(g_hStream)
END IF
CONTROL SET FOCUS CB.HNDL, 9
CASE 6 ' Button "Stop music"
KillTimer(CB.HNDL, 1)
isPlaying = 0
GRAPHIC ATTACH CB.HNDL, %IDOK
GRAPHIC CLEAR WIN_BG_COL
GRAPHIC BOX (0, 0) - (3, 7),,, %BLACK, %BLACK
GRAPHIC BOX (4, 0) - (7, 7),,, %BLACK, %BLACK
DIALOG SET TEXT CB.HNDL, $MWR + $SPC + $VER
DIALOG SET ICON CB.HNDL, "ICO1"
IF ISTRUE g_hStream THEN
BASS_StreamFree(g_hStream)
g_hStream = 0
END IF
w = MAX(148, (UBOUND(g_stURL)+1)*(g_icosz+6)-6)
GRAPHIC ATTACH CB.HNDL, 3, REDRAW ' information panel
GRAPHIC CLEAR WIN_BG_COL
FOR i = 0 TO w STEP 11
GRAPHIC RENDER "BMP1", (i, 0) - (i+10, 19)
NEXT
GRAPHIC REDRAW
CONTROL SET FOCUS CB.HNDL, 9
CASE 7 ' Button "Configure"
ShellExecute %NULL, "open", "notepad", (g_stCurMwr), "", %SW_SHOW
CONTROL SET FOCUS CB.HNDL, 9
CASE 8 ' Ignore user (un)checking the 'Autoplay' checkbox
CONTROL SET FOCUS CB.HNDL, 9
CASE 9 ' Link "About..."
ShellExecute %NULL, "open", "http://mougino.free.fr/freeware", "", "", %SW_SHOW
CONTROL SET FOCUS CB.HNDL, 9
CASE ELSE
szURL = g_stURL(CB.CTL - 10)
THREAD CREATE OpenURL(VARPTR(szURL)) TO hThread
SLEEP 200
CONTROL SET FOCUS CB.HNDL, 9
END SELECT ' SELECT CASE CB.CTL
CASE %WM_DESTROY
'-------------------------------------------
CONTROL GET CHECK CB.HNDL, 8 TO i
SetIni FI_INI, "ProgConfig", "Autoplay", FORMAT$(i)
BASS_Free()
FONT END hFont
RemoveResFont(idResFont)
END SELECT
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION PBMAIN() AS LONG
LOCAL e, t AS STRING
LOCAL x, i AS LONG
KILL LocalAppData() + EXE.NAME$ + ".bat"
' Test version of Bass.dll
'-------------------------------------------
IF (HI(WORD, BASS_GetVersion()) <> %BASSVERSION) THEN
LogMe "FATAL ERROR: Bass header version "+FORMAT$(%BASSVERSION) _
+ " vs. DLL version "+FORMAT$(HI(WORD, BASS_GetVersion()))
?"BASS.DLL version does not match the header version",,"Error"
EXIT FUNCTION
END IF
' Register .mwr extension
'-------------------------------------------
IF ISFALSE IsExtensionRegistered(".mwr") THEN
LogMe ".mwr extension not registered - trying to access registry"
RegisterExtension ".mwr"
IF ISFALSE IsExtensionRegistered(".mwr") THEN
LogMe "- Failed!"
? "Could not register the .mwr file extension"+$CR+$CR _
+ "You may have to right click the program > Run as Admin" _
, %MB_ICONWARNING, $MWR
ELSE
LogMe "- Success registering .mwr extension"
END IF
END IF
' Get ini/mwr variables
'-------------------------------------------
IF NOT EXIST(FI_INI) OR NOT EXIST(FI_MWR_1) OR NOT EXIST(FI_MWR_2) THEN MakeIniAndMwr()
' Ini variables
g_readme = 1 - GetIniV(FI_INI, "ProgConfig", "ReadmeOff")
g_autoplay = GetIniV(FI_INI, "ProgConfig", "Autoplay")
g_stCurMwr = GetIniS(FI_INI, "ProgConfig", "LastMwr")
IF COMMAND$ <> "" THEN ' .mwr passed as argument
LogMe $DQ+TRIM$(COMMAND$,$DQ)+$DQ+" passed as argument"
e = TRIM$(COMMAND$, ANY $DQ+$SPC)
IF RIGHT$(LCASE$(e),4) = ".mwr" AND EXIST(e) THEN
g_stCurMwr = e
SetIni FI_INI, "ProgConfig", "LastMwr", g_stCurMwr
e = PATHNAME$(NAME,g_stCurMwr) + " - " + $MWR
t = RTRIM$(EXE.PATH$,"\") + "\" + e + ".lnk"
IF NOT EXIST(t) THEN ' No local shortcut yet
IF MSGBOX($DQ + PATHNAME$(NAMEX,g_stCurMwr) + $DQ +$CR+$CR _
+ "Create a shortcut for these webradios?", _
%MB_ICONQUESTION + %MB_YESNO, $MWR) = %IDYES THEN ' Create shortcut
LogMe "Creating shortcut "+$DQ+t+$DQ
CreateShortcut _
t, _ ' 1. the link file to be created
EXE.FULL$, _ ' 2. the file/document where the shortcut should point to
$DQ+g_stCurMwr+$DQ, _ ' 3. command-line parameters
EXE.PATH$, _ ' 4. the folder where the executable file should start in
%SW_SHOW, _ ' 5. %SW_SHOW, %SW_HIDE etc.
EXE.FULL$, _ ' 6. icon file or executable file containing an icon
0, _ ' 7. icon index in the aforementioned file
("(c) mougino.free.fr - v.0.1") ' 8. any comment (stored in the shortcut)
END IF
END IF
ELSE
LogMe "- incorrect argument: not a valid/existing .mwr!"
END IF
ELSE
LogMe "Opening webradio listing "+$DQ+g_stCurMwr+$DQ
END IF
' Mwr variables
g_icosz = GetIniV(g_stCurMwr, "MwrConfig", "IconSize")
g_lastplay = GetIniV(g_stCurMwr, "MwrConfig", "LastPlayed") - 1
' Check ImageMagick installation
'-------------------------------------------
g_magick = IsImageMagickInstalled()
' Get webradios data
'-------------------------------------------
i = 0
DO
REDIM PRESERVE g_stURL(i)
REDIM PRESERVE g_stIco(i)
g_stURL(i) = GetIniS(g_stCurMwr, "MyWebradios", "radio"+FORMAT$(i+1))
g_stIco(i) = GetIniS(g_stCurMwr, "MyWebradios", "icon"+FORMAT$(i+1))
IF g_stIco(i) <> "" THEN ' User specified icon
' Download any internet icon/image to local
IF LEFT$(LCASE$(g_stIco(i)),4) = "http" THEN
e = LocalAppData() + WebFName(g_stIco(i))
IF NOT EXIST(e) THEN
URLDownloadToFile(BYVAL 0, (g_stIco(i)), (e), 0, BYVAL 0)
LogMe "Downloading "+$DQ+g_stIco(i)+$DQ+" to "+$DQ+e+$DQ
IF EXIST(e) THEN LogMe "- Success" ELSE LogMe "- Failed!"
END IF
g_stIco(i) = e
END IF
' Convert local png/bmp/jpeg to icon
IF RIGHT$(LCASE$(g_stIco(i)),3) <> "ico" THEN
LogMe "Using image "+$DQ+g_stIco(i)+$DQ+" as an icon: conversion to .ico needed"
e = LEFT$(g_stIco(i),-3) + "ico"
IF ISTRUE g_magick THEN
LogMe "- ImageMagick detected: starting conversion"
IF NOT EXIST(e) THEN ConvertIco g_stIco(i)
ELSE
LogMe "- ImageMagick NOT detected on system!"
END IF
IF EXIST(e) THEN LogMe "- Icon created > using it" ELSE LogMe "- Failed creating icon > skipping"
g_stIco(i) = e
ELSE
LogMe "Using "+$DQ+g_stIco(i)+$DQ+" as icon for radio #"+FORMAT$(i+1)
END IF
END IF
IF g_stURL(i) <> "" THEN INCR i ELSE EXIT LOOP
LOOP
REDIM PRESERVE g_stURL(i-1)
' Build main dialog
'-------------------------------------------
DIALOG NEW 0, $MWR + $SPC + $VER,,, MAX(160, 6+i*(g_icosz+6)), 12+g_icosz+36, _
%WS_SYSMENU OR %WS_CAPTION OR %WS_MINIMIZEBOX OR %WS_POPUP OR %DS_MODALFRAME _
TO g_hDlg
DIALOG SET ICON g_hDlg, "ICO1"
' Webradios row
x = 6
FOR i = LBOUND(g_stURL) TO UBOUND(g_stURL)
CONTROL ADD IMGBUTTONX, g_hDlg, 10+i, "", x, 4, g_icosz, g_icosz
ImgbuttonSetIconFile g_hDlg, 10+i, g_stIco(i), g_icosz, g_icosz
x += g_icosz + 6
NEXT i
' Stream information panel
x = MAX(148, (UBOUND(g_stURL)+1)*(g_icosz+6)-6)
CONTROL ADD GRAPHIC, g_hDlg, 3, "", 6, 10+g_icosz, x, 19, %SS_NOTIFY
GRAPHIC ATTACH g_hDlg, 3 : GRAPHIC CLEAR WIN_BG_COL
FOR i = 0 TO x STEP 11
GRAPHIC RENDER "BMP1", (i, 0) - (i+10, 19)
NEXT
' Footer
' Stop button
CONTROL ADD GRAPHIC, g_hDlg, 6, "", 5, 35+g_icosz, 7, 7, %SS_NOTIFY
GRAPHIC ATTACH g_hDlg, 6 : GRAPHIC CLEAR WIN_BG_COL
GRAPHIC BOX (0, 0) - (7, 7), 20,, %BLACK, %BLACK
' Pause button
CONTROL ADD GRAPHIC, g_hDlg, %IDOK, "", 16, 35+g_icosz, 7, 7, %SS_NOTIFY
GRAPHIC ATTACH g_hDlg, %IDOK : GRAPHIC CLEAR WIN_BG_COL
IF ISTRUE g_autoplay THEN
GRAPHIC BOX (0, 0) - (3, 7),,, %BLACK, %BLACK
GRAPHIC BOX (4, 0) - (7, 7),,, %BLACK, %BLACK
ELSE
GRAPHIC ELLIPSE (0, 0) - (7, 7), %RED, %RED
END IF
' Config button
CONTROL ADD GRAPHIC, g_hDlg, 7, "", 27, 32+g_icosz, 16, 14, %SS_NOTIFY
GraphicDrawIconDll g_hDlg, 7, "shell32.dll", 72, 0, 0, 20, 20
' Autoplay checkbox
CONTROL ADD CHECKBOX, g_hDlg, 8, "Autoplay", 47, 32+g_icosz, 40, 14
' About link
CONTROL ADD LABEL, g_hDlg, 9, "<mougino.free.fr>", 95, 35+g_icosz, 60, 12, %SS_NOTIFY
CONTROL SET COLOR g_hDlg, 9, %BLUE, -1
' Display main dialog!
'-------------------------------------------
DIALOG SHOW MODAL g_hDlg, CALL ProcMain
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION ShowReadme(BYVAL hParent AS DWORD) AS LONG
LOCAL hDlg AS DWORD
DIALOG NEW PIXELS, hParent, $MWR, 5, -40, 320, 250, %WS_POPUP _
OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _
%WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
%DS_NOFAILCREATE OR %DS_SETFONT OR %WS_MINIMIZEBOX, %WS_EX_CONTROLPARENT OR _
%WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
DIALOG SET ICON hDlg, "ICO1"
' Create RTF control
LoadLibrary("RICHED32.DLL")
CONTROL ADD "RichEdit", hDlg, 991, "", 8, 8, 320-16, 250-40, _
%WS_CHILD OR %WS_VISIBLE OR %ES_MULTILINE _
OR %ES_READONLY OR %WS_VSCROLL
Fill_RichEdit hDlg, 991
CONTROL ADD CHECKBOX, hDlg, 992, "Do not show this window again", 8, 250-32, 220, 24
CONTROL ADD BUTTON, hDlg, %IDCANCEL, "OK", 320-68, 250-32, 60, 24
DIALOG SHOW MODAL hDlg, CALL ProcReadme
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
CALLBACK FUNCTION ProcReadme() AS LONG
LOCAL i AS LONG
SELECT CASE CB.MSG
' Process RTF hyperlinks
CASE %WM_NOTIFY
IF CB.NMID = 991 AND CB.NMCODE = %EN_LINK THEN RTF_hyperlink CB.HNDL, 991, CB.LPARAM
' Click on "OK" in the readme > close dialog
CASE %WM_COMMAND
IF CB.CTL = %IDCANCEL THEN DIALOG END CB.HNDL
' Dialog ending
CASE %WM_DESTROY
CONTROL GET CHECK CB.HNDL, 992 TO i
SetIni FI_INI, "ProgConfig", "ReadmeOff", FORMAT$(i)
END SELECT
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB Fill_RichEdit (hD AS DWORD, CtlId AS LONG)
LOCAL richtext AS STRING
richtext = "[black][c]"
richtext += "[font:o,11][b]" + $MWR + " v" + $VER + "[/b][eol][l]"
richtext += "[font:o,9][black][l][eol]"
richtext += "This program uses [blue].mwr [black]files, which are simple text files, "
richtext += "as a list to play your favorite webradios and show them with your custom icons."
richtext += "[eol][eol]"
richtext += "You can drag & drop an [blue].mwr [black]file onto the program to load and run it."
richtext += "[eol][eol]"
richtext += "Use the [blue]return [black]key to pause/resume radio playing, and the "
richtext += "[blue]escape [black]key to exit the program.[eop]"
richtext += "[eol]"
richtext += "[c][b][maroon]C[red]r[fuschia]e[purple]a[blue]t[teal]e[green]d [lime]b[grey]y [maroon]m[red]o[fuschia]u[purple]g[blue]i[teal]n[green]o[lime]"
richtext += " - http://mougino.free.fr[/b]"
RTF_SET hD, CtlId, richtext
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB MakeIniAndMwr()
LOCAL ff AS LONG
LogMe "Creating initial "+$DQ+FI_INI+$DQ+", "+$DQ+FI_MWR_1+$DQ+" and "+$DQ+FI_MWR_2+$DQ
ff = FREEFILE
OPEN FI_MWR_1 FOR OUTPUT AS #ff
PRINT #ff, "[MyWebradios]"
PRINT #ff, "radio1=http://hirschmilch.de:7000/psytrance.mp3"
PRINT #ff, "icon1=http://mougino.free.fr/mwr/hirschmilch-psytrance.ico"
PRINT #ff, "radio2=http://hirschmilch.de:7000/prog-house.mp3"
PRINT #ff, "icon2=http://mougino.free.fr/mwr/hirschmilch-prog-house.ico"
PRINT #ff, "radio3=http://hirschmilch.de:7000/techno.mp3"
PRINT #ff, "icon3=http://mougino.free.fr/mwr/hirschmilch-techno.ico"
PRINT #ff, "radio4=http://hirschmilch.de:7000/progressive.mp3"
PRINT #ff, "icon4=http://mougino.free.fr/mwr/hirschmilch-progressive.ico"
PRINT #ff, "radio5=http://hirschmilch.de:7000/chillout.mp3"
PRINT #ff, "icon5=http://mougino.free.fr/mwr/hirschmilch-chillout.ico"
PRINT #ff, "radio6=http://hirschmilch.de:7000/electronic.mp3"
PRINT #ff, "icon6=http://mougino.free.fr/mwr/hirschmilch-electronic.ico"
PRINT #ff, ""
PRINT #ff, "[MwrConfig]"
PRINT #ff, "IconSize=24"
PRINT #ff, "LastPlayed=1"
CLOSE #ff
ff = FREEFILE
OPEN FI_MWR_2 FOR OUTPUT AS #ff
PRINT #ff, "[MyWebradios]"
PRINT #ff, "radio1=https://jazz-wr10.ice.infomaniak.ch/jazz-wr10-128.mp3"
PRINT #ff, "icon1=http://mougino.free.fr/mwr/jazz-soul-radio.ico"
PRINT #ff, "radio2=https://scdn.nrjaudio.fm/fr/30601/mp3_128.mp3?origine=mytuner&cdn_path=adswizz_lbs9&access_token=a1f2fda391774702a62a62234f12ed82"
PRINT #ff, "icon2=http://mougino.free.fr/mwr/nostalgie.ico"
PRINT #ff, "radio3=https://mbs.ice.infomaniak.ch/mbs-128.mp3"
PRINT #ff, "icon3=http://mougino.free.fr/mwr/mbs.ico"
PRINT #ff, "radio4=https://scdn.nrjaudio.fm/fr/30621/mp3_128.mp3?aw_0_1st.station=Nostalgie-Rock&origine=mytuner&cdn_path=adswizz_lbs10&adws_out_1&access_token=739e9bc713cd4691b34acc2e1ea80cff"
PRINT #ff, "icon4=http://mougino.free.fr/mwr/nostalgie-pop-rock.ico"
PRINT #ff, ""
PRINT #ff, "[MwrConfig]"
PRINT #ff, "IconSize=48"
PRINT #ff, "LastPlayed=4"
CLOSE #ff
ff = FREEFILE
OPEN FI_INI FOR OUTPUT AS #ff
PRINT #ff, "[ProgConfig]"
PRINT #ff, "LastMwr=" + FI_MWR_1
PRINT #ff, "Autoplay=0"
CLOSE #ff
END SUB
'------------------------------------------------------------------------------