[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#985049: marked as done (unblock: libgweather/3.36.1-2)



Your message dated Fri, 12 Mar 2021 10:15:50 +0000
with message-id <E1lKepi-0005NU-U2@respighi.debian.org>
and subject line unblock libgweather
has caused the Debian Bug report #985049,
regarding unblock: libgweather/3.36.1-2
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
985049: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=985049
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package libgweather

[ Reason ]
The provider of the weather data (yr.no/met.no) changed their API and we
need to use the new one.

There was also a request to reduce the precision of the coordinates sent
in the query to improve caching on their side.

[ Impact ]
The applications using libgweather (ie. gnome-weather, gnome-shell,...)
are not showing any weather data.

[ Tests ]
gnome-weather and gnome-shell now display the data.

[ Risks ]
The changes are quite straightforward and all patches have been
backported by Andreas from upstream git.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
The provider has asked upstream to rename everything from yr.no to
met.no. Upstream renamed everything, including the name of constants in
the API, something we cannot do now due to the freeze.

https://gitlab.gnome.org/GNOME/libgweather/-/issues/59

unblock libgweather/3.36.1-2
diff -Nru libgweather-3.36.1/debian/changelog libgweather-3.36.1/debian/changelog
--- libgweather-3.36.1/debian/changelog	2020-08-29 00:36:23.000000000 +0200
+++ libgweather-3.36.1/debian/changelog	2021-03-10 18:26:48.000000000 +0100
@@ -1,3 +1,18 @@
+libgweather (3.36.1-2) unstable; urgency=medium
+
+  [ Andreas Henriksson ]
+  * Add patches from upstream for yr.no->met.no API. These patches has been
+    cherry-picked from upstream and modified to apply directly to the yrno
+    backend (without renaming it to metno and breaking the API). (Closes:
+    #983917)
+
+  [ Laurent Bigonville ]
+  * Only use 4 significant decimals for locations when sending the query.
+    Patch from upstream. More precision is not needed and this helps to
+    improve caching on the provider side and reduce their load.
+
+ -- Iain Lane <laney@debian.org>  Wed, 10 Mar 2021 17:26:48 +0000
+
 libgweather (3.36.1-1) unstable; urgency=medium
 
   * Team upload
diff -Nru libgweather-3.36.1/debian/libgweather-3-16.symbols libgweather-3.36.1/debian/libgweather-3-16.symbols
--- libgweather-3.36.1/debian/libgweather-3-16.symbols	2020-08-29 00:36:23.000000000 +0200
+++ libgweather-3.36.1/debian/libgweather-3-16.symbols	2021-03-10 18:26:48.000000000 +0100
@@ -1,6 +1,7 @@
 libgweather-3.so.16 libgweather-3-16 #MINVER#
 * Build-Depends-Package: libgweather-3-dev
  _gweather_location_reset_world@Base 3.32.0
+ _radians_to_degrees_str@Base 3.36.1-2~
  gweather_conditions_to_string@Base 3.7.91
  gweather_conditions_to_string_full@Base 3.25.91
  gweather_distance_unit_get_type@Base 3.7.91
diff -Nru libgweather-3.36.1/debian/patches/gweather-Only-use-4-significant-decimals-for-locations.patch libgweather-3.36.1/debian/patches/gweather-Only-use-4-significant-decimals-for-locations.patch
--- libgweather-3.36.1/debian/patches/gweather-Only-use-4-significant-decimals-for-locations.patch	1970-01-01 01:00:00.000000000 +0100
+++ libgweather-3.36.1/debian/patches/gweather-Only-use-4-significant-decimals-for-locations.patch	2021-03-10 18:26:48.000000000 +0100
@@ -0,0 +1,179 @@
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 7 Jan 2021 12:46:34 +0100
+Subject: gweather: Only use 4 significant decimals for locations
+
+1/1000th of a degree of longitude or latitude corresponds to around
+100 meters. There's no reason for the weather to be any more precise
+than this.
+
+See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616
+
+Closes: #69
+---
+ libgweather/gweather-private.c | 21 ++++++++++++++++-----
+ libgweather/gweather-private.h |  3 +++
+ libgweather/test_libgweather.c | 16 ++++++++++++++++
+ libgweather/weather-iwin.c     |  7 ++++---
+ libgweather/weather-owm.c      |  7 ++++---
+ libgweather/weather-yrno.c     |  7 ++++---
+ 6 files changed, 47 insertions(+), 14 deletions(-)
+
+diff --git a/libgweather/gweather-private.c b/libgweather/gweather-private.c
+index b214ad9..0ccc21b 100644
+--- a/libgweather/gweather-private.c
++++ b/libgweather/gweather-private.c
+@@ -22,8 +22,19 @@
+ 
+ #include "gweather-private.h"
+ 
+-/*
+-  There is no code here: the purpose of this header is so that
+-  gnome-builder knows how to pick up the include flags to parse
+-  gweather-private.h properly.
+-*/
++/* sign, 3 digits, separator, 4 decimals, nul-char */
++#define DEGREES_STR_SIZE (1 + 3 + 1 + 4 + 1)
++
++char *
++_radians_to_degrees_str (gdouble radians)
++{
++  char *str;
++  double degrees;
++
++  str = g_malloc0 (DEGREES_STR_SIZE);
++  /* Max 4 decimals */
++  degrees = (double) ((int) (RADIANS_TO_DEGREES (radians) * 10000)) / 10000;
++  /* Too many digits */
++  g_return_val_if_fail (degrees <= 1000 || degrees >= -1000, NULL);
++  return g_ascii_formatd (str, G_ASCII_DTOSTR_BUF_SIZE, "%g", degrees);
++}
+diff --git a/libgweather/gweather-private.h b/libgweather/gweather-private.h
+index ddf0a41..be73768 100644
+--- a/libgweather/gweather-private.h
++++ b/libgweather/gweather-private.h
+@@ -167,6 +167,9 @@ struct _GWeatherInfoPrivate {
+ #define RADIANS_TO_DEGREES(rad)		((rad) * 180. / M_PI)
+ #define RADIANS_TO_HOURS(rad)		((rad) * 12. / M_PI)
+ 
++GWEATHER_EXTERN
++char           *_radians_to_degrees_str (gdouble radians);
++
+ /*
+  * Planetary Mean Orbit and their progressions from J2000 are based on the
+  * values in http://ssd.jpl.nasa.gov/txt/aprx_pos_planets.pdf
+diff --git a/libgweather/test_libgweather.c b/libgweather/test_libgweather.c
+index 8a21911..e0e4b81 100644
+--- a/libgweather/test_libgweather.c
++++ b/libgweather/test_libgweather.c
+@@ -26,6 +26,7 @@
+ #include <gweather-version.h>
+ #include "gweather-location.h"
+ #include "gweather-weather.h"
++#include "gweather-private.h"
+ 
+ extern void _gweather_location_reset_world (void);
+ 
+@@ -758,6 +759,20 @@ test_weather_loop_use_after_free (void)
+     g_main_loop_unref (loop);
+ }
+ 
++static void
++test_radians_to_degrees_str (void)
++{
++    char long_version[G_ASCII_DTOSTR_BUF_SIZE];
++    g_autofree char *short_version = NULL;
++    double coord = 1.260765526077;
++
++    g_ascii_dtostr (long_version, G_ASCII_DTOSTR_BUF_SIZE, RADIANS_TO_DEGREES (coord));
++    short_version = _radians_to_degrees_str (coord);
++
++    g_assert_cmpint (strlen (long_version), >, strlen (short_version));
++    g_assert_cmpstr (short_version, ==, "72.2365");
++}
++
+ static void
+ log_handler (const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer user_data)
+ {
+@@ -780,6 +795,7 @@ main (int argc, char *argv[])
+ 		  FALSE);
+ 	set_gsettings ();
+ 
++	g_test_add_func ("/weather/radians-to-degrees_str", test_radians_to_degrees_str);
+ 	g_test_add_func ("/weather/named-timezones", test_named_timezones);
+ 	g_test_add_func ("/weather/named-timezones-deserialized", test_named_timezones_deserialized);
+ 	g_test_add_func ("/weather/no-code-serialize", test_no_code_serialize);
+diff --git a/libgweather/weather-iwin.c b/libgweather/weather-iwin.c
+index c3d414d..7102039 100644
+--- a/libgweather/weather-iwin.c
++++ b/libgweather/weather-iwin.c
+@@ -353,7 +353,8 @@ iwin_start_open (GWeatherInfo *info)
+     SoupMessage *msg;
+     struct tm tm;
+     time_t now;
+-    gchar latstr[G_ASCII_DTOSTR_BUF_SIZE], lonstr[G_ASCII_DTOSTR_BUF_SIZE];
++    g_autofree char *latstr = NULL;
++    g_autofree char *lonstr = NULL;
+ 
+     g_assert (info != NULL);
+ 
+@@ -376,8 +377,8 @@ iwin_start_open (GWeatherInfo *info)
+     now = time (NULL);
+     localtime_r (&now, &tm);
+ 
+-    g_ascii_dtostr (latstr, sizeof(latstr), RADIANS_TO_DEGREES (loc->latitude));
+-    g_ascii_dtostr (lonstr, sizeof(lonstr), RADIANS_TO_DEGREES (loc->longitude));
++    latstr = _radians_to_degrees_str (loc->latitude);
++    lonstr = _radians_to_degrees_str (loc->longitude);
+     url = g_strdup_printf ("https://www.weather.gov/forecasts/xml/sample_products/browser_interface/ndfdBrowserClientByDay.php?&lat=%s&lon=%s&format=24+hourly&startDate=%04d-%02d-%02d&numDays=7";,
+ 			   latstr, lonstr, 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday);
+     g_debug ("iwin_start_open, requesting: %s", url);
+diff --git a/libgweather/weather-owm.c b/libgweather/weather-owm.c
+index a58950c..eb45f52 100644
+--- a/libgweather/weather-owm.c
++++ b/libgweather/weather-owm.c
+@@ -428,7 +428,8 @@ owm_start_open (GWeatherInfo *info)
+     gchar *url;
+     SoupMessage *message;
+     WeatherLocation *loc;
+-    gchar latstr[G_ASCII_DTOSTR_BUF_SIZE], lonstr[G_ASCII_DTOSTR_BUF_SIZE];
++    g_autofree char *latstr = NULL;
++    g_autofree char *lonstr = NULL;
+ 
+     priv = info->priv;
+     loc = &priv->location;
+@@ -438,8 +439,8 @@ owm_start_open (GWeatherInfo *info)
+ 
+     /* see the description here: http://bugs.openweathermap.org/projects/api/wiki/Api_2_5_forecast */
+ 
+-    g_ascii_dtostr (latstr, sizeof(latstr), RADIANS_TO_DEGREES (loc->latitude));
+-    g_ascii_dtostr (lonstr, sizeof(lonstr), RADIANS_TO_DEGREES (loc->longitude));
++    latstr = _radians_to_degrees_str (loc->latitude);
++    lonstr = _radians_to_degrees_str (loc->longitude);
+ 
+ #define TEMPLATE_START "https://api.openweathermap.org/data/2.5/forecast?lat=%s&lon=%s&mode=xml&units=metric";
+ #ifdef OWM_APIKEY
+diff --git a/libgweather/weather-yrno.c b/libgweather/weather-yrno.c
+index 7c89df2..ef6d188 100644
+--- a/libgweather/weather-yrno.c
++++ b/libgweather/weather-yrno.c
+@@ -435,7 +435,8 @@ yrno_start_open (GWeatherInfo *info)
+     gchar *url;
+     SoupMessage *message;
+     WeatherLocation *loc;
+-    gchar latstr[G_ASCII_DTOSTR_BUF_SIZE], lonstr[G_ASCII_DTOSTR_BUF_SIZE];
++    g_autofree char *latstr = NULL;
++    g_autofree char *lonstr = NULL;
+ 
+     priv = info->priv;
+     loc = &priv->location;
+@@ -445,8 +446,8 @@ yrno_start_open (GWeatherInfo *info)
+ 
+     /* see the description here: https://api.met.no/weatherapi/locationforecast/2.0/documentation */
+ 
+-    g_ascii_dtostr (latstr, sizeof(latstr), RADIANS_TO_DEGREES (loc->latitude));
+-    g_ascii_dtostr (lonstr, sizeof(lonstr), RADIANS_TO_DEGREES (loc->longitude));
++    latstr = _radians_to_degrees_str (loc->latitude);
++    lonstr = _radians_to_degrees_str (loc->longitude);
+ 
+     url = g_strdup_printf("https://"; API_ENDPOINT_DOMAIN "/weatherapi/locationforecast/2.0/classic?lat=%s&lon=%s", latstr, lonstr);
+     g_debug ("yrno_start_open, requesting: %s", url);
diff -Nru libgweather-3.36.1/debian/patches/metno-Use-alphabetical-2.0-symbol-codes.patch libgweather-3.36.1/debian/patches/metno-Use-alphabetical-2.0-symbol-codes.patch
--- libgweather-3.36.1/debian/patches/metno-Use-alphabetical-2.0-symbol-codes.patch	1970-01-01 01:00:00.000000000 +0100
+++ libgweather-3.36.1/debian/patches/metno-Use-alphabetical-2.0-symbol-codes.patch	2021-03-10 18:26:48.000000000 +0100
@@ -0,0 +1,158 @@
+From: =?utf-8?q?Florian_M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 21 Jan 2021 05:12:21 +0100
+Subject: metno: Use alphabetical 2.0 symbol codes
+
+The numerical codes are deprecated and scheduled for removal, so
+replace them with the non-deprecated alphabetical codes as listed
+in https://api.met.no/weatherapi/weathericon/2.0/.
+
+https://gitlab.gnome.org/GNOME/libgweather/-/issues/67
+---
+ libgweather/weather-yrno.c | 113 ++++++++++++++++++++++-----------------------
+ 1 file changed, 55 insertions(+), 58 deletions(-)
+
+diff --git a/libgweather/weather-yrno.c b/libgweather/weather-yrno.c
+index 9bd974d..7c89df2 100644
+--- a/libgweather/weather-yrno.c
++++ b/libgweather/weather-yrno.c
+@@ -42,53 +42,53 @@
+ 
+ /* Reference for symbols at https://api.met.no/weatherapi/weathericon/2.0/ */
+ typedef struct {
+-    int code;
++    const char *code;
+     GWeatherSky sky;
+     GWeatherConditions condition;
+ } YrnoSymbol;
+ 
+ static YrnoSymbol symbols[] = {
+-    { 1,  GWEATHER_SKY_CLEAR,     { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* Sun */
+-    { 2,  GWEATHER_SKY_BROKEN,    { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* LightCloud */
+-    { 3,  GWEATHER_SKY_SCATTERED, { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* PartlyCloudy */
+-    { 4,  GWEATHER_SKY_OVERCAST,  { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* Cloudy */
+-    { 5,  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_LIGHT } }, /* LightRainSun */
+-    { 6,  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* LightRainThunderSun */
+-    { 7,  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_NONE } }, /* SleetSun */
+-    { 8,  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_NONE } }, /* SnowSun */
+-    { 9,  GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_LIGHT } }, /* SnowSun */
+-    { 10, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_NONE } }, /* Rain */
+-    { 11, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* RainThunder */
+-    { 12, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_NONE } }, /* Sleet */
+-    { 13, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_NONE } }, /* Snow */
+-    { 14, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SnowThunder */
+-    { 15, GWEATHER_SKY_CLEAR,     { TRUE, GWEATHER_PHENOMENON_FOG, GWEATHER_QUALIFIER_NONE } }, /* Fog */
+-    { 20, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SleetSunThunder */
+-    { 21, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SnowSunThunder */
+-    { 22, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* LightRainThunder */
+-    { 23, GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SleetThunder */
+-    { 24, GWEATHER_SKY_BROKEN,  { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* DrizzleThunderSun */
+-    { 25, GWEATHER_SKY_BROKEN,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* RainThunderSun */
+-    { 26, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleetThunderSun */
+-    { 27, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleetThunderSun */
+-    { 28, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnowThunderSun */
+-    { 29, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySnowThunderSun */
+-    { 30, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* DrizzleThunder */
+-    { 31, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleetThunder */
+-    { 32, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleetThunder */
+-    { 33, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnowThunder */
+-    { 34, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySnowThunder */
+-    { 40, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_NONE } }, /* DrizzleSun */
+-    { 41, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_NONE } }, /* RainSun */
+-    { 42, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleetSun */
+-    { 43, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleetSun */
+-    { 44, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnowSun */
+-    { 45, GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySnowSun */
+-    { 46, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_NONE } }, /* Drizzle */
+-    { 47, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleet */
+-    { 48, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleet */
+-    { 49, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnow */
+-    { 50, GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } } /* HeavySnow */
++    { "clearsky",  GWEATHER_SKY_CLEAR,     { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* Sun */
++    { "fair",  GWEATHER_SKY_BROKEN,    { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* LightCloud */
++    { "partlycloudy",  GWEATHER_SKY_SCATTERED, { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* PartlyCloudy */
++    { "cloudy",  GWEATHER_SKY_OVERCAST,  { FALSE, GWEATHER_PHENOMENON_NONE, GWEATHER_QUALIFIER_NONE } }, /* Cloudy */
++    { "rainshowers",  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_LIGHT } }, /* LightRainSun */
++    { "rainshowersandthunder",  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* LightRainThunderSun */
++    { "sleetshowers",  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_NONE } }, /* SleetSun */
++    { "snowshowers",  GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_NONE } }, /* SnowSun */
++    { "rain",  GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_LIGHT } }, /* SnowSun */
++    { "heavyrain", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_NONE } }, /* Rain */
++    { "heavyrainandthunder", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* RainThunder */
++    { "sleet", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_NONE } }, /* Sleet */
++    { "snow", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_NONE } }, /* Snow */
++    { "snowandthunder", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SnowThunder */
++    { "fog", GWEATHER_SKY_CLEAR,     { TRUE, GWEATHER_PHENOMENON_FOG, GWEATHER_QUALIFIER_NONE } }, /* Fog */
++    { "sleetshowersandthunder", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SleetSunThunder */
++    { "snowshowersandthunder", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SnowSunThunder */
++    { "rainandthunder", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* LightRainThunder */
++    { "sleetandthunder", GWEATHER_SKY_OVERCAST,  { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* SleetThunder */
++    { "lightrainshowersandthunder", GWEATHER_SKY_BROKEN,  { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* DrizzleThunderSun */
++    { "heavyrainshowersandthunder", GWEATHER_SKY_BROKEN,  { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* RainThunderSun */
++    { "lightssleetshowersandthunder", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleetThunderSun */
++    { "heavysleetshowersandthunder", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleetThunderSun */
++    { "lightssnowshowersandthunder", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnowThunderSun */
++    { "heavysnowshowersandthunder", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySnowThunderSun */
++    { "lightrainandthunder", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_THUNDERSTORM } }, /* DrizzleThunder */
++    { "lightsleetandthunder", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleetThunder */
++    { "heavysleetandthunder", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleetThunder */
++    { "lightsnowandthunder", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnowThunder */
++    { "heavysnowandthunder", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySnowThunder */
++    { "lightrainshowers", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_NONE } }, /* DrizzleSun */
++    { "heavyrainshowers", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_RAIN, GWEATHER_QUALIFIER_NONE } }, /* RainSun */
++    { "lightsleetshowers", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleetSun */
++    { "heavysleetshowers", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleetSun */
++    { "lightsnowshowers", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnowSun */
++    { "heavysnowshowers", GWEATHER_SKY_BROKEN,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySnowSun */
++    { "lightrain", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_DRIZZLE, GWEATHER_QUALIFIER_NONE } }, /* Drizzle */
++    { "lightsleet", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_LIGHT } }, /* LightSleet */
++    { "heavysleet", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_ICE_PELLETS, GWEATHER_QUALIFIER_HEAVY } }, /* HeavySleet */
++    { "lightsnow", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_LIGHT } }, /* LightSnow */
++    { "heavysnow", GWEATHER_SKY_OVERCAST,    { TRUE, GWEATHER_PHENOMENON_SNOW, GWEATHER_QUALIFIER_HEAVY } } /* HeavySnow */
+ };
+ 
+ static struct {
+@@ -149,21 +149,18 @@ date_to_time_t (const xmlChar *str, const char * tzid)
+ }
+ 
+ static YrnoSymbol *
+-symbol_search (int code)
++symbol_search (const char *code)
+ {
+-    int a = 0;
+-    int b = G_N_ELEMENTS (symbols);
+-
+-    while (a < b) {
+-	int c = (a + b)/2;
+-	YrnoSymbol *yc = symbols + c;
+-
+-	if (yc->code == code)
+-	    return yc;
+-	if (yc->code < code)
+-	    a = c+1;
+-	else
+-	    b = c;
++    unsigned int i;
++
++    for (i = 0; i < G_N_ELEMENTS (symbols); i++) {
++        YrnoSymbol *s = symbols + i;
++
++        if (strcmp (code, s->code) == 0)
++            return s;
++
++        if (strstr (code, s->code) == code && code[strlen (s->code)] == '_')
++            return s;
+     }
+ 
+     return NULL;
+@@ -177,9 +174,9 @@ read_symbol (GWeatherInfo *info,
+     YrnoSymbol* symbol;
+     GWeatherInfoPrivate *priv = info->priv;
+ 
+-    val = xmlGetProp (node, XC("number"));
++    val = xmlGetProp (node, XC("code"));
+ 
+-    symbol = symbol_search (strtol ((char*) val, NULL, 0));
++    symbol = symbol_search ((char *)val);
+     if (symbol != NULL) {
+ 	priv->valid = TRUE;
+ 	priv->sky = symbol->sky;
diff -Nru libgweather-3.36.1/debian/patches/metno-Use-as-arguments-separator-in-query.patch libgweather-3.36.1/debian/patches/metno-Use-as-arguments-separator-in-query.patch
--- libgweather-3.36.1/debian/patches/metno-Use-as-arguments-separator-in-query.patch	1970-01-01 01:00:00.000000000 +0100
+++ libgweather-3.36.1/debian/patches/metno-Use-as-arguments-separator-in-query.patch	2021-03-10 18:26:48.000000000 +0100
@@ -0,0 +1,26 @@
+From: Bastien Nocera <hadess@hadess.net>
+Date: Tue, 12 Jan 2021 14:22:28 +0100
+Subject: metno: Use "&" as arguments separator in query
+
+According to the HTML5 spec ";" is no longer allowed. This was
+automatically rewritten in Varnish, but was temporary measure
+and was likely to disappear if on cache/load balancer change.
+
+Closes: #72
+---
+ libgweather/weather-yrno.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libgweather/weather-yrno.c b/libgweather/weather-yrno.c
+index c8570ab..9bd974d 100644
+--- a/libgweather/weather-yrno.c
++++ b/libgweather/weather-yrno.c
+@@ -451,7 +451,7 @@ yrno_start_open (GWeatherInfo *info)
+     g_ascii_dtostr (latstr, sizeof(latstr), RADIANS_TO_DEGREES (loc->latitude));
+     g_ascii_dtostr (lonstr, sizeof(lonstr), RADIANS_TO_DEGREES (loc->longitude));
+ 
+-    url = g_strdup_printf("https://"; API_ENDPOINT_DOMAIN "/weatherapi/locationforecast/2.0/classic?lat=%s;lon=%s", latstr, lonstr);
++    url = g_strdup_printf("https://"; API_ENDPOINT_DOMAIN "/weatherapi/locationforecast/2.0/classic?lat=%s&lon=%s", latstr, lonstr);
+     g_debug ("yrno_start_open, requesting: %s", url);
+ 
+     message = soup_message_new ("GET", url);
diff -Nru libgweather-3.36.1/debian/patches/metno-Use-compat-2.0-API.patch libgweather-3.36.1/debian/patches/metno-Use-compat-2.0-API.patch
--- libgweather-3.36.1/debian/patches/metno-Use-compat-2.0-API.patch	1970-01-01 01:00:00.000000000 +0100
+++ libgweather-3.36.1/debian/patches/metno-Use-compat-2.0-API.patch	2021-03-10 18:26:48.000000000 +0100
@@ -0,0 +1,40 @@
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 7 Jan 2021 15:14:40 +0100
+Subject: metno: Use compat 2.0 API
+
+Version 1.9, which we were using, was deprecated and will be removed soon,
+so migrate to the compat XML output of the v2.0 API.
+
+Closes: #65
+---
+ libgweather/weather-yrno.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/libgweather/weather-yrno.c b/libgweather/weather-yrno.c
+index 8324121..f41cbe6 100644
+--- a/libgweather/weather-yrno.c
++++ b/libgweather/weather-yrno.c
+@@ -37,7 +37,7 @@
+ 
+ #define XC(t) ((const xmlChar *)(t))
+ 
+-/* Reference for symbols at http://om.yr.no/forklaring/symbol/ */
++/* Reference for symbols at https://api.met.no/weatherapi/weathericon/2.0/ */
+ typedef struct {
+     int code;
+     GWeatherSky sky;
+@@ -443,12 +443,12 @@ yrno_start_open (GWeatherInfo *info)
+     if (!loc->latlon_valid)
+ 	return FALSE;
+ 
+-    /* see the description here: https://api.met.no/ */
++    /* see the description here: https://api.met.no/weatherapi/locationforecast/2.0/documentation */
+ 
+     g_ascii_dtostr (latstr, sizeof(latstr), RADIANS_TO_DEGREES (loc->latitude));
+     g_ascii_dtostr (lonstr, sizeof(lonstr), RADIANS_TO_DEGREES (loc->longitude));
+ 
+-    url = g_strdup_printf("https://api.met.no/weatherapi/locationforecast/1.9/?lat=%s;lon=%s";, latstr, lonstr);
++    url = g_strdup_printf("https://api.met.no/weatherapi/locationforecast/2.0/classic?lat=%s;lon=%s";, latstr, lonstr);
+     g_debug ("yrno_start_open, requesting: %s", url);
+ 
+     message = soup_message_new ("GET", url);
diff -Nru libgweather-3.36.1/debian/patches/metno-Use-GNOME-specific-subdomain.patch libgweather-3.36.1/debian/patches/metno-Use-GNOME-specific-subdomain.patch
--- libgweather-3.36.1/debian/patches/metno-Use-GNOME-specific-subdomain.patch	1970-01-01 01:00:00.000000000 +0100
+++ libgweather-3.36.1/debian/patches/metno-Use-GNOME-specific-subdomain.patch	2021-03-10 18:26:48.000000000 +0100
@@ -0,0 +1,32 @@
+From: Bastien Nocera <hadess@hadess.net>
+Date: Tue, 12 Jan 2021 14:21:21 +0100
+Subject: metno: Use GNOME-specific subdomain
+
+This allows the API provider to track libgweather usage.
+---
+ libgweather/weather-yrno.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/libgweather/weather-yrno.c b/libgweather/weather-yrno.c
+index f41cbe6..c8570ab 100644
+--- a/libgweather/weather-yrno.c
++++ b/libgweather/weather-yrno.c
+@@ -37,6 +37,9 @@
+ 
+ #define XC(t) ((const xmlChar *)(t))
+ 
++/* As per https://gitlab.gnome.org/GNOME/libgweather/-/issues/59#note_1004747 */
++#define API_ENDPOINT_DOMAIN "aa037rv1tsaszxi6o.api.met.no"
++
+ /* Reference for symbols at https://api.met.no/weatherapi/weathericon/2.0/ */
+ typedef struct {
+     int code;
+@@ -448,7 +451,7 @@ yrno_start_open (GWeatherInfo *info)
+     g_ascii_dtostr (latstr, sizeof(latstr), RADIANS_TO_DEGREES (loc->latitude));
+     g_ascii_dtostr (lonstr, sizeof(lonstr), RADIANS_TO_DEGREES (loc->longitude));
+ 
+-    url = g_strdup_printf("https://api.met.no/weatherapi/locationforecast/2.0/classic?lat=%s;lon=%s";, latstr, lonstr);
++    url = g_strdup_printf("https://"; API_ENDPOINT_DOMAIN "/weatherapi/locationforecast/2.0/classic?lat=%s;lon=%s", latstr, lonstr);
+     g_debug ("yrno_start_open, requesting: %s", url);
+ 
+     message = soup_message_new ("GET", url);
diff -Nru libgweather-3.36.1/debian/patches/series libgweather-3.36.1/debian/patches/series
--- libgweather-3.36.1/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ libgweather-3.36.1/debian/patches/series	2021-03-10 18:26:48.000000000 +0100
@@ -0,0 +1,5 @@
+metno-Use-compat-2.0-API.patch
+metno-Use-GNOME-specific-subdomain.patch
+metno-Use-as-arguments-separator-in-query.patch
+metno-Use-alphabetical-2.0-symbol-codes.patch
+gweather-Only-use-4-significant-decimals-for-locations.patch

--- End Message ---
--- Begin Message ---
Unblocked libgweather.

--- End Message ---

Reply to: