Fixed searchclients to handle new Google URLs correctly; added GUI
[movie-schedule] / src / searchclients / theaterschedulesearchclient.cpp
index 82f8482..3172279 100644 (file)
@@ -82,6 +82,7 @@ enum State {
     PARSE_MOVIE_EXPECT_DIV3,
     PARSE_MOVIE_DIV3,
     PARSE_MOVIE_TIME,
+    PARSE_NEXT_PAGE_LINK
 };
 
 void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
@@ -97,6 +98,8 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
     QRegExp duration_pattern("((\\d+)hr )?(\\d+)min");
     QRegExp reviews_pattern("\\d+ review(s)?");
     QXmlStreamReader xml(reply);
+    QString next_page_url;
+    int next_page_start;
     while (!xml.atEnd()) {
         QXmlStreamReader::TokenType token = xml.readNext();
         if (token == QXmlStreamReader::StartElement) {
@@ -122,6 +125,16 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
                     rating = -1.0;
                     schedule.clear();
                     state = PARSE_MOVIE_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;
                 }
@@ -215,6 +228,8 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
                     }
                 }
                 state = PARSE_HTML;
+            } else if (state == PARSE_NEXT_PAGE_LINK) {
+                state = PARSE_HTML;
             }
         } else if (token == QXmlStreamReader::Characters) {
             if (state == PARSE_MOVIE_LINK) {
@@ -251,15 +266,18 @@ void TheaterScheduleSearchClient::ReplyFinished(QNetworkReply *reply)
         emit Cancelled(GetSearchTaskId());
         emit SearchFinished(GetSearchTaskId(), false);
     } else {
-        // all movies are listed on one page
-        // no repetition of search with start parameter
-        if (!_date_urls.isEmpty()) {
+        if (!next_page_url.isEmpty()) {
             emit Reply(GetSearchTaskId(), true);
-            SearchNextDate();
+            SearchEncodedUrl(next_page_url, next_page_start);
         } else {
-            emit Reply(GetSearchTaskId(), false);
-            emit SearchFinished(GetSearchTaskId(), true);
-            deleteLater();
+            if (!_date_urls.isEmpty()) {
+                emit Reply(GetSearchTaskId(), true);
+                SearchNextDate();
+            } else {
+                emit Reply(GetSearchTaskId(), false);
+                emit SearchFinished(GetSearchTaskId(), true);
+                deleteLater();
+            }
         }
     }
     reply->deleteLater();