diff --git a/src/dvb/dvb_support.h b/src/dvb/dvb_support.h index 5de62abf..cb32d4f2 100644 --- a/src/dvb/dvb_support.h +++ b/src/dvb/dvb_support.h @@ -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 diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 2e08ab14..54dddbc5 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -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; diff --git a/src/epg.c b/src/epg.c index b669d78d..2061956d 100644 --- a/src/epg.c +++ b/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); +} /** * diff --git a/src/epg.h b/src/epg.h index d6665241..9849645a 100644 --- a/src/epg.h +++ b/src/epg.h @@ -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, diff --git a/src/webui/extjs.c b/src/webui/extjs.c index db7fadc5..3e2943ec 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -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); diff --git a/src/webui/static/app/epg.js b/src/webui/static/app/epg.js index ae9dc327..aeec7ed2 100644 --- a/src/webui/static/app/epg.js +++ b/src/webui/static/app/epg.js @@ -20,6 +20,12 @@ tvheadend.epgDetails = function(event) { content += '
'; + if(event.ext_desc != null) + content += ' '; + + if(event.ext_text != null) + content += ' '; + content += ' ' @@ -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 */},