PARSE_LINK,
PARSE_BR,
PARSE_SPAN,
+ PARSE_NEXT_PAGE_LINK
};
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) {
//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);
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;
}
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) {
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;
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();