From 0078935fc140f0124af4ae5104cdd4f1613dc521 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Sun, 08 Jul 2012 19:01:42 +0000
Subject: [PATCH] Poprawka parsowania programu telewizyjnego - filtrowanie znaków UTF-8 ze względu na problemy z kodowaniem na stronach WP

---
 data/lotto/pobierz.php |  111 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 65 insertions(+), 46 deletions(-)

diff --git a/data/lotto/pobierz.php b/data/lotto/pobierz.php
index 2260d8b..2dc91d0 100644
--- a/data/lotto/pobierz.php
+++ b/data/lotto/pobierz.php
@@ -2,9 +2,12 @@
 echo STAR.'Pobieranie danych...';
 
 class lotto {
+	// Zawartość strony http://lotto.pl/wyniki-gier
 	protected $strona = NULL;
 	
+	// Lista gier.
 	protected $gry = array(
+		// nazwa => array(ilość liczb, plus?)
 		'lotto' => array(6, FALSE, 'dl'),
 		'mini-lotto' => array(5, FALSE, 'el'),
 		'kaskada' => array(12, FALSE, 'ka'),
@@ -12,15 +15,21 @@
 		'joker' => array(5, FALSE, 'jk')
 	);
 	
+	// Spróbuj pobrać stronę http://lotto.pl/wyniki-gier
+	// do zmiennej $this->strona z użyciem pliku cache.
 	function __construct() {
 		$cache = 'lotto_cache.txt';
 		
+		// Sprawdź, czy da się skorzystać z pliku cache.
 		if( ( !file_exists($cache) AND !is_writable(dirname($cache)) )
 			OR ( file_exists($cache) AND !(is_writable($cache)) ) ) {
+			// Nie, nie da się.
 			$cache = '';
 		}
 		else
 		{
+			// Tak, da się.
+			// Sprawdź, czy dane są aktualne.
 			if(@filemtime($cache)<strtotime('yesterday 22:45') && time()<=strtotime('14:30')) {
 				$recent = FALSE;
 			}
@@ -34,89 +43,99 @@
 			}
 		}
 		
+		// Dane są nieaktualne, więc pobieramy je ponownie
 		if($cache == '' OR !$recent) {
 			$this->strona = @file_get_contents('http://lotto.pl/wyniki-gier');
 			if(!$this->strona) {
 				throw new Exception('Nie udało się pobrać wyników.');
 			}
 			
+			// Można zapisać do cache'a...
 			if($cache != '') {
+				// ...więc zapamiętujemy arkusz.
 				file_put_contents($cache, $this->strona);
 			}
 		}
 		else
 		{
+			// Dane w cache są aktualne, więc załaduj je.
 			$this->strona = file_get_contents($cache);
 		}
 	}
 	
-	protected function szukaj_poczatku($tresc, $poczatek = 0) {
-		return strpos($this->strona, $tresc, $poczatek);
-	}
-	
-	protected function szukaj_konca($tresc, $poczatek = 0) {
-		$pozycja = strpos($this->strona, $tresc, $poczatek);
-		
-		if($pozycja !== FALSE) {
-			$pozycja += strlen($tresc);
+	// Znajduje w $gdzie ciągi $od i $do, po czym zwraca
+	// treść znajdującą się pomiędzy tymi wartościami.
+	protected function wytnij(&$gdzie, $od, $do, $blad = NULL, &$pozycja = NULL) {
+		if($blad === NULL) {
+			$blad = 'Nie znaleziono wymaganego elementu';
 		}
 		
-		return $pozycja;
+		$start = strpos($gdzie, $od, $pozycja);
+		if($start === FALSE) {
+			throw new Exception($blad);
+		}
+		$start += strlen($od);
+		
+		$stop = strpos($gdzie, $do, $start);
+		if($stop === FALSE) {
+			throw new Exception($blad);
+		}
+		
+		if($pozycja !== NULL) {
+			$pozycja = $stop + strlen($do);
+		}
+		
+		return trim(substr($gdzie, $start, $stop-$start));
 	}
 	
+	// Zwraca wynik gry (domyślnie lotto).
 	function wynik($gra = 'lotto') {
 		$wyniki = $this->wyniki($gra, 1);
 		return $wyniki[0];
 	}
 	
-	function wyniki($gra = 'lotto', $liczba = 100) {
+	// Zwraca $liczba ostatnich wyników gry (domyślnie lotto),
+	// jednak nie więcej niż 5 (tyle jest na stronie Totalizatora).
+	function wyniki($gra = 'lotto', $liczba = 1000) {
 		if(!isset($this->gry[$gra])) {
 			throw new Exception('Podana gra liczbowa nie jest obsługiwana.');
 		}
 		
 		$wyniki = array();
-		$poczatek = $this->szukaj_konca('<div class="start-wyniki_'.$gra.'">');
-		if($poczatek === FALSE) {
-			throw new Exception('Nie znaleziono wyników dla gry '.$gra.' na stronie.');
-		}
+		$dane = $this->wytnij($this->strona, '<div class="start-wyniki_'.$gra.'">',
+		'<div class="start-wyniki_', 'Nie znaleziono na stronie wyników dla gry '.$gra);
 		
-		for($l = 0; $l < $liczba; $l++) {
-			$poczatek = $this->szukaj_konca('<div class="wyniki_data">', $poczatek);
-			if($poczatek === FALSE) {
+		$poz_dane = 0;
+		for($l = 1; $l <= $liczba; $l++) {
+			$data = $this->wytnij($dane, '<div class="wyniki_data">', '</div>',
+				'Nie znaleziono '.$l.'-ej informacji o losowanu gry '.$gra, $poz_dane);
+			
+			$pozycja = 0;
+			$wynik['data'] = $this->wytnij($data, '<strong>', '</strong>',
+				'Nie znaleziono '.$l.'-ej daty losowania gry '.$gra, $pozycja);
+			$wynik['godzina'] = $this->wytnij($data, '<strong>', '</strong>',
+				'Nie znaleziono '.$l.'-ej godziny losowania gry '.$gra, $pozycja);
+			
+			try {
+				$liczby = $this->wytnij($dane, '<div class="glowna_wyniki_'.$gra.'">', "\t".'</div>',
+				'Nie znaleziono na stronie '.$l.'-ch wyników dla gry '.$gra, $poz_dane);
+			}
+			catch(Exception $e) {
 				break;
 			}
 			
-			$wynik = array();
-			
-			$poczatek = $this->szukaj_konca('<strong>', $poczatek);
-			if($poczatek === FALSE) {
-				break;
-			}
-			$koniec = $this->szukaj_poczatku('</strong>', $poczatek);
-			$wynik['data'] = substr($this->strona, $poczatek, $koniec-$poczatek);
-			if($poczatek === FALSE) {
-				break;
-			}
-			$poczatek = $this->szukaj_konca('<strong>', $poczatek);
-			$koniec = $this->szukaj_poczatku('</strong>', $poczatek);
-			$wynik['godzina'] = substr($this->strona, $poczatek, $koniec-$poczatek);
-			
-			$poczatek = $this->szukaj_konca('<div class="glowna_wyniki_'.$gra.'">', $poczatek);
-			if($poczatek === FALSE) {
-				break;
-			}
-			
+			// Pobierz kolejne liczy zawarte pomiędzy <div class="wynik_NAZWAGRY"> a </div>
 			$wynik['liczby'] = array();
+			$pozycja = 0;
 			for($i = 0; $i < $this->gry[$gra][0]; $i++) {
-				$poczatek = $this->szukaj_konca('<div class="wynik_'.$gra.'">', $poczatek);
-				$koniec = $this->szukaj_poczatku('</div>', $poczatek);
-				$wynik['liczby'][] = substr($this->strona, $poczatek, $koniec-$poczatek);
+				$wynik['liczby'][] = $this->wytnij($liczby, '<div class="wynik_'.$gra.'">',
+				'</div>', NULL, $pozycja);
 			}
 			
+			// Szukamy plusa
 			if($this->gry[$gra][1]) {
-				$poczatek = $this->szukaj_konca('<div class="wynik_'.$gra.'_plus">', $poczatek);
-				$koniec = $this->szukaj_poczatku('</div>', $poczatek);
-				$wynik['plus'] = substr($this->strona, $poczatek, $koniec-$poczatek);
+				$wynik['plus'] = $this->wytnij($dane, '<div class="wynik_'.$gra.'_plus">',
+				'</div>', NULL, $poz_dane);
 			}
 			
 			$wyniki[] = $wynik;
@@ -128,7 +147,7 @@
 	function pobierz() {
 		foreach($this->gry as $gra => $data) {
 			echo STAR.'Wyniki gry '.$gra.'...';
-			if($gra == 'multi-multi') {
+			if($gra == 'multimulti') {
 				$wyniki = $this->wyniki($gra, 2);
 				$wynik = $wyniki[0];
 				$skrot = $data[2].substr($wynik['godzina'], 0, 2);
@@ -192,4 +211,4 @@
 echo OK;
 
 $lotto->pobierz();
-?>
+?>
\ No newline at end of file

--
Gitblit v1.9.1