Tuesday, July 17, 2012

Radio PI Followup

I ended up tweaking the scripts a little to display 3 columns of stations but other than that the radio is working great. One other thing I found was that some of the radio stations start having issues with an irregular clicking sound that is not part of the stream. I found that changing the station and then changing it right back fixes the issue for awhile. So I put in a cron job to run the doradio script every 2 hours (0 */2 * * * /usr/bin/doradio). We'll see how that works out.

Sunday, July 8, 2012

Radio PI

I decided to go ahead and release my Radio PI setup. Steps 2 & 3 are completely optional and not needed for playing internet radio at all, I just like having Webmin on all of my Linux Boxes.
This assumes that you are running the Wheezy Beta RPI distro or later (audio is fixed in Wheezy)

1) log into console: /etc/init.d/ssh start so you can login from the pc :)
2) Install webmin  (wget http://prdownloads.sourceforge.net/webadmin/webmin-1.590.tar.gz)  tar xvzf filename   cd webmin_folder   ./setup.sh
3) Set SSH to auto start at bootup in Webmin
4) install PHP  (apt-get install php5)  this will also install apache
5) install mpg123 (apt-get install mpg123)
6) Create a user that will auto login (adduser radio)
7) set the hostname (hostname RadioPI)
8) Create the web pages that will be used to change radio stations

/var/www/stationCommon.php
*********************************
<?php
// Created 7/7/2012 by Gregg Buntin - http://pentiumprime.realmlabs.com/
    $file = fopen("stationList","r");
    while(!feof($file))
    {
        $string = fgets($file);
        $tempArray = explode("~",$string);
        $radioList[] = $tempArray;
    }
    fclose($file);
    $currentStation = trim(file_get_contents("station"));
?>
*********************************

/var/www/index.php
*********************************
<?php
// Created 7/7/2012 by Gregg Buntin - http://pentiumprime.realmlabs.com/
    include("stationCommon.php");
?>
<html>
<head>
   <link href="station.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#669">
    <center>
    <h2 style="color: #0f0;"><?=file_get_contents("/etc/hostname");?></h2>
    <table>
       <tr>
<?php
    $colCount = 0;
    foreach ($radioList as $key => $stationData)
    {
        if (trim($stationData[0]) > "")
        {
           $stationName = trim($stationData[0]);
           $stationUrl = trim($stationData[1]);
           if ($stationUrl > "")
           {
               $buttonClass = "button";
               if ($currentStation == $stationUrl)
               {
                   $buttonClass .= " save";
                   $currentName = $stationName;
               } // if currentStation
               else
               {
                   $buttonClass .= " play";
               }
               $colCount++;
               if ($colCount == 3) print "</tr>\r\n<tr>\r\n";
               print "<td><button id='$stationName' onclick=\"doRadio('$stationUrl','$stationName');\" class=\"$buttonClass\">$stationName</button></td>\r\n";
           } // if stationUrl
        } // if stationData[0]
    } // foreach
?>
       </tr>
    </table>
    </center>
    <iframe id="radioFrame" style="height: 0px; width: 0px; visibility: hidden;"></iframe>
    <script>
        var lastStation = '<?=$currentName;?>';
        var theFrame = document.getElementById('radioFrame');
        function doRadio(inUrl, inName)
        {
               if (lastStation > '')
               {
                  lastButton = document.getElementById(lastStation);
                  lastButton.innerText = lastStation;
                  lastButton.className = "button play";
               }
               if (inName > '')
               {
                  newButton = document.getElementById(inName);
                  newButton.innerText = inName;
                  newButton.className = "button save";
                  theFrame.src = "doRadioScript.php?inUrl="+inUrl;
                  lastStation = inName;
               }
        }
    </script>
</body>
</html>
*********************************

/var/www/station.css
*********************************
# CSS from this site: http://www.red-team-design.com/just-another-awesome-css3-buttons
.button
{
        display: inline-block;
        white-space: nowrap;
        background-color: #9cf;
        background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#9cf));
        background-image: -webkit-linear-gradient(top, #eee, #9cf);
        background-image: -moz-linear-gradient(top, #eee, #9cf);
        background-image: -ms-linear-gradient(top, #eee, #9cf);
        background-image: -o-linear-gradient(top, #eee, #9cf);
        background-image: linear-gradient(top, #eee, #9cf);
        filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#99ccff');
        border: 1px solid #777;
        padding: 0 1.5em;
        margin: 0.5em;
        font: bold 2em/3em Arial, Helvetica;
        text-decoration: none;
        color: #333;
        text-shadow: 0 1px 0 rgba(255,255,255,.8);
        -moz-border-radius: .2em;
        -webkit-border-radius: .2em;
        border-radius: .2em;
        -moz-box-shadow: 0 0 1px 1px rgba(255,255,255,.8) inset, 0 1px 0 rgba(0,0,0,.3);
        -webkit-box-shadow: 0 0 1px 1px rgba(255,255,255,.8) inset, 0 1px 0 rgba(0,0,0,.3);
        box-shadow: 0 0 1px 1px rgba(255,255,255,.8) inset, 0 1px 0 rgba(0,0,0,.3);
}

.button:hover
{
        background-color: #cfc;
        background-image: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#cfc));
        background-image: -webkit-linear-gradient(top, #fafafa, #cfc);
        background-image: -moz-linear-gradient(top, #fafafa, #cfc);
        background-image: -ms-linear-gradient(top, #fafafa, #cfc);
        background-image: -o-linear-gradient(top, #fafafa, #cfc);
        background-image: linear-gradient(top, #fafafa, #cfc);
        filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#cfc');
}

.button:active
{
        -moz-box-shadow: 0 0 4px 2px rgba(0,0,0,.3) inset;
        -webkit-box-shadow: 0 0 4px 2px rgba(0,0,0,.3) inset;
        box-shadow: 0 0 4px 2px rgba(0,0,0,.3) inset;
        position: relative;
        top: 1px;
}

.button:focus
{
        outline: 0;
        background: #fafafa;
}

.button:before
{
        background: #9cf;
        background: rgba(0,0,0,.1);
        float: left;
        width: 1em;
        text-align: center;
        font-size: 1.5em;
        margin: 0 1em 0 -1em;
        padding: 0 .2em;
        -moz-box-shadow: 1px 0 0 rgba(0,0,0,.5), 2px 0 0 rgba(255,255,255,.5);
        -webkit-box-shadow: 1px 0 0 rgba(0,0,0,.5), 2px 0 0 rgba(255,255,255,.5);
        box-shadow: 1px 0 0 rgba(0,0,0,.5), 2px 0 0 rgba(255,255,255,.5);
        -moz-border-radius: .15em 0 0 .15em;
        -webkit-border-radius: .15em 0 0 .15em;
        border-radius: .15em 0 0 .15em;
        pointer-events: none;
}

/* Hexadecimal entities for the icons */

.save:before
{
        content: "\2714";
}

.play:before
{
        content: "\25B6";
}
*********************************

/var/www/doRadioScript.php
*********************************
<?php
// Created 7/7/2012 by Gregg Buntin - http://pentiumprime.realmlabs.com/
    include "stationCommon.php";

    $inUrl = trim($_GET["inUrl"]);
    
    // Check to make sure the passed in URL is in our list of valid radio stations
    $DoIt = false;
    foreach ($radioList as $key => $stationData)
    {
        if (trim($stationData[0]) > "")
        {
           $stationUrl = trim($stationData[1]);
           if ($stationUrl > "")
           {
               if ($inUrl == $stationUrl)
               {
                   $DoIt = true;
               } // if inUrl
           } // if stationUrl
        } // if stationData[0]
    } // foreach

    // Passed in Url is in our List so write it out and restart mpg123
    if ($DoIt)
    {
       $file = fopen("/var/www/station","w");
       fwrite($file,$inUrl);
       fclose($file);
       echo shell_exec("/usr/bin/doradio > /dev/null 2>/dev/null &");
    }
?>
*********************************

/var/www/stationlist
*********************************
Antioch ~ http://lin2.ash.fast-serv.com:9022/listen.pls
WTMJ ~ http://1942.live.streamtheworld.com:3690/WTMJAM_SC
*********************************

/var/www/station (be sure to chmod 777 this file)
*********************************
http://lin2.ash.fast-serv.com:9022/listen.pls
*********************************

9) create the script to change the radio station based on their selections:

/usr/bin/doradio (be sure to chmod 755 this file)
*********************************
# Created 7/7/2012 by Gregg Buntin - http://pentiumprime.realmlabs.com/
sudo -uradio killall  mpg123
sudo -uradio /usr/bin/mpg123 -@ `cat /var/www/station` &
*********************************

10) Setup for the Auto Login (vi /etc/inittab)
    find this line and comment it out: 1:2345:respawn:/sbin/getty 115200 tty1
    below it add this line:  1:2345:respawn:/bin/login -f radio tty1 </dev/tty1 >/dev/tty1 2>&1
    save it
    
11) set the user to start the radio on login
    vi /home/radio/.bash_profile  and add the following line
    /usr/bin/doradio
    save it
    
12) setup www-data so it can sudo to the radio user
    vi /etc/sudoers and add the following lines:
        radio ALL=(radio)NOPASSWD:/usr/bin/doradio,/usr/bin/mpg123 *,/usr/bin/killall mpg123
        www-data ALL=(radio)NOPASSWD:/usr/bin/doradio,/usr/bin/mpg123 *,/usr/bin/killall mpg123
    save it
    
13) REBOOT and you are done!

Monday, July 2, 2012

Stuff

Was a pretty productive week last week.  Got my RPi running RBMC working well in the basement and I use the XBMC Android Remote Control published by the XBMC team.

Got 2 more RPis that I have to decide what to do with yet.

Fixed my Wii setup.

Fixed 2 monitors.

And ghosted a 500gb HD to a 1tb HD.

All in all... pretty good.
Copyright Realm Laboratories, LLC