Fixed searchclients to handle new Google URLs correctly; added GUI
[movie-schedule] / src / searchclients / movieschedulesearchclient.cpp
index cb2ac42..235f549 100644 (file)
@@ -78,6 +78,7 @@ enum State {
     PARSE_LINK,
     PARSE_BR,
     PARSE_SPAN,
+    PARSE_NEXT_PAGE_LINK
 };
 
 void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
@@ -90,8 +91,10 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
     QString theater_name;
     QString theater_address;
     QString theater_phone;
-    QList<QTime> schedule;
+    QList<QString> schedule;
     QRegExp time_pattern("\\d+:\\d+([aApP][mM])*");
+    QString next_page_url;
+    int next_page_start;
     while (!xml.atEnd()) {
         QXmlStreamReader::TokenType token = xml.readNext();
         if (token == QXmlStreamReader::StartElement) {
@@ -102,7 +105,7 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
                 //std::cout << "LINK " << qPrintable(attr_href) << std::endl;
                 if (url.hasQueryItem("date")) {
                     QString v = url.queryItemValue("date");
-                    std::cout << "FOUND Date Link " << qPrintable(v) << " from " << qPrintable(url.toString()) << std::endl;
+                    //std::cout << "FOUND Date Link " << qPrintable(v) << " from " << qPrintable(url.toString()) << std::endl;
                     if (!_dates_seen.contains(v)) {
                         // TODO replace location with user selected location (Google simplifies to much)
                         _dates_seen.insert(v);
@@ -115,6 +118,16 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
                     theater_phone = "";
                     schedule.clear();
                     state = PARSE_THEATER_LINK;
+                } else if (url.hasQueryItem("start")) {
+                    QString sort = url.queryItemValue("sort");
+                    QString start = url.queryItemValue("start");
+                    int istart = start.toInt();
+                    if (sort == "0" && istart > GetStartIndex()) {
+                        //std::cout << "next page LINK " << qPrintable(attr_href) << std::endl;
+                        next_page_url = attr_href;
+                        next_page_start = istart;
+                    }
+                    state = PARSE_NEXT_PAGE_LINK;
                 } else {
                     state = PARSE_HTML;
                 }
@@ -164,12 +177,20 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
                             if (!theater_phone.isEmpty()) {
                                 cinema->SetTelephone(theater_phone);
                             }
-                            Q_FOREACH(const QTime time, schedule) {
-                                _cinema_schedule->AddSchedule(cinema, movie, time, _date);
+                            QList<QTime> schedule_times = TimesFromString(schedule);
+                            Q_FOREACH(const QTime time, schedule_times) {
+                                if (time.hour() < 3) {
+                                    // interpret very early times as shifted by 1 day (seems to be a Google logic)
+                                    _cinema_schedule->AddSchedule(cinema, movie, time, _date.addDays(1));
+                                } else {
+                                    _cinema_schedule->AddSchedule(cinema, movie, time, _date);
+                                }
                             }
                         }
                     }
                 }
+            } else if (state == PARSE_NEXT_PAGE_LINK) {
+                state = PARSE_HTML;
             }
         } else if (token == QXmlStreamReader::Characters) {
             if (state == PARSE_THEATER_LINK) {
@@ -185,11 +206,8 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
                 while ((i = time_pattern.indexIn(t, i)) != -1) {
                     int length = time_pattern.matchedLength();
                     //std::cout << "time " << qPrintable(t.mid(i, length)) << std::endl;
-                    QTime time = TimeUtils::FromTimeString(t.mid(i, length));
-                    if (time.isValid()) {
-                        schedule.append(time);
-                    } else {
-                        std::cout << "ERROR: time " << qPrintable(t.mid(i, length)) << " is invalid." << std::endl;
+                    if (length > 0) {
+                        schedule.append(t.mid(i, length));
                     }
                     i += length;
                     found = true;
@@ -211,9 +229,9 @@ void MovieScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
         emit SearchFinished(GetSearchTaskId(), false);
         deleteLater();
     } else {
-        if (found > 0) {
+        if (!next_page_url.isEmpty()) {
             emit Reply(GetSearchTaskId(), true);
-            Search(GetStartIndex() + found);
+            SearchEncodedUrl(next_page_url, next_page_start);
         } else {
             if (!_date_urls.isEmpty()) {
                 SearchNextDate();