source: spip-zone/_plugins_/rainette/trunk/services/wunderground.php @ 91455

Last change on this file since 91455 was 91455, checked in by eric@…, 6 years ago

Correction des prévisions wwo qui ne fonctionnaent plus depuis un changement dans l'API wwo (c'est récurrent et on est jamais prévenu).
En outre, début de refactoring du plugin pour augmenter le niveau de configuration des services et limiter le code redondant et lourdingue.
On commence par wwo en mode infos et conditions.

  • Property svn:eol-style set to native
File size: 33.8 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des constantes et fonctions implémentant le service Open Weather Map (owm).
4 * Ce service fournit des données au format XML ou JSON.
5 *
6 * @package SPIP\RAINETTE\WUNDERGROUND
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11if (!defined('_RAINETTE_WUNDERGROUND_URL_BASE_REQUETE'))
12        define('_RAINETTE_WUNDERGROUND_URL_BASE_REQUETE', 'http://api.wunderground.com/api');
13if (!defined('_RAINETTE_WUNDERGROUND_URL_BASE_ICONE'))
14        define('_RAINETTE_WUNDERGROUND_URL_BASE_ICONE', 'http://icons.wxug.com/i/c');
15if (!defined('_RAINETTE_WUNDERGROUND_JOURS_PREVISIONS'))
16        define('_RAINETTE_WUNDERGROUND_JOURS_PREVISIONS', 10);
17if (!defined('_RAINETTE_WUNDERGROUND_SUFFIXE_METRIQUE'))
18        define('_RAINETTE_WUNDERGROUND_SUFFIXE_METRIQUE', 'c:mb:km:kph:metric|celsius:mm:kph');
19if (!defined('_RAINETTE_WUNDERGROUND_SUFFIXE_STANDARD'))
20        define('_RAINETTE_WUNDERGROUND_SUFFIXE_STANDARD', 'f:in:mi:mph:in|farenheit:in:mph');
21if (!defined('_RAINETTE_WUNDERGROUND_LANGUE_DEFAUT'))
22        define('_RAINETTE_WUNDERGROUND_LANGUE_DEFAUT', 'FR');
23
24
25/**
26 * ------------------------------------------------------------------------------------------------
27 * Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
28 * unique de chargement des données météorologiques `charger_meteo()`.
29 * PACKAGE SPIP\RAINETTE\WUNDERGROUND\API
30 * ------------------------------------------------------------------------------------------------
31 */
32
33
34/**
35 * @param $lieu
36 * @param $mode
37 * @return string
38 */
39function wunderground_service2cache($lieu, $mode) {
40        include_spip('inc/config');
41        $condition = lire_config('rainette/wunderground/condition');
42        $langue = $GLOBALS['spip_lang'];
43
44        $dir = sous_repertoire(_DIR_CACHE, 'rainette');
45        $dir = sous_repertoire($dir, 'wunderground');
46        $fichier_cache = $dir . str_replace(array(',', '+', '.', '/'), '-', $lieu) 
47                                   . "_" . $mode 
48                                   . ((($condition == 'wunderground') AND ($mode != 'infos')) ? '-' . $langue : '')
49                                   . ".txt";
50
51        return $fichier_cache;
52}
53
54/**
55 * @param $lieu
56 * @param $mode
57 * @return string
58 */
59function wunderground_service2url($lieu, $mode) {
60        include_spip('inc/config');
61        $cle = lire_config('rainette/wunderground/inscription');
62        $format = lire_config('rainette/wunderground/format', 'json');
63
64        // Determination de la demande
65        if ($mode == 'infos') {
66                $demande = 'geolookup';
67        }
68        else {
69                $demande = ($mode == 'previsions') ? 'forecast10day/astronomy' : 'conditions';
70        }
71
72        // Identification et formatage du lieu
73        $query = str_replace(array(' ', ','), array('', '/'), trim($lieu));
74        $index = strpos($query, '/');
75        if ($index !== false) {
76                $ville = substr($query, 0, $index);
77                $pays = substr($query, $index+1, strlen($query)-$index-1);
78                $query = $pays . '/' . $ville;
79        }
80
81        // Identification de la langue du resume.
82        // Le choix de la langue n'a d'interet que si on utilise le resume natif du service. Si ce n'est pas le cas
83        // on ne la precise pas et on laisse l'API renvoyer la langue par defaut
84        $condition = lire_config('rainette/wunderground/condition', 'wunderground');
85        $code_langue = '';
86        if ($condition == 'wunderground')
87                $code_langue = langue2code_wunderground($GLOBALS['spip_lang']);
88
89        $url = _RAINETTE_WUNDERGROUND_URL_BASE_REQUETE
90                .  '/' . $cle
91                .  '/' . $demande
92                .  ($code_langue ? '/lang:' . $code_langue : '')
93                .  '/q'
94                .  '/' . $query . '.' . $format;
95
96        return $url;
97}
98
99
100/**
101 * @param $mode
102 * @return mixed
103 */
104function wunderground_service2reload_time($mode) {
105        static $reload = array('conditions' => 1800, 'previsions' => 7200);
106
107        return $reload[$mode];
108}
109
110/**
111 * @param $url
112 * @return array
113 */
114function wunderground_url2flux($url) {
115        // Déterminer le format d'échange pour aiguiller vers la bonne conversion
116        include_spip('inc/config');
117        $format = lire_config('rainette/wunderground/format', 'json');
118
119        include_spip('inc/phraser');
120        $flux = ($format == 'json') ? url2flux_json($url) : url2flux_xml($url, false);
121
122        return $flux;
123}
124
125
126/**
127 * lire le xml fournit par le service meteo et en extraire les infos interessantes
128 * retournees en tableau jour par jour
129 * utilise le parseur xml de Spip
130 *
131 * @param array $flux
132 * @return array
133 */
134function wunderground_flux2previsions($flux, $lieu) {
135        // Identification des suffixes d'unite pour choisir le bon champ
136        // -> wunderground fournit toujours les valeurs dans les deux systemes d'unites. Néanmois, la liste n'est pas
137        //    la même pour les conditions et les prévisions
138        include_spip('inc/config');
139        $unites = (lire_config('rainette/wunderground/unite', 'm') == 'm')
140                ? _RAINETTE_WUNDERGROUND_SUFFIXE_METRIQUE
141                : _RAINETTE_WUNDERGROUND_SUFFIXE_STANDARD;
142        $unites = explode('|', $unites);
143        $unites = explode(':', $unites[1]);
144
145        // Identifier le format d'échange des données
146        $format = lire_config('rainette/wunderground/format', 'json');
147
148        // Construire le tableau standard des conditions météorologiques propres au service
149        $tableau = ($format == 'json') ? json2previsions_wunderground($flux, $unites) : xml2previsions_wunderground($flux, $unites);
150
151        // Compléter le tableau standard avec les états météorologiques calculés
152        if ($tableau) {
153                $condition = lire_config('rainette/wunderground/condition', 'wunderground');
154                foreach ($tableau as $_index => $_prevision) {
155                        if ($_prevision[0]['code_meteo']
156                        AND $_prevision[0]['icon_meteo']
157                        AND isset($_prevision[0]['desc_meteo'])) {
158                                // Le mode jour/nuit n'est pas supporté par ce service.
159                                $tableau[$_index]['periode'] = 0; // jour
160
161                                // Determination, suivant le mode choisi, du code, de l'icone et du resume qui seront affiches
162                                if ($condition == 'wunderground') {
163                                        // On affiche les prévisions natives fournies par le service.
164                                        // Pour le resume, wwo ne fournit pas de traduction : on stocke donc le code meteo afin
165                                        // de le traduire à partir des fichiers de langue SPIP.
166                                        $theme = lire_config('rainette/wunderground/theme', 'a');
167                                        $url = _RAINETTE_WUNDERGROUND_URL_BASE_ICONE . '/' . $theme . '/' . basename($_prevision[0]['icon_meteo']);
168                                        $tableau[$_index][0]['icone']['code'] = $_prevision[0]['code_meteo'];
169                                        $tableau[$_index][0]['icone']['url'] = copie_locale($url);
170                                        $tableau[$_index][0]['resume'] = ucfirst($_prevision[0]['desc_meteo']);
171                                }
172                                else {
173                                        // On affiche les conditions traduites dans le systeme weather.com
174                                        $meteo = meteo_wunderground2weather($_prevision[0]['code_meteo'], $tableau[$_index]['periode']);
175                                        $tableau[$_index][0]['icone'] = $meteo;
176                                        $tableau[$_index][0]['resume'] = $meteo;
177                                }
178                        }
179                }
180        }
181
182        // Traitement des erreurs de flux
183        $index = count($tableau);
184        $tableau[$index]['erreur'] = (!$tableau) ? 'chargement' : '';
185
186        // Ajout des informations communes dans l'index adéquat
187        $tableau[$index]['max_jours'] = _RAINETTE_WUNDERGROUND_JOURS_PREVISIONS;
188
189        return $tableau;
190}
191
192function wunderground_flux2conditions($flux, $lieu) {
193        // Correspondance des tendances de pression dans le système standard
194        static $tendances = array('0' => 'steady', '+' => 'rising', '-' => 'falling');
195
196        // Identification des suffixes d'unite pour choisir le bon champ
197        // -> wunderground fournit toujours les valeurs dans les deux systemes d'unites. Néanmois, la liste n'est pas
198        //    la même pour les conditions et les prévisions
199        include_spip('inc/config');
200        $unites = (lire_config('rainette/wunderground/unite', 'm') == 'm')
201                ? _RAINETTE_WUNDERGROUND_SUFFIXE_METRIQUE
202                : _RAINETTE_WUNDERGROUND_SUFFIXE_STANDARD;
203        $unites = explode('|', $unites);
204        $suffixes = explode(':', $unites[0]);
205
206        // Déterminer le format d'échange pour aiguiller vers la bonne conversion
207        $format = lire_config('rainette/wunderground/format', 'json');
208
209        // Construire le tableau standard des conditions météorologiques propres au service
210        $tableau = ($format == 'json') ? json2conditions_wunderground($flux, $tendances, $suffixes) : xml2conditions_wunderground($flux, $tendances, $suffixes);
211
212        // Compléter le tableau standard avec les états météorologiques calculés
213        if ($tableau['code_meteo']
214        AND $tableau['icon_meteo']
215        AND isset($tableau['desc_meteo'])) {
216                // Determination de l'indicateur jour/nuit qui permet de choisir le bon icone
217                // Pour ce service (cas actuel) le nom du fichier icone commence par "nt_" pour la nuit.
218                $icone = basename($tableau['icon_meteo']);
219                if (strpos($icone, 'nt_') === false)
220                        $tableau['periode'] = 0; // jour
221                else
222                        $tableau['periode'] = 1; // nuit
223
224                // Determination, suivant le mode choisi, du code, de l'icone et du resume qui seront affiches
225                $condition = lire_config('rainette/wunderground/condition', 'wunderground');
226                if ($condition == 'wunderground') {
227                        // On affiche les conditions natives fournies par le service.
228                        // Celles-ci etant deja traduites dans la bonne langue on stocke le texte exact retourne par l'API
229                        $tableau['icone']['code'] = $tableau['code_meteo'];
230                        $theme = lire_config('rainette/wunderground/theme', 'a');
231                        $url = _RAINETTE_WUNDERGROUND_URL_BASE_ICONE . '/' . $theme
232                                 . '/' . ($tableau['periode'] == 1 ? 'nt_' : '') . $tableau['code_meteo'] . '.gif';
233                        $tableau['icone']['url'] = copie_locale($url);
234                        $tableau['resume'] = ucfirst($tableau['desc_meteo']);
235                }
236                else {
237                        // On affiche les conditions traduites dans le systeme weather.com
238                        // Pour le resume on stocke le code et non la traduction pour eviter de generer
239                        // un cache par langue comme pour le mode natif. La traduction est faite via les fichiers de langue
240                        $meteo = meteo_wunderground2weather($tableau['code_meteo'], $tableau['periode']);
241                        $tableau['icone'] = $meteo;
242                        $tableau['resume'] = $meteo;
243                }
244        }
245
246        // Traitement des erreurs de flux
247        $tableau['erreur'] = (!$tableau) ? 'chargement' : '';
248
249        return $tableau;
250}
251
252function wunderground_flux2infos($flux, $lieu) {
253        // Déterminer le format d'échange pour aiguiller vers la bonne conversion
254        include_spip('inc/config');
255        $format = lire_config('rainette/wunderground/format', 'json');
256
257        // Construire le tableau standard des informations sur le lieu et ajouter le nombre de jours de prévisions
258        $tableau = ($format == 'json') ? json2infos_wunderground($flux) : xml2infos_wunderground($flux);
259        $tableau['max_previsions'] = _RAINETTE_WUNDERGROUND_JOURS_PREVISIONS;
260
261        // Traitement des erreurs de flux
262        $tableau['erreur'] = (!$tableau) ? 'chargement' : '';
263
264        return $tableau;
265}
266
267function wunderground_service2credits() {
268
269        $credits['titre'] = NULL;
270        $credits['logo'] = 'wunderground-126.png';
271        $credits['lien'] = 'http://www.wunderground.com/';
272
273        return $credits;
274}
275
276
277/**
278 * -----------------------------------------------------------------------------------------------
279 * Les fonctions qui suivent sont permettent le décodage des données météorologiques reçues au
280 * format XML. Ce sont des sous-fonctions internes appelées uniquement par les fonctions de l'API.
281 * PACKAGE SPIP\RAINETTE\WUNDERGROUND\XML
282 * -----------------------------------------------------------------------------------------------
283 */
284
285function xml2previsions_wunderground($flux, $unites) {
286        $tableau = array();
287
288        if (isset($flux['children']['forecast'][0]['children']['simpleforecast'][0]['children']['forecastdays'][0]['children']['forecastday'])) {
289                $previsions = $flux['children']['forecast'][0]['children']['simpleforecast'][0]['children']['forecastdays'][0]['children']['forecastday'];
290                $maintenant = time();
291
292                if ($previsions) {
293                        foreach ($previsions as $_index => $_prevision) {
294                                if ($_prevision) {
295                                        $_prevision = $_prevision['children'];
296
297                                        // Index du jour et date du jour
298                                        $tableau[$_index]['index'] = $_index;
299                                        $tableau[$_index]['date'] = (isset($_prevision['date'][0]['children']['epoch']))
300                                                ? date($_prevision['date'][0]['children']['epoch'][0]['text'])
301                                                : date('Y-m-d', $maintenant + 24*3600*$_index);
302
303                                        // Date complete des lever/coucher du soleil
304                                        $tableau[$_index]['lever_soleil'] = NULL;
305                                        $tableau[$_index]['coucher_soleil'] = NULL;
306
307                                        // Previsions du jour
308                                        list($ut, $ur, $uv) = $unites;
309                                        $tableau[$_index][0]['temperature_max'] = (isset($_prevision['high'][0]['children'])) ? floatval($_prevision['high'][0]['children'][$ut][0]['text']) : '';
310                                        $tableau[$_index][0]['temperature_min'] = (isset($_prevision['low'][0]['children'])) ? floatval($_prevision['low'][0]['children'][$ut][0]['text']) : '';
311                                        $tableau[$_index][0]['vitesse_vent'] = (isset($_prevision['avewind'][0]['children'])) ? floatval($_prevision['avewind'][0]['children'][$uv][0]['text']) : '';
312                                        $tableau[$_index][0]['angle_vent'] = (isset($_prevision['avewind'][0]['children'])) ? intval($_prevision['avewind'][0]['children']['degrees'][0]['text']) : '';
313                                        // La documentation indique que les directions uniques sont fournies sous forme de texte comme North
314                                        // alors que les autres sont des acronymes. En outre, la valeur semble être traduite
315                                        // --> Le mieux est donc de convertir à partir de l'angle
316                                        include_spip('inc/convertir');
317                                        $tableau[$_index][0]['direction_vent'] = (isset($_prevision['avewind'][0]['children'])) ? angle2direction($tableau[$_index][0]['angle_vent']) : '';
318
319                                        $tableau[$_index][0]['risque_precipitation'] = (isset($_prevision['pop'])) ? intval($_prevision['pop'][0]['text']) : '';
320                                        $tableau[$_index][0]['precipitation'] = (isset($_prevision['qpf_allday'][0]['children'])) ? floatval($_prevision['qpf_allday'][0]['children'][$ur][0]['text']) : '';
321                                        $tableau[$_index][0]['humidite'] = (isset($_prevision['avehumidity'])) ? intval($_prevision['avehumidity'][0]['text']) : '';
322
323                                        $tableau[$_index][0]['code_meteo'] = (isset($_prevision['icon'])) ? $_prevision['icon'][0]['text'] : '';
324                                        $tableau[$_index][0]['icon_meteo'] = (isset($_prevision['icon_url'])) ? $_prevision['icon_url'][0]['text'] : '';
325                                        $tableau[$_index][0]['desc_meteo'] = (isset($_prevision['conditions'])) ? $_prevision['conditions'][0]['text'] : '';
326
327                                        // Previsions de la nuit si elle existe
328                                        $tableau[$_index][1] = NULL;
329                                }
330                        }
331                }
332        }
333
334        return $tableau;
335}
336
337
338function xml2conditions_wunderground($flux, $tendances, $suffixes) {
339        $tableau = array();
340
341        if (isset($flux['children']['current_observation'][0]['children'])) {
342                $conditions = $flux['children']['current_observation'][0]['children'];
343
344                // Date d'observation
345                $date_maj = (isset($conditions['observation_epoch'])) ? intval($conditions['observation_epoch'][0]['text']) : 0;
346                $tableau['derniere_maj'] = date('Y-m-d H:i:s', $date_maj);
347                // Station d'observation
348                $tableau['station'] = (isset($conditions['observation_location']))
349                        ? trim($conditions['observation_location'][0]['children']['full'][0]['text'], ',')
350                        : '';
351
352                // Liste des conditions meteo extraites dans le systeme demande
353                list($ut, $up, $ud, $uv, $ur) = $suffixes;
354                $tableau['vitesse_vent'] = (isset($conditions['wind_'.$uv])) ? floatval($conditions['wind_'.$uv][0]['text']) : '';
355                $tableau['angle_vent'] = (isset($conditions['wind_degrees'])) ? intval($conditions['wind_degrees'][0]['text']) : '';
356                // La documentation indique que les directions uniques sont fournies sous forme de texte comme North
357                // alors que les autres sont des acronymes. En outre, la valeur semble être traduite
358                // --> Le mieux est donc de convertir à partir de l'angle
359                include_spip('inc/convertir');
360                $tableau['direction_vent'] = (isset($conditions['wind_degrees'])) ? angle2direction($tableau['angle_vent']) : '';
361
362                $tableau['temperature_reelle'] = (isset($conditions['temp_'.$ut])) ? floatval($conditions['temp_'.$ut][0]['text']) : '';
363                $tableau['temperature_ressentie'] = (isset($conditions['feelslike_'.$ut])) ? floatval($conditions['feelslike_'.$ut][0]['text']) : '';
364
365                $tableau['humidite'] = (isset($conditions['relative_humidity'])) ? intval($conditions['relative_humidity'][0]['text']) : '';
366                $tableau['precipitation'] = (isset($conditions['precip_today_'.$ur])) ? floatval($conditions['precip_today_'.$ur][0]['text']) : '';
367                $tableau['point_rosee'] = (isset($conditions['dewpoint_'.$ut])) ? intval($conditions['dewpoint_'.$ut][0]['text']) : '';
368
369                $tableau['pression'] = (isset($conditions['pressure_'.$up])) ? floatval($conditions['pressure_'.$up][0]['text']) : '';
370                $tableau['tendance_pression'] = (isset($conditions['pressure_trend']) AND array_key_exists($conditions['pressure_trend'][0]['text'], $tendances))
371                                        ? $tendances[$conditions['pressure_trend'][0]['text']]
372                                        : '';
373
374                $tableau['visibilite'] = (isset($conditions['visibility_'.$ud])) ? floatval($conditions['visibility_'.$ud][0]['text']) : '';
375
376                $tableau['indice_uv'] = NULL;
377
378                // Code meteo, resume et icone natifs au service
379                $tableau['code_meteo'] = (isset($conditions['icon'])) ? $conditions['icon'][0]['text'] : '';
380                $tableau['icon_meteo'] = (isset($conditions['icon_url'])) ? $conditions['icon_url'][0]['text'] : '';
381                $tableau['desc_meteo'] = (isset($conditions['weather'])) ? $conditions['weather'][0]['text'] : '';
382        }
383
384        return $tableau;
385}
386
387function xml2infos_wunderground($flux) {
388        $tableau = array();
389
390        if (isset($flux['children']['location'][0]['children'])) {
391                $infos = $flux['children']['location'][0]['children'];
392
393                if (isset($infos['city'])) {
394                        $tableau['ville'] = $infos['city'][0]['text'];
395                        $tableau['ville'] .= (isset($infos['country_name'])) ? ', ' . $infos['country_name'][0]['text'] : '';
396                }
397                $tableau['region'] = NULL;
398
399                $tableau['longitude'] = (isset($infos['lon'])) ? floatval($infos['lon'][0]['text']) : '';
400                $tableau['latitude'] = (isset($infos['lat'])) ? floatval($infos['lat'][0]['text']) : '';
401
402                $tableau['population'] = NULL;
403        }
404
405        return $tableau;
406}
407
408/**
409 * ------------------------------------------------------------------------------------------------
410 * Les fonctions qui suivent sont permettent le décodage des données météorologiques reçues au
411 * format JSON. Ce sont des sous-fonctions internes appelées uniquement par les fonctions de l'API.
412 * PACKAGE SPIP\RAINETTE\WUNDERGROUND\JSON
413 * ------------------------------------------------------------------------------------------------
414 */
415
416function json2previsions_wunderground($flux, $unites) {
417        $tableau = array();
418
419        if (isset($flux['forecast']['simpleforecast']['forecastday'])) {
420                $previsions = $flux['forecast']['simpleforecast']['forecastday'];
421                $maintenant = time();
422
423                if ($previsions) {
424                        foreach ($previsions as $_index => $_prevision) {
425                                if ($_prevision) {
426                                        // Index du jour et date du jour
427                                        $tableau[$_index]['index'] = $_index;
428                                        $tableau[$_index]['date'] = (isset($_prevision['date']))
429                                                ? date($_prevision['date']['epoch'])
430                                                : date('Y-m-d', $maintenant + 24*3600*$_index);
431
432                                        // Date complete des lever/coucher du soleil
433                                        $tableau[$_index]['lever_soleil'] = NULL;
434                                        $tableau[$_index]['coucher_soleil'] = NULL;
435
436                                        // Previsions du jour
437                                        list($ut, $ur, $uv) = $unites;
438                                        $tableau[$_index][0]['temperature_max'] = (isset($_prevision['high'])) ? floatval($_prevision['high'][$ut]) : '';
439                                        $tableau[$_index][0]['temperature_min'] = (isset($_prevision['low'])) ? floatval($_prevision['low'][$ut]) : '';
440                                        $tableau[$_index][0]['vitesse_vent'] = (isset($_prevision['avewind'])) ? floatval($_prevision['avewind'][$uv]) : '';
441                                        $tableau[$_index][0]['angle_vent'] = (isset($_prevision['avewind'])) ? intval($_prevision['avewind']['degrees']) : '';
442                                        // La documentation indique que les directions uniques sont fournies sous forme de texte comme North
443                                        // alors que les autres sont des acronymes. En outre, la valeur semble être traduite
444                                        // --> Le mieux est donc de convertir à partir de l'angle
445                                        include_spip('inc/convertir');
446                                        $tableau[$_index][0]['direction_vent'] = (isset($_prevision['avewind'])) ? angle2direction($tableau[$_index][0]['angle_vent']) : '';
447
448                                        $tableau[$_index][0]['risque_precipitation'] = (isset($_prevision['pop'])) ? intval($_prevision['pop']) : '';
449                                        $tableau[$_index][0]['precipitation'] = (isset($_prevision['qpf_allday'])) ? floatval($_prevision['qpf_allday'][$ur]) : '';
450                                        $tableau[$_index][0]['humidite'] = (isset($_prevision['avehumidity'])) ? intval($_prevision['avehumidity']) : '';
451
452                                        $tableau[$_index][0]['code_meteo'] = (isset($_prevision['icon'])) ? $_prevision['icon'] : '';
453                                        $tableau[$_index][0]['icon_meteo'] = (isset($_prevision['icon_url'])) ? $_prevision['icon_url'] : '';
454                                        $tableau[$_index][0]['desc_meteo'] = (isset($_prevision['conditions'])) ? $_prevision['conditions'] : '';
455
456                                        // Previsions de la nuit si elle existe
457                                        $tableau[$_index][1] = NULL;
458                                }
459                        }
460                }
461        }
462
463        return $tableau;
464}
465
466
467function json2conditions_wunderground($flux, $tendances, $suffixes) {
468        $tableau = array();
469
470        if (isset($flux['current_observation'])) {
471                $conditions = $flux['current_observation'];
472
473                // Date d'observation
474                $date_maj = (isset($conditions['observation_epoch'])) ? intval($conditions['observation_epoch']) : 0;
475                $tableau['derniere_maj'] = date('Y-m-d H:i:s', $date_maj);
476                // Station d'observation
477                $tableau['station'] = (isset($conditions['observation_location']['full']))
478                        ? $conditions['observation_location']['full']
479                        : '';
480
481                // Liste des conditions meteo extraites dans le systeme demande
482                list($ut, $up, $ud, $uv) = $suffixes;
483                $tableau['vitesse_vent'] = (isset($conditions['wind_'.$uv])) ? floatval($conditions['wind_'.$uv]) : '';
484                $tableau['angle_vent'] = (isset($conditions['wind_degrees'])) ? intval($conditions['wind_degrees']) : '';
485                // La documentation indique que les directions uniques sont fournies sous forme de texte comme North
486                // alors que les autres sont des acronymes. En outre, la valeur semble être traduite
487                // --> Le mieux est donc de convertir à partir de l'angle
488                include_spip('inc/convertir');
489                $tableau['direction_vent'] = (isset($conditions['wind_degrees'])) ? angle2direction($tableau['angle_vent']) : '';
490
491                $tableau['temperature_reelle'] = (isset($conditions['temp_'.$ut])) ? floatval($conditions['temp_'.$ut]) : '';
492                $tableau['temperature_ressentie'] = (isset($conditions['feelslike_'.$ut])) ? floatval($conditions['feelslike_'.$ut]) : '';
493
494                $tableau['humidite'] = (isset($conditions['relative_humidity'])) ? intval($conditions['relative_humidity']) : '';
495                $tableau['precipitation'] = (isset($conditions['precip_today_'.$ur])) ? floatval($conditions['precip_today_'.$ur]) : '';
496                $tableau['point_rosee'] = (isset($conditions['dewpoint_'.$ut])) ? intval($conditions['dewpoint_'.$ut]) : '';
497
498                $tableau['pression'] = (isset($conditions['pressure_'.$up])) ? floatval($conditions['pressure_'.$up]) : '';
499                $tableau['tendance_pression'] = (isset($conditions['pressure_trend']) AND array_key_exists($conditions['pressure_trend'], $tendances))
500                        ? $tendances[$conditions['pressure_trend']]
501                        : '';
502
503                $tableau['visibilite'] = (isset($conditions['visibility_'.$ud])) ? floatval($conditions['visibility_'.$ud]) : '';
504
505                $tableau['indice_uv'] = NULL;
506
507                // Code meteo, resume et icone natifs au service
508                $tableau['code_meteo'] = (isset($conditions['icon'])) ? $conditions['icon'] : '';
509                $tableau['icon_meteo'] = (isset($conditions['icon_url'])) ? $conditions['icon_url'] : '';
510                $tableau['desc_meteo'] = (isset($conditions['weather'])) ? $conditions['weather'] : '';
511        }
512
513        return $tableau;
514}
515
516function json2infos_wunderground($flux) {
517        $tableau = array();
518
519        // On stocke les informations disponibles dans un tableau standard
520        if (isset($flux['location'])) {
521                $infos = $flux['location'];
522
523                if (isset($infos['city'])) {
524                        $tableau['ville'] = $infos['city'];
525                        $tableau['ville'] .= (isset($infos['country_name'])) ? ', ' . $infos['country_name'] : '';
526                }
527                $tableau['region'] = NULL;
528
529                $tableau['longitude'] = (isset($infos['lon'])) ? floatval($infos['lon']) : '';
530                $tableau['latitude'] = (isset($infos['lat'])) ? floatval($infos['lat']) : '';
531
532                $tableau['population'] = NULL;
533        }
534
535        return $tableau;
536}
537
538
539/**
540 * ---------------------------------------------------------------------------------------------
541 * Les fonctions qui suivent sont des utilitaires utilisés uniquement appelées par les fonctions
542 * de l'API.
543 * PACKAGE SPIP\RAINETTE\WUNDERGROUND\OUTILS
544 * ---------------------------------------------------------------------------------------------
545 */
546
547
548/**
549 * @internal
550 *
551 * @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
552 * Transcodage issu du plugin Wordpress weather forecast.
553 *
554 * @param string $meteo
555 * @param int $periode
556 * @return string
557 */
558function meteo_wunderground2weather($meteo, $periode=0) {
559        static $wunderground2weather = array(
560                                                        'chanceflurries'=> array(41,46),
561                                                        'chancerain'=> array(39,45),
562                                                        'chancesleet'=> array(39,45),
563                                                        'chancesleet'=> array(41,46),
564                                                        'chancesnow'=> array(41,46),
565                                                        'chancetstorms'=> array(38,47),
566                                                        'clear'=> array(32,31),
567                                                        'cloudy'=> array(26,26),
568                                                        'flurries'=> array(15,15),
569                                                        'fog'=> array(20,20),
570                                                        'hazy'=> array(21,21),
571                                                        'mostlycloudy'=> array(28,27),
572                                                        'mostlysunny'=> array(34,33),
573                                                        'partlycloudy'=> array(30,29),
574                                                        'partlysunny'=> array(28,27),
575                                                        'sleet'=> array(5,5),
576                                                        'rain'=> array(11,11),
577                                                        'sleet'=> array(5,5),
578                                                        'snow'=> array(16,16),
579                                                        'sunny'=> array(32,31),
580                                                        'tstorms'=> array(4,4),
581                                                        'thunderstorms'=> array(4,4),
582                                                        'unknown'=> array(4,4),
583                                                        'cloudy'=> array(26,26),
584                                                        'scatteredclouds'=> array(30,29),
585                                                        'overcast'=> array(26,26));
586
587        $icone = 'na';
588        $meteo = strtolower($meteo);
589        if (array_key_exists($meteo,  $wunderground2weather))
590                $icone = strval($wunderground2weather[$meteo][$periode]);
591        return $icone;
592}
593
594function langue2code_wunderground($langue) {
595        static $langue2wunderground = array(
596                'aa' => array('', ''),                                  // afar
597                'ab' => array('', ''),                                  // abkhaze
598                'af' => array('AF', ''),                                // afrikaans
599                'am' => array('', ''),                                  // amharique
600                'an' => array('', 'SP'),                                // aragonais
601                'ar' => array('AR', ''),                                // arabe
602                'as' => array('', ''),                                  // assamais
603                'ast' => array('', 'SP'),                               // asturien - iso 639-2
604                'ay' => array('', ''),                                  // aymara
605                'az' => array('AZ', ''),                                // azeri
606                'ba' => array('', ''),                                  // bashkir
607                'be' => array('BY', ''),                                // bielorusse
608                'ber_tam' => array('', ''),                             // berbère
609                'ber_tam_tfng' => array('', ''),                // berbère tifinagh
610                'bg' => array('BU', ''),                                // bulgare
611                'bh' => array('', ''),                                  // langues biharis
612                'bi' => array('', ''),                                  // bichlamar
613                'bm' => array('', ''),                                  // bambara
614                'bn' => array('', ''),                                  // bengali
615                'bo' => array('', ''),                                  // tibétain
616                'br' => array('', 'FR'),                                // breton
617                'bs' => array('', ''),                                  // bosniaque
618                'ca' => array('CA', ''),                                // catalan
619                'co' => array('', 'FR'),                                // corse
620                'cpf' => array('', 'FR'),                               // créole réunionais
621                'cpf_dom' => array('', 'FR'),                   // créole ???
622                'cpf_hat' => array('HT', ''),                   // créole haïtien
623                'cs' => array('CZ', ''),                                // tchèque
624                'cy' => array('CY', ''),                                // gallois
625                'da' => array('DK', ''),                                // danois
626                'de' => array('DL', ''),                                // allemand
627                'dz' => array('', ''),                                  // dzongkha
628                'el' => array('GR', ''),                                // grec moderne
629                'en' => array('EN', ''),                                // anglais
630                'en_hx' => array('', 'EN'),                             // anglais hacker
631                'en_sm' => array('', 'EN'),                             // anglais smurf
632                'eo' => array('EO', ''),                                // esperanto
633                'es' => array('SP', ''),                                // espagnol
634                'es_co' => array('', 'SP'),                             // espagnol colombien
635                'es_mx_pop' => array('', 'SP'),                 // espagnol mexicain
636                'et' => array('ET', ''),                                // estonien
637                'eu' => array('EU', ''),                                // basque
638                'fa' => array('FA', ''),                                // persan (farsi)
639                'ff' => array('', ''),                                  // peul
640                'fi' => array('FI', ''),                                // finnois
641                'fj' => array('', 'EN'),                                // fidjien
642                'fo' => array('', 'DK'),                                // féroïen
643                'fon' => array('', ''),                                 // fon
644                'fr' => array('FR', ''),                                // français
645                'fr_sc' => array('', 'FR'),                             // français schtroumpf
646                'fr_lpc' => array('', 'FR'),                    // français langue parlée
647                'fr_lsf' => array('', 'FR'),                    // français langue des signes
648                'fr_spl' => array('', 'FR'),                    // français simplifié
649                'fr_tu' => array('', 'FR'),                             // français copain
650                'fy' => array('', 'DL'),                                // frison occidental
651                'ga' => array('IR', ''),                                // irlandais
652                'gd' => array('', 'EN'),                                // gaélique écossais
653                'gl' => array('GZ', ''),                                // galicien
654                'gn' => array('', ''),                                  // guarani
655                'grc' => array('', 'GR'),                               // grec ancien
656                'gu' => array('GU', ''),                                // goudjrati
657                'ha' => array('', ''),                                  // haoussa
658                'hac' => array('', 'KU'),                               // Kurdish-Horami
659                'hbo' => array('', 'IL'),                               // hebreu classique ou biblique
660                'he' => array('IL', ''),                                // hébreu
661                'hi' => array('HI', ''),                                // hindi
662                'hr' => array('CR', ''),                                // croate
663                'hu' => array('HU', ''),                                // hongrois
664                'hy' => array('HY', ''),                                // armenien
665                'ia' => array('', ''),                                  // interlingua (langue auxiliaire internationale)
666                'id' => array('ID', ''),                                // indonésien
667                'ie' => array('', ''),                                  // interlingue
668                'ik' => array('', ''),                                  // inupiaq
669                'is' => array('IS', ''),                                // islandais
670                'it' => array('IT', ''),                                // italien
671                'it_fem' => array('', 'IT'),                    // italien féminin
672                'iu' => array('', ''),                                  // inuktitut
673                'ja' => array('JP', ''),                                // japonais
674                'jv' => array('JW', ''),                                // javanais
675                'ka' => array('KA', ''),                                // géorgien
676                'kk' => array('', ''),                                  // kazakh
677                'kl' => array('', 'DK'),                                // groenlandais
678                'km' => array('KM', ''),                                // khmer central
679                'kn' => array('', ''),                                  // Kannada
680                'ko' => array('KR', ''),                                // coréen
681                'ks' => array('', ''),                                  // kashmiri
682                'ku' => array('KU', ''),                                // kurde
683                'ky' => array('', ''),                                  // kirghiz
684                'la' => array('LA', ''),                                // latin
685                'lb' => array('', 'FR'),                                // luxembourgeois
686                'ln' => array('', ''),                                  // lingala
687                'lo' => array('', ''),                                  // lao
688                'lt' => array('LT', ''),                                // lituanien
689                'lu' => array('', ''),                                  // luba-katanga
690                'lv' => array('LV', ''),                                // letton
691                'man' => array('GM', ''),                               // mandingue
692                'mfv' => array('', ''),                                 // manjaque - iso-639-3
693                'mg' => array('', ''),                                  // malgache
694                'mi' => array('MI', ''),                                // maori
695                'mk' => array('MK', ''),                                // macédonien
696                'ml' => array('', ''),                                  // malayalam
697                'mn' => array('MN', ''),                                // mongol
698                'mo' => array('', 'RO'),                                // moldave ??? normalement c'est ro comme le roumain
699                'mos' => array('', ''),                                 // moré - iso 639-2
700                'mr' => array('MR', ''),                                // marathe
701                'ms' => array('', ''),                                  // malais
702                'mt' => array('MT', ''),                                // maltais
703                'my' => array('MY', ''),                                // birman
704                'na' => array('', ''),                                  // nauruan
705                'nap' => array('', 'IT'),                               // napolitain - iso 639-2
706                'ne' => array('', ''),                                  // népalais
707                'nqo' => array('', ''),                                 // n’ko - iso 639-3
708                'nl' => array('NL', ''),                                // néerlandais
709                'no' => array('NO', ''),                                // norvégien
710                'nb' => array('', 'NO'),                                // norvégien bokmål
711                'nn' => array('', 'NO'),                                // norvégien nynorsk
712                'oc' => array('OC', ''),                                // occitan
713                'oc_lnc' => array('', 'OC'),                    // occitan languedocien
714                'oc_ni' => array('', 'OC'),                             // occitan niçard
715                'oc_ni_la' => array('', 'OC'),                  // occitan niçard
716                'oc_prv' => array('', 'OC'),                    // occitan provençal
717                'oc_gsc' => array('', 'OC'),                    // occitan gascon
718                'oc_lms' => array('', 'OC'),                    // occitan limousin
719                'oc_auv' => array('', 'OC'),                    // occitan auvergnat
720                'oc_va' => array('', 'OC'),                             // occitan vivaro-alpin
721                'om' => array('', ''),                                  // galla
722                'or' => array('', ''),                                  // oriya
723                'pa' => array('PA', ''),                                // pendjabi
724                'pbb' => array('', ''),                                 // Nasa Yuwe (páez) - iso 639-3
725                'pl' => array('PL', ''),                                // polonais
726                'ps' => array('PS', ''),                                // pachto
727                'pt' => array('BR', ''),                                // portugais
728                'pt_br' => array('', 'BR'),                             // portugais brésilien
729                'qu' => array('', ''),                                  // quechua
730                'rm' => array('', ''),                                  // romanche
731                'rn' => array('', ''),                                  // rundi
732                'ro' => array('RO', ''),                                // roumain
733                'roa' => array('chti', ''),                             // langues romanes (ch'ti) - iso 639-2
734                'ru' => array('RU', ''),                                // russe
735                'rw' => array('', ''),                                  // rwanda
736                'sa' => array('', ''),                                  // sanskrit
737                'sc' => array('', 'IT'),                                // sarde
738                'scn' => array('', 'IT'),                               // sicilien - iso 639-2
739                'sd' => array('', ''),                                  // sindhi
740                'sg' => array('', ''),                                  // sango
741                'sh' => array('', 'SR'),                                // serbo-croate
742                'sh_latn' => array('', 'SR'),                   // serbo-croate latin
743                'sh_cyrl' => array('', 'SR'),                   // serbo-croate cyrillique
744                'si' => array('', ''),                                  // singhalais
745                'sk' => array('SK', ''),                                // slovaque
746                'sl' => array('SL', ''),                                // slovène
747                'sm' => array('', ''),                                  // samoan
748                'sn' => array('', ''),                                  // shona
749                'so' => array('', ''),                                  // somali
750                'sq' => array('AL', ''),                                // albanais
751                'sr' => array('SR', ''),                                // serbe
752                'src' => array('', 'IT'),                               // sarde logoudorien - iso 639-3
753                'sro' => array('', 'IT'),                               // sarde campidanien - iso 639-3
754                'ss' => array('', ''),                                  // swati
755                'st' => array('', ''),                                  // sotho du Sud
756                'su' => array('', ''),                                  // soundanais
757                'sv' => array('SW', ''),                                // suédois
758                'sw' => array('SI', ''),                                // swahili
759                'ta' => array('', ''),                                  // tamoul
760                'te' => array('', ''),                                  // télougou
761                'tg' => array('', ''),                                  // tadjik
762                'th' => array('TH', ''),                                // thaï
763                'ti' => array('', ''),                                  // tigrigna
764                'tk' => array('TK', ''),                                // turkmène
765                'tl' => array('TL', ''),                                // tagalog
766                'tn' => array('', ''),                                  // tswana
767                'to' => array('', ''),                                  // tongan (Îles Tonga)
768                'tr' => array('TR', ''),                                // turc
769                'ts' => array('', ''),                                  // tsonga
770                'tt' => array('TT', ''),                                // tatar
771                'tw' => array('', ''),                                  // twi
772                'ty' => array('', 'FR'),                                // tahitien
773                'ug' => array('', ''),                                  // ouïgour
774                'uk' => array('UA', ''),                                // ukrainien
775                'ur' => array('', ''),                                  // ourdou
776                'uz' => array('UZ', ''),                                // ouszbek
777                'vi' => array('VU', ''),                                // vietnamien
778                'vo' => array('', ''),                                  // volapük
779                'wa' => array('', 'FR'),                                // wallon
780                'wo' => array('SN', ''),                                // wolof
781                'xh' => array('', ''),                                  // xhosa
782                'yi' => array('YI', ''),                                // yiddish
783                'yo' => array('', ''),                                  // yoruba
784                'za' => array('', 'CN'),                                // zhuang
785                'zh' => array('CN', ''),                                // chinois (ecriture simplifiee)
786                'zh_tw' => array('TW', ''),                     // chinois taiwan (ecriture traditionnelle)
787                'zu' => array('', '')                                   // zoulou
788        );
789
790        $code = _RAINETTE_WUNDERGROUND_LANGUE_DEFAUT;
791        if (array_key_exists($langue,  $langue2wunderground)) {
792                if ($c0 = $langue2wunderground[$langue][0])
793                        $code = strtoupper($c0);
794                else
795                        $code = strtoupper($langue2wunderground[$langue][1]);
796        }
797
798        return $code;
799}
800
801?>
Note: See TracBrowser for help on using the repository browser.