File source
<?php
/** parses www.shmu.sk for weather */
class Shmu extends WeatherSource{
protected $city;
protected $data;
protected $timestamp = false;
protected $validity = 600;
protected $icons = Array(
0 => "",
1 => "01",
2 => "02",
3 => "03",
4 => "10",
5 => "10", //prehanky
6 => "11",
7 => "13",
8 => "13", // sneh s dazdom,
9 => "50", //hmla
10 => "02",
11 => "10",
12 => "02",
13 => "", // snehove prehanky,
14 => "", // nie je
15 =>"03",
16 => "03",
17 => "13"
);
protected $icons_current = Array(
1 => "01",
2 => "02",
3 => "03",
4 => "04",
5 => "50",
6 => "10", // slaby dazd
7 => "10", // silny dazd
8 => "13", //dazd so snehom
9 => "13", //sneh
10 => "13", //slaby sneh
11 => "10", //prehanky
12 => "13", //snehove prehanky
13 => "11", //burka
14 => "11", //blesky
);
protected $substitiute_current = Array(
"TN" => "PN"
);
function __construct($city){
$this->city = $city;
}
function getIcon($status, $time = false){
$suffix = "d";
if($time && Date("H",$time) >= 19 ){
$suffix = "n";
}
return $this->icons[$status].$suffix;
}
function getIconCurrent($status, $time = false){
$suffix = "d";
if($time && Date("H",$time) >= 19 ){
$suffix = "n";
}
return $this->icons_current[$status].$suffix;
}
function getCurrent($city){
if($this->substitiute_current[$city]){
$city = $this->substitiute_current[$city];
}
$page = file_get_contents("http://www.shmu.sk/sk/?page=1&id=meteo_gapocasie_sk");
$data = $this->parseSHMU($page,$city);
$matches = $data["details"];
$text = "";
if(trim($matches[2][3])!="-"){
$text = $matches[2][3].", ";
}
$text.=$matches[2][2];
$r = Array(
"status" => $data["icon"],
"icon" => $this->getIconCurrent($data["icon"], Time()),
"city" => $matches[2][0],
"temp" => intval($matches[2][1]),
"text" => $text,
"wind" => intval($matches[2][4]),
"wind_dir" => $matches[2][5]
);
return $r;
}
function getForecast($city, $date = false){
if(!$date) $date = Time();
$page = file_get_contents("http://www.shmu.sk/sk/?page=1&id=meteo_gpredpoved_sk&day=".Date("Ymd",$date));
$data = $this->parseSHMU($page, $city);
$matches = $data["details"];
return Array(
"status" => $data["icon"],
"icon" => $this->getIcon($data["icon"]),
"city" => $matches[2][0],
"date" => $matches[2][1],
"temp_night"=> intval($matches[2][2]),
"temp" => intval($matches[2][3]),
"text" => $matches[2][4],
"wind" => intval($matches[2][5]),
"wind_dir" => $matches[2][6]
);
}
function parseSHMU($page, $city){
$matches = Array();
preg_match('/HINTS_ITEMS = (\{[^\}]*\})/ms', $page, $matches);
//return $matches[1];
$data = str_replace("'", '"', $matches[1]);
$data = json_decode($data,true);
$w = $data[$city];
preg_match_all("/<p>(.*?)<strong>(.*?)<\/strong>[[:space:]]*<\/p>/ms",$w,$matches);
preg_match("@<img src=\"([^\"]+)\"[^>]+".$city."[^>]+>@ms", $page, $icons);
preg_match("@([0-9]+)\.[a-zA-Z]+$@ms",$icons[1],$icon);
return Array(
"icon" => $icon[1],
"details" => $matches
);
}
function load(){
$today = Time();
return Array(
"current" => $this->getCurrent($this->city),
"0" => $this->getForecast($this->city,$today),
"1" => $this->getForecast($this->city,$today+24),
"2" => $this->getForecast($this->city,$today+48),
"3" => $this->getForecast($this->city,$today+72)
);
}
function getData($type="current"){
if($this->timestamp && $this->timestamp + $this->validity > Time()){
}else{
$this->data = $this->load();
$this->timestamp = Time();
}
return $this->data[$type];
}
}