Author Archives: Mark Headrick

Configured Winamp v5.57 and website to use new Now Playing plug-in.

After upgrading Winamp to its latest version (5.57), the Now Playing v2.1.2 plug-in I was using would cause Winamp to crash every time I closed Winamp which caused none of its settings to be saved. After some googling around I came across Brandon Fuller’s Now Playing: A Winamp Plugin which seemed to do what I needed. It would allow me to FTP a XML file containing information about the last X number of songs I played and would also let me send a HTTP post request to run a PHP script with the current song’s information contained within the $_POST variable. It calls this HTTP request a “ping”.

When this “ping” is sent, my PHP script parses the newly uploaded XML file to create the now playing images and song history (as seen on my Entertainment page), as well as a prepared Twitter message in a separate file should I choose to send a tweet out.

You can also send Twitter and Facebook updates using this plug-in. I’ve only tested it with Twitter and it seems to work; however, I use a separate PHP script to manually Tweet the song I’m currently listening to so I don’t fill my Twitter stream with song spam.

This plug-in does lack a couple things that the older one would do:

  1. Send an album cover image along with the rest of the song’s information in a $_POST variable such as a folder.jpg located in the same directory as the song; however, it will send a link to an Amazon album image if the information matches (sometimes it doesn’t match correctly or just can’t find one). I am working on a mechanism to get around some of these pitfalls by uploading album images and having my script check for the existence of the local album image first.
  2. Work with Shoutcast streams to extract out song information.

Even so, I will continue to use this plug-in for its compatibility and continuing support by the developer. It also seems to be a bit more reliable and stable than what I was using. Yes, I did purchase a license key. 🙂

Blog has been upgraded to WordPress v2.9

I have updated my blog to WordPress v2.9 which was just released. I did the auto upgrade option again which seems to have worked well. Even so, once again I had to edit the /wp-includes/vars.php file to force $is_apache to true (see below) since the SERVER_SOFTWARE variable comes back as WebServerX instead of Apache.

// Server detection

/**
 * Whether the server software is Apache or something else
 * @global bool $is_apache
 */

//$is_apache = ((strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false) || (strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false)) ? true : false;
$is_apache = true;
/**
 * Whether the server software is IIS or something else
 * @global bool $is_IIS
 */

$is_IIS = (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false) ? true : false;

I also had to edit the /wp-login.php file and add session_start(); at the beginning for the Register Plus plug-in to work properly as PHP sessions are not automatically started:

session_start();
/**
 * WordPress User Page

Other than the modifications above, which I have always had to do, the upgrade went smoothly. 🙂

Of course, I did perform a complete database and file backup before upgrading! 🙂

Updated MIDI embedding method on DVD pages.

I’ve updated the method I’m using to embed MIDI files in my DVD pages that had them. A couple of example pages are The Best of Benny Hill and Star Wars I: The Phantom Menace. I am using the JavaScript method that is described at MIDKar.com. It’s basically the same thing I was doing before directly within the page’s code without JavaScript; however, this script now adjusts the code based upon the browser it detects which should make it more compatible.  I did modify their code slightly by adding an optional autostart parameter with a default value of 0 if no value is given so that it does not automatically start playing.  Here’s my modified code:

// This script determines correct code required to embed MEDIA files
// for a large number of browsers, including AOL and WebTV
// Windows Media Player is required and always used, except for WebTV
// Written by Les Gorven, http://midistudio.com/
// Ver. 4.0 (simple) auto-start parameter is true - Created: February 2, 2008
// autostart parameter added by Mark Headrick December 2, 2009

function playMedia(mediaURL,rpt,height,width,autostart) {
var mediaURL,rpt,height,width,autostart;

if (typeof autostart == "undefined") {
   autostart = 0;
}

if (GetBrowser() == "IE")
   playAll(mediaURL,rpt,height,width,autostart) ;  
else if (GetBrowser() == "unknown")
   embedSource(mediaURL,rpt,height,width,autostart) ;
else if (navigator.appName.substring(0,5) == "WebTV")
   embedSource(mediaURL,rpt,height,width,autostart) ;
else
   playAll(mediaURL,rpt,height,width,autostart) ;
}

function embedSource(mediaURL,rpt,height,width,autostart) {

   var CodeGen = "";
   var mediaURL,rpt,height,width,autostart;
         
   CodeGen = '<embed src="' + mediaURL + '"' + '\n' ;
   if (autostart == 0) {
      CodeGen += ' height=' + height + ' width=' + width + ' autostart="false"' + '\n';
   } else {
      CodeGen += ' height=' + height + ' width=' + width + ' autostart="true"' + '\n';
   }
   CodeGen += ' LOOP=' + rpt + '>';
   document.write(CodeGen);
}

function playAll(mediaURL,rpt,height,width,autostart) {
   var CodeGen = "";

   CodeGen = '<embed type="application/x-mplayer2" ' + '\n' ;
   CodeGen += ' pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" ' + '\n' ;
   CodeGen += 'Name="Player" ' + 'src="' + mediaURL + '" ' + '\n' ;
   CodeGen += 'autoStart=' + autostart + ' ' ;
   if ((height == 24) && (width == 299))
      CodeGen = CodeGen + 'ShowStatusBar=1 ';
   if ((height >= 50) && (height <= 75) && (width >= 200))
      CodeGen = CodeGen + 'ShowStatusBar=1 ';
   if ((height > 75) && (width >= 200))
      CodeGen = CodeGen + 'ShowStatusBar=0 ';
   if ((height <= 49) && (width != 299))
      CodeGen += 'ShowStatusBar=0 ';
   CodeGen += 'enableContextMenu=1 cache=0' + '\n' ;
   CodeGen += 'playCount=' + rpt + ' ' ;
   CodeGen += 'volume=-1 ' ;
   CodeGen += 'HEIGHT=' + height + ' WIDTH=' + width + '>' ;
   document.write(CodeGen);
}

function GetBrowser()
{
   var agt=navigator.userAgent.toLowerCase();
   if( ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)) )
       return "IE";
   else if( ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
         && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
         && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)) )
       return "Netscape";
   else
       return "unknown";
}

Within the page itself, I just put the following where I want the player to appear:

   <script type="text/javascript">
   playMedia("/midi/SomeFileToPlay.mid",3,65,300)
   </script>

If I want the song to automatically start playing, then I would change the code to:

   <script type="text/javascript">
   playMedia("/midi/SomeFileToPlay.mid",3,65,300,1)
   </script>

Seems to work well in both Firefox 3.5.5 and Internet Explorer 8. 🙂

Changed method of displaying random Gallery2 image to bypass DNS performance issues

Yeah, I know this probably will not make much sense to most people other than those dealing with something similar.

In the past I had been using PHP’s CURL functionality to obtain and display a random gallery image on both my main website and blog. The code I used was similar to the following:

$ch = curl_init();
$timeout = 10; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, 'http://gallery.markheadrick.com/main.php?g2_view=imageblock.External&g2_blocks=randomImage&g2_linkTarget=_blank&g2_show=title|date|views';);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
if ($file_contents != false) {
   echo $file_contents;
} else {
   echo '
<div class="small">Error, exceeded '
.$timeout.' second connection timeout.</div>

'
."\n";
}

This method worked fine; however, every now and then it would take several seconds to complete causing the webpages to display that much slower. After much investigation from when I started noticing this many months ago, I determined that the delay was being caused by the amount of time it was taking the server to look-up the IP address of gallery.markheadrick.com. I used the following bit of code to test this with:

function getmicrotime()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}

$port_starttime = getmicrotime();
$fp = @fsockopen('gallery.markheadrick.com', 80, $errno, $errstr, 10);
if (!$fp)
{
    echo "Offline ".number_format((getmicrotime() - $port_starttime), 4)." seconds\n";
}
else
{
    echo "Online ".number_format((getmicrotime() - $port_starttime), 4)." seconds\n";
    fclose($fp);
}

All this does is show the amount of time it takes to make a connection. Normally this should be a fraction of a second (0.0843 seconds for example). Well, on occasion this would take 4, 5 or more seconds to complete. If I used the server’s IP address instead of gallery.markheadrick.com, it would always take a fraction of a second (0.0001 seconds). So, the only difference was the system trying to determine what the IP address of gallery.markheadrick.com was. Similar behavior was displayed when I connected to google.com vs its IP address. In order for CURL to work, I had to supply it with gallery.markheadrick.com as the server has many domains and sub-domains associated with the same IP address.

Over time I’ve submitted numerous support tickets concerning this hostname look-up delay as the problem has surfaced, been fixed, and then resurfaced for whatever reason.

A couple days ago it started happening again and I submitted a new support ticket concerning it which more or less went nowhere and told them to just forget about it and close it.

Since my gallery is on the same server as my website and blog, I thought I should be able to obtain an image directly using PHP and MySQL; however, after looking at Gallery2’s database schema, this was going to be more difficult than I had thought. I then wondered if I could simply include some part of the Gallery code that dealt with the ImageBlock code that displays a random image. Then, I wondered if I could just include Gallery’s main PHP file and somehow feed it the variable values it needed to work. The following is what I eventually ended up with:

$_GET['g2_view'] = 'imageblock.External';
$_GET['g2_blocks'] = 'randomImage';
$_GET['g2_show'] = 'title|date|views';
$_GET['g2_linkTarget'] = '_blank';
ob_start();
include_once ($_SERVER['DOCUMENT_ROOT'].'/gallery/main.php');
$gallery_ob = ob_get_contents(); // Gets the contents of the output buffer
ob_end_clean(); // Ends capture and cleans the buffer so that it will not be displayed
$gallery_ob = str_replace('http://www.markheadrick.com/d/','http://gallery.markheadrick.com/d/',$gallery_ob);
$gallery_ob = str_replace('http://www.markheadrick.com/v/','http://gallery.markheadrick.com/v/',$gallery_ob);
echo $gallery_ob;

Hallelujah!! It worked! 🙂 During my search for answers the following two articles/threads helped me out the most: I want “include” to return a string instead of writing directly into the page. and [SOLVED] Get arguments in include function. Because I was including the code under a different sub-domain, it was using the wrong URL for the image and link. This is why I needed to add the two str_replace functions. On my blog, it was trying to load the image from blog.markheadrick.com instead of gallery.markheadrick.com. I also had to increase the amount of memory PHP could use for scripts on my blog from 32M to 64M.