Browse Source

Suppression des services obsolètes pour éviter de les migrer dans la nouvelle configuration.

Suppression des fonctions de config par service au profit d'une fonction commune.
Quelques mises à jour de la configuration des services.
Ajout des endpoint pour la requete et les icones dans les YAML et suppression des constantes en doublons dans les fichiers PHP des services.
Update du schéma et de la version du plugin.
master
Eric Lupinacci 3 months ago
parent
commit
e6fa98c57f
35 changed files with 105 additions and 2129 deletions
  1. +1
    -1
      demo/inc-afficher_execution.html
  2. +3
    -5
      formulaires/configurer_rainette_service.php
  3. +2
    -3
      inc/meteo_charger.php
  4. +8
    -16
      inc/rainette_debusquer.php
  5. +25
    -16
      inc/rainette_normaliser.php
  6. +2
    -3
      paquet.xml
  7. +3
    -6
      rainette_administrations.php
  8. +11
    -12
      rainette_fonctions.php
  9. +2
    -32
      services/accuweather.php
  10. +2
    -0
      services/accuweather.yaml
  11. +0
    -521
      services/apixu.php
  12. +3
    -0
      services/config/rainette.yaml
  13. +3
    -0
      services/config/service.template.yaml
  14. +0
    -470
      services/darksky.php
  15. +10
    -42
      services/owm.php
  16. +4
    -2
      services/owm.yaml
  17. +0
    -331
      services/weather.php
  18. +1
    -31
      services/weatherapi.php
  19. +4
    -2
      services/weatherapi.yaml
  20. +3
    -40
      services/weatherbit.php
  21. +4
    -2
      services/weatherbit.yaml
  22. +0
    -545
      services/wunderground.php
  23. +2
    -32
      services/wwo.php
  24. +12
    -11
      services/wwo.yaml
  25. +0
    -6
      themes/darksky/original/LICENSE.txt
  26. BIN
      themes/darksky/original/clear-day.png
  27. BIN
      themes/darksky/original/clear-night.png
  28. BIN
      themes/darksky/original/cloudy.png
  29. BIN
      themes/darksky/original/fog.png
  30. BIN
      themes/darksky/original/partly-cloudy-day.png
  31. BIN
      themes/darksky/original/partly-cloudy-night.png
  32. BIN
      themes/darksky/original/rain.png
  33. BIN
      themes/darksky/original/sleet.png
  34. BIN
      themes/darksky/original/snow.png
  35. BIN
      themes/darksky/original/wind.png

+ 1
- 1
demo/inc-afficher_execution.html View File

@ -10,7 +10,7 @@
<thead>
<tr>
<th>Services</th>
<BOUCLE_head(DATA) {source table, #LISTE{'dernier_appel', year, month, day, hour, minute}}>
<BOUCLE_head(DATA) {source table, #LISTE{'dernier_appel', year, month, day, hour, minute, second}}>
<th>#VALEUR</th>
</BOUCLE_head>
</tr>


+ 3
- 5
formulaires/configurer_rainette_service.php View File

@ -22,10 +22,9 @@ function formulaires_configurer_rainette_service_charger($service) {
$service = rainette_service_defaut();
}
// Récupération et normalisation des données de configuration utilisateur.
include_spip("services/${service}");
$configurer = "${service}_service2configuration";
$configuration = $configurer('service');
// Récupération de la configuration générale du service.
include_spip('inc/config');
$configuration = lire_config("rainette_${service}/service", array());
// Normalisation de la configuration utilisateur du service afin d'éviter de gérer
// au sein du formulaire des valeurs par défaut.
@ -40,7 +39,6 @@ function formulaires_configurer_rainette_service_charger($service) {
$valeurs['_configuration']['offres'] = $configuration['offres'];
// Ajout des informations d'utilisation du service
include_spip('inc/config');
$execution = lire_config("rainette_execution/${service}", array());
$valeurs['_utilisation']['dernier_appel'] = isset($execution['dernier_appel'])
? $execution['dernier_appel']


+ 2
- 3
inc/meteo_charger.php View File

@ -86,8 +86,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
include_spip("services/${service}");
// Acquérir la configuration statique du service (periode, format, données...)
$configurer = "${service}_service2configuration";
$configuration = $configurer($mode);
$configuration = configuration_service_lire($service, $mode);
// Acquérir la configuration dynamique du service (celle modifiable par l'utilisateur via
// le formulaire et stockée en BDD dans la table spip_meta) et la merger avec la configuration statique.
@ -133,7 +132,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// On teste une erreur d'acquisition renvoyée par le service. Pour tous les services, une cle de base
// est explicitement utilisée pour distinguer les erreurs; sa présence permet d'identifier un cas d'erreur.
include_spip('inc/filtres');
$configuration_erreur = $configurer('erreurs');
$configuration_erreur = configuration_service_lire($service, 'erreurs');
$flux_erreur = $flux;
if (!empty($configuration_erreur['cle_base'])) {
$flux_erreur = table_valeur($flux, implode('/', $configuration_erreur['cle_base']), null);


+ 8
- 16
inc/rainette_debusquer.php View File

@ -34,14 +34,12 @@ function rainette_debug_afficher_cache($lieu, $mode = 'previsions', $service = '
}
// Recuperation du tableau des conditions courantes
include_spip('inc/rainette_normaliser');
if (!service_est_indisponible($service) and _RAINETTE_DEBUG and function_exists('bel_env')) {
// Si on est en mode prévisions, on impose la périodicité à la valeur par défaut pour le service
$periodicite = 0;
if ($mode == 'previsions') {
include_spip("services/${service}");
$configurer = "${service}_service2configuration";
$configuration = $configurer($mode);
include_spip('inc/rainette_normaliser');
$configuration = configuration_service_lire($service, $mode);
$periodicite = $configuration['periodicite_defaut'];
}
@ -91,14 +89,13 @@ function rainette_debug_comparer_services($mode = 'conditions', $jeu = array())
}
// On boucle sur chaque jeu de demo
include_spip('inc/rainette_normaliser');
include_spip('inc/utils');
$periodicite = 0;
foreach ($jeu as $_service => $_lieu) {
// Si on est en mode prévisions, on impose la périodicité à la valeur par défaut pour le service
if ($mode == 'previsions') {
include_spip("services/${_service}");
$configurer = "${_service}_service2configuration";
$configuration = $configurer($mode);
$configuration = configuration_service_lire($_service, $mode);
$periodicite = $configuration['periodicite_defaut'];
}
@ -195,12 +192,8 @@ function rainette_debug_jeu_defaut() {
$services = rainette_lister_services();
if ($services) {
foreach ($services as $_service => $_nom) {
if (($_service == 'weather') or ($_service == 'wunderground')) {
$jeu[$_service] = 'FRXX0076';
} elseif ($_service == 'accuweather') {
if ($_service == 'accuweather') {
$jeu[$_service] = '623';
} elseif ($_service == 'darksky') {
$jeu[$_service] = '48.85,2.35';
} else {
$jeu[$_service] = 'Paris,France';
}
@ -221,15 +214,14 @@ function rainette_debug_afficher_execution() {
include_spip('inc/config');
$execution = lire_config('rainette_execution', array());
include_spip('inc/rainette_normaliser');
foreach ($services as $_service => $_nom) {
include_spip("services/${_service}");
$configurer = "${_service}_service2configuration";
$configuration = $configurer('infos');
$configuration = lire_config("rainette_${_service}/service", array());
$debug[$_service]['dernier_appel'] = isset($execution[$_service]['dernier_appel'])
? $execution[$_service]['dernier_appel']
: '--';
foreach (array('year', 'month', 'day', 'hour', 'minute') as $_periode) {
foreach (array('year', 'month', 'day', 'hour', 'minute', 'second') as $_periode) {
if (isset($configuration['offres']['limites'][$_periode])) {
$compteur = isset($execution[$_service]['compteurs'][$_periode])
? $execution[$_service]['compteurs'][$_periode]


+ 25
- 16
inc/rainette_normaliser.php View File

@ -88,7 +88,7 @@ function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
? $flux
: table_valeur($flux, implode('/', $cle_service));
if ($valeur_service !== '') {
$typer = donnee_typer($configuration_mode[$_donnee]['type_php'], $_donnee);
$typer = donnee_typer($configuration_mode[$_donnee]['type_php']);
$valeur_typee = $typer ? $typer($valeur_service) : $valeur_service;
// Vérification de la donnée en cours de traitement si une fonction idoine existe
@ -121,12 +121,10 @@ function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
* Détermine, en fonction du type PHP configuré, la fonction à appliquer à la valeur d'une donnée.
*
* @param string $type_php Le type PHP ou chaine vide sinon
* @param string $donnee Correspond à l'index du tableau associatif standardisé comme `temperature`, `humidite`,
* `precipitation`...
*
* @return string La fonction PHP (floatval, intval...) ou spécifique à appliquer à la valeur de la donnée.
*/
function donnee_typer($type_php, $donnee) {
function donnee_typer($type_php) {
// Si aucun type PHP précisé on renvoie aucune fonction à appliquer.
$fonction = '';
@ -254,9 +252,7 @@ function erreur_normaliser_extras($erreur, $lieu, $mode, $periodicite, $service
if ($erreur['type'] != 'service_inconnu') {
if (!$configuration) {
// Acquérir la configuration statique du service (periode, format, données...)
include_spip("services/${service}");
$configurer = "${service}_service2configuration";
$configuration = $configurer($mode);
$configuration = configuration_service_lire($service, $mode);
}
// On prépare un contexte extras pour traiter les erreurs du modèle de façon standard comme celles
@ -357,14 +353,11 @@ function periodicite_determiner($type_modele, $service) {
if ($periodicites_modele) {
// Acquérir la configuration statique du service pour connaître les périodicités horaires supportées
// pour le mode prévisions.
include_spip("services/${service}");
$configurer = "${service}_service2configuration";
$configuration = $configurer('previsions');
$periodicites_service = array_keys($configuration['periodicites']);
$periodicites_service = lire_config("rainette_${service}/previsions/periodicites", array());
// Déterminer la première périodicité compatible
foreach ($periodicites_modele as $_periodicite_modele) {
if (in_array($_periodicite_modele, $periodicites_service)) {
if (array_key_exists($_periodicite_modele, $periodicites_service)) {
$periodicite = $_periodicite_modele;
break;
}
@ -530,6 +523,23 @@ function langue_determiner($configuration_service) {
return $langue_service;
}
/**
* @param $service
* @param $mode
*
* @return array
*/
function configuration_service_lire($service, $mode) {
// Lecture de la configuration du service.
include_spip('inc/config');
$configuration_service = lire_config("rainette_${service}", array());
// On renvoie le bloc du mode concerné et le bloc général du service.
return
array_merge($configuration_service[$mode], $configuration_service['service']);
}
/**
* @param $mode
* @param $configuration
@ -601,10 +611,9 @@ function icone_weather_normaliser($code_meteo, $theme, $transcodage = array(), $
$icone = strval($code);
}
// Construction du chemin complet de l'icone.
$chemin = icone_local_normaliser("${icone}.png", 'weather', $theme);
return $chemin;
// Construction du chemin complet de l'icone et retour.
return
icone_local_normaliser("${icone}.png", 'weather', $theme);
}
/**


+ 2
- 3
paquet.xml View File

@ -1,15 +1,14 @@
<paquet
prefix="rainette"
categorie="divers"
version="3.12.0"
version="3.12.1"
etat="stable"
compatibilite="]3.1.3;3.2.*]"
logo="rainette_logo-64.png"
demonstration="demo/rainette"
documentation="https://contrib.spip.net/article4949"
schema="1"
schema="2"
>
<nom>Rainette</nom>
<!-- La météo au quotidien -->


+ 3
- 6
rainette_administrations.php View File

@ -21,12 +21,9 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function rainette_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
// Initialisation de la configuration
$maj['create'] = array(
array(
'rainette_configurer',
)
);
// Initialisation de la configuration : c'est la seule chose à faire à chaque mise à jour de schéma.
$maj['create'] = array();
rainette_configurer();
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);


+ 11
- 12
rainette_fonctions.php View File

@ -21,10 +21,14 @@ if (!defined('_RAINETTE_ICONES_PETITE_TAILLE')) {
* @return mixed
*/
function balise_RAINETTE_INFOS($p) {
// Extraction et normalisation des arguments
$lieu = interprete_argument_balise(1, $p);
$lieu = isset($lieu) ? str_replace('\'', '"', $lieu) : '""';
// Donnée informative sur le lieu (vide = toutes)
$type_info = interprete_argument_balise(2, $p);
$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '""';
// Le service à utiliser (service par défaut si vide)
$service = interprete_argument_balise(3, $p);
$service = isset($service) ? str_replace('\'', '"', $service) : '""';
@ -280,12 +284,10 @@ function rainette_afficher_unite($valeur, $type_donnee = '', $precision = -1, $s
function rainette_afficher_service($service) {
// Acquérir la configuration statique du service.
include_spip("services/${service}");
$configurer = "${service}_service2configuration";
$configuration = $configurer('service');
return $configuration['nom'];
// On renvoie le nom du service ou a défaut son id.
include_spip('inc/config');
return
lire_config("rainette_${service}/service/nom", $service);
}
@ -308,6 +310,7 @@ function rainette_lister_services($mode = 'tableau', $actif_uniquement = true) {
// On lit les fichiers php dans répertoire services/ du plugin sachant ce répertoire
// contient exclusivement les api de chaque service dans un fichier unique appelé
// alias_du_service.php
include_spip('inc/config');
$liste = array();
if ($fichiers_api = glob(_DIR_PLUGIN_RAINETTE . '/services/*.php')) {
foreach ($fichiers_api as $_fichier) {
@ -315,17 +318,13 @@ function rainette_lister_services($mode = 'tableau', $actif_uniquement = true) {
$service = strtolower(basename($_fichier, '.php'));
// Acquérir la configuration statique du service.
include_spip("services/${service}");
$configurer = "${service}_service2configuration";
$configuration = $configurer('service');
$configuration = lire_config("rainette_${service}/service", array());
// Ajout du service dans la liste uniquement si celui-ci est encore actif ou si on demande tous
// les services actifs ou pas.
if (
!$actif_uniquement
or ($actif_uniquement
and $configuration['actif']
)
or $configuration['actif']
) {
if (
($mode == 'tableau')


+ 2
- 32
services/accuweather.php View File

@ -9,41 +9,12 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_RAINETTE_ACCUWEATHER_URL_BASE')) {
/**
* URL de base (endpoint) des requêtes au service World Weather Online.
*/
define('_RAINETTE_ACCUWEATHER_URL_BASE', 'http://dataservice.accuweather.com/');
}
// ------------------------------------------------------------------------------------------------
// Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
// unique de chargement des données météorologiques `meteo_charger()`.
// ------------------------------------------------------------------------------------------------
/**
* Fournit la configuration statique du service pour le type de données requis.
*
* @api
*
* @param string $mode
* Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
* La périodicité n'est pas nécessaire car la configuration est indifférente à ce paramètre.
*
* @return array
* Le tableau des données de configuration communes au service et propres au type de données demandé.
*/
function accuweather_service2configuration($mode) {
// On merge la configuration propre au mode et la configuration du service proprement dite
// composée des valeurs par défaut de la configuration utilisateur et de paramètres généraux.
include_spip('inc/config');
$config_service = lire_config('rainette_accuweather', array());
$config = array_merge($config_service[$mode], $config_service['service']);
return $config;
}
/**
* Construit l'url de la requête correspondant au lieu, au type de données et à la configuration utilisateur
* du service (par exemple, le code d'inscription, le format des résultats...).
@ -85,7 +56,8 @@ function accuweather_service2url($lieu, $mode, $periodicite, $configuration) {
$mode = 'location';
}
$url = _RAINETTE_ACCUWEATHER_URL_BASE
return
$configuration['endpoint_requete']
. $mode
. '/v1/'
. $lieu_normalise
@ -93,8 +65,6 @@ function accuweather_service2url($lieu, $mode, $periodicite, $configuration) {
. '?apikey=' . $configuration['inscription']
. '&language=' . $code_langue
. '&details=true';
return $url;
}


+ 2
- 0
services/accuweather.yaml View File

@ -15,6 +15,8 @@
service:
nom: 'AccuWeather'
#actif: true
endpoint_requete: 'http://dataservice.accuweather.com/'
endpoint_icone: ''
credits:
titre: 'AccuWeather'
lien: 'https://www.accuweather.com/'


+ 0
- 521
services/apixu.php View File

@ -1,521 +0,0 @@
<?php
/**
* Ce fichier contient la configuration et l'ensemble des fonctions implémentant le service APIXU (apixu).
* Ce service est capable de fournir des données au format XML ou JSON. Néanmoins, l'API actuelle du plugin utilise
* uniquement le format JSON.
*
* @package SPIP\RAINETTE\SERVICES\APIXU
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_RAINETTE_APIXU_URL_BASE')) {
/**
* URL de base (endpoint) des requêtes au service APIXU.
*/
define('_RAINETTE_APIXU_URL_BASE', 'https://api.apixu.com/v1');
}
// Configuration des valeurs par défaut des éléments de la configuration dynamique.
// Ces valeurs sont applicables à tous les modes.
$GLOBALS['rainette_apixu_config']['service'] = array(
'alias' => 'apixu',
'nom' => 'APIXU',
'actif' => false,
'credits' => array(
'titre' => 'APIXU',
'logo' => 'apixu.png',
'lien' => 'https://www.apixu.com/',
),
'termes' => array(
'titre' => 'Terms and Conditions',
'lien' => 'https://www.apixu.com/terms.aspx'
),
'enregistrement' => array(
'titre' => 'Signup',
'lien' => 'https://www.apixu.com/signup.aspx',
'taille_cle' => 32
),
'offres' => array(
'titre' => 'Pricing',
'lien' => 'https://www.apixu.com/pricing.aspx',
'limites' => array(
'month' => 5000
),
),
'langues' => array(
'disponibles' => array(
'ar' => 'ar',
'bg' => 'bg',
'bn' => 'bn',
'cs' => 'cs',
'da' => 'da',
'de' => 'de',
'el' => 'el',
'en' => 'en',
'es' => 'es',
'fi' => 'fi',
'fr' => 'fr',
'hi' => 'hi',
'hu' => 'hu',
'it' => 'it',
'ja' => 'ja',
'jv' => 'jv',
'ko' => 'ko',
'mr' => 'mr',
'nl' => 'nl',
'pa' => 'pa',
'pl' => 'pl',
'pt' => 'pt',
'ro' => 'ro',
'ru' => 'ru',
'si' => 'si',
'sk' => 'sk',
'sr' => 'sr',
'sv' => 'sv',
'ta' => 'ta',
'te' => 'te',
'tr' => 'tr',
'uk' => 'uk',
'ur' => 'ur',
'vi' => 'vi',
'zh' => 'zh',
'zh_tw' => 'zh_tw',
'zu' => 'zu',
),
'defaut' => 'en'
),
'defauts' => array(
'inscription' => '',
'unite' => 'm',
'condition' => 'apixu',
'theme' => '',
'theme_local' => 'original',
'theme_weather' => 'sticker',
),
// @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
// Transcodage issu du plugin Wordpress weather forecast.
// TODO : a revoir, index ok, idem que wwo a priori
'transcodage_weather' => array(
1000 => array(32, 31),
1003 => array(30, 29),
1006 => array(28, 27),
1009 => array(26, 26),
1030 => array(20, 20), // plutot 21 21
1063 => array(40, 40),
1066 => array(16, 16), // plutot 42, 42
1069 => array(18, 18),
1072 => array(10, 10),
1087 => array(38, 47),
1114 => array(15, 15),
1117 => array(16, 16),
1135 => array(20, 20),
1147 => array(20, 20),
1150 => array(9, 9),
1153 => array(9, 9),
1168 => array(9, 9),
1171 => array(10, 10),
1180 => array(9, 9),
1183 => array(9, 9),
1186 => array(39, 45),
1189 => array(11, 11),
1192 => array(39, 45),
1195 => array(40, 40),
1198 => array(8, 8),
1201 => array(8, 8),
1204 => array(18, 18),
1207 => array(18, 18),
1210 => array(13, 13),
1213 => array(13, 13),
1216 => array(14, 14),
1219 => array(14, 14),
1222 => array(16, 16),
1225 => array(16, 16),
1237 => array(18, 18),
1240 => array(9, 9),
1243 => array(11, 11),
1246 => array(11, 11),
1249 => array(6, 6),
1252 => array(6, 6),
1255 => array(13, 13),
1258 => array(14, 14),
1261 => array(6, 6),
1264 => array(6, 6),
1273 => array(37, 47),
1276 => array(38, 47),
1279 => array(41, 46),
1282 => array(41, 46)
)
);
// Configuration des données fournies par le service apixu pour le mode 'infos' en format JSON.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_apixu_config']['infos'] = array(
'periode_maj' => 86400,
'format_flux' => 'json',
'cle_base' => array('location'),
'donnees' => array(
// Lieu
'ville' => array('cle' => array('name')),
'pays' => array('cle' => array('country')),
'pays_iso2' => array('cle' => array()),
'region' => array('cle' => array('region')),
// Coordonnées
'longitude' => array('cle' => array('lon')),
'latitude' => array('cle' => array('lat')),
// Informations complémentaires : aucune configuration car ce sont des données calculées
),
);
// Configuration des données fournies par le service apixu pour le mode 'conditions'.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_apixu_config']['conditions'] = array(
'periode_maj' => 10800,
'format_flux' => 'json',
'cle_base' => array('current'),
'donnees' => array(
// Données d'observation
'derniere_maj' => array('cle' => array('last_updated')),
'station' => array('cle' => array()),
// Températures
'temperature_reelle' => array('cle' => array('temp_'), 'suffixe_unite' => array('id_cle' => 0, 'm' => 'c', 's' => 'f')),
'temperature_ressentie' => array('cle' => array('feelslike_'), 'suffixe_unite' => array('id_cle' => 0, 'm' => 'c', 's' => 'f')),
// Données anémométriques
'vitesse_vent' => array('cle' => array('wind_'), 'suffixe_unite' => array('id_cle' => 0, 'm' => 'kph', 's' => 'mph')),
'angle_vent' => array('cle' => array('wind_degree')),
'direction_vent' => array('cle' => array('wind_dir')),
// Données atmosphériques : risque_uv est calculé
'precipitation' => array('cle' => array('precip_'), 'suffixe_unite' => array('id_cle' => 0, 'm' => 'mm', 's' => 'in')),
'humidite' => array('cle' => array('humidity')),
'point_rosee' => array('cle' => array()),
'pression' => array('cle' => array('pressure_'), 'suffixe_unite' => array('id_cle' => 0, 'm' => 'mb', 's' => 'in')),
'tendance_pression' => array('cle' => array()),
'visibilite' => array('cle' => array('vis_'), 'suffixe_unite' => array('id_cle' => 0, 'm' => 'km', 's' => 'miles')),
'indice_uv' => array('cle' => array()),
// Etats météorologiques natifs
'code_meteo' => array('cle' => array('condition', 'code')),
'icon_meteo' => array('cle' => array('condition', 'icon')),
'desc_meteo' => array('cle' => array('condition', 'text')),
'trad_meteo' => array('cle' => array()),
// Etats météorologiques calculés : icone, resume, periode sont calculés
),
);
// Configuration des données fournies par le service apixu pour le mode 'conditions'.
// -- L'API fournit 10 jours de prévisions avec une périodicité systématique de 1h.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_apixu_config']['previsions'] = array(
'periodicites' => array(
24 => array('max_jours' => 10),
// 1 => array('max_jours' => 10)
),
'periodicite_defaut' => 24,
'periode_maj' => 14400,
'format_flux' => 'json',
'cle_base' => array('forecast', 'forecastday'),
'cle_heure' => array(),
'structure_heure' => false,
'donnees' => array(
// Données d'observation
'date' => array('cle' => array('date')),
'heure' => array('cle' => array('time')),
// Données astronomiques
'lever_soleil' => array('cle' => array('astro', 'sunrise')),
'coucher_soleil' => array('cle' => array('astro', 'sunset')),
// Températures
'temperature' => array('cle' => array('day', 'avgtemp_'), 'suffixe_unite' => array('id_cle' => 1, 'm' => 'c', 's' => 'f')),
'temperature_max' => array('cle' => array('day', 'maxtemp_'), 'suffixe_unite' => array('id_cle' => 1, 'm' => 'c', 's' => 'f')),
'temperature_min' => array('cle' => array('day', 'mintemp_'), 'suffixe_unite' => array('id_cle' => 1, 'm' => 'c', 's' => 'f')),
// Données anémométriques
'vitesse_vent' => array('cle' => array('day', 'maxwind_'), 'suffixe_unite' => array('id_cle' => 1, 'm' => 'kph', 's' => 'mph')),
'angle_vent' => array('cle' => array()),
'direction_vent' => array('cle' => array()),
// Données atmosphériques : risque_uv est calculé
'risque_precipitation' => array('cle' => array()),
'precipitation' => array('cle' => array('day', 'totalprecip_'), 'suffixe_unite' => array('id_cle' => 1, 'm' => 'mm', 's' => 'in')),
'humidite' => array('cle' => array('day', 'avghumidity')),
'point_rosee' => array('cle' => array()),
'pression' => array('cle' => array()),
'visibilite' => array('cle' => array('day', 'avgvis_'), 'suffixe_unite' => array('id_cle' => 1, 'm' => 'km', 's' => 'miles')),
'indice_uv' => array('cle' => array('day', 'uv')),
// Etats météorologiques natifs
'code_meteo' => array('cle' => array('day', 'condition', 'code')),
'icon_meteo' => array('cle' => array('day', 'condition', 'icon')),
'desc_meteo' => array('cle' => array('day', 'condition', 'text')),
'trad_meteo' => array('cle' => array()),
// Etats météorologiques calculés : icone, resume, periode sont calculés
),
);
// Configuration des données fournies par le service APIXU en cas d'erreur.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_apixu_config']['erreurs'] = array(
'cle_base' => array('error'),
'donnees' => array(
// Erreur
'code' => array('cle' => array('code')),
'message' => array('cle' => array('message')),
),
);
// ------------------------------------------------------------------------------------------------
// Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
// unique de chargement des données météorologiques `meteo_charger()`.
// ------------------------------------------------------------------------------------------------
/**
* Fournit la configuration statique du service pour le type de données requis.
*
* @api
*
* @param string $mode
* Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
* La périodicité n'est pas nécessaire car la configuration est indifférente à ce paramètre.
*
* @return array
* Le tableau des données de configuration communes au service et propres au type de données demandé.
*/
function apixu_service2configuration($mode) {
// On merge la configuration propre au mode et la configuration du service proprement dite
// composée des valeurs par défaut de la configuration utilisateur et de paramètres généraux.
$config = array_merge($GLOBALS['rainette_apixu_config'][$mode], $GLOBALS['rainette_apixu_config']['service']);
return $config;
}
/**
* Construit l'url de la requête correspondant au lieu, au type de données et à la configuration utilisateur
* du service (par exemple, le code d'inscription, le format des résultats...).
*
* @api
* @uses langue2code_apixu()
*
* @param string $lieu
* Lieu pour lequel on acquiert les données météorologiques.
* @param string $mode
* Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
* @param int $periodicite
* La périodicité horaire des prévisions :
* - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
* - `0`, pour les modes `conditions` et `infos`
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return string
* URL complète de la requête.
*/
function apixu_service2url($lieu, $mode, $periodicite, $configuration) {
// Identification de la langue du resume.
include_spip('inc/rainette_normaliser');
$code_langue = langue_determiner($configuration);
// On normalise le lieu et on récupère son format.
// Le service accepte la format ville,pays, le format latitude,longitude et le format adresse IP.
// Néanmoins, la query a toujours la même forme; il n'est donc pas nécessaire de gérer le format.
$lieu_normalise = lieu_normaliser($lieu);
$url = _RAINETTE_APIXU_URL_BASE;
if ($mode == 'previsions') {
$url .= "/forecast.{$configuration['format_flux']}";
} else {
$url .= "/current.{$configuration['format_flux']}";
}
$url .= '?key=' . $configuration['inscription']
. '&lang=' . $code_langue
. '&q=' . $lieu_normalise;
if ($mode == 'previsions') {
$url .= '&days=' . $configuration['periodicites'][$periodicite]['max_jours'];
}
return $url;
}
/**
* @param array $erreur
*
* @return bool
*/
function apixu_erreur_verifier($erreur) {
// Initialisation
$est_erreur = false;
// Une erreur est toujours décrite par un code et un message.
if (!empty($erreur['code']) and !empty($erreur['message'])) {
$est_erreur = true;
}
return $est_erreur;
}
/**
* Complète par des données spécifiques au service le tableau des conditions issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return array
* Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function apixu_complement2conditions($tableau, $configuration) {
if ($tableau) {
// Compléter le tableau standard avec les états météorologiques calculés
etat2resume_apixu($tableau, $configuration);
}
return $tableau;
}
/**
* Complète par des données spécifiques au service le tableau des conditions issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
* @param int $index_periode
* Index trouver et ranger les données. Cet index n'est pas utilisé pour les conditions
*
* @return array
* Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function apixu_complement2previsions($tableau, $configuration, $index_periode) {
if (($tableau) and ($index_periode > -1)) {
// Convertir les informations exprimées en système métrique dans le systeme US si la
// configuration le demande
if ($configuration['unite'] == 's') {
metrique2imperial_apixu($tableau);
}
// Compléter le tableau standard avec les états météorologiques calculés
etat2resume_apixu($tableau, $configuration);
}
return $tableau;
}
/**
* ---------------------------------------------------------------------------------------------
* Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
* ---------------------------------------------------------------------------------------------
*/
/**
* @param array $tableau
*
* @return void
*/
function metrique2imperial_apixu(&$tableau) {
// Seules la température, la température ressentie et la vitesse du vent sont fournies dans
// les deux systèmes.
// Etant donnée que les tableaux sont normalisés, ils contiennent toujours les index de chaque
// donnée météo, il est donc inutile de tester leur existence.
include_spip('inc/rainette_convertir');
$tableau['visibilite'] = ($tableau['visibilite'])
? kilometre2mile($tableau['visibilite'])
: '';
$tableau['pression'] = ($tableau['pression'])
? millibar2inch($tableau['pression'])
: '';
$tableau['precipitation'] = ($tableau['precipitation'])
? millimetre2inch($tableau['precipitation'])
: '';
}
/**
* Calcule les états en fonction des états météorologiques natifs fournis par le service.
*
* @internal
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service. Le tableau est mis à jour et renvoyé à l'appelant.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return void
*/
function etat2resume_apixu(&$tableau, $configuration) {
if ($tableau['code_meteo'] and $tableau['icon_meteo']) {
// Determination de l'indicateur jour/nuit. Pour ce service aucun indicateur n'est disponible.
// -> on utilise l'url de l'icone qui contient l'indication "/night/" pour la nuit
if (strpos($tableau['icon_meteo'], '/night/') === false) {
// C'est le jour
$tableau['periode'] = 0;
} else {
// C'est la nuit
$tableau['periode'] = 1;
}
// Détermination du résumé à afficher.
// Depuis la 3.4.6 on affiche plus que le résumé natif de chaque service car les autres services
// que weather.com possèdent de nombreuses traductions qu'il convient d'utiliser.
// Pour éviter de modifier la structure de données, on conserve donc desc_meteo et resume même si
// maintenant ces deux données coincident toujours.
$tableau['resume'] = ucfirst($tableau['desc_meteo']);
// Determination de l'icone qui sera affiché.
// -- on stocke le code afin de le fournir en alt dans la balise img
$tableau['icone'] = array();
$tableau['icone']['code'] = $tableau['code_meteo'];
// -- on calcule le chemin complet de l'icone.
if ($configuration['condition'] == $configuration['alias']) {
// On affiche l'icône natif fourni par le service et désigné par son url
// en faisant une copie locale dans IMG/.
include_spip('inc/distant');
$tableau['icone']['source'] = copie_locale($tableau['icon_meteo']);
} else {
include_spip('inc/rainette_normaliser');
if ($configuration['condition'] == "{$configuration['alias']}_local") {
// On affiche un icône d'un thème local compatible avec APIXU.
// Les icônes sont rangés dans themes/$service/$theme_local/$periode où periode vaut 'day' ou 'night'.
// Les icônes APIXU sont les mêmes que ceux de wwo, seuls le code météo change. Néanmoins, le service
// APIXU renvoi dans la donnée 'icon_meteo' le code wwo que l'on peut utiliser pour construire l'icone.
$chemin = icone_local_normaliser(
basename($tableau['icon_meteo']),
$configuration['alias'],
$configuration['theme_local'],
$tableau['periode'] == 0 ? 'day' : 'night');
} else {
// On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
$chemin = icone_weather_normaliser(
$tableau['code_meteo'],
$configuration['theme_weather'],
$configuration['transcodage_weather'],
$tableau['periode']);
}
include_spip('inc/utils');
$tableau['icone']['source'] = find_in_path($chemin);
}
}
}

+ 3
- 0
services/config/rainette.yaml View File

@ -55,6 +55,9 @@ service:
nom: '_id_service_'
# Etat d'activité du service, actif par défaut.
actif: true
# -- URL de base des requêtes et des icones (éventuellement)
endpoint_requete: ''
endpoint_icone: ''
# Liens vers les crédits, les termes d'utilisation, l'enregistrement et les offres de service
# On donne un titre standard en anglais à chaque lien qui peut être modifier par service.
credits:


+ 3
- 0
services/config/service.template.yaml View File

@ -16,6 +16,9 @@
service:
# -- Identification: saisir le nom complet du service
nom: 'monservice'
# -- URL de base des requêtes et des icones (éventuellement)
endpoint_requete: ''
endpoint_icone: ''
# -- Activité: par défaut à true, donc à laisser en commentaire. A mettre à false si on veut déprécier le service
#actif: true
# -- Liens vers les crédits et titre de la page (pour les affichages / modèles)


+ 0
- 470
services/darksky.php View File

@ -1,470 +0,0 @@
<?php
/**
* Ce fichier contient la configuration et l'ensemble des fonctions implémentant le service Dark Sky (darksky).
* Ce service fournit des données au format JSON.
*
* @package SPIP\RAINETTE\SERVICES\DARKSKY
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_RAINETTE_DARKSKY_URL_BASE')) {
/**
* URL de base (endpoint) des requêtes au service Dark Sky.
*/
define('_RAINETTE_DARKSKY_URL_BASE', 'https://api.darksky.net');
}
// Configuration des valeurs par défaut des éléments de la configuration dynamique.
// Ces valeurs sont applicables à tous les modes.
$GLOBALS['rainette_darksky_config']['service'] = array(
'alias' => 'darksky',
'nom' => 'Dark Sky',
'actif' => false,
'credits' => array(
'titre' => 'Powered by Dark Sky',
'logo' => '',
'lien' => 'https://darksky.net/poweredby/',
),
'termes' => array(
'titre' => 'Terms of Service',
'lien' => 'https://darksky.net/dev/docs/terms'
),
'enregistrement' => array(
'titre' => 'Register',
'lien' => 'https://darksky.net/dev/register',
'taille_cle' => 32
),
'offres' => array(
'titre' => 'Dead Simple Pricing',
'lien' => 'https://darksky.net/dev',
'limites' => array(
'day' => 1000
),
),
'langues' => array(
'disponibles' => array(
'ar' => 'ar',
'az' => 'az',
'be' => 'be',
'bg' => 'bg',
'bn' => 'bn',
'bs' => 'bs',
'ca' => 'ca',
'cs' => 'cs',
'da' => 'da',
'de' => 'de',
'el' => 'el',
'en' => 'en',
'eo' => 'eo',
'es' => 'es',
'et' => 'et',
'fi' => 'fi',
'fr' => 'fr',
'he' => 'he',
'hi' => 'hi',
'hr' => 'hr',
'hu' => 'hu',
'id' => 'id',
'is' => 'is',
'it' => 'it',
'ja' => 'ja',
'ka' => 'ka',
'kn' => 'kn',
'ko' => 'ko',
'kw' => '',
'lv' => 'lv',
'ml' => 'ml',
'mr' => 'mr',
'nb' => 'nb',
'nl' => 'nl',
'no' => 'no',
'pa' => 'pa',
'pl' => 'pl',
'pt' => 'pt',
'ro' => 'ro',
'ru' => 'ru',
'sk' => 'sk',
'sl' => 'sl',
'sr' => 'sr',
'sv' => 'sv',
'ta' => 'ta',
'te' => 'te',
'tet' => '',
'tr' => 'tr',
'uk' => 'uk',
'ur' => 'ur',
'x-pig-latin' => '',
'zh' => 'zh',
'zh_tw' => 'zh_tw',
),
'defaut' => 'en'
),
'defauts' => array(
'inscription' => '',
'unite' => 'm',
'condition' => 'darksky_local',
'theme' => '',
'theme_local' => 'original',
'theme_weather' => 'sticker',
),
// Dark Sky ne gère pas le jour et la nuit pour les résumés ou icones :
// - de fait, on indique les mêmes codes pour le jour et la nuit
'transcodage_weather' => array(
'clear-day' => array(32, 32),
'clear-night' => array(31, 31),
'cloudy' => array(26, 26),
'fog' => array(20, 20),
'partly-cloudy-day' => array(30, 30),
'partly-cloudy-night' => array(29, 29),
'rain' => array(11, 11),
'sleet' => array(18, 18),
'snow' => array(16, 16),
'wind' => array(24, 24),
'hail' => array(17, 17), // for future use
'thunderstorm' => array(4, 4), // for future use
'tornado' => array(0, 0) // for future use
)
);
// Configuration des données fournies par le service weatherstack pour le mode 'infos' en format JSON.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_darksky_config']['infos'] = array(
'periode_maj' => 86400,
'format_flux' => 'json',
'cle_base' => array(),
'donnees' => array(
// Lieu
'ville' => array('cle' => array()),
'pays' => array('cle' => array()),
'pays_iso2' => array('cle' => array()),
'region' => array('cle' => array()),
// Coordonnées
'longitude' => array('cle' => array('longitude')),
'latitude' => array('cle' => array('latitude')),
// Informations complémentaires : aucune configuration car ce sont des données calculées
),
);
// Configuration des données fournies par le service weatherstack pour le mode 'conditions'.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_darksky_config']['conditions'] = array(
'periode_maj' => 10800,
'format_flux' => 'json',
'cle_base' => array('currently'),
'donnees' => array(
// Données d'observation
'derniere_maj' => array('cle' => array('time')),
'station' => array('cle' => array()),
// Températures
'temperature_reelle' => array('cle' => array('temperature')),
'temperature_ressentie' => array('cle' => array('apparentTemperature')),
// Données anémométriques
'vitesse_vent' => array('cle' => array('windSpeed')),
'angle_vent' => array('cle' => array('windBearing')),
'direction_vent' => array('cle' => array()),
// Données atmosphériques : risque_uv est calculé
'precipitation' => array('cle' => array()),
'humidite' => array('cle' => array('humidity')),
'point_rosee' => array('cle' => array('dewPoint')),
'pression' => array('cle' => array('pressure')),
'tendance_pression' => array('cle' => array()),
'visibilite' => array('cle' => array('visibility')),
'nebulosite' => array('cle' => array('cloudCover')),
'indice_uv' => array('cle' => array('uvIndex')),
// Etats météorologiques natifs
'code_meteo' => array('cle' => array('icon')),
'icon_meteo' => array('cle' => array('icon')),
'desc_meteo' => array('cle' => array('summary')),
'trad_meteo' => array('cle' => array()),
'jour_meteo' => array('cle' => array()),
// Etats météorologiques calculés : icone, resume, periode sont calculés
),
);
// Configuration des données fournies par le service weatherstack pour le mode 'conditions'.
// -- L'API fournit 10 jours de prévisions avec une périodicité systématique de 1h.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_darksky_config']['previsions'] = array(
'periodicites' => array(
24 => array('max_jours' => 7),
),
'periodicite_defaut' => 24,
'periode_maj' => 14400,
'format_flux' => 'json',
'cle_base' => array('daily', 'data'),
'cle_heure' => array(),
'structure_heure' => false,
'donnees' => array(
// Données d'observation
'date' => array('cle' => array('time')),
'heure' => array('cle' => array('time')),
// Données astronomiques
'lever_soleil' => array('cle' => array('sunriseTime')),
'coucher_soleil' => array('cle' => array('sunsetTime')),
// Températures
'temperature' => array('cle' => array()),
'temperature_max' => array('cle' => array('temperatureMax')),
'temperature_min' => array('cle' => array('temperatureMin')),
// Données anémométriques
'vitesse_vent' => array('cle' => array('windSpeed')),
'angle_vent' => array('cle' => array('windBearing')),
'direction_vent' => array('cle' => array()),
// Données atmosphériques : risque_uv est calculé
'risque_precipitation' => array('cle' => array()),
'precipitation' => array('cle' => array()),
'humidite' => array('cle' => array('humidity')),
'point_rosee' => array('cle' => array('dewPoint')),
'pression' => array('cle' => array('pressure')),
'visibilite' => array('cle' => array('visibility')),
'nebulosite' => array('cle' => array('cloudCover')),
'indice_uv' => array('cle' => array('uvIndex')),
// Etats météorologiques natifs
'code_meteo' => array('cle' => array('icon')),
'icon_meteo' => array('cle' => array('icon')),
'desc_meteo' => array('cle' => array('summary')),
'trad_meteo' => array('cle' => array()),
'jour_meteo' => array('cle' => array()),
// Etats météorologiques calculés : icone, resume, periode sont calculés
),
);
// Configuration des données fournies par le service weatherstack en cas d'erreur.
// -- Seules les données non calculées sont configurées.
$GLOBALS['rainette_darksky_config']['erreurs'] = array(
'cle_base' => array(),
'donnees' => array(
// Erreur
'code' => array('cle' => array('code')),
'message' => array('cle' => array('error')),
),
);
// ------------------------------------------------------------------------------------------------
// Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
// unique de chargement des données météorologiques `meteo_charger()`.
// ------------------------------------------------------------------------------------------------
/**
* Fournit la configuration statique du service pour le type de données requis.
*
* @api
*
* @param string $mode Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
* La périodicité n'est pas nécessaire car la configuration est indifférente à ce paramètre.
*
* @return array Le tableau des données de configuration communes au service et propres au type de données demandé.
*/
function darksky_service2configuration($mode) {
// On merge la configuration propre au mode et la configuration du service proprement dite
// composée des valeurs par défaut de la configuration utilisateur et de paramètres généraux.
$config = array_merge($GLOBALS['rainette_darksky_config'][$mode], $GLOBALS['rainette_darksky_config']['service']);
return $config;
}
/**
* Construit l'url de la requête correspondant au lieu, au type de données et à la configuration utilisateur
* du service (par exemple, le code d'inscription, le format des résultats...).
*
* @api
*
* @uses langue2code_darksky()
*
* @param string $lieu Lieu pour lequel on acquiert les données météorologiques.
* @param string $mode Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
* @param int $periodicite La périodicité horaire des prévisions :
* - `24` pour le mode `previsions`
* - `0`, pour les modes `conditions` et `infos`
* @param array $configuration Configuration complète du service, statique et utilisateur.
*
* @return string URL complète de la requête.
*/
function darksky_service2url($lieu, $mode, $periodicite, $configuration) {
// Identification de la langue du resume.
include_spip('inc/rainette_normaliser');
$code_langue = langue_determiner($configuration);
// On normalise le lieu et on récupère son format.
// Le service accepte la format ville,pays, le format latitude,longitude et le format adresse IP.
// Néanmoins, la query a toujours la même forme; il n'est donc pas nécessaire de gérer le format.
$lieu_normalise = lieu_normaliser($lieu);
// Exclusion des blocs inutiles en réponse à la requête.
$exclusions = 'minutely,hourly,alerts,flags,';
if ($mode == 'previsions') {
$exclusions .= 'currently';
} else {
$exclusions .= 'daily';
}
$url = _RAINETTE_DARKSKY_URL_BASE
. '/forecast'
. "/{$configuration['inscription']}"
. "/${lieu_normalise}"
. "?lang=${code_langue}"
. '&units=' . ($configuration['unite'] == 'm' ? 'si' : 'us')
. "&exclude=${exclusions}";
return $url;
}
/**
* Vérifie si une erreur a été renvoyée dans la réponse du service.
*
* @param array $erreur Bloc d'erreur du service avant normalisation.
*
* @return bool
*/
function darksky_erreur_verifier($erreur) {
// Initialisation
$est_erreur = false;
// Une erreur est toujours décrite par un code et un message.
if (!empty($erreur['code']) and !empty($erreur['error'])) {
$est_erreur = true;
}
return $est_erreur;
}
/**
* Complète par des données spécifiques au service le tableau des conditions issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration Configuration complète du service, statique et utilisateur.
*
* @return array Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function darksky_complement2conditions($tableau, $configuration) {
if ($tableau) {
include_spip('inc/rainette_convertir');
// Calcul de la direction du vent (16 points).
$tableau['direction_vent'] = angle2direction($tableau['angle_vent']);
// On convertit aussi l'humidité et la nébulosité en pourcentage car elle sont fournies en float entre 0 et 1.
$tableau['humidite'] = 100 * $tableau['humidite'];
$tableau['nebulosite'] = 100 * $tableau['nebulosite'];
// Vitesse du vent en km/h plutôt qu'en m/s si on est en système métrique.
if ($configuration['unite'] == 'm') {
$tableau['vitesse_vent'] = metre_seconde2kilometre_heure($tableau['vitesse_vent']);
}
// Compléter le tableau standard avec les états météorologiques calculés
etat2resume_darksky($tableau, $configuration);
}
return $tableau;
}
/**
* Complète par des données spécifiques au service le tableau des conditions issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration Configuration complète du service, statique et utilisateur.
* @param int $index_periode Index trouver et ranger les données. Cet index n'est pas utilisé pour les conditions
*
* @return array Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function darksky_complement2previsions($tableau, $configuration, $index_periode) {
if (($tableau) and ($index_periode > -1)) {
// Calcul de la direction du vent (16 points).
include_spip('inc/rainette_convertir');
$tableau['direction_vent'] = angle2direction($tableau['angle_vent']);
// On convertit aussi l'humidité et la nébulosité en pourcentage car elle sont fournies en float entre 0 et 1.
$tableau['humidite'] = 100 * $tableau['humidite'];
$tableau['nebulosite'] = 100 * $tableau['nebulosite'];
// Vitesse du vent en km/h plutôt qu'en m/s si on est en système métrique.
if ($configuration['unite'] == 'm') {
$tableau['vitesse_vent'] = metre_seconde2kilometre_heure($tableau['vitesse_vent']);
}
// Compléter le tableau standard avec les états météorologiques calculés
etat2resume_darksky($tableau, $configuration);
}
return $tableau;
}
/**
* ---------------------------------------------------------------------------------------------
* Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
* ---------------------------------------------------------------------------------------------.
*/
/**
* Calcule les états en fonction des états météorologiques natifs fournis par le service.
*
* @internal
*
* @param array $tableau Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service. Le tableau est mis à jour et renvoyé à l'appelant.
* @param array $configuration Configuration complète du service, statique et utilisateur.
*
* @return void
*/
function etat2resume_darksky(&$tableau, $configuration) {
if ($tableau['code_meteo'] and $tableau['icon_meteo']) {
// Determination de l'indicateur jour/nuit. Pour ce service aucun indicateur n'est disponible.
// -> le calcul qui est fait n'est pas déterministe car il existe des icones communs jour/nuit.
if (strpos($tableau['icon_meteo'], '-night') === false) {
// C'est le jour
$tableau['periode'] = 0;
} else {
// C'est la nuit
$tableau['periode'] = 1;
}
// Détermination du résumé à afficher.
// Depuis la 3.4.6 on affiche plus que le résumé natif de chaque service car les autres services
// que weather.com possèdent de nombreuses traductions qu'il convient d'utiliser.
// Pour éviter de modifier la structure de données, on conserve donc desc_meteo et resume même si
// maintenant ces deux données coincident toujours.
$tableau['resume'] = ucfirst($tableau['desc_meteo']);
// Determination de l'icone qui sera affiché.
// -- on stocke le code afin de le fournir en alt dans la balise img
$tableau['icone'] = array();
$tableau['icone']['code'] = $tableau['code_meteo'];
// -- on calcule le chemin complet de l'icone. Le service ne founit pas d'icone via l'API.
include_spip('inc/rainette_normaliser');
if ($configuration['condition'] == "{$configuration['alias']}_local") {
// On affiche un icône d'un thème local compatible avec Dark Sky.
// Les icônes sont rangés dans themes/$service/$theme_local/. Pas de distinction en fonction de
// la période.
$chemin = icone_local_normaliser(
"{$tableau['icon_meteo']}.png",
$configuration['alias'],
$configuration['theme_local']
);
} else {
// On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
$chemin = icone_weather_normaliser(
$tableau['code_meteo'],
$configuration['theme_weather'],
$configuration['transcodage_weather']
);
}
include_spip('inc/utils');
$tableau['icone']['source'] = find_in_path($chemin);
}
}

+ 10
- 42
services/owm.php View File

@ -9,19 +9,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined('_RAINETTE_OWM_URL_BASE_REQUETE')) {
/**
* URL de base (endpoint) des requêtes au service OpenWeatherMap.
*/
define('_RAINETTE_OWM_URL_BASE_REQUETE', 'http://api.openweathermap.org/data/2.5/');
}
if (!defined('_RAINETTE_OWM_URL_BASE_ICONE')) {
/**
* URL de base des icônes fournis par le service OpenWeatherMap.
*/
define('_RAINETTE_OWM_URL_BASE_ICONE', 'http://openweathermap.org/img/w');
}
/**
* ------------------------------------------------------------------------------------------------
@ -29,26 +16,8 @@ if (!defined('_RAINETTE_OWM_URL_BASE_ICONE')) {
* unique de chargement des données météorologiques `meteo_charger()`.
* PACKAGE SPIP\RAINETTE\OWM\API
* ------------------------------------------------------------------------------------------------
*
* @param mixed $mode
*/
/**
* @param string $mode
*
* @return array
*/
function owm_service2configuration($mode) {
// On merge la configuration propre au mode et la configuration du service proprement dit
// composée des valeurs par défaut de la configuration utilisateur et de paramètres généraux.
include_spip('inc/config');
$config_service = lire_config('rainette_owm', array());
$config = array_merge($config_service[$mode], $config_service['service']);
return $config;
}
/**
* @param $lieu
* @param $mode
@ -85,18 +54,17 @@ function owm_service2url($lieu, $mode, $periodicite, $configuration) {
$query = "q=${lieu_normalise}";
}
$url = _RAINETTE_OWM_URL_BASE_REQUETE
. $demande . '?'
. $query
. '&mode=' . $configuration['format_flux']
. '&units=' . ($configuration['unite'] == 'm' ? 'metric' : 'imperial')
. ((($mode == 'previsions') and ($periodicite == 24))
return
$configuration['endpoint_requete']
. $demande . '?'
. $query
. '&mode=' . $configuration['format_flux']
. '&units=' . ($configuration['unite'] == 'm' ? 'metric' : 'imperial')
. ((($mode == 'previsions') and ($periodicite == 24))
? '&cnt=' . $configuration['periodicites'][$periodicite]['max_jours']
: '')
. '&lang=' . $code_langue
. ($configuration['inscription'] ? '&appid=' . $configuration['inscription'] : '');
return $url;
. '&lang=' . $code_langue
. ($configuration['inscription'] ? '&appid=' . $configuration['inscription'] : '');
}
@ -253,7 +221,7 @@ function etat2resume_owm(&$tableau, $configuration) {
// On affiche l'icône natif fourni par le service et désigné par son url
// en faisant une copie locale dans IMG/.
include_spip('inc/distant');
$url = _RAINETTE_OWM_URL_BASE_ICONE
$url = $configuration['endpoint_icone']
. (substr($configuration['theme'], 0, 1) == 'n' ? 'n' : '')
. '/' . $tableau['icon_meteo']
. (substr($configuration['theme'], 1, 2) == '2x' ? '@2x' : '')


+ 4
- 2
services/owm.yaml View File

@ -15,6 +15,8 @@
service:
nom: 'OpenWeather'
#actif: true
endpoint_requete: 'https://api.openweathermap.org/data/2.5/'
endpoint_icone: 'http://openweathermap.org/img/w'
credits:
#titre:
lien: 'http://openweathermap.org/'
@ -30,8 +32,8 @@ service: