Fixed searchclients to handle new Google URLs correctly; added GUI
[movie-schedule] / src / searchclients / moviesearchclient.cpp
index 670c569..ec642ec 100644 (file)
@@ -48,6 +48,7 @@ void MovieSearchClient::CancelAllRunningSearchs()
 void MovieSearchClient::Search(int start)
 {
     QUrl url("http://www.google.com/m/movies");
+    url.addQueryItem("action","chgloc");
     url.addQueryItem("loc", _town);
     url.addQueryItem("sort", QString::number(1));
     AbstractSearchClient::Search(url, start);
@@ -58,7 +59,8 @@ enum State {
     PARSE_MOVIE_LINK,
     PARSE_EXPECT_DIV1,
     PARSE_EXPECT_DIV2, PARSE_DIV2,
-    PARSE_SPAN, PARSE_RATING, PARSE_TRAILER
+    PARSE_SPAN, PARSE_RATING, PARSE_TRAILER,
+    PARSE_NEXT_PAGE_LINK
 };
 
 void MovieSearchClient::ReplyFinished(QNetworkReply *reply)
@@ -73,6 +75,8 @@ void MovieSearchClient::ReplyFinished(QNetworkReply *reply)
     QString movie_theaters_url;
     QRegExp duration_pattern("((\\d+)hr )?(\\d+)min");
     QRegExp reviews_pattern("\\d+ review(s)?");
+    QString next_page_url;
+    int next_page_start;
     while (!xml.atEnd()) {
         QXmlStreamReader::TokenType token = xml.readNext();
         if (token == QXmlStreamReader::StartElement) {
@@ -88,6 +92,16 @@ void MovieSearchClient::ReplyFinished(QNetworkReply *reply)
                     movie_rating = -1.0;
                     movie_theaters_url = attr_href;
                     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 == "1" && 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;
                 }
@@ -151,6 +165,8 @@ void MovieSearchClient::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) {
@@ -178,9 +194,9 @@ void MovieSearchClient::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 {
             emit Reply(GetSearchTaskId(), false);
             emit SearchFinished(GetSearchTaskId(), true);