summaryrefslogtreecommitdiff
path: root/episode.c
diff options
context:
space:
mode:
Diffstat (limited to 'episode.c')
-rw-r--r--episode.c298
1 files changed, 298 insertions, 0 deletions
diff --git a/episode.c b/episode.c
new file mode 100644
index 0000000..af07bd2
--- /dev/null
+++ b/episode.c
@@ -0,0 +1,298 @@
+/*
+ * update.c
+ *
+ * See the README file for copyright information
+ *
+ */
+
+#include <unistd.h>
+#include <locale.h>
+#include <zlib.h>
+
+#include "epgd.h"
+
+//***************************************************************************
+// Get Special
+//***************************************************************************
+
+int getSpecial(const char* line, const char* item, char* content, int max, int* count = 0)
+{
+ const char* p;
+
+ unsigned int off = strlen(item) + 1;
+
+ if ((p = strstr(line, item)) && strlen(line) > off)
+ {
+ snprintf(content, max, "%s", p+off);
+
+ if (count)
+ (*count)++;
+
+ return success;
+ }
+
+ return fail;
+}
+
+//***************************************************************************
+// Store To Table
+//***************************************************************************
+
+int cEpisodeFile::storeToTable(cDbTable* episodeDb, const cList<cLine>* linkLines)
+{
+ const int maxSeasons = 100;
+
+ string::size_type pos;
+ string compName;
+ string lang = "de";
+ string ename = name;
+
+ char shortName[100] = "";
+ char col1Name[100] = "";
+ char col2Name[100] = "";
+ char col3Name[100] = "";
+ int exColCount = 0;
+
+ const cList<cLine>* theLines = linkLines ? linkLines : lines;
+
+ if (!theLines)
+ return done;
+
+ if (isLink())
+ ename = link;
+
+ // detect language special
+
+ if ((pos = ename.rfind('.')) != string::npos)
+ {
+ lang = ename.substr(pos+1);
+
+ if (lang == "de" || lang == "en" || lang == "de-en" || lang == "en-de" || lang == "at")
+ ename.erase(pos);
+ else
+ lang = "de";
+ }
+
+ // build compressed name for episode lookup
+
+ compName = ename;
+ prepareCompressed(compName);
+
+ if (!compName.length())
+ return done;
+
+ // delete old entry of this episode
+
+ episodeDb->deleteWhere("compname = '%s' and lang = '%s'", compName.c_str(), lang.c_str());
+
+ // parse ...
+
+ unsigned short seasons[maxSeasons+1];
+ int seasonNr = na;
+ int insideSeasonList = no;
+ char* line = 0;
+
+ memset(seasons, 0, sizeof(seasons));
+
+ for (cLine* l = theLines->First(); l; l = theLines->Next(l))
+ {
+ free(line);
+ line = strdup(l->Text());
+
+ if (l->Length() < 4)
+ continue;
+
+ if (line[0] == '#')
+ {
+ getSpecial(line, "# SHORT", shortName, 100);
+ getSpecial(line, "# EXTRACOL1", col1Name, 100, &exColCount);
+ getSpecial(line, "# EXTRACOL2", col2Name, 100, &exColCount);
+ getSpecial(line, "# EXTRACOL3", col3Name, 100, &exColCount);
+
+ // parse season list:
+ // # SEASONLIST
+ // # 1 1 10
+ // # 2 11 20
+ // # 3 21 30
+ // # /SEASONLIST
+
+ if (strstr(line, "SEASONLIST"))
+ {
+ if (strstr(line, "/SEASONLIST"))
+ insideSeasonList = no;
+ else
+ insideSeasonList = yes;
+
+ continue;
+ }
+
+ // is season info?
+
+ if (insideSeasonList)
+ {
+ int s, v, t;
+
+ if (!isdigit(line[2]))
+ {
+ tell(0, "Warning: (%s) Ignoring unexpected season line [%s]"
+ " missing number at position 3", name.c_str(), line);
+ continue;
+ }
+
+ if (sscanf(line, "# %d\t%d\t%d", &s, &v, &t) == 3)
+ {
+ if (seasonNr == na)
+ seasonNr = s;
+
+ if (s != seasonNr)
+ tell(0, "Info: (%s) Season line [%s] not in sequence, "
+ "expected season %d", name.c_str(), line, seasonNr);
+
+ if (seasonNr > maxSeasons)
+ {
+ tell(0, "Warning: (%s) Ignoring unexpected season line "
+ "[%s] only %d seasons expected", name.c_str(), line, maxSeasons);
+ }
+
+ // store part count of the season
+
+ seasons[seasonNr] = t-(v-1);
+ seasonNr++;
+ }
+ }
+
+ continue;
+ }
+
+ if (!isdigit(line[0]) || !isdigit(line[1]) || line[2] != '\t')
+ continue;
+
+ // found episode line ...
+
+ string partNameComp;
+ char partName[200] = "";
+ char comment[200] = "";
+ char ex1[250] = "";
+ char ex2[250] = "";
+ char ex3[250] = "";
+ char ex[250] = "";
+
+ int se;
+ int ep;
+ int no;
+
+ // get lines like:
+ // "01<tab>1<tab>1<tab>Schatten der Vergangenheit<tab>[extcol1<tab>[extcol2<tab>[extcol3]]][<tab>#comment]<tab>"
+
+ switch (exColCount)
+ {
+ case 0:
+ {
+ if (sscanf(line, "%d\t%d\t%d\t%[^\t\n]\t%[^\t\n]",
+ &se, &ep, &no, partName, comment) < 4)
+ {
+ tell(0, "Warning: (%s) Got invalid episode line [%s], "
+ "at lease 4 columns expected", name.c_str(), line);
+ continue;
+ }
+
+ break;
+ }
+ case 1:
+ {
+ if (sscanf(line, "%d\t%d\t%d\t%[^\t\n]\t%[^\t\n]\t%[^\t\n]",
+ &se, &ep, &no, partName, ex1, comment) < 5)
+ {
+ tell(0, "Warning: (%s) Got invalid episode line [%s], "
+ "at lease 5 columns expected", name.c_str(), line);
+ continue;
+ }
+
+ break;
+ }
+ case 2:
+ {
+ if (sscanf(line, "%d\t%d\t%d\t%[^\t\n]\t%[^\t\n]\t%[^\t\n]\t%[^\t\n]",
+ &se, &ep, &no, partName, ex1, ex2, comment) < 6)
+ {
+ tell(0, "Warning: (%s) Got invalid episode line [%s], "
+ "at lease 6 columns expected", name.c_str(), line);
+ continue;
+ }
+
+ break;
+ }
+ case 3:
+ {
+ if (sscanf(line, "%d\t%d\t%d\t%[^\t\n]\t%[^\t\n]\t%[^\t\n]\t%[^\t\n]\t%[^\t\n]",
+ &se, &ep, &no, partName, ex1, ex2, ex3, comment) < 7)
+ {
+ tell(0, "Warning: (%s) Got invalid episode line [%s], "
+ "at lease 7 columns expected", name.c_str(), line);
+ continue;
+ }
+
+ break;
+ }
+ }
+
+ partNameComp = partName;
+ prepareCompressed(partNameComp);
+
+ if (!partNameComp.length() || strcmp(partName, "n.n.") == 0)
+ continue;
+
+ episodeDb->clear();
+
+ episodeDb->setValue("COMPNAME", compName.c_str());
+ episodeDb->setValue("COMPPARTNAME", partNameComp.c_str());
+ episodeDb->setValue("LANG", lang.c_str());
+
+ episodeDb->setValue("EPISODENAME", ename.c_str());
+ episodeDb->setValue("LINK", isLink());
+ episodeDb->setValue("PARTNAME", partName);
+ episodeDb->setValue("SEASON", se);
+ episodeDb->setValue("PART", ep);
+ episodeDb->setValue("PARTS", se < maxSeasons ? seasons[se] : 0);
+ episodeDb->setValue("NUMBER", no);
+
+ if (!isEmpty(shortName))
+ {
+ string comp;
+ comp = shortName;
+ prepareCompressed(comp);
+
+ episodeDb->setValue("SHORTNAME", shortName);
+ episodeDb->setValue("COMPSHORTNAME", comp.c_str());
+ }
+
+ if (!isEmpty(comment))
+ episodeDb->setValue("COMMENT", comment);
+
+ if (!isEmpty(ex1) && !isEmpty(col1Name))
+ {
+ snprintf(ex, 250, "%s: %s", col1Name, ex1);
+ episodeDb->setValue("EXTRACOL1", ex);
+ }
+
+ if (!isEmpty(ex2) && !isEmpty(col2Name))
+ {
+ snprintf(ex, 250, "%s: %s", col2Name, ex2);
+ episodeDb->setValue("EXTRACOL2", ex);
+ }
+
+ if (!isEmpty(ex3) && !isEmpty(col3Name))
+ {
+ snprintf(ex, 250, "%s: %s", col3Name, ex3);
+ episodeDb->setValue("EXTRACOL3", ex);
+ }
+
+ if (episodeDb->store() != success)
+ tell(0, "Error: (%s) Can't store part '%s'/%d of "
+ "serie '%s' in database", name.c_str(), partName, ep, ename.c_str());
+ }
+
+ free(line);
+
+ return 0;
+}