Software, your way.
How To Get Good Custom Software
(Download)
(PDF)
burger menu icon
WillMaster

WillMaster > LibraryMiscellaneous

FREE! Coding tips, tricks, and treasures.

Possibilities weekly ezine

Get the weekly email website developers read:

 

Your email address

name@example.com
YES! Send Possibilities every week!

Private Internet Radio

This article provides the software for a private internet radio.

Only the music, audio books, or lectures you want. No separate ads. Everything is on your server, in your power to change as you wish.

Consider it to be free radio — free of monthly or per-listen charges and also ad-free.

Even the software to run your station is free. Copy the software directly from this article and upload it into a directory on your server.

The radio station's playlist is populated with MP3 files uploaded into the same directory as the Private Internet Radio software.

The playlist may be any MP3 files you have on hand or can obtain. As an example, they may be files of music, audio books, or lectures that you have already purchased or have been given. As another example, they may be music obtained from royalty-free distribution websites.

The music for the demonstration (link further below) was downloaded from the Free Music Public Domain website.

The radio can play your MP3 files sequentially or randomly. The random feature is available only when there are at least three MP3 files available.

The radio's player is the browser's native audio player. There are several reasons for using the browser's audio player rather than creating a styled one.

  1. No matter what style I came up with, it wouldn't appeal to everybody.

  2. Although each browser's player may be designed differently than other browser's players, it is the player that the user is familiar with.

  3. Custom-designed players tend to become unusable over time because of deprecated code or because of the programmer's failure to anticipate new browser features that interfere.

  4. The browser's player will always be the best for that browser.

A live demonstration is here. This is a public demonstration of the radio.

Installation is 3 steps.

  1. Upload the .htaccess file to make it a private internet radio. (Without the file, the radio would be publicly accessible, in which case it may be prudent to get legal advice about royalties. The radio software works the same, whether public or private.)

  2. Upload the Private Internet Radio software — copy and paste from this article.

  3. Upload MP3 files for the radio to play.

Where to Install the Private Internet Radio Software

Select or create a directory on your server for your internet radio. The directory may have other files but it may also be more orderly if the directory is used only by the radio.

That is the directory that will contain the .htaccess file, the Private Internet Radio software, and the MP3 files for the radio.

The .htaccess File

To make it a private internet radio, create the .htaccess file like this (customize the IP address):

SetEnvIf REMOTE_ADDR 127.0.0.1 allow_this=1
Order Deny,Allow
Deny from all
Allow from env=allow_this

Replace 127.0.0.1 with your IP address.

Upload the .htaccess file into the directory you selected for your Private Internet Radio software.

Now, only browsers with your IP address can access the directory. (If you don't know your IP address, the get IP address page can provide it for you.)

You can access the directory with any of your devices so long as they use the specified IP address. If you have a different IP address for another device, or want to let a friend use your radio, add an IP address for each that you want to give access to.

Here is an example.

SetEnvIf REMOTE_ADDR 127.0.0.1 allow_this=1
SetEnvIf REMOTE_ADDR 127.0.0.22 allow_this=1
SetEnvIf REMOTE_ADDR 127.0.0.123 allow_this=1
SetEnvIf REMOTE_ADDR 127.0.222.1 allow_this=1
Order Deny,Allow
Deny from all
Allow from env=allow_this

Customize the IP addresses for those allowed to access your radio.

When the .htaccess file is ready, upload it into the directory where the Private Internet Radio software will be installed.

The Private Internet Radio Software

Here is the source code for the Private Internet Radio software.

<?php 
$PlayList = array();
foreach(glob(__DIR__.'/*.mp3') as $mp3){$PlayList[]=preg_replace('!^.*/!','',$mp3);}
?><!doctype html>
<html lang="en-US">
<head>
<title>Private Internet Radio</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type="text/css">
* { box-sizing:border-box; } /* box-sizing:content-box; */
html, body { font-size:100%; font-family:sans-serif; }
img { max-width:100%; }
.bold { font-weight:bold; }
a { text-decoration:none; }
[type="radio"], [type="checkbox"] { margin:none; padding:none;  cursor:pointer; }
#bcgi-privateradio-controls-container { position:-webkit-sticky; position:sticky; top:0; z-index:2; background-color:white; }
.bcgi-privateradio-sections-border { position:relative; border-left:3px solid #ccc; border-top:3px solid #ccc; border-bottom:3px solid #ccc; border-top-left-radius:6px; border-bottom-left-radius:6px; padding:1px 0 1px 9px; background-color:white; overflow:auto; }
#bcgi-currently-playing-container { visibility:hidden; height:30px; }
.bcgi-currently-playing-image { display:inline-block; margin-right:3px; height:100%; cursor:pointer; }
#bcgi-currently-playing-filename { display:inline-block; vertical-align:top; padding-top:5px; }
#bcgi-sequential-random-choice { margin:9px 0 2px 0; }
.bcgi-privateradio-item-container { margin:9px; }
.bcgi-privateradio-item-image { display:inline-block; margin-right:3px; height:1.0em; cursor:pointer; }
.bcgi-privateradio-item-image-tag { max-height:100%; }
.bcgi-privateradio-item-title { display:inline-block; vertical-align:top; padding-top:.0em; }
.bcgi-privateradio-name { margin-bottom:0; }
.bcgi-privateradio-audio-container { margin:9px 0; }
#bcgi-currently-playing-control { max-height:100%; }
.bcgi-privateradio-above-title-list { margin-top:15px; }
#bcgi-how-to-instructions { margin-top:.5em; border:2px dotted #ccc; border-radius:1em; padding:.7em; font-size:1rem; position:relative; }
</style>
</head>
<body>
<div id="bcgi-privateradio-controls-container">
<div class="bcgi-privateradio-sections-border">

<h3 class="bcgi-privateradio-name">Private Internet Radio</h3>

<div class="bcgi-privateradio-audio-container"><audio id="audio-control" controls src="<?php echo($PlayList[0]) ?>"></audio></div>

<div id="bcgi-currently-playing-container">
<div id="bcgi-currently-playing-indice" style="display:none;">0</div>
<div class="bcgi-currently-playing-image"><img alt="currently playing icon" id="bcgi-currently-playing-control" src="data:png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABkCAYAAAAR+rcWAAAACXBIWXMAAAS0AAAEtAEY0aC0AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABN1JREFUeJztnMtvVUUcgL9fqfh+xBhDjO9nYkCMWhMTtGqMWql/gdEEH7ASXBI3unWnbozuwKVLtIJCiryDCOVRKViQqLhwI7DwgdWfizmTeyi9j3M7c+bMOfNtmtB7Z3758s3tbe8EUVVE5FPgI1XdRaIQA9nXIWCHiKwXkRtDDhQbVuACQICXgWMiskZEBsONFQ95gZbrgPeBfSKyrPyR4mIugZalwHYR2SAit5Q4U1R0EmgZBY6KyLsisrCEmaKiF4EAVwLvAIdF5Dm/I8VFrwIt9wIbs2N9m6eZoqKoQMso8H12rC91PFNUSPZG+gxwbZ9rTANrVHXM4VzR0G+Bee4GvsiO9R0OZooKFwIto8Bkdqwvc7BeFNgj/Dfg8i3KSWCtqn7mcM1KYgXO4KbC2WwGVqvqUQ9rV4KBWV9d8wxwUEQ+EJGrPO0RFMHI+7eEvU4Db6vq+hL2Kg0BLgHOl7jnOPCmqk6WuKc3BvDz2teJp4AD2bG+puS9nRNCIJjqV2P+SPGKiEiAGZwQSqDlJmAdMC4iSwLO0TehBVqGgf3Zse73V8ogVEUgwCDmWE+JyEoR8fXWyilVEmhZBHwM7BGRR0MP040qCrQMAbuzTwpvCD1MO6osEMx8+U8KKzdr1QVarsd8UrhXRB4LPUyeWARaHgJ2VukCQGwC4eILAEHnj1GgpRIXAGIWaHkQ2JYd60Vlb14HgdA61tNlXwCoi0CLvQBwSESeLWPDugm03Adsyj4pvNXnRnUVaMnf6/FyAaDuAgGuoHWvZ8T14k0QaLkHGMuO9e2uFm2SQEv+Xs+8LwA0USDA5ZhjfURERuezUFMFWu4CNmTH+s5+Fmi6QIv9aV34AkAS2GIhuU8Ke31SEngxNwPrRGSLiNzf7cFJYHueBiayY311uwclgZ2xFwCm2l0ASAJ7I38BYHH+G0lgMYaZda8nCSxO/gLAS0lg/5wHfksCi6PAJ8ASVf16kCSwCKeAN1R1s/2HVGBv2OoeyMsD84KYBHbmFPC6qm6Z65upwPbkX+vmlAepwHb8CLymquPdHpgKvJD8a11XeZAKzHMSU93WIk9KBV5Y3daiT256gScw1X3T7wJNLfA/THVL5yMPmlngNKa6bS4Wa1KBM8CHmOqcyIPmFDgJvKqqe10vXPcCZ4D3gId9yIN6FzgJrFDVb31uUscC89V5lQf1K/AIprp9ZW1YlwJtdY+UKQ/qUeBhTHXfhdg85gL/oVVdEHkQb4GHMNXtDz1IbAXa6oaqIA/iKvAgproDoQfJE0OB+eoqJQ+qX+AEprqJ0IO0o6oF/gWsxfyEraw8qGaBezB/OYnif3yrUoG2umWxyIPqFLgbU91U6EGKErrAPzHVPR6jPAhb4C5MdccC7e+EEAXa6p6IXR6UX+BOTHXHS9zTK2UV+Aet6mojD8opcAemuh887xMEnwXa6obrKg/8FbgdU920h7UrhesCzwFvAU82QR64LfArzA32nxytFwUuCjwHrAKeb5o8mH+Bm4CVTRRn6bfAs5jqRposD/orcCOmup89zBMdRQo8C6xS1ZEkr0WvBX6Jqe4Xz/NER7cCz2CqeyHJm5tOBY5hqjtd4jzRMVeBtrrlSV53Zhf4OUber4HmiQ5b4O8YcS8mecVYACwGlru8+t8k/gc1x5Rk7LR3+AAAAABJRU5ErkJggg==" onclick="PlayOrPause(-1)"></div>
<div id="bcgi-currently-playing-filename"><?php echo($PlayList[0]) ?></div>
</div><!-- id="bcgi-currently-playing-container" -->

<div id="bcgi-sequential-random-choice" style="display:none;">
<label><input type="radio" name="sequrand" id="bcgi-sequrand-sequential" onclick="SetQuentialRandom('sequential')" checked="checked">&thinsp;Sequential</label> &nbsp; 
<label><input type="radio" name="sequrand" id="sequrand-random" onclick="SetQuentialRandom('random')">&thinsp;Random</label>
</div>
<img id="how-to-view" alt="icon to open how-to text" src="data:png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAqQAAAKkBq7NRIgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANXSURBVDiNjZVBSCprFMf/Y5PyMswxqIgkZ6NBBN3irSwiqaCN0MZNi8cro+e7vF2L3Lmzddy4SPV6i1eGFCWR0dRtVZGN6NDKSizuCyElNSiFxul7K6XJ6XIPfDDn+/7f75zDOXxDQcECgYCapumpxsbGQa1Wa6ypqWEAoFQq5Z6env7L5/PfRFFcdjgcL+/vUu83gsHgVEtLi+vq6qqb4zjq8vISuVwOAMAwDCwWC0ZGRojZbBbu7+8X7Hb7siIwEAjUaLXaL2q1+re5ublfEokEbDYb+vv70dbWBp1Oh1QqhUQigY2NDeh0Orjd7qIoiv+enZ394fF4XmWZhUIh3+rqqmQymQgAUiwWyUcmSRJxu93EZDIRv98vhUKhr1VlchxXLMPeAx8fH6sCSJJEurq6iNFoJBzHFXd2dpyVBoTD4ejAwEAFBoBkMhni9XpJOYharSZLS0sy6MzMDAFABgcHyenpaXR+fl5D0zQ9dXFx0X1yciLL2mKxIJvNVvyXlxdsbm5icnKysldXVwcAOD4+Rjwe7zYajRMqg8FgOzw8pEqlkgz4Fla28fFxmS8IAgBAFEUcHBxQDMPYwPM839PTIytXaXk8Hlm54XCY0DRdOe/t7SU8z4cRi8Wu3jZDaXm9Xhns+vqatLa2yjQsy5JoNHqpIoQQiqqa74o5HA7Mzs5W/Hg8DqvVilQqJdNRFAVCCFFJkvTIMMyHQKfTKfPHxsaQTqerdAzD4PX1NU8XCoXvZrP512g0qggUBAH5fB4AUCgUEI/HFXUWiwXPz8/fqa2tLdfDw8OCy+WiRFH8MNMfWW1tLXw+H9Hr9X+q0un0UmdnZ8xqtSqK/X4/IpEIIpEIjo6OFDV9fX3o6OiIlUqlvwEAwWBwguO4Ynt7e1WHBUGodDebzVadm0wmsr+/X9je3v5dFiUUCn1dW1uTWJb9aSDLsmR9fV3a3d1dKHNU5Y/z8/PPer3et7i4WBgaGoJGowEA3N3dIZlMIplM4vb2FgCg0WgwPDyMlZWVYkNDwyLP83+VOUoP7ERzc/Pnm5ubT3t7e7IH1mAwwGw2Y3R0lLAsG02n01/sdvs/b+8rTrTP56ttampy6vV6W319vZGmadkvIJfLfctkMsvT09NVY/E/CvYrrH3PEiIAAAAASUVORK5CYII=" style="display:inline; margin-left:1em; cursor:pointer; position:relative; bottom:-7px;" onclick="openHelpBox()">
<script type="text/javascript">
function openHelpBox()
{
   document.getElementById("bcgi-privateradio-controls-container").style.position = "relative";
   document.getElementById("bcgi-how-to-instructions").style.display = "block";
   document.getElementById("how-to-view").style.display = "none";
}
function closeHelpBox()
{
   document.getElementById("bcgi-privateradio-controls-container").style.position = "sticky";
   document.getElementById("bcgi-how-to-instructions").style.display = "none";
   document.getElementById("how-to-view").style.display = "inline";
}
</script>
<div id="bcgi-how-to-instructions" style="display:none;">
<div style="font-weight:bold; margin-bottom:1em; font-size:120%;">How to Use Private Internet Radio</div>
<div onclick="closeHelpBox()" style="position:absolute; left:-10px; top:-10px; cursor:pointer;"><img alt="close help box icon" src="data:png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAHFAAABxQG6eNsrAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAACxtJREFUaIHNWn1sE1cSn921vYnj+CuJ7UQFVB3FraiIQvNPdUgnClIhFW2ltnc97lSIgDTiUKV+qdWduAItFUVQVZxCHK931wWnkXLwR0H5oiHGBJwUEZrGNFHIIS6UNHEMJXac2N7N7twf1JGN8+E4Kb2R5o99b95789s3Oztv5hGICEtBLMuukGV5vVKpXEcQxBpZlpfLspwryzINAECSZIwkyXGKogZlWfaJoniJJEn3jh07BpdifWIxQBwOx+MkSZYTBLGDJElDUVGRVFhYqNHr9aDVaoGmaVAqlQAAIIoixGIxCIVCMDY2BsPDw+GffvqJQsT7kiQ5RFHkKysr//tIgdjt9rUqleogIv7hiSeeIK1WK11QUAAAAOFwGPr7++HGjRswNjYGwWAQAAB0Oh3o9XqwWq2watUq0Gg0AAAQCASgv78/NjAwIBME4RZF8R+7du3q/lWBHD9+3KJWq6sIgtj0zDPPZD355JOkQqGArq4u4HkempubIRAIgFKphFgsBtFoFKampgAAQKlUAk3TQNM0iKIIBQUFUFZWBtu3b4e1a9fC1NQU9PX1ydeuXYsCQGMkEvlbZWXlaNrKIWJaXFNTs9XhcIx3dnbGRFHEWCyGDMPgsmXL0GAwIEmSCAALYpIk0WAw4LJly5BhGBQEAUVRxI6OjhjLsiGGYf6crn7zCtTX16tYlj3hcrnCd+/eRUTEuro6NJlMmJubu2DlZ+Pc3Fw0mUxYX1+PiIiBQABdLtcEz/Mn6uvrVfPpOadpHT9+XJOdnX3OYrEUb9y4UX337l145ZVXoLe3d9r2l5p0Oh08/fTTcPr0aTAajdDa2jrp9/u7Jycnn9+9e3d41oGzIayqqtJwHOe7cOFCRJZlPH/+PObl5aFCoViyXZiNSZJEo9GIbrcbZVlGt9sd4TjOV1VVpVmQadXX16s4jrt44cKFybgp6XS6Xx3Aw6zVavGrr75CRMSLFy9GOI7rOHbsGJ02EJZlTzQ2Nk7Isowulwu1Wu0jB5EIpra2FmVZxsbGxgme5/m0gDAM8yeXyxWOxWLY0tLym+zETGBaW1tREASsra0NMwzz1zk/dofDYSYI4j8vv/yyZnJyEoqLi+H+/fvw/0BGoxF6enqApmk4c+bMOEEQvysvLw/E+8lEYYVCUbV69Wql0WiELVu2QCgUevQaz0LBYBBefPFFyMvLg6eeeoomCOJfif3TQGw2WwlBEJtLS0tpu90Ot27dAkmS5pz82WefXRIl05lHkiQYGBgAnuehtLRUBQBbHA7HmmmBuI3xPN/k8/mkcDiMRqNxXrt95513EBHxs88+W5T979q1CyVJws8//zwteaPRiBMTE9jd3T3ldDrPJn3sDMM8zvP8pCiKeOjQIczJyZlzsnfffRcT6fDhwxmDkGV5ep7q6mokCGLOMWq1Gg8fPoyiKCLHcZMOh2NFIpAD7e3tkampKczPz59zIo1GgwMDA/gwffrppwsCsWfPniQQiIhdXV2o0WjmHZufn4+SJKHH44k6HI5/TgPhOG5odHQUW1paUK/XzzuRxWLB3t7eFDBHjhxJC8Sbb76ZAuLatWuYl5eX1niDwYBtbW3o9/uR5/nbiAhQU1OznOf5CUTE1157Le03arFY8IcfflgwmMrKykWBAAAkCAK3bt2KiIg8z08yDPMY2Gy28nPnzo0jIhYUFCzIPMxm84xgjh49OqP822+/nSLb1dWVlnN5mE0mEyIiNjc3h2w22xvA87zD5/Ph4OAgGgyGBU9oNpvx+vXrKQo+7IVmAnH16tWMQMTN686dO9jT04Mcx9WA0+m88uOPP2JTU1Na38dCwMS9UNxVPwwikxeXCOTcuXN4+/ZtdDqdHcDz/GgwGMQvvvhiUSH6bN9Me3t7SpvX6110IKpUKvHYsWMYDAaR47gRUpKkHJqmYXh4ePp8nQmNjIzA+vXrwefzJbWvW7cu6dnr9cKmTZsWHf6IoggjIyOgUqlAluUcUpZlWqlULklwODo6Chs2bEgBEyev1wubN29eshju559/BqVSCbIsZ5Hziy+MAoEANDQ0zNh3/fp1GB8fX+olAQCAJEkyJooiGAyGJZnwgw8+gA8//HDGvoqKCrDb7UCSS/P+jEYjiKIIJElGSYqiwrFYDIqKikChUCxq4o8++ggOHTqU1CYIQtLzzp07obq6GgiCWNRaSqUSCgsLQRAEIElygiQIYjAUCiVl/zKhffv2wb59+5La2tvbYeXKlXD16tWk9oqKCnA4HIvaGY1GA1arFYLBIJAkeQs4jmN8Ph/evn07Y7++f//+FBd78eLF6QBQr9fjlStXUmRYls0osQepP0Qb2O327ZmGKACABw4cSFHQ4/GkRLF6vR6//fbbFFmO4zICYzabERGxqakpZLPZ3iARsW1oaIgCAFi/fv2Ctvfjjz+GvXv3JrV5PB4oKyuDcDg5lzY2NgbPP/88XLlyJam9vLwcXC4XUBSV9roEQcDGjRsBAGBkZERBUVRb/HQ4NDo6it98803a5vXJJ5+kvN2WlhbMzs6ec5xOp8POzs6UsXV1dWlHFgaDAd1udzyMH8T4ecThcOxvb2+PSJKUlnkdPHgwIxCJYDo6OjIGYzKZpg9WLMvuRcQHyQdEdA4MDKAsy/Dee+9BTk7OrNuq0WigrKwsqa25uRleeukliEQiaZlGMBiETZs2QWdnZ1K7xWIBlUo151i1Wg3vv/8+SJIEN2/elBHxBPwCAhARnE5nY09PT1rJh0Qv1NTUhFlZWRl5npycHPR4PClebi7Oy8ubTj7wPH8GH840VldXlzidzglBEJBhmHkzjEajEY8cOYI0TWcEIs5arRaPHj2KarV6Xtnc3FzkeR4FQUCe5ycYhlmTAgQfnN3/7fV6o7IsY0lJCVIUtSgll5IpisLS0lKUZRm9Xm+M5/m6RN2Tfq2SJO3p6+sT7t27B2fPngWdTjerrT5q0uv18PXXX8O9e/egr68vhohvJQkkosJfktgnT54Mx2IxbG1t/b9JYre1tU0nse12+18e1nvGsgLHcc54WaG2tvY3LyvU1dWhLMvY0NAwwXEcO5POM0Ztoiju8vv9V91ud3Tr1q1gt9t/EzPTarXAMAy8/vrrcOnSpajf7/8+HA7vnlF4JnSYUHpzu90RWZbR4/Fgfn7+Iym9KRQKzM/PR4/Hk1h665mr9DZvMVStVjebzeaSDRs2qO/fvw+vvvoq+Hy+X7UYumbNGjh16hTo9fp4MfRaJBLZnFExNM6/1BM5l8sVDgQCiIh46tQpNJvNS16etlgsePr0aUR8UJ4+efLkBM/zfE1NjXI+PdMqxse9GcuyocuXL0cFQUBBEJBlWVy+fPmiLwysWLECOY5DURRREAS8fPlylGXZkN1u/2O6+i3oCofNZjPRNH2MIIgtJSUl9OrVqymFQgHd3d3w5ZdfQkNDw3SKRhAEiEajIIoiADw4mmZlZU33FRYWwgsvvADbtm2D4uJiEEURent7pe+++y4GAGcQ8a3E0tp8lNGlmpqammKapg8i4nMrV64krFZrlslkAgCAiYkJuHHjxvSlmniayWAwgF6vh1WrVoHVagW1Wg0AAH6/H/r7+6M3b95EkiTPx2Kxv1dUVMycT1pqIHFiWXYFAGyjKGonAOQXFhZOFRUV5er1esjNzYXs7Oyka06RSATGx8dhbGwMhoaGxoeHhxUEQQSmpqYcBEGcWMzdrUUBSSSHw/GYJEnPqVSq31MUVSzL8gpJkrSJF88oigqRJDkoSdL3giBcpiiqbefOnXeWYv3/AYr1gyBRCGmNAAAAAElFTkSuQmCC" style="max-width:25px;"></div>
<p>
This radio software expects MP3 sound files to be loaded into the directory where this software is running.
</p>
<p>
Near the top of this dashboard, immediately under the name of this software, you will see the audio player used for hearing the radio. The player is designed by your browser. If you use more than one kind of browser, you may see differences in the style of the audio player.
</p>
<p>
The audio player has its own controls. Generally, the browser provides a play/pause button, an indication of how far along the current piece has played and, perhaps, a volume control.
</p>
<p>
Immediately below the player, you'll see the currently loaded line indicating which MP3 is ready to play. There is either a "play" icon or a "pause" icon. To the right of the icon is the file name of the piece. If you see the "play" icon, it may be tapped to start playing the piece. If you see the "pause" icon, it may be tapped to stop the piece from playing.
</p>
<p>
Below the currently loaded line (and immediately above these how-to instructions), are two HTML radio button tags &mdash; assuming there are at least three MP3 files available. The buttons are "Sequential" and "Random". Sequential is default. Random chooses a random piece from your MP3 playlist below these how-to instructions.
</p>
<p>
Each MP3 playlist item has either a "play" icon or a "pause" icon at the beginning of the line. To the right of the icon is the MP3 file name of the piece. If you see the "play" icon, it may be tapped to start playing the piece. If you see the "pause" icon, it may be tapped to stop the piece from playing.
</p>
<p style="margin-bottom:0;">
Happy listening!
</p>

<div onclick="closeHelpBox()" style="position:absolute; left:-10px; bottom:-10px; cursor:pointer;"><img alt="close help box icon" src="data:png;base64,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" style="max-width:25px;"></div>
</div>

</div><!-- sequence/random/help holder -->

</div><!-- class="bcgi-privateradio-sections-border" -->
<div style="height:6px;"></div>

</div><!-- class="bcgi-privateradio-controls-container" -->

<div class="bcgi-privateradio-sections-border bcgi-privateradio-above-title-list">
<?php 
$Template = <<<TEMPLATE
<div class="bcgi-privateradio-item-container">
<div class="bcgi-privateradio-item-image" onclick="PlayOrPause({{{NUM}}})"><img alt="icon to play or pause" id="list-on-off-image-{{{NUM}}}" class="bcgi-privateradio-item-image-tag" src="data:png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABkCAYAAAAR+rcWAAAACXBIWXMAAAS0AAAEtAEY0aC0AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABN1JREFUeJztnMtvVUUcgL9fqfh+xBhDjO9nYkCMWhMTtGqMWql/gdEEH7ASXBI3unWnbozuwKVLtIJCiryDCOVRKViQqLhwI7DwgdWfizmTeyi9j3M7c+bMOfNtmtB7Z3758s3tbe8EUVVE5FPgI1XdRaIQA9nXIWCHiKwXkRtDDhQbVuACQICXgWMiskZEBsONFQ95gZbrgPeBfSKyrPyR4mIugZalwHYR2SAit5Q4U1R0EmgZBY6KyLsisrCEmaKiF4EAVwLvAIdF5Dm/I8VFrwIt9wIbs2N9m6eZoqKoQMso8H12rC91PFNUSPZG+gxwbZ9rTANrVHXM4VzR0G+Bee4GvsiO9R0OZooKFwIto8Bkdqwvc7BeFNgj/Dfg8i3KSWCtqn7mcM1KYgXO4KbC2WwGVqvqUQ9rV4KBWV9d8wxwUEQ+EJGrPO0RFMHI+7eEvU4Db6vq+hL2Kg0BLgHOl7jnOPCmqk6WuKc3BvDz2teJp4AD2bG+puS9nRNCIJjqV2P+SPGKiEiAGZwQSqDlJmAdMC4iSwLO0TehBVqGgf3Zse73V8ogVEUgwCDmWE+JyEoR8fXWyilVEmhZBHwM7BGRR0MP040qCrQMAbuzTwpvCD1MO6osEMx8+U8KKzdr1QVarsd8UrhXRB4LPUyeWARaHgJ2VukCQGwC4eILAEHnj1GgpRIXAGIWaHkQ2JYd60Vlb14HgdA61tNlXwCoi0CLvQBwSESeLWPDugm03Adsyj4pvNXnRnUVaMnf6/FyAaDuAgGuoHWvZ8T14k0QaLkHGMuO9e2uFm2SQEv+Xs+8LwA0USDA5ZhjfURERuezUFMFWu4CNmTH+s5+Fmi6QIv9aV34AkAS2GIhuU8Ke31SEngxNwPrRGSLiNzf7cFJYHueBiayY311uwclgZ2xFwCm2l0ASAJ7I38BYHH+G0lgMYaZda8nCSxO/gLAS0lg/5wHfksCi6PAJ8ASVf16kCSwCKeAN1R1s/2HVGBv2OoeyMsD84KYBHbmFPC6qm6Z65upwPbkX+vmlAepwHb8CLymquPdHpgKvJD8a11XeZAKzHMSU93WIk9KBV5Y3daiT256gScw1X3T7wJNLfA/THVL5yMPmlngNKa6bS4Wa1KBM8CHmOqcyIPmFDgJvKqqe10vXPcCZ4D3gId9yIN6FzgJrFDVb31uUscC89V5lQf1K/AIprp9ZW1YlwJtdY+UKQ/qUeBhTHXfhdg85gL/oVVdEHkQb4GHMNXtDz1IbAXa6oaqIA/iKvAgproDoQfJE0OB+eoqJQ+qX+AEprqJ0IO0o6oF/gWsxfyEraw8qGaBezB/OYnif3yrUoG2umWxyIPqFLgbU91U6EGKErrAPzHVPR6jPAhb4C5MdccC7e+EEAXa6p6IXR6UX+BOTHXHS9zTK2UV+Aet6mojD8opcAemuh887xMEnwXa6obrKg/8FbgdU920h7UrhesCzwFvAU82QR64LfArzA32nxytFwUuCjwHrAKeb5o8mH+Bm4CVTRRn6bfAs5jqRposD/orcCOmup89zBMdRQo8C6xS1ZEkr0WvBX6Jqe4Xz/NER7cCz2CqeyHJm5tOBY5hqjtd4jzRMVeBtrrlSV53Zhf4OUber4HmiQ5b4O8YcS8mecVYACwGlru8+t8k/gc1x5Rk7LR3+AAAAABJRU5ErkJggg=="></div>
<div class="bcgi-privateradio-item-title">{{{SONGTITLE}}}</div>
</div><!-- class="bcgi-privateradio-item-container" -->
TEMPLATE;
$counter = count($PlayList);
for( $i=0; $i<$counter; $i++ )
{
   $item = str_replace('{{{NUM}}}',$i,$Template);
   $item = str_replace('{{{SONGTITLE}}}',$PlayList[$i],$item);
   echo $item;
}
?>
</div><!-- gray border -->

<script type="text/javascript">
var SoundOnImageBASE64src = "data:png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABkCAYAAAAR+rcWAAAACXBIWXMAAAS0AAAEtAEY0aC0AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAADX1JREFUeJztnX1wVNd5xn9HWgkQ65AYyZIRio1JYAxxa4GxxwXTpECc1DiI4GAT3FB7Ev8Rm3HqDo7TSeISz7RTSNyaiYdh6LTUndLKBEz4cEyAiCQQGwUwJJgJBgWZCFxEFCnlQx8r7dM/jlZZ3b13de/u3dUS+5k5M9r3nPe99zw6595z3vOec40kCgxTgc8Bi4FPAi3DezvpUTTcNwAUA7OAF7BkHQeeBW49duzYY8aYW4wx5caYUcN5k16IDNN1RwFzgfmSFhpjKtwKtba2fgP4RuK3MeYC8AvgGHAQ+KGk/8vD/XrC5LELfwhL2v1AHXDdUAqxWIzKykra29u9ivQADcAWYKOkyyHdq39IymWqkPQFSdsldSsDLF26VICf1A6sBm7KcZ0GpVwYnSDpSUn7JfVlQloyNm3a5JfARIoB3wXK80FgWF048eacD0wPw2ACly9fpqKigq6urqCqHcBzwBpJvWHe0yBkyHyRpOmS/l7SyWxb2VCYP39+0FaYnBqBSdm0snQpSOFiSbMkvSDpfG4pG4yzZ89uBT4FfBXYCFwISOJl4LEAdQ2NwFGS7pf0kqSO3FPliYuy/0B703b8+mfAP/d3Vb9E/htQqhwTeL3sm/NlSZfzwY5P3CO3CkAUeAI465PEfcBYN1uZpMQfNZIekx1u9OSHj8D4jtJVBMqAb/Z316FIfBv4cDp7fhOSdkuK54uFLNAkPxWCGmCvDxKbwiCxqP+BbHy8sIcbtwB/MlQhSb8B5gErgO4h7DUYYz6czU0VAVuzMZBn1PkpJNujvg3MAS6mKXoLsMcYMzbTGzKSov0XGZmpkTziTWBaEAVjzARgBzAlTbGfAvMkpWuxrijCPnT3BFUcJtQCE4IoSDqDdZcdSVPsHmBdJjeU8AdeS934M0EVJLVjn4vpSFxmjPlKUNuJuXA58L9Y52ahYx/wiUwUjTHXAz/Bzt3d0A3cLelNvzYTLfC3wM8yualhwD3Yf3hgSPod1uHR6lFkBPDfxpjRfm0mu/SHrRv39PTQ19c3SLZq1SpGjx7NuHHjmDdvHk8//TQNDQ309vYWY0nICJKasW9zL/fOZOwU0bfBRLo5h4NgV8Tj3uP3U6dOuQ6Ay8vL9cgjj7wNVCubGQR80c1+f4oDrlPHFDsOwbGQOcoKU6ZMSTeT6AJWAWOUOYkb09g/DpQMZcO5KldQb+OHHnooXfYI7GzjV8aYv8zwEl8Gmj3ypgJ/O6QFB6O1+WpdftHe3q6GhgY988wzmjhxYrou9wIQUfBWONfDZsKPWJVW30X46/zREwx9fX3atm2bamtrvSr8Ghl0aeC/0pC4Jq2ui/Bf8kdJZujr69O6detUXFx8xaXCPwc+qGAEVmJX9dwI7AZu9tR1EX48n2Rkg4MHD/4HcNil0o3ABxSMxK+kaYX/7qnnIiyWdaFfC2ipqKiIYhfWnZV+FRhYBhgqYV9K73gQGANq3PTcYmP6sN6LawHVra2tk7FLqhsdeZ8GvuPXkKwn5jmP7Aj2je2q6JYW5LMZZYnnZFtQMfAKqa2nTv5bYQQ45WJD2OnuqBQdD2OjVFgLSunwS/2BgNHAIZeKj5N/Eh/3IFDAl1LKpzG2JY8kZIuBhXPgJuB3joq/LP8ElgFtHgQedJZPFx+Y91lJR0cHnZ2dAFy8eJHKykpqa2t54oknaGxsTKe6IPGHpHeAxxz5nzPGfNrPPUi6CmzwyL7TGDPJqeCVrpcUy0fz8XIqzJo1a1ALmDlzpo4fP+5WdL9SW9L3GNx6juPzrQx8BDu7cWuFzw4qO4SxvWEQlCnOnz+vjRs3qq6uTqWlpQJUWlqq1atXO4v2SbpRg0kYD1xyVP6v5IPAfv03PAg8pQAELs8hP4Fw+vRpzZkzZ6AiTz31lLPlpsS+ACsdlX8bKHKWc0vAcg8CBfypfBJYrQJadI/H41q5cuVARVasWJGcvVOpJIzBvoWTKz/fWc4tATdgB9BuBK6QTwKRdCjXxATFmjVrBMgYo/r6+oS4S1LK9A34lqPyu51lvBLwIw8CB2z4MfT13FMSHI8//rgARaNRnTlzJiFeLPeW1JVU+ThpnAMO3a95ENgJlMkngR/LByFB0d3drTvuuEOAHnzwwYR4o9yJqHcQ8FW3ci5609I8B++VTwJRHqJQM8Hrr78uY4yMMTpw4IBkYxhT4v+wa8nJlX/TWcYtwUDskOdwxi+BKeOGQsGSJUsEqK6uLiG6V6lElDJ4dhIHbnSWc0vAZg8CtykAgTPzQUYmOHTokACVlJTo/PnzkrRW7kRschDwBbdyLnpez8F3pfRTuWS8jo1cKDhMnz6d2tpaYrEYL730EsBC3Lew/dDx+899XuKwh7zKGDPOL4FxYLvPsnnHww8/DMCuXbvAuufvdCn2E8fvO3yaT3h33HBrkM2GBbXkmYzZs2cD8MYbb9DT0wPucYSngOR9dVP8bGCUDQe54JE9IQiBex03UDC4/fbbue666+js7OTo0aMAn3WWkRTHblJMIAJM9HmJZg95IAK7scuGWSMej4dhZgCRSITJkycD0NzcDPBR4FaXok2O335jDZs95DcF3S8cSjcuKgp/m3JVVRUAFy4M9LaFLsXOOH77jY9u9pCPD1qTV7FbTAsO5eU24q2trS0hWuBSzBkv/SGf5r3irMcEJfD32P25WaO3N9z9f93dNrx55MiBUO8Z2C0PyXA+w4fcs9yP33vIAxMIIXVjY8LdWdHR0QHAmDFjBi5Bajhwp+O332MEvF6eH8iEwFew48KsUFwcbjTxmTP28ZZ4FvbD2Y2dRxzEfJq/5CGPZkLgBWzoRNbonypljfb2dk6ePAnAjBkzkrM+zuDnnHMrh18CvbpLX6avw4Lqxrt370YSNTU1jB8/PjmrBLgv6XelQ/W3Pi9R6iGPZUrglgz1coK1a9cCsHjxYrfs5G5c5cjzO78v8ZD3+PXGuKUTufWz+MOePXsEqKioSKdPn3Yrckk20gJszE+yR8VfHDQsw90j05LNiPaVLHRDQVtbG48++igAy5YtY+JE15lZFBuFCqmbFY/7vNSNHvLWbFrgnblpU/4xe/ZsAaqpqVFHR9oN9f+KDflIbj3vyGddsdse3Frgq9m0wJ8Dv8lCP2tMmjSJqqoqtm7dmjz+c8OCkpKSTzpkPw5wKeezM4ELRhLGmK9hAwyDYLWkf8JGMw3gyJEjbNu2LZCh2267jUWLFgW8POzfv5/q6momTBjaJ1BZWdnY2tqa7Cd8RNIGP9cxxhzBbnR04h8STdQZAuEnVUqa5+wr69evD2pHS5YsCdR1L126pLNnz6bdqJOMlpYWFRUVJce6dOPzYB7s4LvL496XZnv42D5scLbfSXlW6O3tJRKJEI1GiUajvvWef/554vF48qDzB5L8jgEn4d07f5mtXymG9dDkBZFI8P93S0sL69albAVeG8DEDA95DDgZhmOuYF39AE8++SRXrlxJFh2RtCuAiTke8hOSusMg8DW8dz4OK9avX8+WLSmTpr8LaOYvPOQNEM4JlgV5ZMCuXbtYvnz5INkDDzyApLf92jDG3A5Ue2TvhfCOAC2obtzU1MTChQsHnKwA1dXVvPjii+DuqfbCwx7yXvqXScMi8PvY/SUFgWg0Ooi8ESNGUF9fzw033AA+CTTGFAOf98j+sfqPHg2LwII6MqCyspK77roLsORt3ryZmTNnJrLvAVzPbHXgfrznwP+Z+CPM5bGC6sZ1dXWMHTuWHTt2cN99yS5B/B4Z8IyH/Ao24AgIl8CC8hEuXbqUw4cPM3fuXLfstN3YGDMHuMsje4uSDrsN8xjkZuwRxUOeb5VrxGIxqqu9Xp6APeB7NLY1DUL/s2+Vh56AbycLwl7hHjYf4dWrV7l40S7flpR4OZAHMAq41yPvy3gfL7VT0i+SBWET+P2Q7aWFkhalysrKqKjw824YQEo37j9ny2vHJsA/OgVhE/hmZ2en30l61shyUeozJK11GGNGYoMwvRyL35OUMtIIPUjl3LlzR8O2mSN8EJgNYOx/Yi3eRzhfBv7GLSN0Ao8dO3atEAiwoJ+87wJ/nabcSkmuX5UI/WMEe/fuPRW2zVxB0qKioqKR8Xj8S2mK/Yg0R0GF3gJjsVi4wX85hDFm3LRp09KRdw5YIslzmloI3xMZVixY4Dmm7gIelOR10hvwPoEsXOgWh0k38FlJB4bSf88TOHXqVCZNGrQJvRtYJOkHfvTf8wTCoG58AfiUpJ1+dd8nEOu5wbrjpkvaF0T3fQKBu+++W2+99dYSSeeC6r5PIGCMaZsyZcotmegO11e9hh29vb3vRiKR7diQt9fwH606CO8pAq9evfruiBEjNhcXF9dHIpEDeO+B8433AoEnsF6Wl8vKyk6EbfyPkcA+7Jkv27FrF6dzebE/FgK7gP3Y51k9edzbfC0TeBXrKdmEXREclp2k1xqBbdhosE3YHeiBP18RNq4FAt/BrrVsx8Yj5u4jexmgUAk8gSVsBxDKcCNXKCQCE8ON/wF+Ncz34hsFQeCOHTu24r5BuuCRiNKvJfjHWI7K5aOfxphy4GY3hZ07dz4biURGNzU17duwYcP+xsbGxJuzTfbTPdcc/h9+2abaN2hOfAAAAABJRU5ErkJggg==";
var SoundOffImageBASE64src = "data:png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABkCAYAAAAR+rcWAAAACXBIWXMAAAS0AAAEtAEY0aC0AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABN1JREFUeJztnMtvVUUcgL9fqfh+xBhDjO9nYkCMWhMTtGqMWql/gdEEH7ASXBI3unWnbozuwKVLtIJCiryDCOVRKViQqLhwI7DwgdWfizmTeyi9j3M7c+bMOfNtmtB7Z3758s3tbe8EUVVE5FPgI1XdRaIQA9nXIWCHiKwXkRtDDhQbVuACQICXgWMiskZEBsONFQ95gZbrgPeBfSKyrPyR4mIugZalwHYR2SAit5Q4U1R0EmgZBY6KyLsisrCEmaKiF4EAVwLvAIdF5Dm/I8VFrwIt9wIbs2N9m6eZoqKoQMso8H12rC91PFNUSPZG+gxwbZ9rTANrVHXM4VzR0G+Bee4GvsiO9R0OZooKFwIto8Bkdqwvc7BeFNgj/Dfg8i3KSWCtqn7mcM1KYgXO4KbC2WwGVqvqUQ9rV4KBWV9d8wxwUEQ+EJGrPO0RFMHI+7eEvU4Db6vq+hL2Kg0BLgHOl7jnOPCmqk6WuKc3BvDz2teJp4AD2bG+puS9nRNCIJjqV2P+SPGKiEiAGZwQSqDlJmAdMC4iSwLO0TehBVqGgf3Zse73V8ogVEUgwCDmWE+JyEoR8fXWyilVEmhZBHwM7BGRR0MP040qCrQMAbuzTwpvCD1MO6osEMx8+U8KKzdr1QVarsd8UrhXRB4LPUyeWARaHgJ2VukCQGwC4eILAEHnj1GgpRIXAGIWaHkQ2JYd60Vlb14HgdA61tNlXwCoi0CLvQBwSESeLWPDugm03Adsyj4pvNXnRnUVaMnf6/FyAaDuAgGuoHWvZ8T14k0QaLkHGMuO9e2uFm2SQEv+Xs+8LwA0USDA5ZhjfURERuezUFMFWu4CNmTH+s5+Fmi6QIv9aV34AkAS2GIhuU8Ke31SEngxNwPrRGSLiNzf7cFJYHueBiayY311uwclgZ2xFwCm2l0ASAJ7I38BYHH+G0lgMYaZda8nCSxO/gLAS0lg/5wHfksCi6PAJ8ASVf16kCSwCKeAN1R1s/2HVGBv2OoeyMsD84KYBHbmFPC6qm6Z65upwPbkX+vmlAepwHb8CLymquPdHpgKvJD8a11XeZAKzHMSU93WIk9KBV5Y3daiT256gScw1X3T7wJNLfA/THVL5yMPmlngNKa6bS4Wa1KBM8CHmOqcyIPmFDgJvKqqe10vXPcCZ4D3gId9yIN6FzgJrFDVb31uUscC89V5lQf1K/AIprp9ZW1YlwJtdY+UKQ/qUeBhTHXfhdg85gL/oVVdEHkQb4GHMNXtDz1IbAXa6oaqIA/iKvAgproDoQfJE0OB+eoqJQ+qX+AEprqJ0IO0o6oF/gWsxfyEraw8qGaBezB/OYnif3yrUoG2umWxyIPqFLgbU91U6EGKErrAPzHVPR6jPAhb4C5MdccC7e+EEAXa6p6IXR6UX+BOTHXHS9zTK2UV+Aet6mojD8opcAemuh887xMEnwXa6obrKg/8FbgdU920h7UrhesCzwFvAU82QR64LfArzA32nxytFwUuCjwHrAKeb5o8mH+Bm4CVTRRn6bfAs5jqRposD/orcCOmup89zBMdRQo8C6xS1ZEkr0WvBX6Jqe4Xz/NER7cCz2CqeyHJm5tOBY5hqjtd4jzRMVeBtrrlSV53Zhf4OUber4HmiQ5b4O8YcS8mecVYACwGlru8+t8k/gc1x5Rk7LR3+AAAAABJRU5ErkJggg==";
var PlayList = new Array("<?php echo(implode('","',$PlayList)) ?>");
var CurrentlyPlayingContainer = document.getElementById("bcgi-currently-playing-container");
var CurrentlyPlayingControl = document.getElementById("bcgi-currently-playing-control");
var CurrentlyPlayingFileName = document.getElementById("bcgi-currently-playing-filename");
var CurrentlyPlayingIndice = document.getElementById("bcgi-currently-playing-indice");
var AudioElement = document.getElementById("audio-control");
var ImageClicked = false;
if(PlayList.length>=3){document.getElementById("bcgi-sequential-random-choice").style.display="inline-block";}
var RandomPlay = document.getElementById("bcgi-sequrand-sequential").checked ? false : true;
var PreviousRandomItemNumber = -1;
CurrentlyPlayingContainer.style.visibility = "visible";
CurrentlyPlayingFileName.innerHTML = PlayList[0];
CurrentlyPlayingControl.src = SoundOffImageBASE64src;
AudioElement.src = PlayList[0];

function SetQuentialRandom(d) { RandomPlay = d=="sequential" ? false : true; }

function PlayOrPause(item)
{
   var current_condition = AudioElement.paused ? "paused" : "playing";
   var currentindice = parseInt(CurrentlyPlayingIndice.innerHTML);
   if(item<0) { item = currentindice; }
   var loop_again = (item==currentindice||current_condition=="paused") ? false : true;
   var item_track = item;
   document.getElementById("list-on-off-image-"+currentindice).src=SoundOffImageBASE64src;
   CurrentlyPlayingIndice.innerHTML = item;
   CurrentlyPlayingFileName.innerHTML = PlayList[item];
   AudioElement.src = PlayList[item];
   if(current_condition=="paused")
   {
      CurrentlyPlayingControl.src = SoundOnImageBASE64src;
      document.getElementById("list-on-off-image-"+item).src=SoundOnImageBASE64src;
      AudioElement.play();
   }
   else if(current_condition=="playing")
   {
      CurrentlyPlayingControl.src = SoundOffImageBASE64src;
      document.getElementById("list-on-off-image-"+item).src=SoundOffImageBASE64src;
      AudioElement.pause();
   }
   if( loop_again ) { PlayOrPause(item_track); }
}

function ElementPlay()
{
   if( ImageClicked )
   {
      ImageClicked = false;
      return;
   }
   var item = parseInt(CurrentlyPlayingIndice.innerHTML);
   CurrentlyPlayingIndice.innerHTML = item;
   CurrentlyPlayingFileName.innerHTML = PlayList[item];
   CurrentlyPlayingControl.src = SoundOnImageBASE64src;
   document.getElementById("list-on-off-image-"+item).src=SoundOnImageBASE64src;
}

function ElementPause()
{
   if( ImageClicked )
   {
      ImageClicked = false;
      return;
   }
   var item = parseInt(CurrentlyPlayingIndice.innerHTML);
   CurrentlyPlayingIndice.innerHTML = item;
   CurrentlyPlayingFileName.innerHTML = PlayList[item];
   CurrentlyPlayingControl.src = SoundOffImageBASE64src;
   document.getElementById("list-on-off-image-"+item).src=SoundOffImageBASE64src;
}

function ElementEnded()
{
   var item = parseInt(CurrentlyPlayingIndice.innerHTML);
   CurrentlyPlayingControl.src = SoundOffImageBASE64src;
   document.getElementById("list-on-off-image-"+item).src=SoundOffImageBASE64src;
   if(RandomPlay)
   {
      var nextitem = Math.floor(Math.random() * PlayList.length);
      while( nextitem==item || nextitem==PreviousRandomItemNumber ) { nextitem = Math.floor(Math.random() * PlayList.length); }
      PreviousRandomItemNumber = item;
      item = nextitem;
   }
   else { item++; }
   if( item >= PlayList.length ) { item = 0; }
   CurrentlyPlayingIndice.innerHTML = item;
   AudioElement.src = PlayList[item];
   CurrentlyPlayingControl.src = SoundOnImageBASE64src;
   document.getElementById("list-on-off-image-"+item).src=SoundOnImageBASE64src;
   AudioElement.play();
}

AudioElement.addEventListener('play',ElementPlay);
AudioElement.addEventListener('pause',ElementPause);
AudioElement.addEventListener('ended',ElementEnded);
</script>

<p>
Provided by <a href="https://www.willmaster.com">Will Bontrager Software LLC</a>
</p>
</body>
</html>

Installation —

Copy the above source code and save it as privateradio.php or other *.php file name that you prefer.

Upload privateradio.php into directory selected for your private internet radio (where the .htaccess file was installed in the earlier step).

MP3 Files

As the last step, upload the MP3 files for your radio into the same directory where you put the privateradio.php and .htaccess files.

Upload at least three *.mp3 files. You can always upload more later, and remove some if you wish.

When ready to listen to your radio, type the URL of privateradio.php into your browser.

For your convenience, the how-to available on the dashboard of the Private Internet Radio software is repeated here:

Near the top of this dashboard, immediately under the name of this software, you will see the audio player used for hearing the radio. The player is designed by your browser. If you use more than one kind of browser, you may see differences in the style of the audio player.

The audio player has its own controls. Generally, the browser provides a play/pause button, an indication of how far along the current piece has played and, perhaps, a volume control.

Immediately below the player, you'll see the currently loaded line indicating which MP3 is ready to play. There is either a "play" icon or a "pause" icon. To the right of the icon is the file name of the piece. If you see the "play" icon, it may be tapped to start playing the piece. If you see the "pause" icon, it may be tapped to stop the piece from playing.

Below the currently loaded line (and immediately above these how-to instructions), are two HTML radio button tags — assuming there are at least three MP3 files available. The buttons are "Sequential" and "Random". Sequential is default. Random chooses a random piece from your MP3 playlist below these how-to instructions.

Each MP3 playlist item has either a "play" icon or a "pause" icon at the beginning of the line. To the right of the icon is the MP3 file name of the piece. If you see the "play" icon, it may be tapped to start playing the piece. If you see the "pause" icon, it may be tapped to stop the piece from playing.

You now have your very own private internet radio. No ads, unless you insert them yourself.

(This content first appeared in Possibilities newsletter.)

Will Bontrager

Was this article helpful to you?
(anonymous form)

Support This Website

Some of our support is from people like you who see the value of all that's offered for FREE at this website.

"Yes, let me contribute."

Amount (USD):

Tap to Choose
Contribution
Method

All information in WillMaster Library articles is presented AS-IS.

We only suggest and recommend what we believe is of value. As remuneration for the time and research involved to provide quality links, we generally use affiliate links when we can. Whenever we link to something not our own, you should assume they are affiliate links or that we benefit in some way.

How Can We Help You? balloons
How Can We Help You?
bullet Custom Programming
bullet Ready-Made Software
bullet Technical Support
bullet Possibilities Newsletter
bullet Website "How-To" Info
bullet Useful Information List
software index page

© 1998-2001 William and Mari Bontrager
© 2001-2011 Bontrager Connection, LLC
© 2011-2024 Will Bontrager Software LLC