Jacek Kowalski
2012-07-08 a29a9307065a3582a6317f9bd27e6d009ec1623e
commit | author | age
8091b1 1 <?php
JK 2 class wp_parse {
3     var $document, $xpath, $context;
4     var $name = '';
5     var $program = array();
6     var $months = array(
7             'stycznia' => 1,
8             'lutego' => 2,
9             'marca' => 3,
10             'kwietnia' => 4,
11             'maja' => 5,
12             'czerwca' => 6,
13             'lipca' => 7,
14             'sierpnia' => 8,
15             'września' => 9,
16             'października' => 10,
17             'listopada' => 11,
18             'grudnia' => 12,
19         );
20     var $weekdays = array(
21             'poniedziałek' => 'next Monday',
22             'wtorek' => 'next Tuesday',
23             'środa' => 'next Wednesday',
24             'czwartek' => 'next Thursday',
25             'piątek' => 'next Friday',
26             'sobota' => 'next Saturday',
27             'niedziela' => 'next Sunday',
28         );
29     
30     function __construct(DOMDocument $document) {
31         $this->document = $document;
32         $this->xpath = new DOMXPath($this->document);
33         
34         $context = $this->xpath->query('//div[@class="ramowka"]');
35         if($context->length != 1) {
36             throw new Exception('Nie znaleziono ramówki!');
37         }
38         $this->context = $context->item(0);
39         
40         $name = $this->xpath->query('.//h2[@class="sh2"]//span//text()', $this->context);
41         if($name->length != 1) {
42             throw new Exception('Nie znaleziono nazwy stacji, błędny HTML.');
43         }
44         $this->name = $name->item(0)->nodeValue;
45     }
46     
47     function parse_date($date) {
48         if($date == 'dzisiaj') {
49             // 'dzisiaj'
50             return mktime(0, 0, 0);
51         }
52         elseif(isset($this->weekdays[$date])) {
53             // data przyszła: 'poniedziałek'
54             return strtotime($this->weekdays[$date]);
55         }
56         else
57         {
58             // data przeszła: 'pon. 18 czerwca'
59             $date = explode(' ', $date);
60             if(!isset($this->months[$date[2]])) {
61                 throw new Exception('Nie udało się przetworzyć daty ('.$date[2].')');
62             }
63             $timestamp = mktime(0, 0, 0, $this->months[$date[2]], $date[1]);
64             
65             // Należy przesunąć się o rok
66             if($timestamp > time()) {
67                 $timestamp = strtotime('-1 year', $timestamp);
68             }
69             
70             return $timestamp;
71         }
72     }
73     
74     function xmltv($id, $fp) {
75         $program = array();
76         
007893 77         ini_set('mbstring.substitute_character', 'none');
JK 78         
8091b1 79         $days_dom = $this->xpath->query('.//ul[@class="lsDay"]//li', $this->context);
JK 80         $days = array();
81         foreach($days_dom as $day) {
82             $days[] = $this->parse_date($day->nodeValue);
83             $program[] = array();
84         }
85         unset($days_dom, $day);
86         
87         $hours_dom = $this->xpath->query('.//div[@class="hrsOut"]//div[@class="hour"]', $this->context);
88         // Kolejne wiersze (pełne godziny)
89         foreach($hours_dom as $in => $hour) {
90             $days_dom = $this->xpath->query('.//div[@class="col"]', $hour);
91             // Zbiory programów w tych godzinach dla kolejnych dni
92             foreach($days_dom as $num => $day) {
93                 $programs_dom = $this->xpath->query('.//div[@class="prog"]', $day);
94                 // Kolejne programy w danej godzinie i dniu
95                 foreach($programs_dom as $n => $programs) {
96                     $godzina = $this->xpath->query('.//div[@class="tm"]', $programs)->item(0)->textContent;
97                     $nazwa = $this->xpath->query('.//h3', $programs)->item(0)->textContent;
98                     $opis = $this->xpath->query('.//p', $programs)->item(0)->textContent;
99                     
007893 100                     $program[$num][] = array(
JK 101                         $godzina,
102                         mb_convert_encoding($nazwa, 'UTF-8', 'UTF-8'),
103                         mb_convert_encoding($opis, 'UTF-8', 'UTF-8')
104                     );
8091b1 105                 }
JK 106                 unset($programs_dom, $programs);
107             }
108             unset($days_dom, $day);
109         }
110         unset($hours_dom, $hour, $godzina, $nazwa, $opis);
111         
112         fwrite($fp, "\t".'<channel id="'.$id.'">'."\n"
113             ."\t\t".'<display-name>'.htmlspecialchars($this->name).'</display-name>'."\n"
114             ."\t".'</channel>'."\n");
115         
116         $last_timestamp = $timestamp = $days[0];
117         $last_prog = NULL;
118         foreach($program as $day => $dayprog) {
119             foreach($dayprog as $prog) {
120                 $timestamp = strtotime($prog[0], $last_timestamp);
121                 if($timestamp < $last_timestamp) {
122                     $timestamp = strtotime('+1 day', $timestamp);
123                 }
124                 while($timestamp < $days[$day]) {
125                     $timestamp = strtotime('+1 day', $timestamp);
126                 }
127
128                 if($program !== NULL) 
129                     fwrite($fp, "\t".'<programme channel="'.$id.'" start="'.date('YmdHis O', $last_timestamp).'"'
130                         .' stop="'.date('YmdHis O', $timestamp).'">'."\n"
131                         ."\t\t".'<title>'.htmlspecialchars($last_prog[1]).'</title>'."\n"
132                         ."\t\t".'<desc>'.htmlspecialchars($last_prog[2]).'</desc>'."\n"
133                         ."\t".'</programme>'."\n");
134                 
135                 $last_prog = $prog;
136                 $last_timestamp = $timestamp;
137             }
138         }
139     }
140 }
007893 141 ?>