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']; } } ?>