/** * @brief Called when the episode infos are downloaded * @see TheTvDb::parseAndAssignSingleEpisodeInfos */ void TheTvDb::onEpisodeLoadFinished() { QNetworkReply *reply = static_cast<QNetworkReply*>(QObject::sender()); QList<int> infos = reply->property("infosToLoad").value<Storage*>()->infosToLoad(); reply->deleteLater(); TvShowEpisode *episode = reply->property("storage").value<Storage*>()->episode(); if (!episode) return; if (reply->error() == QNetworkReply::NoError ) { QString msg = QString::fromUtf8(reply->readAll()); QDomDocument domDoc; domDoc.setContent(msg); for (int i=0, n=domDoc.elementsByTagName("Episode").count() ; i<n ; ++i) { QDomElement elem = domDoc.elementsByTagName("Episode").at(i).toElement(); if (!elem.elementsByTagName("SeasonNumber").isEmpty() && !elem.elementsByTagName("EpisodeNumber").isEmpty()) { int seasonNumber = elem.elementsByTagName("SeasonNumber").at(0).toElement().text().toInt(); int episodeNumber = elem.elementsByTagName("EpisodeNumber").at(0).toElement().text().toInt(); if (episode->season() == seasonNumber && episode->episode() == episodeNumber) { episode->clear(episode->infosToLoad()); parseAndAssignSingleEpisodeInfos(elem, episode, infos); } } } } else { qWarning() << "Network Error" << reply->errorString(); } episode->scraperLoadDone(); }
/** * @brief Parses info XML data and assigns it to the given tv show object * @param xml XML data * @param show Tv Show object * @param updateAllEpisodes Update all child episodes (regardless if they already have infos or not) */ void TheTvDb::parseAndAssignInfos(QString xml, TvShow *show, TvShowUpdateType updateType, QList<int> infosToLoad) { QDomDocument domDoc; domDoc.setContent(xml); if (updateType == UpdateShow || updateType == UpdateShowAndAllEpisodes || updateType == UpdateShowAndNewEpisodes) { show->clear(infosToLoad); if (!domDoc.elementsByTagName("Series").isEmpty()) { QDomElement elem = domDoc.elementsByTagName("Series").at(0).toElement(); if (infosToLoad.contains(TvShowScraperInfos::Certification) && !elem.elementsByTagName("ContentRating").isEmpty()) show->setCertification(Helper::mapCertification(elem.elementsByTagName("ContentRating").at(0).toElement().text())); if (infosToLoad.contains(TvShowScraperInfos::FirstAired) && !elem.elementsByTagName("FirstAired").isEmpty()) show->setFirstAired(QDate::fromString(elem.elementsByTagName("FirstAired").at(0).toElement().text(), "yyyy-MM-dd")); if (infosToLoad.contains(TvShowScraperInfos::Genres) && !elem.elementsByTagName("Genre").isEmpty()) show->setGenres(Helper::mapGenre(elem.elementsByTagName("Genre").at(0).toElement().text().split("|", QString::SkipEmptyParts))); if (infosToLoad.contains(TvShowScraperInfos::Network) && !elem.elementsByTagName("Network").isEmpty()) show->setNetwork(elem.elementsByTagName("Network").at(0).toElement().text()); if (infosToLoad.contains(TvShowScraperInfos::Overview) && !elem.elementsByTagName("Overview").isEmpty()) show->setOverview(elem.elementsByTagName("Overview").at(0).toElement().text()); if (infosToLoad.contains(TvShowScraperInfos::Rating) && !elem.elementsByTagName("Rating").isEmpty()) show->setRating(elem.elementsByTagName("Rating").at(0).toElement().text().toFloat()); if (infosToLoad.contains(TvShowScraperInfos::Title) && !elem.elementsByTagName("SeriesName").isEmpty()) show->setName(elem.elementsByTagName("SeriesName").at(0).toElement().text()); } } if (updateType == UpdateAllEpisodes || updateType == UpdateNewEpisodes || updateType == UpdateShowAndAllEpisodes || updateType == UpdateShowAndNewEpisodes) { for (int i=0, n=domDoc.elementsByTagName("Episode").count() ; i<n ; ++i) { QDomElement elem = domDoc.elementsByTagName("Episode").at(i).toElement(); if (!elem.elementsByTagName("SeasonNumber").isEmpty() && !elem.elementsByTagName("EpisodeNumber").isEmpty()) { int seasonNumber = elem.elementsByTagName("SeasonNumber").at(0).toElement().text().toInt(); int episodeNumber = elem.elementsByTagName("EpisodeNumber").at(0).toElement().text().toInt(); TvShowEpisode *episode = show->episode(seasonNumber, episodeNumber); if (!episode->isValid()) continue; if (updateType == UpdateAllEpisodes || updateType == UpdateShowAndAllEpisodes || ((updateType == UpdateNewEpisodes || updateType == UpdateShowAndNewEpisodes) && !episode->infoLoaded())) { episode->clear(infosToLoad); parseAndAssignSingleEpisodeInfos(elem, episode, infosToLoad); } } } } }