summaryrefslogtreecommitdiff
path: root/scraper/thetvdbscraper/tvdbepisode.c
diff options
context:
space:
mode:
Diffstat (limited to 'scraper/thetvdbscraper/tvdbepisode.c')
-rw-r--r--scraper/thetvdbscraper/tvdbepisode.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/scraper/thetvdbscraper/tvdbepisode.c b/scraper/thetvdbscraper/tvdbepisode.c
new file mode 100644
index 0000000..b9ac510
--- /dev/null
+++ b/scraper/thetvdbscraper/tvdbepisode.c
@@ -0,0 +1,147 @@
+
+#include <iostream>
+#include <string>
+#include <sstream>
+#include <vector>
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include "../../lib/curl.h"
+#include "tvdbepisode.h"
+
+using namespace std;
+
+cTVDBEpisode::cTVDBEpisode(void) {
+ id = 0;
+ seriesID = 0;
+ number = 0;
+ season = 0;
+ combinedEpisode = 0;
+ combinedSeason = 0;
+ name = "";
+ firstAired = "";
+ guestStars = "";
+ overview = "";
+ rating = 0.0;
+ imageUrl = "";
+ width = 400;
+ height = 225;
+ imgFlag = 0;
+ seasonId = 0;
+ lastUpdated = 0;
+}
+
+cTVDBEpisode::cTVDBEpisode(int ID, string language, string apiKey, cTVDBMirrors *mirrors) {
+ this->language = language;
+ this->apiKey = apiKey;
+ this->mirrors = mirrors;
+ id = ID;
+ seriesID = 0;
+ number = 0;
+ season = 0;
+ combinedEpisode = 0;
+ combinedSeason = 0;
+ name = "";
+ firstAired = "";
+ guestStars = "";
+ overview = "";
+ rating = 0.0;
+ imageUrl = "";
+ width = 400;
+ height = 225;
+ imgFlag = 0;
+ seasonId = 0;
+ lastUpdated = 0;
+}
+
+void cTVDBEpisode::ReadEpisode(void) {
+ stringstream url;
+ url << mirrors->GetMirrorXML() << "/api/" << apiKey << "/episodes/" << id << "/" << language << ".xml";
+ string episodeXML;
+ if (curl.GetUrl(url.str().c_str(), &episodeXML)) {
+ ParseXML(episodeXML);
+ }
+}
+
+void cTVDBEpisode::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 *)"Episode")) {
+ ReadEpisodeFromXML(doc, cur_node->children, mirrors);
+ }
+ }
+ xmlFreeDoc(doc);
+}
+
+void cTVDBEpisode::ReadEpisodeFromXML(xmlDoc *myDoc, xmlNode *node, cTVDBMirrors *mirrors) {
+ 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(myDoc, cur_node->xmlChildrenNode, 1);
+ if (!node_content)
+ continue;
+ if (!xmlStrcmp(cur_node->name, (const xmlChar *)"id")) {
+ id = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"EpisodeNumber")) {
+ number = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"seriesid")) {
+ seriesID = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"SeasonNumber")) {
+ season = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Combined_episodenumber")) {
+ combinedEpisode = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"Combined_season")) {
+ combinedSeason = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"EpisodeName")) {
+ name = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"FirstAired")) {
+ firstAired = (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"GuestStars")) {
+ guestStars = (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 *)"filename")) {
+ imageUrl = mirrors->GetMirrorBanner() + (const char *)node_content;
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"thumb_width")) {
+ width = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"thumb_height")) {
+ height = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"EpImgFlag")) {
+ imgFlag = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"seasonid")) {
+ seasonId = atoi((const char *)node_content);
+ } else if (!xmlStrcmp(cur_node->name, (const xmlChar *)"lastupdated")) {
+ lastUpdated = atoi((const char *)node_content);
+ }
+ xmlFree(node_content);
+ }
+ }
+}
+
+void cTVDBEpisode::Dump() {
+ cout << "----------------------------------------" << endl;
+ cout << "Season " << season << ", Episode " << number << ", Name: " << name << ", ID: " << id << ", SeasonID " << seasonId << endl;
+ cout << "combinedSeason: " << combinedSeason << ", combinedEpisode: " << combinedEpisode << endl;
+ cout << "First Aired: " << firstAired << endl;
+ cout << "Guest Stars: " << guestStars << endl;
+ cout << "Overview: " << overview << endl;
+ cout << "Rating: " << rating << endl;
+ cout << "imageUrl: " << imageUrl << ", Size: " << width << " x " << height << ", Flag: " << imgFlag << endl;
+ cout << "Last Update: " << lastUpdated << endl;
+}