/** * Parse tags inside of a programme */ static int _xmltv_parse_programme_tags (epggrab_module_t *mod, channel_t *ch, htsmsg_t *tags, time_t start, time_t stop, epggrab_stats_t *stats) { int save = 0, save2 = 0, save3 = 0; epg_episode_t *ee = NULL; epg_serieslink_t *es = NULL; epg_broadcast_t *ebc; epg_genre_list_t *egl; epg_episode_num_t epnum; memset(&epnum, 0, sizeof(epnum)); char *suri = NULL, *uri = NULL; lang_str_t *title = NULL; lang_str_t *desc = NULL; lang_str_t *subtitle = NULL; time_t first_aired = 0; int8_t bw = -1; /* * Broadcast */ if (!(ebc = epg_broadcast_find_by_time(ch, start, stop, 0, 1, &save))) return 0; stats->broadcasts.total++; if (save) stats->broadcasts.created++; /* Description (wait for episode first) */ _xmltv_parse_lang_str(&desc, tags, "desc"); if (desc) save3 |= epg_broadcast_set_description2(ebc, desc, mod); /* Quality metadata */ save |= xmltv_parse_vid_quality(mod, ebc, htsmsg_get_map(tags, "video"), &bw); /* Accessibility */ save |= xmltv_parse_accessibility(mod, ebc, tags); /* Misc */ save |= _xmltv_parse_previously_shown(mod, ebc, tags, &first_aired); if (htsmsg_get_map(tags, "premiere") || htsmsg_get_map(tags, "new")) save |= epg_broadcast_set_is_new(ebc, 1, mod); /* * Episode/Series info */ get_episode_info(mod, tags, &uri, &suri, &epnum); /* * Series Link */ if (suri) { es = epg_serieslink_find_by_uri(suri, 1, &save2); free(suri); if (es) stats->seasons.total++; if (save2) stats->seasons.created++; if (es) save |= epg_broadcast_set_serieslink(ebc, es, mod); } /* * Episode */ if (uri) { if ((ee = epg_episode_find_by_uri(uri, 1, &save3))) save |= epg_broadcast_set_episode(ebc, ee, mod); free(uri); } else { ee = epg_broadcast_get_episode(ebc, 1, &save3); } if (ee) stats->episodes.total++; if (save3) stats->episodes.created++; if (ee) { _xmltv_parse_lang_str(&title, tags, "title"); _xmltv_parse_lang_str(&subtitle, tags, "sub-title"); if (title) save3 |= epg_episode_set_title2(ee, title, mod); if (subtitle) save3 |= epg_episode_set_subtitle2(ee, subtitle, mod); if ((egl = _xmltv_parse_categories(tags))) { save3 |= epg_episode_set_genre(ee, egl, mod); epg_genre_list_destroy(egl); } if (bw != -1) save3 |= epg_episode_set_is_bw(ee, (uint8_t)bw, mod); save3 |= epg_episode_set_epnum(ee, &epnum, mod); save3 |= _xmltv_parse_star_rating(mod, ee, tags); // TODO: parental rating } /* Stats */ if (save) stats->broadcasts.modified++; if (save2) stats->seasons.modified++; if (save3) stats->episodes.modified++; /* Cleanup */ if (title) lang_str_destroy(title); if (subtitle) lang_str_destroy(subtitle); if (desc) lang_str_destroy(desc); return save | save2 | save3; }
static int _pyepg_parse_episode ( epggrab_module_t *mod, htsmsg_t *data, epggrab_stats_t *stats ) { int save = 0; htsmsg_t *attr, *tags; epg_episode_t *episode; epg_season_t *season; epg_brand_t *brand; const char *str; uint32_t u32, pc, pn; epg_genre_list_t *egl; if ( data == NULL ) return 0; if ((attr = htsmsg_get_map(data, "attrib")) == NULL) return 0; if ((str = htsmsg_get_str(attr, "id")) == NULL) return 0; if ((tags = htsmsg_get_map(data, "tags")) == NULL) return 0; /* Find episode */ if ((episode = epg_episode_find_by_uri(str, 1, &save)) == NULL) return 0; stats->episodes.total++; if (save) stats->episodes.created++; /* Set season */ if ((str = htsmsg_get_str(attr, "series"))) { if ((season = epg_season_find_by_uri(str, 0, NULL))) { save |= epg_episode_set_season(episode, season, mod); } } /* Set brand */ if ((str = htsmsg_get_str(attr, "brand"))) { if ((brand = epg_brand_find_by_uri(str, 0, NULL))) { save |= epg_episode_set_brand(episode, brand, mod); } } /* Set title/subtitle */ if ((str = htsmsg_xml_get_cdata_str(tags, "title"))) { save |= epg_episode_set_title(episode, str, NULL, mod); } if ((str = htsmsg_xml_get_cdata_str(tags, "subtitle"))) { save |= epg_episode_set_subtitle(episode, str, NULL, mod); } /* Set summary */ if ((str = htsmsg_xml_get_cdata_str(tags, "summary"))) { save |= epg_episode_set_summary(episode, str, NULL, mod); } /* Number */ if (htsmsg_xml_get_cdata_u32(tags, "number", &u32) == 0) { save |= epg_episode_set_number(episode, u32, mod); } if (!htsmsg_xml_get_cdata_u32(tags, "part-number", &pn)) { pc = 0; htsmsg_xml_get_cdata_u32(tags, "part-count", &pc); save |= epg_episode_set_part(episode, pn, pc, mod); } /* Set image */ if ((str = htsmsg_xml_get_cdata_str(tags, "image"))) { save |= epg_episode_set_image(episode, str, mod); } else if ((str = htsmsg_xml_get_cdata_str(tags, "thumb"))) { save |= epg_episode_set_image(episode, str, mod); } /* Genre */ if ((egl = _pyepg_parse_genre(tags))) { save |= epg_episode_set_genre(episode, egl, mod); epg_genre_list_destroy(egl); } /* Content */ if ((htsmsg_get_map(tags, "blackandwhite"))) save |= epg_episode_set_is_bw(episode, 1, mod); if (save) stats->episodes.modified++; return save; }