Skip to content

Commit

Permalink
Added support for xmltv in interactive mode
Browse files Browse the repository at this point in the history
git-svn-id: http://crossepg.googlecode.com/svn/trunk@72 bda989b6-6649-11de-9c70-efa4e9705d34
  • Loading branch information
sandro@skanetwork.com committed Sep 5, 2010
1 parent ac010eb commit 94a0a4e
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 20 deletions.
6 changes: 6 additions & 0 deletions .project
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.python.pydev.PyDevBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.python.pydev.pythonNature</nature>
</natures>
</projectDescription>
7 changes: 7 additions & 0 deletions .pydevproject
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?>

<pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property>
</pydev_project>
73 changes: 66 additions & 7 deletions src/common/crossepg_downloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ unsigned int buffer_size_last;
bool huffman_debug_titles = false;
bool huffman_debug_summaries = false;

char *db_root = DEFAULT_DB_ROOT;
char demuxer[256];
char provider[256];
char homedir[256];
Expand Down Expand Up @@ -124,7 +125,47 @@ bool opentv_summaries_callback (int size, unsigned char* data)
return !stop;
}

void save_progress_callback (int value, int max)
void xmltv_event_callback (int type, char *arg)
{
switch (type)
{
case 0:
interactive_send_text (ACTION_PROGRESS, "ON");
break;

case 1:
interactive_send_text (ACTION_PROGRESS, "OFF");
break;

case 2:
interactive_send_text (ACTION_TYPE, "DOWNLOADING CHANNELS LIST");
interactive_send_text (ACTION_URL, arg);
break;

case 3:
interactive_send_text (ACTION_TYPE, "DEFLATING CHANNELS LIST");
break;

case 4:
interactive_send_text (ACTION_TYPE, "PARSING CHANNELS LIST");
break;

case 5:
interactive_send_text (ACTION_TYPE, "DOWNLOADING EVENTS");
interactive_send_text (ACTION_URL, arg);
break;

case 6:
interactive_send_text (ACTION_TYPE, "DEFLATING EVENTS");
break;

case 7:
interactive_send_text (ACTION_TYPE, "PARSING EVENTS");
break;
}
}

void progress_callback (int value, int max)
{
static int last = 0;
static time_t lasttime = 0;
Expand Down Expand Up @@ -285,9 +326,28 @@ void *download (void *args)
char opentv_file[256];

sprintf (opentv_file, "%s/providers/%s.conf", homedir, provider);

if (providers_read (opentv_file))
download_opentv ();

{
if (providers_get_protocol () == 1)
{
download_opentv ();
}
else if (providers_get_protocol () == 2)
{
interactive_send (ACTION_START);
xmltv_channels_init ();
if (xmltv_downloader_channels (providers_get_xmltv_channels (), db_root, progress_callback, xmltv_event_callback, &stop))
{
xmltv_parser_set_iso639 (providers_get_xmltv_plang ());
xmltv_downloader_events (providers_get_xmltv_url (), db_root, progress_callback, xmltv_event_callback, &stop);
}
xmltv_channels_cleanup ();
interactive_send (ACTION_END);
}
}


return NULL;
}

Expand Down Expand Up @@ -356,7 +416,7 @@ void *interactive (void *args)
timeout_enable = false;
interactive_send (ACTION_START);
interactive_send_text (ACTION_PROGRESS, "ON");
if (!epgdb_save (save_progress_callback)) interactive_send_text (ACTION_ERROR, "cannot save data");
if (!epgdb_save (progress_callback)) interactive_send_text (ACTION_ERROR, "cannot save data");
interactive_send (ACTION_END);
interactive_send_text (ACTION_PROGRESS, "OFF");
}
Expand Down Expand Up @@ -409,7 +469,6 @@ void interactive_manager ()
int main (int argc, char **argv)
{
int c, i;
char *db_root = DEFAULT_DB_ROOT;
opterr = 0;
bool iactive = false;

Expand Down Expand Up @@ -521,10 +580,10 @@ int main (int argc, char **argv)
log_add ("Events url: %s", providers_get_xmltv_url ());
log_add ("Preferred language: %s", providers_get_xmltv_plang ());
xmltv_channels_init ();
if (xmltv_downloader_channels (providers_get_xmltv_channels (), db_root))
if (xmltv_downloader_channels (providers_get_xmltv_channels (), db_root, NULL, NULL, &stop))
{
xmltv_parser_set_iso639 (providers_get_xmltv_plang ());
if (xmltv_downloader_events (providers_get_xmltv_url (), db_root))
if (xmltv_downloader_events (providers_get_xmltv_url (), db_root, NULL, NULL, &stop))
save = true;
else
log_add ("Error downloading/parsing events file");
Expand Down
52 changes: 44 additions & 8 deletions src/common/xmltv/xmltv_downloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#include "xmltv_downloader.h"

static char _url[256];
static volatile bool _stop = false;
//static volatile bool _stop = false;

#define BUFLEN 16384

Expand Down Expand Up @@ -62,7 +62,7 @@ static bool xmltv_downloader_extension_check (char *filename, char *extension)
return true;
}

bool xmltv_downloader_channels (char *url, char *dbroot)
bool xmltv_downloader_channels (char *url, char *dbroot, void(*progress_callback)(int, int), void(*event_callback)(int, char*), volatile bool *stop)
{
bool ret = false;
char host[256];
Expand All @@ -74,6 +74,9 @@ bool xmltv_downloader_channels (char *url, char *dbroot)

strcpy (_url, url);

if (event_callback) event_callback(2, _url); // download message
if (event_callback) event_callback(0, NULL); // turn on progress bar

memset (host, 0, sizeof (host));
memset (port, 0, sizeof (port));
memset (page, 0, sizeof (page));
Expand Down Expand Up @@ -108,17 +111,27 @@ bool xmltv_downloader_channels (char *url, char *dbroot)
sprintf (sfn, "%s/crossepg.tmp.XXXXXX", dbroot);
if ((fd = mkstemp (sfn)) == -1)
{
if (event_callback) event_callback(1, NULL); // turn off progress bar
log_add ("Cannot get temp file (%s)", sfn);
return false;
}
char tmp_url[256];
sprintf (tmp_url, "http://%s/%s", host, page);
if (!http_get (host, page, atoi (port), fd, NULL, &_stop))
if (!http_get (host, page, atoi (port), fd, progress_callback, stop))
{
if (event_callback) event_callback(1, NULL); // turn off progress bar
log_add ("Error downloading file %s", tmp_url);
return false;
}

if (event_callback) event_callback(1, NULL); // turn off progress bar

if (*stop)
{
unlink (sfn);
return false;
}

if (xmltv_downloader_extension_check (page, "gz"))
{
int fd2 = -1;
Expand All @@ -127,25 +140,30 @@ bool xmltv_downloader_channels (char *url, char *dbroot)
if ((fd2 = mkstemp (sfn2)) == -1) log_add ("Cannot get temp file");
else
{
if (event_callback) event_callback(3, NULL); // deflating message
log_add ("Deflating %s", page);
FILE *dest = fdopen (fd2, "w");
if (!xmltv_downloader_gzip (sfn, dest)) log_add ("Error deflating file");
else log_add ("File deflated");
fclose (dest);
close (fd2);
if (event_callback) event_callback(4, NULL); // reading message
ret = xmltv_channels_load (sfn2);
unlink (sfn2);
}
}
else
{
if (event_callback) event_callback(4, NULL); // reading message
ret = xmltv_channels_load (sfn);
}

unlink (sfn);

return ret;
}

bool xmltv_downloader_events (char *url, char *dbroot)
bool xmltv_downloader_events (char *url, char *dbroot, void(*progress_callback)(int, int), void(*event_callback)(int, char*), volatile bool *stop)
{
bool ret = false;
char host[256];
Expand All @@ -157,6 +175,9 @@ bool xmltv_downloader_events (char *url, char *dbroot)

strcpy (_url, url);

if (event_callback) event_callback(5, _url); // download message
if (event_callback) event_callback(0, NULL); // turn on progress bar

memset (host, 0, sizeof (host));
memset (port, 0, sizeof (port));
memset (page, 0, sizeof (page));
Expand Down Expand Up @@ -192,16 +213,26 @@ bool xmltv_downloader_events (char *url, char *dbroot)
if ((fd = mkstemp (sfn)) == -1)
{
log_add ("Cannot get temp file (%s)", sfn);
if (event_callback) event_callback(1, NULL); // turn off progress bar
return false;
}
char tmp_url[256];
sprintf (tmp_url, "http://%s/%s", host, page);
if (!http_get (host, page, atoi (port), fd, NULL, &_stop))
if (!http_get (host, page, atoi (port), fd, progress_callback, stop))
{
log_add ("Error downloading file %s", tmp_url);
if (event_callback) event_callback(1, NULL); // turn off progress bar
return false;
}


if (event_callback) event_callback(1, NULL); // turn off progress bar

if (*stop)
{
unlink (sfn);
return false;
}

if (xmltv_downloader_extension_check (page, "gz"))
{
int fd2 = -1;
Expand All @@ -210,18 +241,23 @@ bool xmltv_downloader_events (char *url, char *dbroot)
if ((fd2 = mkstemp (sfn2)) == -1) log_add ("Cannot get temp file");
else
{
if (event_callback) event_callback(6, NULL); // deflating message
log_add ("Deflating %s", page);
FILE *dest = fdopen (fd2, "w");
if (!xmltv_downloader_gzip (sfn, dest)) log_add ("Error deflating file");
else log_add ("File deflated");
fclose (dest);
close (fd2);
ret = xmltv_parser_import (sfn2);
if (event_callback) event_callback(7, NULL); // parsing events
ret = xmltv_parser_import (sfn2, progress_callback, stop);
unlink (sfn2);
}
}
else
ret = xmltv_parser_import (sfn);
{
if (event_callback) event_callback(7, NULL); // parsing events
ret = xmltv_parser_import (sfn, progress_callback, stop);
}

unlink (sfn);

Expand Down
4 changes: 2 additions & 2 deletions src/common/xmltv/xmltv_downloader.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef _XMLTV_DOWNLOADER_H_
#define _XMLTV_DOWNLOADER_H_

bool xmltv_downloader_channels (char *url, char *dbroot);
bool xmltv_downloader_events (char *url, char *dbroot);
bool xmltv_downloader_channels (char *url, char *dbroot, void(*progress_callback)(int, int), void(*event_callback)(int, char*), volatile bool *stop);
bool xmltv_downloader_events (char *url, char *dbroot, void(*progress_callback)(int, int), void(*event_callback)(int, char*), volatile bool *stop);

#endif // _XMLTV_DOWNLOADER_H_
19 changes: 18 additions & 1 deletion src/common/xmltv/xmltv_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,13 +394,23 @@ void xmltv_parser_set_iso639 (char *iso639)
memcpy (preferred_iso639, iso639, 3);
}

bool xmltv_parser_import (char *filename)
bool xmltv_parser_import (char *filename, void(*progress_callback)(int, int), volatile bool *stop)
{
xmlTextReaderPtr reader;
int ret;
int filesize = 0;
FILE *fd;

log_add ("Parsing %s", filename);

fd = fopen (filename, "r");
if (fd)
{
fseek (fd, 0, SEEK_END);
filesize = ftell (fd);
fclose (fd);
}

reader = xmlReaderForFile (filename, NULL, 0);
if (!reader)
{
Expand Down Expand Up @@ -430,8 +440,15 @@ bool xmltv_parser_import (char *filename)
ret = xmlTextReaderRead (reader);
while (ret == 1)
{
if (*stop)
{
ret = -1;
continue;
}
processNode (reader);
ret = xmlTextReaderRead (reader);
if (progress_callback)
progress_callback (xmlTextReaderByteConsumed (reader), filesize);
}

log_add ("Read %d events", events_count);
Expand Down
2 changes: 1 addition & 1 deletion src/common/xmltv/xmltv_parser.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef _XMLTV_PARSER_H_
#define _XMLTV_PARSER_H_

bool xmltv_parser_import (char *filename);
bool xmltv_parser_import (char *filename, void(*progress_callback)(int, int), volatile bool *stop);
void xmltv_parser_set_iso639 (char *iso639);

#endif // _XMLTV_PARSER_H_
2 changes: 1 addition & 1 deletion src/enigma2/python/crossepglib.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ def getChannelID(self, provider):
namespace = int(znamespace[0]);

if nid == -1 or sid == -1 or tsid == -1:
print "[CrossEPG_Config] invalid configuration file"
#print "[CrossEPG_Config] invalid configuration file"
return

f.close()
Expand Down

0 comments on commit 94a0a4e

Please sign in to comment.