1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
From 558a29efc4c9f055799d23ee6c75464e24489e5a Mon Sep 17 00:00:00 2001
From: "Friedrich W. H. Kossebau" <kossebau@kde.org>
Date: Fri, 30 Mar 2018 17:10:32 +0200
Subject: [weather dataengine] Fix BBC provider to adapt to change RSS feed
Summary:
The urls of the BBC weather feeds seem to have changed, resulting in the
dataengine to use no longer existing urls.
...
BUG: 392510
...
Differential Revision: https://phabricator.kde.org/D11808
---
dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp | 47 +++++++++++++---------
dataengines/weather/ions/bbcukmet/ion_bbcukmet.h | 4 +-
2 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp b/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
index 6acaa9b..fcf0bae 100644
--- a/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
+++ b/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
@@ -266,7 +266,19 @@ bool UKMETIon::updateIonSource(const QString& source)
setData(source, QStringLiteral("validate"), QStringLiteral("bbcukmet|malformed"));
return true;
}
- m_place[QStringLiteral("bbcukmet|") +sourceAction[2]].XMLurl = sourceAction[3];
+
+ XMLMapInfo& place = m_place[QStringLiteral("bbcukmet|") + sourceAction[2]];
+
+ // backward compatibility after rss feed url change in 2018/03
+ place.sourceExtraArg = sourceAction[3];
+ if (place.sourceExtraArg.startsWith(QLatin1String("http://open.live.bbc.co.uk/"))) {
+ // Old data source id stored the full (now outdated) observation feed url
+ // http://open.live.bbc.co.uk/weather/feeds/en/STATIOID/observations.rss
+ // as extra argument, so extract the id from that
+ place.stationId = place.sourceExtraArg.section(QLatin1Char('/'), -2, -2);
+ } else {
+ place.stationId = place.sourceExtraArg;
+ }
getXMLData(sourceAction[0] + QLatin1Char('|') + sourceAction[2]);
return true;
}
@@ -288,7 +300,7 @@ void UKMETIon::getXMLData(const QString& source)
}
}
- const QUrl url(m_place[source].XMLurl);
+ const QUrl url(QStringLiteral("https://weather-broker-cdn.api.bbci.co.uk/en/observation/rss/") + m_place[source].stationId);
KIO::TransferJob* getJob = KIO::get(url, KIO::Reload, KIO::HideProgressInfo);
getJob->addMetaData(QStringLiteral("cookies"), QStringLiteral("none")); // Disable displaying cookies
@@ -328,13 +340,8 @@ void UKMETIon::findPlace(const QString& place, const QString& source)
void UKMETIon::getFiveDayForecast(const QString& source)
{
XMLMapInfo& place = m_place[source];
- QUrl xmlMap(place.forecastHTMLUrl);
-
- const QString stationID = xmlMap.path().section(QLatin1Char('/'), -1);
-
- place.XMLforecastURL = QStringLiteral("http://open.live.bbc.co.uk/weather/feeds/en/") + stationID + QStringLiteral("/3dayforecast.rss") + xmlMap.query();
- const QUrl url(place.XMLforecastURL);
+ const QUrl url(QStringLiteral("https://weather-broker-cdn.api.bbci.co.uk/en/forecast/rss/3day/") + place.stationId);
KIO::TransferJob* getJob = KIO::get(url, KIO::Reload, KIO::HideProgressInfo);
getJob->addMetaData(QStringLiteral("cookies"), QStringLiteral("none")); // Disable displaying cookies
@@ -362,8 +369,6 @@ void UKMETIon::readSearchHTMLData(const QString& source, const QByteArray& html)
const QString fullName = result.value(QStringLiteral("fullName")).toString();
if (!id.isEmpty() && !fullName.isEmpty()) {
- const QString url = QStringLiteral("http://open.live.bbc.co.uk/weather/feeds/en/") + id + QStringLiteral("/observations.rss");
-
QString tmp = QStringLiteral("bbcukmet|") + fullName;
// Duplicate places can exist
@@ -372,7 +377,7 @@ void UKMETIon::readSearchHTMLData(const QString& source, const QByteArray& html)
counter++;
}
XMLMapInfo& place = m_place[tmp];
- place.XMLurl = url;
+ place.stationId = id;
place.place = fullName;
m_locations.append(tmp);
}
@@ -561,6 +566,9 @@ void UKMETIon::parseWeatherForecast(const QString& source, QXmlStreamReader& xml
if (xml.isStartElement()) {
if (elementName == QLatin1String("item")) {
parseFiveDayForecast(source, xml);
+ } else if (elementName == QLatin1String("link") &&
+ xml.namespaceUri().isEmpty()) {
+ m_place[source].forecastHTMLUrl = xml.readElementText();
} else {
parseUnknownElement(xml);
}
@@ -644,9 +652,6 @@ void UKMETIon::parseWeatherObservation(const QString& source, WeatherData& data,
}
}
- } else if (elementName == QLatin1String("link")) {
- m_place[source].forecastHTMLUrl = xml.readElementText();
-
} else if (elementName == QLatin1String("description")) {
QString observeString = xml.readElementText();
const QStringList observeData = observeString.split(QLatin1Char(':'));
@@ -871,7 +876,7 @@ void UKMETIon::validate(const QString& source)
QString placeList;
for (const QString& place : qAsConst(m_locations)) {
const QString p = place.section(QLatin1Char('|'), 1, 1);
- placeList.append(QStringLiteral("|place|") + p + QStringLiteral("|extra|") + m_place[place].XMLurl);
+ placeList.append(QStringLiteral("|place|") + p + QStringLiteral("|extra|") + m_place[place].stationId);
}
if (m_locations.count() > 1) {
setData(source, QStringLiteral("validate"),
@@ -897,12 +902,18 @@ void UKMETIon::updateWeather(const QString& source)
QString weatherSource = source;
// TODO: why the replacement here instead of just a new string?
weatherSource.replace(QStringLiteral("bbcukmet|"), QStringLiteral("bbcukmet|weather|"));
- weatherSource.append(QLatin1Char('|') + place.XMLurl);
+ weatherSource.append(QLatin1Char('|') + place.sourceExtraArg);
Plasma::DataEngine::Data data;
- data.insert(QStringLiteral("Place"), weatherData.stationName);
- data.insert(QStringLiteral("Station"), weatherData.stationName);
+ // work-around for buggy observation RSS feed missing the station name
+ QString stationName = weatherData.stationName;
+ if (stationName.isEmpty() || stationName == QLatin1String(",")) {
+ stationName = source.section(QLatin1Char('|'), 1, 1);
+ }
+
+ data.insert(QStringLiteral("Place"), stationName);
+ data.insert(QStringLiteral("Station"), stationName);
if (weatherData.observationDateTime.isValid()) {
data.insert(QStringLiteral("Observation Timestamp"), weatherData.observationDateTime);
}
diff --git a/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h b/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h
index a1026f4..d9d3ad3 100644
--- a/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h
+++ b/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h
@@ -155,10 +155,10 @@ private:
private:
struct XMLMapInfo {
+ QString stationId;
QString place;
- QString XMLurl;
QString forecastHTMLUrl;
- QString XMLforecastURL;
+ QString sourceExtraArg;
};
// Key dicts
--
cgit v0.11.2
|