9 #endif // HTMLTIDY_LOCAL
14 // -- refaktor parsingu ... sloucit nacitani podle jednotlivych datovych struktur
15 // -- nastava chyba pri parsovani - ta je zrejme zpusobena timeoutem, protoze se vrati prazdny obsah
16 // - poslat tedy ten samy request, pokud toto nastane
20 // - co kdyz spustim 2 requesty po sobe a prvni se jeste nedokoncil? (prepise se mi reply/request)
21 // -- zvazit blokovani nejakym booleanem, cimz se otevre cesta i pro vlakna - 1 request = 1 vlakno
23 // - leaky? m_net, m_reply, m_request...nejsem si tim jistej...
27 WebEngine::slotNewestVideosReady(QNetworkReply
*reply
) // reply == m_reply
31 if((err
= parse("parser/top_new.xq", reply
->readAll(), &result
)) != ERR_NO
)
33 emit
error(new WebEngineError(err
));
37 QTextStream
stream(&result
, QIODevice::ReadOnly
);
39 QVector
<VideoInfo
*> *videos
= new QVector
<VideoInfo
*>();
43 tmp
= stream
.readLine();
44 if(tmp
.isNull()) break;
49 video
= new VideoInfo
;
51 video
->title
= stream
.readLine().trimmed();
52 video
->img
= stream
.readLine().trimmed();
53 video
->desc
= stream
.readLine().trimmed();
54 video
->date
= QDate::fromString(stream
.readLine().trimmed(), "d. M. yyyy");
55 video
->watched
= stream
.readLine().trimmed().toInt();
56 videos
->push_back(video
);
60 emit
newestVideosReady(videos
);
64 WebEngine::slotMostWatchedVideosReady(QNetworkReply
*reply
)
68 if((err
= parse("parser/top_new.xq", reply
->readAll(), &result
)) != ERR_NO
)
70 emit
error(new WebEngineError(err
));
74 QTextStream
stream(&result
, QIODevice::ReadOnly
);
76 QVector
<VideoInfo
*> *videos
= new QVector
<VideoInfo
*>();
80 tmp
= stream
.readLine();
81 if(tmp
.isNull()) break;
86 video
= new VideoInfo
;
88 video
->title
= stream
.readLine().trimmed();
89 video
->img
= stream
.readLine().trimmed();
90 video
->desc
= stream
.readLine().trimmed();
91 video
->date
= QDate::fromString(stream
.readLine().trimmed(), "d. M. yyyy");
92 video
->watched
= stream
.readLine().trimmed().toInt();
93 videos
->push_back(video
);
97 emit
mostWatchedVideosReady(videos
);
101 WebEngine::slotAlphabetReady(QNetworkReply
*reply
)
105 if((err
= parse("parser/alphabet.xq", reply
->readAll(), &result
)) != ERR_NO
)
107 emit
error(new WebEngineError(err
));
111 QTextStream
stream(&result
, QIODevice::ReadOnly
);
113 QVector
<LinkInfo
*> *genres
= new QVector
<LinkInfo
*>();
114 LinkInfo
*genre
= NULL
;
117 tmp
= stream
.readLine();
118 if(tmp
.isNull()) break;
123 genre
= new LinkInfo
;
125 genre
->title
= stream
.readLine().trimmed();
126 genres
->push_back(genre
);
130 emit
alphabetReady(genres
);
134 WebEngine::slotGenresReady(QNetworkReply
*reply
)
138 if((err
= parse("parser/genres.xq", reply
->readAll(), &result
)) != ERR_NO
)
140 emit
error(new WebEngineError(err
));
144 QTextStream
stream(&result
, QIODevice::ReadOnly
);
146 QVector
<LinkInfo
*> *genres
= new QVector
<LinkInfo
*>();
147 LinkInfo
*genre
= NULL
;
150 tmp
= stream
.readLine();
151 if(tmp
.isNull()) break;
156 genre
= new LinkInfo
;
158 genre
->title
= stream
.readLine().trimmed();
159 genres
->push_back(genre
);
163 emit
genresReady(genres
);
167 WebEngine::slotShowsByAlphaReady(QNetworkReply
*reply
)
171 if((err
= parse("parser/shows.xq", reply
->readAll(), &result
)) != ERR_NO
)
173 emit
error(new WebEngineError(err
));
177 QTextStream
stream(&result
, QIODevice::ReadOnly
);
179 QVector
<LinkInfo
*> *shows
= new QVector
<LinkInfo
*>();
180 LinkInfo
*show
= NULL
;
183 tmp
= stream
.readLine();
184 if(tmp
.isNull()) break;
191 show
->title
= stream
.readLine().trimmed();
192 shows
->push_back(show
);
196 emit
showsByAlphaReady(shows
);
200 WebEngine::slotShowsByGenreReady(QNetworkReply
*reply
)
204 if((err
= parse("parser/shows.xq", reply
->readAll(), &result
)) != ERR_NO
)
206 emit
error(new WebEngineError(err
));
210 QTextStream
stream(&result
, QIODevice::ReadOnly
);
212 QVector
<LinkInfo
*> *shows
= new QVector
<LinkInfo
*>();
213 LinkInfo
*show
= NULL
;
216 tmp
= stream
.readLine();
217 if(tmp
.isNull()) break;
224 show
->title
= stream
.readLine().trimmed();
225 shows
->push_back(show
);
229 emit
showsByGenreReady(shows
);
233 WebEngine::slotVideosByDateReady(QNetworkReply
*reply
)
236 emit
error(new WebEngineError(-1)); // -1 == unexpected error
237 //emit videosByDateReady(videos);
241 WebEngine::slotShowVideosReady(QNetworkReply
*reply
)
245 QByteArray
*data
= new QByteArray(reply
->readAll());
247 if((err
= parse("parser/episodes-pages.xq", *data
, &result
)) != ERR_NO
)
249 emit
error(new WebEngineError(err
));
252 int nextPage
= result
.toInt();
254 m_parser
.addTask(new QPair
<QString
, QByteArray
*>("parser/episodes.xq", data
));
258 getShowVideos(m_requestedShowId
, nextPage
);
262 m_requestedShowId
.clear();
264 emit
showAllVideosReady();
269 WebEngine::slotShowBonusVideosReady(QNetworkReply
*reply
)
272 emit
error(new WebEngineError(-1)); // -1 == unexpected error
273 //emit showBonusVideosReady(videos); link-ivysilani/id/bonusy/1,2,3..max
277 WebEngine::slotVideoLinkReady(QNetworkReply
*reply
)
280 QString
*result
= new QString("");
282 if((err
= parse("parser/videolink.xq", reply
->readAll(), result
)) != ERR_NO
)
284 emit
error(new WebEngineError(err
));
289 emit
videoLinkReady(result
);
293 WebEngine::slotRemoteFileReady(QNetworkReply
*reply
)
295 QByteArray
*data
= new QByteArray(reply
->readAll());
297 emit
remoteFileReady(data
);
301 WebEngine::slotError(QNetworkReply::NetworkError errCode
)
304 emit
error(new WebEngineError(ERR_REQUEST
));
308 WebEngine::emitError(WebEngineError
*err
)
314 WebEngine::emitShowVideoReady(VideoInfo
*video
)
316 emit
showVideoReady(video
);
319 QByteArray
WebEngine::userAgent
= "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.2) Gecko/20100115 Firefox/3.6";
321 QString
WebEngine::iVysilaniLink
= "http://www.ceskatelevize.cz/ivysilani/";
322 QString
WebEngine::theNewestLink
= "http://www.ceskatelevize.cz/ivysilani/nejnovejsi/";
323 QString
WebEngine::theMostWatchedLink
= "http://www.ceskatelevize.cz/ivysilani/nejsledovanejsi/";
324 QString
WebEngine::alphabeticalySortedLink
= "http://www.ceskatelevize.cz/ivysilani/podle-abecedy/";
326 #ifdef HTMLTIDY_LOCAL
328 WebEngine::htmlTidy(QByteArray
&arr
) const
330 TidyDoc tdoc
= tidyCreate();
331 tidyParseString(tdoc
, arr
.data());
332 tidyCleanAndRepair(tdoc
);
336 tidySaveString(tdoc
, outbuf
, &buflen
); // do buflen se mi vrati velikost vystupu
338 outbuf
= new char[buflen
+1]; // pro '\0'
339 tidySaveString(tdoc
, outbuf
, &buflen
);
345 #endif // HTMLTIDY_LOCAL
348 WebEngine::htmlTidyViaWeb(const QString
&url
) const
350 QString retval
= "http://services.w3.org/tidy/tidy?docAddr=" + url
;
357 WebEngine::fromUtf8toLocal8Bit(QByteArray
&arr
) const
359 arr
= QString::fromUtf8(arr
.data()).toLocal8Bit();
363 WebEngine::WebEngine(QObject
*parent
) : QObject(parent
)
371 connect(&m_parser
, SIGNAL(showVideoReady(VideoInfo
*)), this, SLOT(emitShowVideoReady(VideoInfo
*)));
372 connect(&m_parser
, SIGNAL(error(WebEngineError
*)), this, SLOT(emitError(WebEngineError
*)));
375 WebEngine::~WebEngine()
377 if(!m_parser
.isFinished())
380 this->thread()->wait(250); // wait for 250ms
383 while(m_parser
.isFinished())
385 m_parser
.terminate();
386 this->thread()->wait(250); // wait for 250ms
390 m_net
->deleteLater(); // kdyz je prirazen rodic, smaze se objekt automaticky sam!
396 WebEngine::doRequest(const QString
&url
, bool tidyHtml
)
399 m_net
= new QNetworkAccessManager(this);
400 m_request
= new QNetworkRequest
;
401 m_request
->setRawHeader("User-Agent", userAgent
);
402 m_request
->setUrl(QUrl(tidyHtml
? htmlTidyViaWeb(url
) : url
));
403 m_reply
= m_net
->get(*m_request
);
405 connect(m_reply
, SIGNAL(error(QNetworkReply::NetworkError
)),
406 this , SLOT (slotError(QNetworkReply::NetworkError
)));
410 WebEngine::doVideoRequest(const QString
&url
, bool tidyHtml
)
412 m_netVideo
= new QNetworkAccessManager(this);
413 m_requestVideo
= new QNetworkRequest
;
414 m_requestVideo
->setRawHeader("User-Agent", userAgent
);
415 m_requestVideo
->setUrl(QUrl(tidyHtml
? htmlTidyViaWeb(url
) : url
));
416 m_replyVideo
= m_netVideo
->get(*m_requestVideo
);
418 connect(m_replyVideo
, SIGNAL(error(QNetworkReply::NetworkError
)),
419 this , SLOT (slotError(QNetworkReply::NetworkError
)));
423 WebEngine::parse(const QString
&parserPath
, const QByteArray
&data
, QString
*result
)
430 QFile
parser(parserPath
);
431 parser
.open(QIODevice::ReadOnly
);
436 QByteArray get_videos
= parser
.readAll();
439 QXmlQuery
query(QXmlQuery::XQuery10
);
440 QByteArray _data
= data
;
441 if(query
.setFocus(fromUtf8toLocal8Bit(_data
)))
443 query
.setQuery(get_videos
);
446 query
.evaluateTo(result
);
461 WebEngine::getNewestVideos()
463 doRequest(theNewestLink
);
465 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
466 this , SLOT (slotNewestVideosReady(QNetworkReply
*)));
470 WebEngine::getMostWatchedVideos()
472 doRequest(theMostWatchedLink
);
474 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
475 this , SLOT (slotMostWatchedVideosReady(QNetworkReply
*)));
479 WebEngine::getAlphabet()
481 doRequest(alphabeticalySortedLink
);
483 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
484 this , SLOT (slotAlphabetReady(QNetworkReply
*)));
488 WebEngine::getGenres()
490 doRequest(alphabeticalySortedLink
);
492 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
493 this , SLOT (slotGenresReady(QNetworkReply
*)));
497 WebEngine::getShowsByAlpha(const QString
&c
)
499 doRequest(iVysilaniLink
+ c
);
501 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
502 this , SLOT (slotShowsByAlphaReady(QNetworkReply
*)));
505 WebEngine::getShowsByGenre(const QString
&genre
)
507 doRequest(iVysilaniLink
+ genre
);
509 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
510 this , SLOT (slotShowsByGenreReady(QNetworkReply
*)));
514 WebEngine::getVideosByDate(const QDate
&date
)
516 doRequest(iVysilaniLink
+ date
.toString("d.M.yyyy"));
518 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
519 this , SLOT (slotVideosByDateReady(QNetworkReply
*)));
523 WebEngine::getShowVideos(const QString
&id
, int page
)
525 if(m_requestedShowId
!= id
) // zmena poradu?
527 if(!m_parser
.isRunning()) // prvni vyber poradu
533 m_parser
.cleanTasks();
537 m_requestedShowId
= id
;
538 doRequest(iVysilaniLink
+ id
+ "/dalsi-casti/" + QString::number(page
));
540 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
541 this , SLOT (slotShowVideosReady(QNetworkReply
*)));
545 WebEngine::getShowBonusVideos(const QString
&id
)
547 doRequest(iVysilaniLink
+ id
);
549 connect(m_net
, SIGNAL(finished(QNetworkReply
*)),
550 this , SLOT (slotShowBonusVideosReady(QNetworkReply
*)));
554 WebEngine::getVideoLink(const QString
&id
)
556 doVideoRequest(iVysilaniLink
+ id
);
558 connect(m_netVideo
, SIGNAL(finished(QNetworkReply
*)),
559 this , SLOT (slotVideoLinkReady(QNetworkReply
*)));
563 WebEngine::getRemoteFile(const QString
&url
)
565 doVideoRequest(url
, false);
567 connect(m_netVideo
, SIGNAL(finished(QNetworkReply
*)),
568 this , SLOT (slotRemoteFileReady(QNetworkReply
*)));
572 WebEngine::isWorking() const