From 5c80418ee6bb44b4a5128c02801bcdff58e99f76 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 24 Nov 2022 16:50:13 +0100 Subject: [PATCH] I#2164 - RSS: Fails to read RDF feeds Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/2164 --- src/modules/rss/e-rss-parser.c | 36 +++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/modules/rss/e-rss-parser.c b/src/modules/rss/e-rss-parser.c index 12736de9af..b0b169d4bb 100644 --- a/src/modules/rss/e-rss-parser.c +++ b/src/modules/rss/e-rss-parser.c @@ -196,6 +196,7 @@ e_rss_read_item (xmlNodePtr item, { ERssFeed *feed = e_rss_feed_new (); xmlNodePtr node; + gboolean has_author = FALSE; for (node = item->children; node; node = node->next) { xmlChar *value = NULL; @@ -246,7 +247,8 @@ e_rss_read_item (xmlNodePtr item, if (enclosure) feed->enclosures = g_slist_prepend (feed->enclosures, enclosure); - } else if (g_strcmp0 ((const gchar *) node->name, "author") == 0) { + } else if (g_strcmp0 ((const gchar *) node->name, "author") == 0 || + (!has_author && g_strcmp0 ((const gchar *) node->name, "creator") == 0)) { xmlChar *name = NULL, *email = NULL; e_rss_read_feed_person (node, &name, &email); @@ -255,6 +257,8 @@ e_rss_read_item (xmlNodePtr item, g_clear_pointer (&feed->author, g_free); feed->author = e_rss_parser_encode_address (name, email); + has_author = g_strcmp0 ((const gchar *) node->name, "author") == 0; + g_clear_pointer (&name, xmlFree); g_clear_pointer (&email, xmlFree); } @@ -263,7 +267,8 @@ e_rss_read_item (xmlNodePtr item, if (value && *value) feed->last_modified = camel_header_decode_date ((const gchar *) value, NULL); - } else if (g_strcmp0 ((const gchar *) node->name, "updated") == 0) { + } else if (g_strcmp0 ((const gchar *) node->name, "updated") == 0 || + g_strcmp0 ((const gchar *) node->name, "date") == 0) { value = xmlNodeGetContent (node); if (value && *value) { @@ -312,9 +317,9 @@ e_rss_read_defaults_rdf (xmlNodePtr root, for (node = root->children; node; node = node->next) { if (g_strcmp0 ((const gchar *) node->name, "channel") == 0) { xmlNodePtr subnode; - gboolean has_author = FALSE, has_link = FALSE, has_title = FALSE, has_image = FALSE; + gboolean has_author = FALSE, has_link = FALSE, has_title = FALSE, has_image = FALSE, has_date = FALSE; - for (subnode = node->children; subnode && (!has_author || !has_link || !has_title || !has_image); subnode = subnode->next) { + for (subnode = node->children; subnode && (!has_author || !has_link || !has_title || !has_image || !has_date); subnode = subnode->next) { if (!has_author && g_strcmp0 ((const gchar *) subnode->name, "creator") == 0) { g_clear_pointer (&defaults->author_name, xmlFree); defaults->author_name = xmlNodeGetContent (subnode); @@ -339,6 +344,24 @@ e_rss_read_defaults_rdf (xmlNodePtr root, defaults->icon = xmlGetProp (subnode, (const xmlChar *) "resource"); has_image = TRUE; } + + if (!has_date && g_strcmp0 ((const gchar *) subnode->name, "date") == 0) { + xmlChar *value = xmlNodeGetContent (subnode); + + if (value && *value) { + GDateTime *dt; + + dt = g_date_time_new_from_iso8601 ((const gchar *) value, NULL); + + if (dt) + defaults->publish_date = g_date_time_to_unix (dt); + + g_clear_pointer (&dt, g_date_time_unref); + } + + g_clear_pointer (&value, xmlFree); + has_date = TRUE; + } } break; @@ -577,7 +600,7 @@ e_rss_parser_parse (const gchar *xml, const FeedDefaults *defaults, GSList **out_feeds) = NULL; - if (g_strcmp0 ((const gchar *) root->name, "rdf") == 0) { + if (g_strcmp0 ((const gchar *) root->name, "RDF") == 0) { /* RSS 1.0 - https://web.resource.org/rss/1.0/ */ e_rss_read_defaults_rdf (root, &defaults); read_func = e_rss_read_rdf; @@ -591,6 +614,9 @@ e_rss_parser_parse (const gchar *xml, read_func = e_rss_read_feed; } + if (!defaults.publish_date) + defaults.publish_date = g_get_real_time (); + if (defaults.base || defaults.link || defaults.alt_link) { const gchar *base;