id] = $i++;
}
}
function getSortedSchedules($response) {
$sc = $response->xtvd->schedules->schedule;
$schedules = array();
foreach ($sc as $schedule) {
$schedules[$schedule->program] = $schedule;
}
return $schedules;
}
function getSortedGenres($response) {
$ge = $response->xtvd->genres->programGenre;
$genres = array();
foreach ($ge as $genre) {
$genres[$genre->program] = $genre->genre;
}
return $genres;
}
function getSortedLanguages(&$sortedGenres) {
$languages = array();
foreach ($sortedGenres as $programId => $genres) {
if (is_array($genres)) {
$i = 0;
foreach($genres as $genre) {
if ($genre->class == 'French') {
$languages[$programId] = 'French';
array_splice($genres, $i, 1);
$sortedGenres[$programId] = $genres;
break;
}
$i++;
}
} else if ($genres->class == 'French') {
$languages[$programId] = 'French';
$sortedGenres[$programId] = null;
}
}
return $languages;
}
function getStationsXML($stations, $lineups, $providerId) {
$resultXML = "";
$resultXML .= " \n";
$stationDisplayName = array();
if (file_exists("$providerId.channels")) {
$fp = fopen("$providerId.channels", "r")
or die("Can't open $providerId.channels file for reading.");
while (!feof($fp)) {
$line = ereg_replace("[\r\n]*","",fgets($fp, 1024));
if (ereg("^([0-9]+)\t(.*)$", $line, $regs) !== false) {
$rfId = $regs[1];
$name = $regs[2];
$stationDisplayName[$rfId] = $name;
}
}
fclose($fp);
}
$stationsRFID = array();
$channels = array();
foreach ($lineups as $lineup) {
$stationId = $lineup->station;
$channel = $lineup->channel;
$stationsRFID[$stationId] = $channel;
$channels[$lineup->channel] = $lineup->station;
}
$stationsNames = array();
foreach ($stations as $station) {
$stationsNames[$station->id] = xmlize(isset($stationDisplayName[$stationsRFID[$station->id]]) ? $stationDisplayName[$stationsRFID[$station->id]] : $station->name);
}
ksort($channels);
foreach ($channels as $channel => $stationId) {
$displayName = $stationsNames[$stationId];
$resultXML .= "
".$stationId."
".$displayName."
".$channel."
";
}
$resultXML .= " \n";
return $resultXML;
}
function getProgramsXML($programs, $schedules, $genres, $languages) {
global $newProgramId;
$resultXML = "";
$resultXML .= " \n";
foreach ($programs as $program) {
$resultXML .= "
".$newProgramId[$program->id]."
".durationToRuntime($schedules[$program->id]->duration)."
".xmlize($program->title)."\n";
// Serie
if (isset($program->showType) && $program->showType == 'Series') {
if (isset($program->subtitle)) {
$resultXML .= " ".xmlize($program->subtitle)."\n";
}
if (isset($program->syndicatedEpisodeNumber)) {
$resultXML .= " ".$program->syndicatedEpisodeNumber."\n";
}
$resultXML .= " Y\n";
} else {
$resultXML .= " N\n";
}
if (isset($program->description)) {
$resultXML .= " ".xmlize($program->description)."\n";
} else {
$resultXML .= " \n";
}
if (isset($genres[$program->id])) {
if (is_array($genres[$program->id])) {
$resultXML .= " ".xmlize($genres[$program->id][0]->class)."\n";
} else {
$resultXML .= " ".xmlize($genres[$program->id]->class)."\n";
}
} else {
$resultXML .= " \n";
}
$resultXML .= " Other\n";
if (isset($languages[$program->id])) {
$resultXML .= " ".$languages[$program->id]."\n";
} else {
$resultXML .= " English\n";
}
$resultXML .= " \n";
}
$resultXML .= " \n";
return $resultXML;
}
function getSchedulesXML($schedules) {
global $newProgramId;
$resultXML = "";
$resultXML .= " \n";
foreach ($schedules as $schedule) {
$startTime = convertTimeToStartTime($schedule->time);
$resultXML .= "
".$newProgramId[$schedule->program]."
".$schedule->station."
".$startTime."
".convertTimeDurationToEndTime($startTime, $schedule->duration)."
N\n";
if (isset($schedule->stereo)) {
$resultXML .= " Y\n";
} else {
$resultXML .= " N\n";
}
if (isset($schedule->closeCaptioned)) {
$resultXML .= " Y\n";
} else {
$resultXML .= " N\n";
}
$resultXML .= " \n";
}
$resultXML .= " \n";
return $resultXML;
}
function isExpired($filename) {
global $config;
$cacheExpiration = time() - $config['cacheDays']*24*60*60;
if (file_exists($filename) && filemtime($filename) > $cacheExpiration) {
return false;
}
return true;
}
// Either use the cached data (if less than 24h old), or fetch the data from the Schedules Direct SOAP service.
// Returns: Response object that contains all EPG data.
function getEPGData($providerId) {
global $baseTime, $daysRequested, $config;
$cacheFile = "./cache/$providerId.cache";
chdir($config['localDir']);
if (!isExpired($cacheFile)) {
$fp = fopen($cacheFile,'r')
or die("Can't open provider cache file for reading.");
$serializedResponse = "";
while (!feof($fp)) {
$serializedResponse .= fread($fp, 8192);
}
fclose($fp);
$response = unserialize($serializedResponse);
return $response;
}
$username = $config['sd_access'][$providerId]['username'];
$password = $config['sd_access'][$providerId]['password'];
$client = new SoapClient("http://docs.tms.tribune.com/tech/tmsdatadirect/schedulesdirect/tvDataDelivery.wsdl",
array(
'login' => $username,
'password' => $password,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_DEFLATE
)
);
if (!isset($daysRequested)) {
$daysRequested = 8;
}
if (isset($config['numDaysEPG'])) {
$daysRequested = $config['numDaysEPG'];
}
if (isset($config['providers'][$providerId]['numDaysEPG'])) {
$daysRequested = $config['providers'][$providerId]['numDaysEPG'];
}
$startTime = gmstrftime("%Y-%m-%dT00:00:00Z", $baseTime);
$endTime = gmstrftime("%Y-%m-%dT00:00:00Z", strtotime("+$daysRequested days",time()));
$response = $client->download($startTime, $endTime);
$fp = fopen("./cache/".$providerId.'.cache','w')
or die("Can't open provider cache file for writing.");
fwrite($fp,serialize($response));
fclose($fp);
return $response;
}
// Generates the complete EPG data as a XML file (in TitanTV format)
function parseEPGData($providerId) {
global $stationsXML, $programsXML, $schedulesXML, $baseTime;
global $config, $numStations, $numPrograms, $numSchedules;
$response = getEPGData($providerId);
$stations = $response->xtvd->stations->station;
$lineups = $response->xtvd->lineups->lineup->map;
$stationsXML = getStationsXML($stations, $lineups, $providerId);
$numStations = sizeof($stations);
$programs = $response->xtvd->programs->program;
normalizeProgramId($programs);
$sortedSchedules = getSortedSchedules($response);
$sortedGenres = getSortedGenres($response);
$sortedLanguages = getSortedLanguages($sortedGenres);
$programsXML = getProgramsXML($programs, $sortedSchedules, $sortedGenres, $sortedLanguages);
$numPrograms = sizeof($programs);
$schedules = $response->xtvd->schedules->schedule;
$schedulesXML = getSchedulesXML($schedules);
$numSchedules = sizeof($schedules);
}
function setBaseTime() {
global $baseTime, $baseTimeString, $daysRequested, $config;
$baseTime = strtotime(date("Y-m-d H:i:00",time()));
if (isset($config['tz_correction'])) {
$baseTimeString = gmstrftime("%Y-%m-%d %H:%M:00", strtotime($config['tz_correction']." hours", $baseTime));
} else {
$baseTimeString = gmstrftime("%Y-%m-%d %H:%M:00", $baseTime);
}
if (!isset($daysRequested)) {
$daysRequested = 8;
}
if (isset($_GET['DaysRequested'])) {
$daysRequested = $_GET['DaysRequested'];
}
if (isset($config['numDaysEPG'])) {
$daysRequested = $config['numDaysEPG'];
}
}
?>