/** * Parse a <programme> tag from xmltv */ static int _xmltv_parse_programme (epggrab_module_t *mod, htsmsg_t *body, epggrab_stats_t *stats) { int save = 0; htsmsg_t *attribs, *tags; const char *s, *chid; time_t start, stop; epggrab_channel_t *ch; epggrab_channel_link_t *ecl; if(body == NULL) return 0; if((attribs = htsmsg_get_map(body, "attrib")) == NULL) return 0; if((tags = htsmsg_get_map(body, "tags")) == NULL) return 0; if((chid = htsmsg_get_str(attribs, "channel")) == NULL) return 0; if((ch = _xmltv_channel_find(chid, 0, NULL)) == NULL) return 0; if (!LIST_FIRST(&ch->channels)) return 0; if((s = htsmsg_get_str(attribs, "start")) == NULL) return 0; start = _xmltv_str2time(s); if((s = htsmsg_get_str(attribs, "stop")) == NULL) return 0; stop = _xmltv_str2time(s); if(stop <= start || stop <= dispatch_clock) return 0; LIST_FOREACH(ecl, &ch->channels, link) save |= _xmltv_parse_programme_tags(mod, ecl->channel, tags, start, stop, stats); return save; }
/** * Parse a <channel> tag from xmltv */ static int _xmltv_parse_channel (epggrab_module_t *mod, htsmsg_t *body, epggrab_stats_t *stats) { int save =0; htsmsg_t *attribs, *tags, *subtag; const char *id, *name, *icon; epggrab_channel_t *ch; if(body == NULL) return 0; if((attribs = htsmsg_get_map(body, "attrib")) == NULL) return 0; if((id = htsmsg_get_str(attribs, "id")) == NULL) return 0; if((tags = htsmsg_get_map(body, "tags")) == NULL) return 0; if((ch = _xmltv_channel_find(id, 1, &save)) == NULL) return 0; stats->channels.total++; if (save) stats->channels.created++; if((name = htsmsg_xml_get_cdata_str(tags, "display-name")) != NULL) { save |= epggrab_channel_set_name(ch, name); } if((subtag = htsmsg_get_map(tags, "icon")) != NULL && (attribs = htsmsg_get_map(subtag, "attrib")) != NULL && (icon = htsmsg_get_str(attribs, "src")) != NULL) { save |= epggrab_channel_set_icon(ch, icon); } if (save) { epggrab_channel_updated(ch); stats->channels.modified++; } return save; }
/** * Parse a <programme> tag from xmltv */ static int _xmltv_parse_programme (epggrab_module_t *mod, htsmsg_t *body, epggrab_stats_t *stats) { int chsave = 0, save = 0; htsmsg_t *attribs, *tags, *subtag; const char *s, *chid, *icon = NULL; time_t start, stop; epggrab_channel_t *ec; idnode_list_mapping_t *ilm; if(body == NULL) return 0; if((attribs = htsmsg_get_map(body, "attrib")) == NULL) return 0; if((tags = htsmsg_get_map(body, "tags")) == NULL) return 0; if((chid = htsmsg_get_str(attribs, "channel")) == NULL) return 0; if((ec = _xmltv_channel_find(chid, 1, &chsave)) == NULL) return 0; if (chsave) { epggrab_channel_updated(ec); stats->channels.created++; stats->channels.modified++; } if (!LIST_FIRST(&ec->channels)) return 0; if((s = htsmsg_get_str(attribs, "start")) == NULL) return 0; start = _xmltv_str2time(s); if((s = htsmsg_get_str(attribs, "stop")) == NULL) return 0; stop = _xmltv_str2time(s); if((subtag = htsmsg_get_map(tags, "icon")) != NULL && (attribs = htsmsg_get_map(subtag, "attrib")) != NULL) icon = htsmsg_get_str(attribs, "src"); if(stop <= start || stop <= dispatch_clock) return 0; LIST_FOREACH(ilm, &ec->channels, ilm_in2_link) save |= _xmltv_parse_programme_tags(mod, (channel_t *)ilm->ilm_in2, tags, start, stop, icon, stats); return save; }