|
|
b5cc75 |
From 55644fae34ab49834dd52c834c211e765d41f8ab Mon Sep 17 00:00:00 2001
|
|
|
b5cc75 |
From: Raphael Geissert <atomo64@gmail.com>
|
|
|
b5cc75 |
Date: Sat, 15 Feb 2014 15:20:26 +0100
|
|
|
b5cc75 |
Subject: [PATCH 1/3] Update to BBC's new json-based search and modified xml
|
|
|
b5cc75 |
|
|
|
b5cc75 |
BUG:330773
|
|
|
b5cc75 |
---
|
|
|
b5cc75 |
.../weather/ions/bbcukmet/ion_bbcukmet.cpp | 93 ++++++++++++--------
|
|
|
b5cc75 |
1 file changed, 54 insertions(+), 39 deletions(-)
|
|
|
b5cc75 |
|
|
|
b5cc75 |
diff --git a/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp b/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
|
|
|
b5cc75 |
index 746a734..c656e40 100644
|
|
|
b5cc75 |
--- a/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
|
|
|
b5cc75 |
+++ b/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
|
|
|
b5cc75 |
@@ -80,6 +80,7 @@ QMap<QString, IonInterface::ConditionIcons> UKMETIon::setupDayIconMappings(void)
|
|
|
b5cc75 |
//dayList["sunny intervals night"] = ClearNight;
|
|
|
b5cc75 |
dayList["partly cloudy"] = PartlyCloudyDay;
|
|
|
b5cc75 |
dayList["cloudy"] = Overcast;
|
|
|
b5cc75 |
+ dayList["light cloud"] = Overcast;
|
|
|
b5cc75 |
dayList["white cloud"] = Overcast;
|
|
|
b5cc75 |
dayList["grey cloud"] = Overcast;
|
|
|
b5cc75 |
//dayList["low level cloud"] = NotAvailable;
|
|
|
b5cc75 |
@@ -131,6 +132,7 @@ QMap<QString, IonInterface::ConditionIcons> UKMETIon::setupNightIconMappings(voi
|
|
|
b5cc75 |
nightList["sunny intervals"] = PartlyCloudyDay; // it's not really sunny
|
|
|
b5cc75 |
nightList["sunny"] = ClearDay;
|
|
|
b5cc75 |
nightList["cloudy"] = Overcast;
|
|
|
b5cc75 |
+ nightList["light cloud"] = Overcast;
|
|
|
b5cc75 |
nightList["white cloud"] = Overcast;
|
|
|
b5cc75 |
nightList["grey cloud"] = Overcast;
|
|
|
b5cc75 |
nightList["partly cloudy"] = PartlyCloudyNight;
|
|
|
b5cc75 |
@@ -252,7 +254,8 @@ void UKMETIon::getXMLData(const QString& source)
|
|
|
b5cc75 |
void UKMETIon::findPlace(const QString& place, const QString& source)
|
|
|
b5cc75 |
{
|
|
|
b5cc75 |
KUrl url;
|
|
|
b5cc75 |
- url = "http://news.bbc.co.uk/weather/util/search/SearchResultsNode.xhtml?&search=" + place + "®ion=world&startIndex=0&count=500";
|
|
|
b5cc75 |
+ /* There's a page= parameter, results are limited to 10 by page */
|
|
|
b5cc75 |
+ url = "http://www.bbc.com/locator/default/en-GB/search.json?search="+place+"&filter=international&postcode_unit=false&postcode_district=true";
|
|
|
b5cc75 |
|
|
|
b5cc75 |
m_job = KIO::get(url.url(), KIO::Reload, KIO::HideProgressInfo);
|
|
|
b5cc75 |
m_job->addMetaData("cookies", "none"); // Disable displaying cookies
|
|
|
b5cc75 |
@@ -281,7 +284,7 @@ void UKMETIon::getFiveDayForecast(const QString& source)
|
|
|
b5cc75 |
|
|
|
b5cc75 |
int splitIDPos = xmlPath.lastIndexOf('/');
|
|
|
b5cc75 |
QString stationID = xmlPath.midRef(splitIDPos + 1).toString();
|
|
|
b5cc75 |
- m_place[source].XMLforecastURL = "http://newsrss.bbc.co.uk/weather/forecast/" + stationID + "/Next3DaysRSS.xml" + xmlMap.query();
|
|
|
b5cc75 |
+ m_place[source].XMLforecastURL = "http://open.live.bbc.co.uk/weather/feeds/en/" + stationID + "/3dayforecast.rss" + xmlMap.query();
|
|
|
b5cc75 |
KUrl url(m_place[source].XMLforecastURL);
|
|
|
b5cc75 |
|
|
|
b5cc75 |
m_job = KIO::get(url.url(), KIO::Reload, KIO::HideProgressInfo);
|
|
|
b5cc75 |
@@ -303,47 +306,43 @@ void UKMETIon::readSearchHTMLData(const QString& source, const QByteArray& html)
|
|
|
b5cc75 |
QStringList tokens;
|
|
|
b5cc75 |
QString url;
|
|
|
b5cc75 |
QString tmp;
|
|
|
b5cc75 |
- int flag = 0;
|
|
|
b5cc75 |
int counter = 2;
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- // "Vitoria, Brazil "
|
|
|
b5cc75 |
- QRegExp grabURL("/[a-z]+/[a-z]+/([0-9]+)(\\?[^\"]+)?");
|
|
|
b5cc75 |
- QRegExp grabPlace(">([^<]*[a-z()])"); // FIXME: It would be better to strip away the extra '>'
|
|
|
b5cc75 |
+#ifdef __GNUC__
|
|
|
b5cc75 |
+#warning FIXME: use a json parser instead of regexes
|
|
|
b5cc75 |
+#endif
|
|
|
b5cc75 |
+
|
|
|
b5cc75 |
+ QRegExp grabURL("\"id\":\\s*\"([0-9]+)\"");
|
|
|
b5cc75 |
+ QRegExp grabPlace("\"fullName\":\\s*\"([^\"]+)\"");
|
|
|
b5cc75 |
|
|
|
b5cc75 |
while (!stream.atEnd()) {
|
|
|
b5cc75 |
line = stream.readLine();
|
|
|
b5cc75 |
- if (line.contains("") > 0) {
|
|
|
b5cc75 |
- flag = 1;
|
|
|
b5cc75 |
- }
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- if (line.contains("There are no forecasts matching") > 0) {
|
|
|
b5cc75 |
+ if (line.contains("Sorry, no results found for") > 0) {
|
|
|
b5cc75 |
break;
|
|
|
b5cc75 |
}
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- if (flag) {
|
|
|
b5cc75 |
+ if (line.contains("\"results\"") > 0) {
|
|
|
b5cc75 |
|
|
|
b5cc75 |
if (grabURL.indexIn(line.trimmed()) > 0) {
|
|
|
b5cc75 |
- url = "http://newsrss.bbc.co.uk/weather/forecast/" + grabURL.cap(1) + "/ObservationsRSS.xml";
|
|
|
b5cc75 |
- if (grabURL.captureCount() > 1) {
|
|
|
b5cc75 |
- url += grabURL.cap(2);
|
|
|
b5cc75 |
- }
|
|
|
b5cc75 |
- grabPlace.indexIn(line.trimmed());
|
|
|
b5cc75 |
- tmp = QString("bbcukmet|").append(grabPlace.cap(1));
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- // Duplicate places can exist
|
|
|
b5cc75 |
- if (m_locations.contains(tmp)) {
|
|
|
b5cc75 |
- tmp = QString("bbcukmet|").append(QString("%1 (#%2)").arg(grabPlace.cap(1)).arg(counter));
|
|
|
b5cc75 |
- counter++;
|
|
|
b5cc75 |
- }
|
|
|
b5cc75 |
+ for (int captureIndex = 1; captureIndex <= grabURL.captureCount(); captureIndex++) {
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- m_place[tmp].XMLurl = url;
|
|
|
b5cc75 |
- m_place[tmp].place = grabPlace.cap(1);
|
|
|
b5cc75 |
- m_locations.append(tmp);
|
|
|
b5cc75 |
- }
|
|
|
b5cc75 |
- }
|
|
|
b5cc75 |
+ url = "http://open.live.bbc.co.uk/weather/feeds/en/" + grabURL.cap(captureIndex) + "/observations.rss";
|
|
|
b5cc75 |
+ grabPlace.indexIn(line.trimmed());
|
|
|
b5cc75 |
+ tmp = QString("bbcukmet|").append(grabPlace.cap(captureIndex));
|
|
|
b5cc75 |
+
|
|
|
b5cc75 |
+ // Duplicate places can exist
|
|
|
b5cc75 |
+ if (m_locations.contains(tmp)) {
|
|
|
b5cc75 |
+ tmp = QString("bbcukmet|").append(QString("%1 (#%2)").arg(grabPlace.cap(captureIndex)).arg(counter));
|
|
|
b5cc75 |
+ counter++;
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- if (line.contains("") > 0) {
|
|
|
b5cc75 |
- flag = 0;
|
|
|
b5cc75 |
+ m_place[tmp].XMLurl = url;
|
|
|
b5cc75 |
+ m_place[tmp].place = grabPlace.cap(captureIndex);
|
|
|
b5cc75 |
+ m_locations.append(tmp);
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
}
|
|
|
b5cc75 |
}
|
|
|
b5cc75 |
|
|
|
b5cc75 |
@@ -557,12 +556,13 @@ void UKMETIon::parseWeatherObservation(const QString& source, WeatherData& data,
|
|
|
b5cc75 |
QStringRef conditionData = conditionString.midRef(splitIndex + 1); // Include ':'
|
|
|
b5cc75 |
data.obsTime = conditionString.midRef(0, splitIndex).toString();
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- // Friday at 0200 GMT
|
|
|
b5cc75 |
- m_dateFormat = QDateTime::fromString(data.obsTime.split("at")[1].trimmed(), "hhmm 'GMT'");
|
|
|
b5cc75 |
+ // Saturday - 13:00 CET
|
|
|
b5cc75 |
+ // Saturday - 12:00 GMT
|
|
|
b5cc75 |
+ m_dateFormat = QDateTime::fromString(data.obsTime.split("-")[1].trimmed(), "hh:mm 'GMT'");
|
|
|
b5cc75 |
data.iconPeriodHour = m_dateFormat.toString("hh").toInt();
|
|
|
b5cc75 |
data.iconPeriodMinute = m_dateFormat.toString("mm").toInt();
|
|
|
b5cc75 |
|
|
|
b5cc75 |
- data.condition = conditionData.toString().split('.')[0].trimmed();
|
|
|
b5cc75 |
+ data.condition = conditionData.toString().split(',')[0].trimmed();
|
|
|
b5cc75 |
|
|
|
b5cc75 |
} else if (xml.name() == "link") {
|
|
|
b5cc75 |
m_place[source].forecastHTMLUrl = xml.readElementText();
|
|
|
b5cc75 |
@@ -575,21 +575,32 @@ void UKMETIon::parseWeatherObservation(const QString& source, WeatherData& data,
|
|
|
b5cc75 |
#endif
|
|
|
b5cc75 |
|
|
|
b5cc75 |
data.temperature_C = observeData[1].split(QChar(176))[0].trimmed();
|
|
|
b5cc75 |
-
|
|
|
b5cc75 |
- // Temperature might be not available
|
|
|
b5cc75 |
- if (data.temperature_C.contains("N/A")) {
|
|
|
b5cc75 |
+ if (data.temperature_C.contains("N/A") || data.temperature_C.contains("null")) {
|
|
|
b5cc75 |
data.temperature_C = i18n("N/A");
|
|
|
b5cc75 |
}
|
|
|
b5cc75 |
|
|
|
b5cc75 |
data.windDirection = observeData[2].split(',')[0].trimmed();
|
|
|
b5cc75 |
+ if (data.windDirection.contains("null")) {
|
|
|
b5cc75 |
+ data.windDirection = "";
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
+
|
|
|
b5cc75 |
data.windSpeed_miles = observeData[3].split(',')[0].split(' ')[1].remove("mph");
|
|
|
b5cc75 |
+ if (data.windSpeed_miles.contains("null")) {
|
|
|
b5cc75 |
+ data.windSpeed_miles = "N/A";
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
|
|
|
b5cc75 |
data.humidity = observeData[4].split(',')[0].split(' ')[1];
|
|
|
b5cc75 |
if (data.humidity.endsWith('%')) {
|
|
|
b5cc75 |
data.humidity.chop(1);
|
|
|
b5cc75 |
}
|
|
|
b5cc75 |
+ if (data.humidity.contains("null")) {
|
|
|
b5cc75 |
+ data.humidity = "N/A";
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
|
|
|
b5cc75 |
data.pressure = observeData[5].split(',')[0].split(' ')[1].split("mb")[0];
|
|
|
b5cc75 |
+ if (data.pressure.contains("null")) {
|
|
|
b5cc75 |
+ data.pressure = "N/A";
|
|
|
b5cc75 |
+ }
|
|
|
b5cc75 |
data.pressureTendency = observeData[5].split(',')[1].trimmed();
|
|
|
b5cc75 |
|
|
|
b5cc75 |
data.visibilityStr = observeData[6].trimmed();
|
|
|
b5cc75 |
@@ -600,6 +611,10 @@ void UKMETIon::parseWeatherObservation(const QString& source, WeatherData& data,
|
|
|
b5cc75 |
} else if (xml.name() == "long") {
|
|
|
b5cc75 |
const QString ordinate = xml.readElementText();
|
|
|
b5cc75 |
data.longitude = ordinate.toDouble();
|
|
|
b5cc75 |
+ } else if (xml.name() == "georss:point") {
|
|
|
b5cc75 |
+ const QString ordinates = xml.readElementText();
|
|
|
b5cc75 |
+ data.latitude = ordinates.split(' ')[0].toDouble();
|
|
|
b5cc75 |
+ data.longitude = ordinates.split(' ')[1].toDouble();
|
|
|
b5cc75 |
} else {
|
|
|
b5cc75 |
parseUnknownElement(xml);
|
|
|
b5cc75 |
}
|
|
|
b5cc75 |
@@ -675,8 +690,8 @@ void UKMETIon::parseFiveDayForecast(const QString& source, QXmlStreamReader& xml
|
|
|
b5cc75 |
QString line;
|
|
|
b5cc75 |
QString period;
|
|
|
b5cc75 |
QString summary;
|
|
|
b5cc75 |
- QRegExp high("-?\\d+");
|
|
|
b5cc75 |
- QRegExp low("-?\\d+");
|
|
|
b5cc75 |
+ QRegExp high("-?\\d+.C");
|
|
|
b5cc75 |
+ QRegExp low("-?\\d+.C");
|
|
|
b5cc75 |
while (!xml.atEnd()) {
|
|
|
b5cc75 |
xml.readNext();
|
|
|
b5cc75 |
if (xml.name() == "title") {
|
|
|
b5cc75 |
@@ -687,8 +702,8 @@ void UKMETIon::parseFiveDayForecast(const QString& source, QXmlStreamReader& xml
|
|
|
b5cc75 |
|
|
|
b5cc75 |
period = line.split(',')[0].split(':')[0];
|
|
|
b5cc75 |
summary = line.split(',')[0].split(':')[1].trimmed();
|
|
|
b5cc75 |
- high.indexIn(line.split(',')[1]);
|
|
|
b5cc75 |
- low.indexIn(line.split(',')[2]);
|
|
|
b5cc75 |
+ high.indexIn(line.split(',')[1].split(':')[1]);
|
|
|
b5cc75 |
+ low.indexIn(line.split(',')[1].split(':')[2]);
|
|
|
b5cc75 |
|
|
|
b5cc75 |
forecast->period = period;
|
|
|
b5cc75 |
forecast->iconName = getWeatherIcon(dayIcons(), summary.toLower());
|
|
|
b5cc75 |
--
|
|
|
b5cc75 |
1.7.10
|
|
|
b5cc75 |
|