parsing extended_event_descriptor to get really long epg descriptions
This commit is contained in:
parent
6e24cea010
commit
9432e924b8
6 changed files with 115 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
37
src/epg.c
37
src/epg.c
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */},
|
||||
|
|
Loading…
Add table
Reference in a new issue