Midterm

October 18, 2007

So, I did an NHL score retrieval system, using asterisk, PHP, XML, and Festival.

Here’s the code, using Shawn’s XML parser code:

#!/usr/local/bin/php -q
<?PHP
require(‘/var/lib/asterisk/agi-bin/phpagi.php’);

// Create an AGI Object
$agi = new AGI();

class Myxml
{
var $tag;
var $value;
var $attributes;
var $next;

function xml2array($xml_string)
{
$Parser = xml_parser_create();
xml_parser_set_option($Parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($Parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($Parser, $xml_string, $Xml_Values);
xml_parser_free($Parser);
$XmlClass = array();
$LastObj = array();
$NowObj = &$XmlClass;

foreach($Xml_Values as $Xml_Key => $Xml_Value)
{
$Index = count($NowObj);
if ($Xml_Value[“type”] == “complete”)
{
$NowObj[$Index] = new Myxml;

if (isset($Xml_Value[“tag”]))
{
$NowObj[$Index]->tag = $Xml_Value[“tag”];
}
else
{
$NowObj[$Index]->tag = “”;
}

if (isset($Xml_Value[“value”]))
{
$NowObj[$Index]->value = $Xml_Value[“value”];
}
else
{
$NowObj[$Index]->value = “”;
}

if (isset($Xml_Value[“attributes”]))
{
$NowObj[$Index]->attributes = $Xml_Value[“attributes”];
}
else
{
$NowObj[$Index]->attributes = “”;
}
}
else if ($Xml_Value[“type”] == “open”)
{
$NowObj[$Index] = new Myxml;

if (isset($Xml_Value[“tag”]))
{
$NowObj[$Index]->tag = $Xml_Value[“tag”];
}
else
{
$NowObj[$Index]->tag = “”;
}

if (isset($Xml_Value[“value”]))
{
$NowObj[$Index]->value = $Xml_Value[“value”];
}
else
{
$NowObj[$Index]->value = “”;
}

if (isset($Xml_Value[“attributes”]))
{
$NowObj[$Index]->attributes = $Xml_Value[“attributes”];
}
else
{
$NowObj[$Index]->attributes = “”;
}

$NowObj[$Index]->next = array();
$LastObj[count($LastObj)] = &$NowObj;
$NowObj = &$NowObj[$Index]->next;
}
else if ($Xml_Value[“type”] == “close”)
{
$NowObj = &$LastObj[count($LastObj) – 1];
unset($LastObj[count($LastObj) – 1]);
}
}
return $XmlClass;
}

function findElementByAttribute($xmlArray,$attribute_name,$attribute_value)
{
if (sizeof($xmlArray) > 0)
{
for ($i = 0; $i < sizeof($xmlArray); $i++)
{
if (is_array($xmlArray[$i]->attributes))
{
$attributes = $xmlArray[$i]->attributes;

foreach($attributes as $name => $value)
{
//echo $name . ” ” . $value . “\n”;
if ($name == $attribute_name && $value == $attribute_value)
{
return $xmlArray[$i];
}
}
}

if (isset($xmlArray[$i]->next))
{
$possible = findElementByAttribute($xmlArray[$i]->next,$attribute_name,$attribute_value);
if ($possible !== false)
{
return $possible;
}
}
}
}
else if (isset($xmlArray[0]->next))
{
//echo “really here”;
$possible = findElementByAttribute($xmlArray[0]->next,$attribute_name,$attribute_value);
if ($possible !== false)
{
return $possible;
}
}
return false;
}

/*function findElementByTag($xmlArray,$element)
{
//echo “looking for $element”;

if (sizeof($xmlArray) > 0)
{
for ($i = 0; $i < sizeof($xmlArray); $i++)
{
//echo “here”;
//echo “does ” . $xmlArray[$i]->tag . ” == ” . $element . “\n”;

if ($xmlArray[$i]->tag == $element)
{
return $xmlArray[$i];
}
else if (isset($xmlArray[$i]->next))
{
$possible = $this->findElementByTag($xmlArray[$i]->next,$element);
if ($possible !== false)
{
return $possible;
}
}
}
}
else if (isset($xmlArray[0]->next))
{
//echo “really here”;
$possible = $this->findElementByTag($xmlArray[0]->next,$element);
if ($possible !== false)
{
return $possible;
}
}
return false;
}*/

function findElementsByTag($xmlArray,$element)
{
//echo “Looking for ” . $element . “\n”;

$return_elements = array();

if (sizeof($xmlArray) > 0)
{
//echo “Size is greater than 0\n”;

for ($i = 0; $i < sizeof($xmlArray); $i++)
{
//echo “does ” . $xmlArray[$i]->tag . ” == ” . $element . “\n”;

if ($xmlArray[$i]->tag == $element)
{
$return_elements[sizeof($return_elements)] = $xmlArray[$i];
}
else if (isset($xmlArray[$i]->next))
{
$possible = $this->findElementsByTag($xmlArray[$i]->next,$element);
if (is_array($possible))
{
$return_elements = array_merge($return_elements,$possible);
}
}
}
}
else if (isset($xmlArray[0]->next))
{
//echo “Going to next \n”;

$possible = $this->findElementsByTag($xmlArray[0]->next,$element);
if (is_array($possible))
{
$return_elements = $possible;
}
}
return $return_elements;
}
}

exec(“echo ‘Robo Man is getting the scores from totally scored dot com’ | /usr/bin/text2wave -scale 1.5 -F 8000 -o /tmp/temp.wav”);
$agi->stream_file(“/tmp/temp”);

//$scores = array();

// Using Snoopy
// http://sourceforge.net/projects/snoopy/
//curl_setopt($ch, CURLOPT_URL, “http://feeds.feedburner.com/unmediated/&#8221;);
include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->fetch(“http://www.totallyscored.com/rss/team/10/&#8221;);

exec(“echo ‘Robo man has got the feed and is parsing the scores’ | /usr/bin/text2wave -scale 1.5 -F 8000 -o /tmp/temp.wav”);
$agi->stream_file(“/tmp/temp”);

// Myxml defined above
$myxml = new Myxml();
$xml = $myxml->xml2array($snoopy->results);

$scores = $myxml->findElementsByTag($xml,”title”);

// For debugging
for ($i = 0; $i < sizeof($scores); $i++)
{
$score = $scores[$i]->value;
// echo “Was $score”;
//$score = preg_replace(‘/^\*$|^NHL$/’,””,$score);
$score = str_replace(“(NHL)”,””,$score);
$score = str_replace(“*”,””,$score);
$scores[$i]->value = $score;
// echo “now ” . $scores[$i]->value;
}

//$newScores = preg_replace(‘^\*$|^NHL$’, ‘/s’, $scores);

/*
exec(“echo ‘Robo man is preparing to speak the scores’ | /usr/bin/
text2wave -scale 1.5 -F 8000 -o /tmp/temp.wav”);
$agi->stream_file(“/tmp/temp”);

for ($i = 0; $i < sizeof($scores) && $i < 1; $i++)
{
$current_score = $scores[1]->value;
exec(“echo ‘$current_score’ | /usr/bin/text2wave -scale 1.5 -F 8000 –
o /tmp/temp.wav”);
$agi->stream_file(“/tmp/temp”);
}

*/

// For debugging
//for ($i = 0; $i < sizeof($headlines); $i++)
//{
//var_dump($headlines[$i]);
//echo “\n”;
//$title = $item[$s]->value;
//$scores[sizeof($scores)] = preg_replace(‘/[^0-9a-z\s\.]/i’,””,$scores[sizeof($scores)]);
//}

//$newScores = preg_replace(‘^\*$|^NHL$’, ‘/s’, $scores);

exec(“echo ‘Robo man is preparing to speak the scores’ | /usr/bin/text2wave -scale 1.5 -F 8000 -o /tmp/temp.wav”);
$agi->stream_file(“/tmp/temp”);

for ($i = 0; $i < sizeof($scores) && $i < 1; $i++)
{
$current_score = $scores[1]->value;
exec(“echo ‘$current_score’ | /usr/bin/text2wave -scale 1.5 -F 8000 -o /tmp/temp.wav”);
$agi->stream_file(“/tmp/temp”);
}

exit(0);
?>

More to come on the development and future plans and such.

Leave a comment