summaryrefslogtreecommitdiff
path: root/scraper/thetvdbscraper/tvdbseries.c
diff options
context:
space:
mode:
Diffstat (limited to 'scraper/thetvdbscraper/tvdbseries.c')
-rw-r--r--scraper/thetvdbscraper/tvdbseries.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/scraper/thetvdbscraper/tvdbseries.c b/scraper/thetvdbscraper/tvdbseries.c
new file mode 100644
index 0000000..21dc78b
--- /dev/null
+++ b/scraper/thetvdbscraper/tvdbseries.c
@@ -0,0 +1,281 @@
+
+#include "../../lib/curl.h"
+#include "tvdbseries.h"
+
+using namespace std;
+
+cTVDBSeries::cTVDBSeries(int ID, string language, string apiKey, cTVDBMirrors *mirrors) {
+ this->language = language;
+ this->apiKey = apiKey;
+ this->mirrors = mirrors;
+ seriesID = ID;
+ name = "";
+ banner = "";
+ fanart = "";
+ poster = "";
+ overview = "";
+ firstAired = "";
+ network = "";
+ imbdid = "";
+ genre = "";
+ rating = 0.0;
+ status = "";
+ currentEpisode = 0;
+ currentActor = 0;
+ currentFanart = 0;
+ currentPoster = 0;
+ currentSeasonPoster = 0;
+ currentBanner = 0;
+}
+
+cTVDBSeries::~cTVDBSeries() {
+ for(std::vector<cTVDBEpisode*>::const_iterator it = episodes.begin(); it != episodes.end(); it++) {
+ delete *it;
+ }
+ episodes.clear();
+ for(std::vector<cTVDBActor*>::const_iterator it = actors.begin(); it != actors.end(); it++) {
+ delete *it;
+ }
+ actors.clear();
+ for(std::vector<cTVDBFanart*>::const_iterator it = fanarts.begin(); it != fanarts.end(); it++) {
+ delete *it;
+ }
+ fanarts.clear();
+ for(std::vector<cTVDBPoster*>::const_iterator it = posters.begin(); it != posters.end(); it++) {
+ delete *it;
+ }
+ posters.clear();
+ for(std::vector<cTVDBSeasonPoster*>::const_iterator it = seasonPosters.begin(); it != seasonPosters.end(); it++) {
+ delete *it;
+ }
+ seasonPosters.clear();
+ for(std::vector<cTVDBBanner*>::const_iterator it = banners.begin(); it != banners.end(); it++) {
+ delete *it;
+ }
+ banners.clear();
+}
+
+bool cTVDBSeries::ReadSeries(void) {
+ stringstream url;
+ url << mirrors->GetMirrorXML() << "/api/" << apiKey << "/series/" << seriesID << "/all/" << language << ".xml";
+ string seriesXML;
+ if (curl.GetUrl(url.str().c_str(), &seriesXML)) {
+ ParseXML(seriesXML);
+ return true;
+ }
+ return false;
+}
+
+void cTVDBSeries::ReadMedia(void) {
+ stringstream url;
+ url << mirrors->GetMirrorXML() << "/api/" << apiKey << "/series/" << seriesID << "/banners.xml";
+ string bannersXML;
+ if (curl.GetUrl(url.str().c_str(), &bannersXML)) {
+ cTVDBSeriesMedia med(language, mirrors);
+ med.ParseXML(bannersXML, &banners, &fanarts, &posters, &seasonPosters);
+ }
+}
+
+void cTVDBSeries::ReadActors(void) {
+ stringstream url;
+ url << mirrors->GetMirrorXML() << "/api/" << apiKey << "/series/" << seriesID << "/actors.xml";
+ string actorsXML;
+ if (curl.GetUrl(url.str().c_str(), &actorsXML)) {
+ cTVDBActors act(language, mirrors);
+ act.ParseXML(actorsXML, &actors);
+ }
+}
+
+void cTVDBSeries::ParseXML(string xml) {
+ xmlDoc *doc = xmlReadMemory(xml.c_str(), xml.size(), "noname.xml", NULL, 0);
+ if (doc == NULL)
+ return;
+ //Root Element has to be <Data>
+ xmlNode *node = NULL;
+ node = xmlDocGetRootElement(doc);
+ if (!(node && !xmlStrcmp(node->name, (const xmlChar *)"Data"))) {
+ xmlFreeDoc(doc);
+ return;
+ }
+ //Looping through episodes
+ node = node->children;
+ xmlNode *cur_node = NULL;
+ for (cur_node = node; cur_node; cur_node = cur_node->next) {
+ if ((cur_node->type == XML_ELEMENT_NODE) && !xmlStrcmp(cur_node->name, (const xmlChar *)"Series")) {
+ ReadSeriesData(doc, cur_node->children);
+ } else if ((cur_node->type == XML_ELEMENT_NODE) && !xmlStrcmp(cur_node->name, (const xmlChar *)"Episode")) {
+ cTVDBEpisode *episode = new cTVDBEpisode();
+ episode->ReadEpisodeFromXML(doc, cur_node->children, mirrors);
+ episodes.push_back(episode);
+ }
+ }
+ xmlFreeDoc(doc);
+}
+
+void cTVDBSeries::ReadSeriesData(xmlDoc *doc, xmlNode *node) {
+ xmlNode *cur_node = NULL;
+ xmlChar *node_content;
+ for (cur_node = node; cur_node; cur_node = cur_node->next) {
+ if (cur_node->type == XML_ELEMENT_NODE) {
+ node_content = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1);
+ if (!node_content)
+ continue;
+ if (!xmlStrcmp(cur_node->name, (const xmlChar *)"FirstAired")) {
+ firstAired = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Genre")) {
+ genre = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"IMDB_ID")) {
+ imbdid = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Network")) {
+ network = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Overview")) {
+ overview = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Rating")) {
+ rating = atof((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"SeriesName")) {
+ name = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Status")) {
+ status = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"banner")) {
+ banner = mirrors->GetMirrorBanner() + (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"fanart")) {
+ fanart = mirrors->GetMirrorBanner() + (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"poster")) {
+ poster = mirrors->GetMirrorBanner() + (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"lastupdated")) {
+ lastUpdated = atoi((const char *)node_content);
+ }
+ xmlFree(node_content);
+ }
+ }
+}
+
+cTVDBEpisode *cTVDBSeries::GetEpisode(void) {
+ int numEpisodes = episodes.size();
+ if ((numEpisodes < 1) || (currentEpisode >= numEpisodes))
+ return NULL;
+ cTVDBEpisode *epi = episodes[currentEpisode];
+ currentEpisode++;
+ return epi;
+}
+
+cTVDBActor *cTVDBSeries::GetActor(void) {
+ int numActors = actors.size();
+ if ((numActors < 1) || (currentActor >= numActors))
+ return NULL;
+ cTVDBActor *act = actors[currentActor];
+ currentActor++;
+ return act;
+}
+
+cTVDBFanart *cTVDBSeries::GetFanart(void) {
+ int numFanarts = fanarts.size();
+ if ((numFanarts < 1) || (currentFanart >= numFanarts))
+ return NULL;
+ cTVDBFanart *fan = fanarts[currentFanart];
+ currentFanart++;
+ return fan;
+}
+
+cTVDBPoster *cTVDBSeries::GetPoster(void) {
+ int numPosters = posters.size();
+ if ((numPosters < 1) || (currentPoster >= numPosters))
+ return NULL;
+ cTVDBPoster *pos = posters[currentPoster];
+ currentPoster++;
+ return pos;
+}
+
+cTVDBSeasonPoster *cTVDBSeries::GetSeasonPoster(void) {
+ int numSeasonPosters = seasonPosters.size();
+ if ((numSeasonPosters < 1) || (currentSeasonPoster >= numSeasonPosters))
+ return NULL;
+ cTVDBSeasonPoster *pos = seasonPosters[currentSeasonPoster];
+ currentSeasonPoster++;
+ return pos;
+}
+
+cTVDBSeasonPoster *cTVDBSeries::GetSeasonPoster(int season) {
+ int numSeasonPoster = seasonPosters.size();
+ for (int i=0; i<numSeasonPoster; i++) {
+ if (seasonPosters[i]->season == season)
+ return seasonPosters[i];
+ }
+ return NULL;
+}
+
+cTVDBBanner *cTVDBSeries::GetBanner(void) {
+ int numBanners = banners.size();
+ if ((numBanners < 1) || (currentBanner >= numBanners))
+ return NULL;
+ cTVDBBanner *ban = banners[currentBanner];
+ currentBanner++;
+ return ban;
+}
+
+bool cTVDBSeries::GetPartAndSeason(int episodeId, int &season, int &part) {
+ for (vector<cTVDBEpisode*>::iterator ep = episodes.begin(); ep != episodes.end(); ep++) {
+ cTVDBEpisode *episode = *ep;
+ if(episode->id == episodeId) {
+ season = episode->season;
+ part = episode->number;
+ return true;
+ }
+ }
+ return false;
+}
+
+void cTVDBSeries::Dump(int maxEntries) {
+ cout << "--------------------------- Series Info ----------------------------------" << endl;
+ cout << "series " << name << ", ID: " << seriesID <<endl;
+ cout << "Overview: " << overview << endl;
+ cout << "Banner: " << banner << endl;
+ cout << "Poster: " << poster << endl;
+ cout << "Fanart: " << fanart << endl;
+ cout << "imdb: " << imbdid << endl;
+ cout << "FirstAired: " << firstAired << endl;
+ cout << "Network: " << network << endl;
+ cout << "Status: " << status << endl;
+ cout << "lastUpdated: " << lastUpdated << endl;
+ cout << "Genre: " << genre << endl;
+ cout << "Rating: " << rating << endl;
+
+ int size = episodes.size();
+ cout << "--------------------------- " << size << " episodes ----------------------------------" << endl;
+ for (int i=0; i<size; i++) {
+ if (maxEntries && (i == maxEntries)) break;
+ episodes[i]->Dump();
+ }
+
+ size = actors.size();
+ cout << "--------------------------- " << size << " actors ----------------------------------" << endl;
+ for (int i=0; i<size; i++) {
+ if (maxEntries && (i == maxEntries)) break;
+ actors[i]->Dump();
+ }
+
+ int numFanart = fanarts.size();
+ cout << "--------------------------- " << numFanart << " fanarts ----------------------------------" << endl;
+ for (int i=0; i<numFanart; i++) {
+ if (maxEntries && (i == maxEntries)) break;
+ fanarts[i]->Dump();
+ }
+ int numPoster = posters.size();
+ cout << "--------------------------- " << numPoster << " posters ----------------------------------" << endl;
+ for (int i=0; i<numPoster; i++) {
+ if (maxEntries && (i == maxEntries)) break;
+ posters[i]->Dump();
+ }
+ int numSeasonPoster = seasonPosters.size();
+ cout << "--------------------------- " << numSeasonPoster << " season posters ---------------------------" << endl;
+ for (int i=0; i<numSeasonPoster; i++) {
+ if (maxEntries && (i == maxEntries)) break;
+ seasonPosters[i]->Dump();
+ }
+ int numBanner = banners.size();
+ cout << "--------------------------- " << numBanner << " banners ----------------------------------" << endl;
+ for (int i=0; i<numBanner; i++) {
+ if (maxEntries && (i == maxEntries)) break;
+ banners[i]->Dump();
+ }
+}