From a5c67791fcccefc39db34400334dd724dec6310c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Wed, 14 Oct 2009 20:07:35 +0000 Subject: [PATCH] * Increase logging and include various stats to XMLTV grab --- debian/changelog | 2 ++ src/dvb/dvb_tables.c | 2 +- src/xmltv.c | 53 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/debian/changelog b/debian/changelog index fd7bfb42..febf59c3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -20,6 +20,8 @@ hts-tvheadend (2.6) hts; urgency=low * Add support for DiSEqC 1.1 / 2.1, configured on per-adapter basis. Ticket #99 + * Increase logging and include various stats to XMLTV grab + hts-tvheadend (2.5) hts; urgency=low * If a previosly detected DVB adapter was not present during startup, diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 031a7596..b92820d2 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -521,7 +521,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, } if((e = epg_event_create(ch, start_time, start_time + duration, - event_id)) == NULL) { + event_id, NULL)) == NULL) { len -= dllen; ptr += dllen; continue; diff --git a/src/xmltv.c b/src/xmltv.c index c67e102b..f4c2f5b9 100644 --- a/src/xmltv.c +++ b/src/xmltv.c @@ -58,6 +58,17 @@ typedef struct xmltv_grabber { } xmltv_grabber_t; + +typedef struct parse_stats { + int ps_channels; + int ps_programmes; + int ps_events_created; + +} parse_stats_t; + + + + static xmltv_grabber_t *xg_current; @@ -330,17 +341,21 @@ xmltv_parse_channel(htsmsg_t *body) */ static void xmltv_parse_programme_tags(xmltv_channel_t *xc, htsmsg_t *tags, - time_t start, time_t stop) + time_t start, time_t stop, parse_stats_t *ps) { event_t *e; channel_t *ch; const char *title = xmltv_get_cdata_by_tag(tags, "title"); const char *desc = xmltv_get_cdata_by_tag(tags, "desc"); + int created; LIST_FOREACH(ch, &xc->xc_channels, ch_xc_link) { - if((e = epg_event_create(ch, start, stop, -1)) == NULL) + if((e = epg_event_create(ch, start, stop, -1, &created)) == NULL) continue; + if(created) + ps->ps_events_created++; + if(title != NULL) epg_event_set_title(e, title); if(desc != NULL) epg_event_set_desc(e, desc); } @@ -351,7 +366,7 @@ xmltv_parse_programme_tags(xmltv_channel_t *xc, htsmsg_t *tags, * Parse a tag from xmltv */ static void -xmltv_parse_programme(htsmsg_t *body) +xmltv_parse_programme(htsmsg_t *body, parse_stats_t *ps) { htsmsg_t *attribs, *tags; const char *s, *chid; @@ -382,7 +397,7 @@ xmltv_parse_programme(htsmsg_t *body) return; if((xc = xmltv_channel_find(chid, 0)) != NULL) { - xmltv_parse_programme_tags(xc, tags, start, stop); + xmltv_parse_programme_tags(xc, tags, start, stop, ps); } } @@ -390,7 +405,7 @@ xmltv_parse_programme(htsmsg_t *body) * */ static void -xmltv_parse_tv(htsmsg_t *body) +xmltv_parse_tv(htsmsg_t *body, parse_stats_t *ps) { htsmsg_t *tags; htsmsg_field_t *f; @@ -401,8 +416,10 @@ xmltv_parse_tv(htsmsg_t *body) HTSMSG_FOREACH(f, tags) { if(!strcmp(f->hmf_name, "channel")) { xmltv_parse_channel(htsmsg_get_map_by_field(f)); + ps->ps_channels++; } else if(!strcmp(f->hmf_name, "programme")) { - xmltv_parse_programme(htsmsg_get_map_by_field(f)); + xmltv_parse_programme(htsmsg_get_map_by_field(f), ps); + ps->ps_programmes++; } } } @@ -412,7 +429,7 @@ xmltv_parse_tv(htsmsg_t *body) * */ static void -xmltv_parse(htsmsg_t *body) +xmltv_parse(htsmsg_t *body, parse_stats_t *ps) { htsmsg_t *tags, *tv; @@ -422,7 +439,7 @@ xmltv_parse(htsmsg_t *body) if((tv = htsmsg_get_map(tags, "tv")) == NULL) return; - xmltv_parse_tv(tv); + xmltv_parse_tv(tv, ps); } /** @@ -435,13 +452,22 @@ xmltv_grab(const char *prog) char *outbuf; htsmsg_t *body; char errbuf[100]; + time_t t1, t2; + parse_stats_t ps = {0}; + time(&t1); outlen = spawn_and_store_stdout(prog, NULL, &outbuf); if(outlen < 1) { tvhlog(LOG_ERR, "xmltv", "No output from \"%s\"", prog); return; } + time(&t2); + + tvhlog(LOG_DEBUG, "xmltv", + "%s: completed, took %ld seconds", + prog, t2 - t1); + body = htsmsg_xml_deserialize(outbuf, errbuf, sizeof(errbuf)); if(body == NULL) { tvhlog(LOG_ERR, "xmltv", "Unable to parse output from \"%s\": %s", @@ -449,10 +475,19 @@ xmltv_grab(const char *prog) return; } + pthread_mutex_lock(&global_lock); - xmltv_parse(body); + xmltv_parse(body, &ps); pthread_mutex_unlock(&global_lock); + tvhlog(LOG_INFO, "xmltv", + "%s: Parsing completed. XML contained %d channels, %d events, " + "%d new events injected in EPG", + prog, + ps.ps_channels, + ps.ps_programmes, + ps.ps_events_created); + htsmsg_destroy(body); }