<?php
|
class wp_parse {
|
var $document, $xpath, $context;
|
var $name = '';
|
var $program = array();
|
var $months = array(
|
'stycznia' => 1,
|
'lutego' => 2,
|
'marca' => 3,
|
'kwietnia' => 4,
|
'maja' => 5,
|
'czerwca' => 6,
|
'lipca' => 7,
|
'sierpnia' => 8,
|
'września' => 9,
|
'października' => 10,
|
'listopada' => 11,
|
'grudnia' => 12,
|
);
|
var $weekdays = array(
|
'poniedziałek' => 'next Monday',
|
'wtorek' => 'next Tuesday',
|
'środa' => 'next Wednesday',
|
'czwartek' => 'next Thursday',
|
'piątek' => 'next Friday',
|
'sobota' => 'next Saturday',
|
'niedziela' => 'next Sunday',
|
);
|
|
function __construct(DOMDocument $document) {
|
$this->document = $document;
|
$this->xpath = new DOMXPath($this->document);
|
|
$context = $this->xpath->query('//div[@class="ramowka"]');
|
if($context->length != 1) {
|
throw new Exception('Nie znaleziono ramówki!');
|
}
|
$this->context = $context->item(0);
|
|
$name = $this->xpath->query('.//h2[@class="sh2"]//span//text()', $this->context);
|
if($name->length != 1) {
|
throw new Exception('Nie znaleziono nazwy stacji, błędny HTML.');
|
}
|
$this->name = $name->item(0)->nodeValue;
|
}
|
|
function parse_date($date) {
|
if($date == 'dzisiaj') {
|
// 'dzisiaj'
|
return mktime(0, 0, 0);
|
}
|
elseif(isset($this->weekdays[$date])) {
|
// data przyszła: 'poniedziałek'
|
return strtotime($this->weekdays[$date]);
|
}
|
else
|
{
|
// data przeszła: 'pon. 18 czerwca'
|
$date = explode(' ', $date);
|
if(!isset($this->months[$date[2]])) {
|
throw new Exception('Nie udało się przetworzyć daty ('.$date[2].')');
|
}
|
$timestamp = mktime(0, 0, 0, $this->months[$date[2]], $date[1]);
|
|
// Należy przesunąć się o rok
|
if($timestamp > time()) {
|
$timestamp = strtotime('-1 year', $timestamp);
|
}
|
|
return $timestamp;
|
}
|
}
|
|
function xmltv($id, $fp) {
|
$program = array();
|
|
ini_set('mbstring.substitute_character', 'none');
|
|
$days_dom = $this->xpath->query('.//ul[@class="lsDay"]//li', $this->context);
|
$days = array();
|
foreach($days_dom as $day) {
|
$days[] = $this->parse_date($day->nodeValue);
|
$program[] = array();
|
}
|
unset($days_dom, $day);
|
|
$hours_dom = $this->xpath->query('.//div[@class="hrsOut"]//div[@class="hour"]', $this->context);
|
// Kolejne wiersze (pełne godziny)
|
foreach($hours_dom as $in => $hour) {
|
$days_dom = $this->xpath->query('.//div[@class="col"]', $hour);
|
// Zbiory programów w tych godzinach dla kolejnych dni
|
foreach($days_dom as $num => $day) {
|
$programs_dom = $this->xpath->query('.//div[@class="prog"]', $day);
|
// Kolejne programy w danej godzinie i dniu
|
foreach($programs_dom as $n => $programs) {
|
$godzina = $this->xpath->query('.//div[@class="tm"]', $programs)->item(0)->textContent;
|
$nazwa = $this->xpath->query('.//h3', $programs)->item(0)->textContent;
|
$opis = $this->xpath->query('.//p', $programs)->item(0)->textContent;
|
|
$program[$num][] = array(
|
$godzina,
|
mb_convert_encoding($nazwa, 'UTF-8', 'UTF-8'),
|
mb_convert_encoding($opis, 'UTF-8', 'UTF-8')
|
);
|
}
|
unset($programs_dom, $programs);
|
}
|
unset($days_dom, $day);
|
}
|
unset($hours_dom, $hour, $godzina, $nazwa, $opis);
|
|
fwrite($fp, "\t".'<channel id="'.$id.'">'."\n"
|
."\t\t".'<display-name>'.htmlspecialchars($this->name).'</display-name>'."\n"
|
."\t".'</channel>'."\n");
|
|
$last_timestamp = $timestamp = $days[0];
|
$last_prog = NULL;
|
foreach($program as $day => $dayprog) {
|
foreach($dayprog as $prog) {
|
$timestamp = strtotime($prog[0], $last_timestamp);
|
if($timestamp < $last_timestamp) {
|
$timestamp = strtotime('+1 day', $timestamp);
|
}
|
while($timestamp < $days[$day]) {
|
$timestamp = strtotime('+1 day', $timestamp);
|
}
|
|
if($program !== NULL)
|
fwrite($fp, "\t".'<programme channel="'.$id.'" start="'.date('YmdHis O', $last_timestamp).'"'
|
.' stop="'.date('YmdHis O', $timestamp).'">'."\n"
|
."\t\t".'<title>'.htmlspecialchars($last_prog[1]).'</title>'."\n"
|
."\t\t".'<desc>'.htmlspecialchars($last_prog[2]).'</desc>'."\n"
|
."\t".'</programme>'."\n");
|
|
$last_prog = $prog;
|
$last_timestamp = $timestamp;
|
}
|
}
|
}
|
}
|
?>
|