Some updates to the EIT code, fixes a few things and adds some incomplete bits (still a few more to sort).

This commit is contained in:
Adam Sutton 2012-06-22 10:19:03 +01:00
parent ee195c9e07
commit c8e9bb1aa7
2 changed files with 71 additions and 70 deletions
src
epg.c
epggrab

View file

@ -1929,5 +1929,8 @@ void epg_query_sort(epg_query_result_t *eqr)
/* Hash title/summary/description to form URI */ /* Hash title/summary/description to form URI */
char *epg_hash ( const char *t, const char *s, const char *d ) char *epg_hash ( const char *t, const char *s, const char *d )
{ {
return NULL; // TODO if ( d ) return md5sum(d);
if ( s ) return md5sum(d);
if ( t ) return md5sum(t);
return NULL;
} }

View file

@ -62,63 +62,52 @@ dvb_desc_short_event(uint8_t *ptr, int len,
static int static int
dvb_desc_extended_event(uint8_t *ptr, int len, dvb_desc_extended_event(uint8_t *ptr, int len,
char *desc, size_t desclen, char *desc, size_t desclen,
char *text, size_t textlen, htsmsg_t *extra,
char *dvb_default_charset) char *dvb_default_charset)
{ {
#if TODO int ilen, nitems = ptr[4];
int count = ptr[4], r; char ikey[256], ival[256];
uint8_t *localptr = ptr + 5, *items = localptr; if (len < 8) return -1;
int locallen = len - 5; ptr += 5;
len -= 5;
/* terminate buffers */ /* key/value items */
desc[0] = '\0'; item[0] = '\0'; text[0] = '\0'; while (nitems-- > 0) {
while (items < (localptr + count)) /* key */
{ ilen = *ptr;
/* this only makes sense if we have 2 or more character left in buffer */ if (ilen+1 > len) return -1;
if ((desclen - strlen(desc)) > 2) if(dvb_get_string_with_len(ikey, sizeof(ikey),
{ ptr+1, ilen,
/* get description -> append to desc if space left */ dvb_default_charset) < 0) return -1;
if (desc[0] != '\0') return -1;
strncat(desc, "\n", 1); ptr += (ilen + 1);
if((r = dvb_get_string_with_len(desc + strlen(desc), len -= (ilen + 1);
desclen - strlen(desc),
items, (localptr + count) - items,
dvb_default_charset)) < 0)
return -1;
}
items += 1 + items[0]; /* value */
ilen = *ptr;
if (ilen+1 > len) return -1;
if(dvb_get_string_with_len(ival, sizeof(ival),
ptr, ilen,
dvb_default_charset) < 0) return -1;
ptr += (ilen + 1);
len -= (ilen + 1);
/* this only makes sense if we have 2 or more character left in buffer */ // TODO: should this extend existing strings?
if ((itemlen - strlen(item)) > 2) htsmsg_add_str(extra, ikey, ival);
{
/* get item -> append to item if space left */
if (item[0] != '\0')
strncat(item, "\n", 1);
if((r = dvb_get_string_with_len(item + strlen(item),
itemlen - strlen(item),
items, (localptr + count) - items,
dvb_default_charset)) < 0)
return -1;
}
/* go to next item */
items += 1 + items[0];
} }
localptr += count; /* raw text (append) */
locallen -= count; ilen = *ptr;
count = localptr[0]; if (ilen+1 > len) return -1;
if(dvb_get_string_with_len(desc + strlen(desc),
desclen - strlen(desc),
ptr+1, ilen,
dvb_default_charset) < 0) return -1;
/* get text */
if((r = dvb_get_string_with_len(text, textlen, localptr, locallen, dvb_default_charset)) < 0)
return -1;
#endif
return 0; return 0;
} }
// TODO: reg interest th_dvb_mux_instance_t *otdmi = tdmi;
static int _eit_callback static int _eit_callback
( th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, ( th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t tableid, void *opaque ) uint8_t tableid, void *opaque )
@ -137,7 +126,7 @@ static int _eit_callback
char title[256]; char title[256];
char summary[256]; char summary[256];
char desc[5000]; char desc[5000];
char info[5000]; htsmsg_t *extra;
/* Disabled */ /* Disabled */
if(!_eit_mod.enabled) return 0; if(!_eit_mod.enabled) return 0;
@ -164,11 +153,10 @@ static int _eit_callback
break; break;
} }
if(!tdmi) return -1; if(!tdmi) return -1;
/* TODO: register mux interest for more interesting stuff */
/* Get service */ /* Get service */
svc = dvb_transport_find(tdmi, sid, 0, NULL); svc = dvb_transport_find(tdmi, sid, 0, NULL);
if (!svc || !svc->s_enabled || (ch = svc->s_ch)) return 0; if (!svc || !svc->s_enabled || !(ch = svc->s_ch)) return 0;
/* Ignore (disabled or up to date) */ /* Ignore (disabled or up to date) */
if (!svc->s_dvb_eit_enable) return 0; if (!svc->s_dvb_eit_enable) return 0;
@ -205,7 +193,8 @@ static int _eit_callback
if (save2 && tableid < 0x50) resched = 1; if (save2 && tableid < 0x50) resched = 1;
/* Process tags */ /* Process tags */
*title = *summary = *desc = *info = 0; *title = *summary = *desc = 0;
extra = NULL;
genre_idx = 0; genre_idx = 0;
hd = ws = bw = ad = st = ds = 0; hd = ws = bw = ad = st = ds = 0;
while(dllen > 0) { while(dllen > 0) {
@ -228,9 +217,10 @@ static int _eit_callback
/* Extended (description) */ /* Extended (description) */
case DVB_DESC_EXT_EVENT: case DVB_DESC_EXT_EVENT:
if (!extra) extra = htsmsg_create_map();
dvb_desc_extended_event(ptr, dlen, dvb_desc_extended_event(ptr, dlen,
desc, sizeof(desc), desc, sizeof(desc),
info, sizeof(info), extra,
svc->s_dvb_default_charset); svc->s_dvb_default_charset);
break; break;
@ -257,7 +247,8 @@ static int _eit_callback
hd = 1; hd = 1;
if ( t != 0x09 && t != 0x0d ) if ( t != 0x09 && t != 0x0d )
ws = 1; ws = 1;
} else if (t == 0x02 || t == 0x03 || t == 0x04 || t == 0x06 || t == 0x07 || t == 0x08 ) { } else if (t == 0x02 || t == 0x03 || t == 0x04 ||
t == 0x06 || t == 0x07 || t == 0x08 ) {
ws = 1; ws = 1;
} }
@ -297,7 +288,7 @@ static int _eit_callback
#endif #endif
/* Ignore */ /* Ignore */
default: default:
break; break;
} }
@ -317,29 +308,37 @@ static int _eit_callback
ee = ebc->episode; ee = ebc->episode;
if ( !ee || save2 ) { if ( !ee || save2 ) {
char *uri; char *uri;
uri = epg_hash(title, desc, summary); uri = epg_hash(title, summary, desc);
ee = epg_episode_find_by_uri(uri, 1, &save2); if (uri) {
save |= epg_broadcast_set_episode(ebc, ee); ee = epg_episode_find_by_uri(uri, 1, &save2);
free(uri); save |= epg_broadcast_set_episode(ebc, ee);
free(uri);
}
} }
save |= save2; save |= save2;
if (!ee) continue;
/* Episode data */ /* Episode data */
// Note: currently we don't update if already set (else things fight) if (ee) {
save |= epg_episode_set_is_bw(ee, bw); save |= epg_episode_set_is_bw(ee, bw);
if ( !ee->title && *title ) if ( !ee->title && *title )
save |= epg_episode_set_title(ee, title); save |= epg_episode_set_title(ee, title);
if ( !ee->summary && *summary ) if ( !ee->summary && *summary )
save |= epg_episode_set_summary(ee, summary); save |= epg_episode_set_summary(ee, summary);
if ( !ee->description && *desc ) if ( !ee->description && *desc )
save |= epg_episode_set_description(ee, desc); save |= epg_episode_set_description(ee, desc);
if ( !ee->genre_cnt && genre_idx ) if ( !ee->genre_cnt && genre_idx )
save |= epg_episode_set_genre(ee, genre, genre_idx); save |= epg_episode_set_genre(ee, genre, genre_idx);
#if TODO_ADD_EXTRA
if ( extra )
save |= epg_episode_set_extra(ee, extra);
#endif
}
if (extra) free(extra);
} }
/* Update EPG */ /* Update EPG */
if (resched) tvhlog(LOG_DEBUG, "eit", "alert grabbers to resched"); if (resched) tvhlog(LOG_DEBUG, "eit", "alert grabbers to resched");
// TODO: handle the reschedule
if (save) epg_updated(); if (save) epg_updated();
return 0; return 0;
@ -362,7 +361,6 @@ void eit_init ( epggrab_module_list_t *list )
_eit_mod.tune = _eit_tune; _eit_mod.tune = _eit_tune;
*((uint8_t*)&_eit_mod.flags) = EPGGRAB_MODULE_OTA; *((uint8_t*)&_eit_mod.flags) = EPGGRAB_MODULE_OTA;
LIST_INSERT_HEAD(list, &_eit_mod, link); LIST_INSERT_HEAD(list, &_eit_mod, link);
// Note: this is mostly ignored anyway as EIT is treated as a special case!
} }
void eit_load ( void ) void eit_load ( void )