#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, "", 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 '------------------------------------------------------------------------------