parsing extended_event_descriptor to get really long epg descriptions

This commit is contained in:
Robert 2010-02-07 18:48:22 +00:00
parent 6e24cea010
commit 9432e924b8
6 changed files with 115 additions and 0 deletions

View file

@ -40,6 +40,7 @@
#define DVB_DESC_SAT 0x43
#define DVB_DESC_CABLE 0x44
#define DVB_DESC_SHORT_EVENT 0x4d
#define DVB_DESC_EXT_EVENT 0x4e
#define DVB_DESC_SERVICE 0x48
#define DVB_DESC_CONTENT 0x54
#define DVB_DESC_TELETEXT 0x56

View file

@ -384,6 +384,43 @@ dvb_desc_short_event(uint8_t *ptr, int len,
return 0;
}
/**
* DVB Descriptor; Extended Event
*/
static int
dvb_desc_extended_event(uint8_t *ptr, int len,
char *desc, size_t desclen,
char *item, size_t itemlen,
char *text, size_t textlen)
{
int count = ptr[4];
uint8_t *localptr = ptr + 5, *items = localptr;
while (items < (localptr + count))
{
/* get description -> TODO has to be appendend not just copied */
strncpy(desc, (char*)(items+1), items[0]);
desc[items[0]] = '\0';
/* get item -> TODO has to be appendend not just copied */
items += 1 + len;
strncpy(item, (char*)(items+1), items[0]);
item[items[0]] = '\0';
/* go to next item */
items += 1 + len;
}
localptr += count;
count = localptr[0];
/* get text */
strncpy(text, (char*)(&localptr[1]), localptr[0]);
text[localptr[0]] = '\0';
return 0;
}
/**
* DVB Descriptor; Service
@ -443,6 +480,9 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
char title[256];
char desc[5000];
char extdesc[5000];
char extitem[5000];
char exttext[5000];
epg_content_type_t *ect;
event_t *e;
@ -545,6 +585,23 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
epg_event_set_content_type(e, ect);
}
break;
case DVB_DESC_EXT_EVENT:
if(!dvb_desc_extended_event(ptr, dlen,
extdesc, sizeof(extdesc),
extitem, sizeof(extitem),
exttext, sizeof(exttext))) {
char language[4];
memcpy(language, &ptr[1], 3);
language[3] = '\0';
int desc_number = (ptr[0] & 0xF0) >> 4;
//int desc_last = (ptr[0] & 0x0F);
epg_event_set_ext_text(e, desc_number, exttext);
}
break;
default:
break;
}
len -= dlen; ptr += dlen; dllen -= dlen;

View file

@ -150,6 +150,43 @@ epg_event_set_desc(event_t *e, const char *desc)
epg_event_changed(e);
}
/**
*
*/
void epg_event_set_ext_desc(event_t *e, const char *desc)
{
if(e->e_ext_desc != NULL && !strcmp(e->e_ext_desc, desc))
return;
free(e->e_ext_desc);
e->e_ext_desc = strdup(desc);
epg_event_changed(e);
}
/**
*
*/
void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text)
{
if (e->e_ext_text == NULL && ext_dn != 0)
return;
if (e->e_ext_text != NULL && strstr(e->e_ext_text, text))
return;
int len = strlen(text) + ( e->e_ext_text ? strlen(e->e_ext_text) : 0) + 1;
char *tmp = (char*)malloc(len);
if (e->e_ext_text)
{
strcpy(tmp, e->e_ext_text);
strcat(tmp, text);
free(e->e_ext_text);
}
else
strcpy(tmp, text);
e->e_ext_text = tmp;
epg_event_changed(e);
}
/**
*

View file

@ -61,6 +61,8 @@ typedef struct event {
char *e_title; /* UTF-8 encoded */
char *e_desc; /* UTF-8 encoded */
char *e_ext_desc;/* UTF-8 encoded (from extended descriptor) */
char *e_ext_text;/* UTF-8 encoded (from extended descriptor) */
int e_dvb_id;
@ -76,6 +78,10 @@ void epg_event_set_title(event_t *e, const char *title);
void epg_event_set_desc(event_t *e, const char *desc);
void epg_event_set_ext_desc(event_t *e, const char *desc);
void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text);
void epg_event_set_content_type(event_t *e, epg_content_type_t *ect);
event_t *epg_event_create(channel_t *ch, time_t start, time_t stop,

View file

@ -699,6 +699,12 @@ extjs_epg(http_connection_t *hc, const char *remain, void *opaque)
if(e->e_desc != NULL)
htsmsg_add_str(m, "description", e->e_desc);
if(e->e_ext_desc != NULL)
htsmsg_add_str(m, "ext_desc", e->e_ext_desc);
if(e->e_ext_text != NULL)
htsmsg_add_str(m, "ext_text", e->e_ext_text);
htsmsg_add_u32(m, "id", e->e_id);
htsmsg_add_u32(m, "start", e->e_start);
htsmsg_add_u32(m, "end", e->e_stop);

View file

@ -20,6 +20,12 @@ tvheadend.epgDetails = function(event) {
content += '<div class="x-epg-meta">' + event.contentgrp + '</div>';
if(event.ext_desc != null)
content += '<div class="x-epg-meta">' + event.ext_desc + '</div>';
if(event.ext_text != null)
content += '<div class="x-epg-meta">' + event.ext_text + '</div>';
content += '<div class="x-epg-meta"><a target="_blank" href="' +
'http://www.imdb.org/find?q=' + event.title + '">Search IMDB</a></div>'
@ -81,6 +87,8 @@ tvheadend.epg = function() {
{name: 'channel'},
{name: 'title'},
{name: 'description'},
{name: 'ext_desc'},
{name: 'ext_text'},
{name: 'chicon'},
{name: 'start', type: 'date', dateFormat: 'U' /* unix time */},
{name: 'end', type: 'date', dateFormat: 'U' /* unix time */},