Browse Source

Correction du traitement de la date avec weather (énième!)

Suppression du service Yahoo qui a toujours été indigent et qui aujourd'hui ne fonctionne plus.
v2
eric@smellup.net 6 years ago
parent
commit
baa502e89a
  1. 3
      demo/rainette.html
  2. 1
      inc/charger_meteo.php
  3. 4
      inc/rainette_debusquer.php
  4. 2
      lang/paquet-rainette_fr.php
  5. 2
      lang/rainette_fr.php
  6. 2
      paquet.xml
  7. 8
      services/weather.php
  8. 240
      services/yahoo.php

3
demo/rainette.html

@ -64,8 +64,7 @@
'weather', 'FRXX0076',
'owm', 'Paris,Fr',
'wwo', 'Paris,France',
'wunderground', 'Paris,France',
'yahoo', '615702'}}
'wunderground', 'Paris,France'}}
#SET{lieu, #ENV{ville, #GET{jeu/#GET{service}}}}
<body>

1
inc/charger_meteo.php

@ -21,7 +21,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
* - 'weather' pour le weather.com, la valeur par défaut
* - 'wwo' pour World Weather Online
* - 'wunderground' pour Wunderground
* - 'yahoo' pour Yahoo! Weather
* - 'owm' pour Open Weather Map
*
* @return string

4
inc/rainette_debusquer.php

@ -84,8 +84,8 @@ function rainette_dbg_comparer_services($mode='conditions', $jeu=array()) {
'weather' => 'FRXX0076',
'owm' => 'Paris,Fr',
'wwo' => 'Paris,France',
'wunderground' => 'Paris,France',
'yahoo' => '615702');
'wunderground' => 'Paris,France'
);
// Recuperation du tableau des conditions courantes
foreach($jeu as $_service => $_lieu) {

2
lang/paquet-rainette_fr.php

@ -13,7 +13,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// R
'rainette_description' => 'Cette nouvelle version de Rainette permet de choisir son service météo parmi weather.com, Wunderground, World Weather Online, Open Weather Map ou Yahoo. Une configuration est disponible pour chaque service en particulier pour saisir une clé d\'enregistrement. Les affichages proposées par cette version sont incompatibles avec ceux de la branche v1.
'rainette_description' => 'Cette nouvelle version de Rainette permet de choisir son service météo parmi weather.com, Wunderground, World Weather Online ou Open Weather Map. Une configuration est disponible pour chaque service en particulier pour saisir une clé d\'enregistrement. Les affichages proposées par cette version sont incompatibles avec ceux de la branche v1.
Ce plugin permet d\'afficher les conditions et les prévisions météorologiques d\'une ville donnée à partir du flux xml fourni par un des services méteorologiques supportés.
Il ne stocke aucune information en base de données ni ne gère le choix des villes.

2
lang/rainette_fr.php

@ -54,7 +54,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'info_utilisation_owm' => 'Le service fournit gratuitement les données météorologiques sous licence CC-BY-SA 2.0 pour une utilisation commerciale ou pas. Il est demandé de créditer le service avec un lien vers le site web. Pour consulter les termes exacts d\'utilisation veuillez vous rendre sur la page <a href="http://openweathermap.org/copyright">Terms and Conditions</a>.',
'info_utilisation_wwo' => 'Le service fournit gratuitement les données météorologiques pour une utilisation commerciale ou pas. Il est demandé de créditer le service avec un lien vers le site web. Pour consulter les termes exacts d\'utilisation veuillez vous rendre sur la page <a href="http://developer.worldweatheronline.com/api_terms_and_conditions">API Terms and Conditions</a>.',
'info_utilisation_wunderground' => 'Le service fournit gratuitement les données météorologiques. Il est demandé de créditer le service avec le nom et le logo du service. Pour consulter les termes exacts d\'utilisation veuillez vous rendre sur la page <a href="http://www.wunderground.com/weather/api/d/terms.html">Weather API Terms of Service</a>.',
'info_utilisation_yahoo' => 'Le service fournit gratuitement les données météorologiques pour les usages personnel et à but non lucratif. Il est demandé de créditer le service avec le nom du service ou le logo. Pour consulter les termes exacts d\'utilisation veuillez vous rendre sur la page <a href="http://developer.yahoo.com/weather/#terms">Terms of Use</a>.',
'info_configurer_theme' => 'Choisissez le thème d\'icônes utilisé dans les affichages.',
'info_page_configurer' => 'Rainette propose une configuration pour chacun des services de météorologie intégré au plugin. Néanmoins, seuls les services utilisés dans votre site nécessitent d\'être configurés.',
'info_credits' => 'Données fournies par @service@',
@ -231,7 +230,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'titre_service_weather' => 'weather.com&reg;',
'titre_service_wwo' => 'World Weather Online',
'titre_service_wunderground' => 'Weather Underground',
'titre_service_yahoo' => 'Yahoo! Weather',
'titre_page_configurer' => 'Configuration du plugin Rainette',
// U

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="rainette"
categorie="divers"
version="2.3.2"
version="2.4.0"
etat="stable"
compatibilite="[3.0.11;3.1.*]"
logo="rainette-64.png"

8
services/weather.php

@ -76,8 +76,8 @@ function weather_flux2previsions($flux, $lieu) {
// Certaines abréviations de fuseau ne sont pas reconnues par date_create suivant la configuration du serveur
// http. On supprime cette information avant le date_create qui produit un timezone erroné mais qui ne genera
// pas le format ensuite.
$elements_date = explode(' ', $date_service);
if (!$date_maj = date_create($date_service)) {
$elements_date = explode(' ', $date_service);
array_pop($elements_date);
$date_service = implode(' ', $elements_date);
$date_maj = date_create($date_service);
@ -99,8 +99,7 @@ function weather_flux2previsions($flux, $lieu) {
// Date complete des lever/coucher du soleil
list($heure,$am_pm) = explode(' ', $p['sunr'][0]);
list($heure, $minute) = explode(':', $heure);
$minute = strval($minute);
$heure = ($am_pm == 'PM') ? strval($heure) + 12 : strval($heure);
$heure = ($am_pm == 'PM') ? strval(intval($heure) + 12) : $heure;
$interval = new DateInterval("PT${heure}H${minute}M");
$date_soleil = clone $date_prevision;
date_add($date_soleil, $interval);
@ -108,8 +107,7 @@ function weather_flux2previsions($flux, $lieu) {
list($heure,$am_pm) = explode(' ', $p['suns'][0]);
list($heure, $minute) = explode(':', $heure);
$minute = strval($minute);
$heure = ($am_pm == 'PM') ? strval($heure) + 12 : strval($heure);
$heure = ($am_pm == 'PM') ? strval(intval($heure) + 12) : $heure;
$interval = new DateInterval("PT${heure}H${minute}M");
$date_soleil = clone $date_prevision;
date_add($date_soleil, $interval);

240
services/yahoo.php

@ -1,240 +0,0 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_RAINETTE_YAHOO_URL_BASE'))
define('_RAINETTE_YAHOO_URL_BASE', 'http://weather.yahooapis.com/forecastrss');
if (!defined('_RAINETTE_YAHOO_JOURS_PREVISIONS'))
define('_RAINETTE_YAHOO_JOURS_PREVISIONS', 5);
function yahoo_service2cache($lieu, $mode) {
$dir = sous_repertoire(_DIR_CACHE, 'rainette');
$dir = sous_repertoire($dir, 'yahoo');
$f = $dir . strtoupper($lieu) . "_" . $mode . ".txt";
return $f;
}
function yahoo_service2url($lieu, $mode) {
include_spip('inc/config');
$unite = lire_config('rainette/yahoo/unite', 'm');
$url = _RAINETTE_YAHOO_URL_BASE . '?w=' . $lieu
. '&u=' . ($unite == 'm' ? 'c' : 'f');
return $url;
}
function yahoo_service2reload_time($mode) {
static $reload = array('conditions' => 3600, 'previsions' => 7200);
return $reload[$mode];
}
function yahoo_url2flux($url) {
include_spip('inc/rainette_phraser');
$flux = url2flux_xml($url, true);
return $flux;
}
/**
* lire le xml fournit par le service meteo et en extraire les infos interessantes
* retournees en tableau jour par jour
* utilise le parseur xml de Spip
*
* ne gere pas encore le jour et la nuit de la date courante suivant l'heure!!!!
* @param array $flux
* @return array
*/
function yahoo_flux2previsions($flux, $lieu) {
$tableau = array();
$index = 0;
if (isset($flux['children']['channel'][0]['children']['item'][0]['children']['yweather:forecast'])) {
$previsions = $flux['children']['channel'][0]['children']['item'][0]['children']['yweather:forecast'];
foreach ($previsions as $_index => $_prevision) {
if (isset($_prevision['attributes'])) {
$_prevision = $_prevision['attributes'];
// 1- Identifiants du jour : index dans le tableau et la date
$tableau[$_index]['index'] = $_index;
$tableau[$_index]['date'] = (isset($_prevision['date'])) ? date('Y-m-d', strtotime($_prevision['date'])) : '';
$tableau[$_index]['periode'] = 0;
// 2 Données astronomiques
$tableau[$_index]['lever_soleil'] = NULL;
$tableau[$_index]['coucher_soleil'] = NULL;
// 3- Prévisions pour le jour
$tableau[$_index][0]['temperature_max'] = (isset($_prevision['high'])) ? floatval($_prevision['high']) : '';
$tableau[$_index][0]['temperature_min'] = (isset($_prevision['low'])) ? floatval($_prevision['low']) : '';
$tableau[$_index][0]['vitesse_vent'] = NULL;
$tableau[$_index][0]['angle_vent'] = NULL;
$tableau[$_index][0]['direction_vent'] = NULL;
$tableau[$_index][0]['precipitation'] = NULL;
$tableau[$_index][0]['risque_precipitation'] = NULL;
$tableau[$_index][0]['humidite'] = NULL;
$tableau[$_index][0]['code_meteo'] = (isset($_prevision['code'])) ? intval($_prevision['code']) : '';
$tableau[$_index][0]['icon_meteo'] = NULL;
$tableau[$_index][0]['desc_meteo'] = NULL;
$tableau[$_index][0]['icone'] = $tableau[$_index][0]['code_meteo'];
$tableau[$_index][0]['resume'] = $tableau[$_index][0]['code_meteo'];
// 4- Prévisions pour la nuit
$tableau[$_index][1] = NULL;
}
}
// Date de la mise à jour des prévisions
// -- comme toutes les informations communes elles sont stockées dans un index supplémentaire en fin de tableau
$index = count($tableau);
if ($tableau) {
if (isset($flux['children']['channel'][0]['children']['lastbuilddate'][0]['text'])) {
$date_maj = isset($flux['children']['channel'][0]['children']['lastbuilddate'][0]['text'])
? strtotime($flux['children']['channel'][0]['children']['lastbuilddate'][0]['text'])
: '';
$tableau[$index]['derniere_maj'] = date('Y-m-d H:i:s', $date_maj);
}
// On stocke le nombre max de jours de prévisions pour le service
$tableau[$index]['max_jours'] = _RAINETTE_YAHOO_JOURS_PREVISIONS;
}
}
// Traitement des erreurs de flux
$tableau[$index]['erreur'] = (!$tableau) ? 'chargement' : '';
return $tableau;
}
function yahoo_flux2conditions($flux, $lieu) {
static $tendance = array(0 => 'steady', 1 => 'rising', 2 => 'falling');
$tableau = array();
include_spip('inc/rainette_convertir');
if (isset($flux['children']['channel'][0]['children']['yweather:wind'][0]['attributes'])) {
$conditions = $flux['children']['channel'][0]['children']['yweather:wind'][0]['attributes'];
// 1- Données anémométriques : vitesse, angle et direction (16 valeurs)
// --- la direction est calculée car la valeur du service est en anglais
$tableau['vitesse_vent'] = (isset($conditions['speed'])) ? floatval($conditions['speed']) : '';
$tableau['angle_vent'] = (isset($conditions['direction'])) ? intval($conditions['direction']) : '';
$tableau['direction_vent'] = (isset($conditions['direction'])) ? angle2direction($tableau['angle_vent']) : '';
$tableau['temperature_ressentie'] = (isset($conditions['chill'])) ? floatval($conditions['chill']) : '';
}
if (isset($flux['children']['channel'][0]['children']['item'][0]['children']['yweather:condition'][0]['attributes'])) {
$conditions = $flux['children']['channel'][0]['children']['item'][0]['children']['yweather:condition'][0]['attributes'];
// 2- Données d'observation : date et station
// --- la station n'est pas précisée par le service
$date_maj = (isset($conditions['date'])) ? strtotime($conditions['date']) : '';
$tableau['derniere_maj'] = date('Y-m-d H:i:s', $date_maj);
$tableau['station'] = NULL;
// 3- Températures : réelle et ressentie
// --- La température ressentie est dans les données anémométriques
$tableau['temperature_reelle'] = (isset($conditions['temp'])) ? floatval($conditions['temp']) : '';
// 4- Etat météorologique natif : code, icône et résumé
// Ces données sont stockées à titre conservatoire mais ne sont pas utilisées dans les modèles v2
// --- le code météo est le même que celui de Weather ce qui permet d'utiliser les mêmes icônes
// --- Il n'y a pas d'icône proposé par le service
// --- la description n'est pas utilisée car toujours en anglais. On utilise le code méteo
$tableau['code_meteo'] = (isset($conditions['code'])) ? intval($conditions['code']) : '';
$tableau['icon_meteo'] = NULL;
$tableau['desc_meteo'] = (isset($conditions['text'])) ? $conditions['text'] : '';
// 5- Etat météorologique calculé : icône et résumé
// La traduction du resume dans la bonne langue est toujours faite par les fichiers de langue SPIP
// car l'API ne permet pas de choisir la langue. On ne stocke donc que le code meteo
// --- icone et resume sont les données utilisées par les modèles v2
$tableau['icone'] = $tableau['code_meteo'];
$tableau['resume'] = $tableau['code_meteo'];
// --- La période jour/nuit n'est pas supportée par ce service car il n'y a pas de jeux d'icônes
// fonction de la période. Mais il est possible de la déterminer suivant l'heure de l'observation
// pour souci de cohérence avec les autres services mais elle ne sera pas utilisée pour l'instant
// TODO : determiner la periode jour ou nuit
$tableau['periode'] = NULL;
}
if (isset($flux['children']['channel'][0]['children']['yweather:atmosphere'][0]['attributes'])) {
$conditions = $flux['children']['channel'][0]['children']['yweather:atmosphere'][0]['attributes'];
// 6- Données atmosphériques : humidité, point de rosée, pression et visibilité
// --- pas de point de rosée fourni par le service
// --- la tendance barométrique du service est convertie en texte comme pour les autres services
$tableau['humidite'] = (isset($conditions['humidity'])) ? intval($conditions['humidity']) : '';
$tableau['point_rosee'] = NULL;
$tableau['pression'] = (isset($conditions['pressure'])) ? floatval($conditions['pressure']) : '';
$tableau['tendance_pression'] = (isset($conditions['rising'])) ? $tendance[intval($conditions['rising'])] : '';
$tableau['visibilite'] = (isset($conditions['visibility'])) ? floatval($conditions['visibility']) : '';
}
// Traitement des erreurs de flux
$tableau['erreur'] = (!$tableau) ? 'chargement' : '';
return $tableau;
}
function yahoo_flux2infos($flux, $lieu){
$tableau = array();
if (isset($flux['children']['channel'][0]['children']['yweather:location'][0]['attributes'])) {
$infos = $flux['children']['channel'][0]['children']['yweather:location'][0]['attributes'];
// 1- Appelation du lieu et de sa région
$tableau['ville'] = $infos['city'];
$tableau['ville'] .= (isset($infos['country'])) ? ', ' . $infos['country'] : '';
$tableau['region'] = (isset($infos['region'])) ? $infos['region'] : '';
if (isset($flux['children']['channel'][0]['children']['item'][0]['children'])) {
$infos = $flux['children']['channel'][0]['children']['item'][0]['children'];
// 2- Informations géographiques sur le lieu
// --- la population et la zone DVD ne sont pas fournies par ce service
$tableau['longitude'] = (isset($infos['geo:long'])) ? floatval($infos['geo:long'][0]['text']) : '';
$tableau['latitude'] = (isset($infos['geo:lat'])) ? floatval($infos['geo:lat'][0]['text']) : '';
$tableau['population'] = NULL;
}
// Ajout du nombre de jours max de prévisions
$tableau['max_previsions'] = _RAINETTE_YAHOO_JOURS_PREVISIONS;
}
// Traitement des erreurs de flux
$tableau['erreur'] = (!$tableau) ? 'chargement' : '';
return $tableau;
}
function yahoo_service2credits() {
$credits['titre'] = NULL;
$credits['logo'] = NULL;
$credits['lien'] = 'http://weather.yahoo.com/';
return $credits;
}
?>
Loading…
Cancel
Save