1 #include <QtNetwork/QNetworkAccessManager>
2 #include <QtNetwork/QNetworkRequest>
9 #include <QApplication>
11 #include "backendkicker.h"
13 BackendKicker::BackendKicker(QObject *parent) :
14 MatchDayBackend(parent)
16 QSettings settings(qApp->organizationName(), qApp->applicationName());
17 this->selectLeague(settings.value("League", "1. Bundesliga").toString());
22 Match* BackendKicker::getMatch(QString hometeam, QString awayteam, QDateTime date)
24 QListIterator<Match*> iter(m_matchlist);
27 while (iter.hasNext()) {
29 if (match->awayTeam() == awayteam &&
30 match->homeTeam() == hometeam) {
35 match = new Match(hometeam, awayteam, date, this);
36 m_matchlist.append(match);
41 QList<Match*> BackendKicker::matchList()
46 static QDateTime parseDate(QString datehtml)
48 static QDateTime lastParsedDate;
52 int month, day, hour, minute;
54 //qDebug() << "parseDate in: " << datehtml;
56 tokens = datehtml.split(QRegExp("[>.&;:<\"]"), QString::SkipEmptyParts);
57 date = QDate::currentDate();
60 if (tokens.count() < 6) {
61 return lastParsedDate;
64 month = (tokens.at(2)).toInt();
65 day = (tokens.at(1)).toInt();
66 hour = (tokens.at(4)).toInt();
67 minute = (tokens.at(5)).toInt();
69 lastParsedDate = QDateTime(QDate(date.year(), month, day),
72 return lastParsedDate;
75 static QString parseTeam(QString teamhtml)
79 //qDebug() << "parseTeam in: " << teamhtml;
81 teamhtml.truncate(teamhtml.indexOf("</a>"));
82 team = teamhtml.mid(teamhtml.lastIndexOf(">") + 1);
84 qDebug() << "parseTeam out: " << team;
88 static void parseScore(Match* match, QString scorehtml)
92 qDebug() << "parseScore in: " << scorehtml;
93 tokens = scorehtml.split(QRegExp("[>&();:<]"), QString::SkipEmptyParts);
96 if (tokens.count() == 7) {
97 // no extra color tag -> either not started, halftime or finished
98 if (tokens.at(4) == "-") {
99 // no first half results -> match not started yet
100 match->setState(Match::NotStarted);
101 } else if (tokens.at(1) == "-") {
102 // second half has not been started but there are first
103 // half results -> currently half time
104 match->setScore(tokens.at(4).toInt(), tokens.at(5).toInt());
105 match->setState(Match::HalfTime);
107 // no color tag and no "-" -> game is finished
108 match->setScore(tokens.at(1).toInt(), tokens.at(2).toInt());
109 match->setState(Match::Finished);
112 // there is a color tag which means that either first
113 // half or second half are currently running
114 if (tokens.at(4).contains("color")) {
115 // first half score marked red -> first half running
116 match->setScore(tokens.at(5).toInt(), tokens.at(6).toInt());
117 match->setState(Match::FirstHalf);
118 } else if (tokens.at(1).contains("color")) {
119 // second half score marked res -> second half running
120 match->setState(Match::SecondHalf);
121 match->setScore(tokens.at(2).toInt(), tokens.at(3).toInt());
125 qDebug() << "match state: " << match->state();
126 qDebug() << "match home: " << match->homeScore();
127 qDebug() << "match away: " << match->awayScore();
130 void BackendKicker::parsePage (QString htmlstr)
132 QStringList rawmatches;
133 QString hometeam, awayteam, tmp;
141 //qDebug() << "parsePage in: " << htmlstr;
143 rx.setPattern("<td class=\"first\">(.*)<td class=\"aligncenter last\">");
145 while ((pos = rx.indexIn(htmlstr, pos)) != -1) {
147 rawmatches.append(htmlstr.mid(pos, rx.matchedLength()));
148 qDebug() << "MATCH " << count << ":" << htmlstr.mid(pos, rx.matchedLength()) << "\n\n";
149 pos += rx.matchedLength();
152 rx.setPattern("<td.*>(.*)</td>");
154 QStringList::iterator i;
155 for (i = rawmatches.begin(); i != rawmatches.end(); ++i) {
158 while ((pos = rx.indexIn(*i, pos)) != -1) {
160 tmp = (*i).mid(pos, rx.matchedLength());
161 pos += rx.matchedLength();
164 date = parseDate(tmp);
167 hometeam = parseTeam(tmp);
170 awayteam = parseTeam(tmp);
171 match = getMatch(hometeam, awayteam, date);
174 parseScore(match, tmp);
183 bool BackendKicker::selectLeague(QString league)
185 bool leagueIsSupported = true;
187 if (league == "1. Bundesliga") {
188 m_URL = "http://www.kicker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2010-11/spieltag.html";
189 } else if (league == "2. Bundesliga") {
190 m_URL = "http://www.kicker.de/news/fussball/bundesliga/spieltag/2-bundesliga/2010-11/spieltag.html";
191 } else if (league == "tipp3 Bundesliga") {
192 m_URL = "http://www.kicker.de/news/fussball/intligen/oesterreich/tipp3-bundesliga/2010-11/spieltag.html";
194 leagueIsSupported = false;
198 return leagueIsSupported;
201 void BackendKicker::update()
203 emit updateStarted();
205 //QString URL = "file:///home/david/Projects/git-buliscores/testdata/spieltag.html";
206 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
207 connect(manager, SIGNAL(finished(QNetworkReply*)),
208 this, SLOT(dlndFinished(QNetworkReply*)));
210 qDebug() << "URL: " << m_URL;
211 manager->get(QNetworkRequest(QUrl(m_URL)));
214 void BackendKicker::dlndFinished(QNetworkReply *reply)
218 if (reply->error() != QNetworkReply::NoError) {
219 // TODO proper user friendly error handling here!
220 qDebug() << "dlnd failed: error: " << reply->error();
223 this->m_matchlist.clear();
225 rawdata = reply->readAll();
228 emit matchListChanged();