From ae0cde8b50a613ae263ffdae384b65fcb527c81c Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Wed, 20 Jun 2012 16:16:06 +0100 Subject: [PATCH] Filled out a bit more of the EPG metadata parsing in pyepg and fixed a problem with is_bw being in the wrong object. --- src/epg.c | 20 ++++++++++---------- src/epg.h | 7 ++++--- src/epggrab/pyepg.c | 28 ++++++++++++++++++++++++---- src/epggrab/xmltv.c | 14 +++++++------- src/epggrab/xmltv.h | 3 +++ 5 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/epg.c b/src/epg.c index ee7bcf90..12f7010f 100644 --- a/src/epg.c +++ b/src/epg.c @@ -1082,6 +1082,12 @@ int epg_episode_set_genre_str ( epg_episode_t *ee, const char **gstr ) return epg_episode_set_genre(ee, genre, gcnt); } +int epg_episode_set_is_bw ( epg_episode_t *e, uint8_t bw ) +{ + if (!e) return 0; + return _epg_object_set_u8(e, &e->is_bw, bw); +} + static void _epg_episode_add_broadcast ( epg_episode_t *episode, epg_broadcast_t *broadcast ) { @@ -1182,6 +1188,8 @@ htsmsg_t *epg_episode_serialize ( epg_episode_t *episode ) htsmsg_add_str(m, "brand", episode->brand->uri); if (episode->season) htsmsg_add_str(m, "season", episode->season->uri); + if (episode->is_bw) + htsmsg_add_u32(m, "is_bw", 1); return m; } @@ -1226,6 +1234,8 @@ epg_episode_t *epg_episode_deserialize ( htsmsg_t *m, int create, int *save ) if ( (eb = epg_brand_find_by_uri(str, 0, NULL)) ) *save |= epg_episode_set_brand(ee, eb); + *save |= epg_episode_set_is_bw(ee, htsmsg_get_u32_or_default(m , "is_bw", 0)); + return ee; } @@ -1461,12 +1471,6 @@ int epg_broadcast_set_is_hd ( epg_broadcast_t *b, uint8_t hd ) return _epg_object_set_u8(b, &b->is_hd, hd); } -int epg_broadcast_set_is_bw ( epg_broadcast_t *b, uint8_t bw ) -{ - if (!b) return 0; - return _epg_object_set_u8(b, &b->is_bw, bw); -} - int epg_broadcast_set_lines ( epg_broadcast_t *b, uint16_t lines ) { if (!b) return 0; @@ -1532,8 +1536,6 @@ htsmsg_t *epg_broadcast_serialize ( epg_broadcast_t *broadcast ) htsmsg_add_u32(m, "is_widescreen", 1); if (broadcast->is_hd) htsmsg_add_u32(m, "is_hd", 1); - if (broadcast->is_bw) - htsmsg_add_u32(m, "is_widescreen", 1); if (broadcast->lines) htsmsg_add_u32(m, "lines", broadcast->lines); if (broadcast->aspect) @@ -1589,8 +1591,6 @@ epg_broadcast_t *epg_broadcast_deserialize (*ebc)->is_widescreen = 1; if (!htsmsg_get_u32(m, "is_hd", &u32)) (*ebc)->is_hd = 1; - if (!htsmsg_get_u32(m , "is_bw", &u32)) - (*ebc)->is_bw = 1; if (!htsmsg_get_u32(m, "lines", &u32)) (*ebc)->lines = u32; if (!htsmsg_get_u32(m, "aspect", &u32)) diff --git a/src/epg.h b/src/epg.h index a973a9f4..5927b60b 100644 --- a/src/epg.h +++ b/src/epg.h @@ -205,7 +205,9 @@ struct epg_episode // Note: do not use epnum directly! use the accessor routine char *image; ///< Episode image + uint8_t is_bw; ///< Is black and white // TODO: certification and rating + // TODO: film/year LIST_ENTRY(epg_episode) blink; ///< Brand link LIST_ENTRY(epg_episode) slink; ///< Season link @@ -246,6 +248,8 @@ int epg_episode_set_genre_str ( epg_episode_t *e, const char **s ) __attribute__((warn_unused_result)); int epg_episode_set_image ( epg_episode_t *e, const char *i ) __attribute__((warn_unused_result)); +int epg_episode_set_is_bw ( epg_episode_t *b, uint8_t bw ) + __attribute__((warn_unused_result)); // Note: this does NOT strdup the text field void epg_episode_get_epnum @@ -293,7 +297,6 @@ struct epg_broadcast /* Some quality info */ uint8_t is_widescreen; ///< Is widescreen uint8_t is_hd; ///< Is HD - uint8_t is_bw; ///< Is black and white uint16_t lines; ///< Lines in image (quality) uint16_t aspect; ///< Aspect ratio (*100) @@ -326,8 +329,6 @@ int epg_broadcast_set_is_widescreen ( epg_broadcast_t *b, uint8_t ws ) __attribute__((warn_unused_result)); int epg_broadcast_set_is_hd ( epg_broadcast_t *b, uint8_t hd ) __attribute__((warn_unused_result)); -int epg_broadcast_set_is_bw ( epg_broadcast_t *b, uint8_t bw ) - __attribute__((warn_unused_result)); int epg_broadcast_set_lines ( epg_broadcast_t *b, uint16_t lines ) __attribute__((warn_unused_result)); int epg_broadcast_set_aspect ( epg_broadcast_t *b, uint16_t aspect ) diff --git a/src/epggrab/pyepg.c b/src/epggrab/pyepg.c index 72760838..a5e71030 100644 --- a/src/epggrab/pyepg.c +++ b/src/epggrab/pyepg.c @@ -26,6 +26,7 @@ #include "spawn.h" #include "epg.h" #include "epggrab/pyepg.h" +#include "epggrab/xmltv.h" #include "channels.h" static epggrab_channel_tree_t _pyepg_channels; @@ -293,7 +294,9 @@ static int _pyepg_parse_episode ( htsmsg_t *data, epggrab_stats_t *stats ) save |= epg_episode_set_genre(episode, genre, genre_cnt); } - /* TODO: extra metadata */ + /* Content */ + if ((htsmsg_get_map(tags, "blackandwhite"))) + save |= epg_episode_set_is_bw(episode, 1); if (save) stats->episodes.modified++; @@ -304,11 +307,12 @@ static int _pyepg_parse_broadcast ( htsmsg_t *data, channel_t *channel, epggrab_stats_t *stats ) { int save = 0; - htsmsg_t *attr;//, *tags; + htsmsg_t *attr, *tags; epg_episode_t *episode; epg_broadcast_t *broadcast; const char *id, *start, *stop; time_t tm_start, tm_stop; + uint32_t u32; if ( data == NULL || channel == NULL ) return 0; @@ -316,6 +320,7 @@ static int _pyepg_parse_broadcast if ((id = htsmsg_get_str(attr, "episode")) == NULL) return 0; if ((start = htsmsg_get_str(attr, "start")) == NULL ) return 0; if ((stop = htsmsg_get_str(attr, "stop")) == NULL ) return 0; + if ((tags = htsmsg_get_map(data, "tags")) == NULL) return 0; /* Find episode */ if ((episode = epg_episode_find_by_uri(id, 1, &save)) == NULL) return 0; @@ -333,8 +338,23 @@ static int _pyepg_parse_broadcast /* Set episode */ save |= epg_broadcast_set_episode(broadcast, episode); - /* TODO: extra metadata */ - + /* Quality */ + u32 = htsmsg_get_map(tags, "hd") ? 1 : 0; + save |= epg_broadcast_set_is_hd(broadcast, u32); + u32 = htsmsg_get_map(tags, "widescreen") ? 1 : 0; + save |= epg_broadcast_set_is_widescreen(broadcast, u32); + // TODO: lines, aspect + + /* Accessibility */ + // Note: reuse XMLTV parse code as this is the same + xmltv_parse_accessibility(broadcast, tags); + + /* New/Repeat */ + u32 = htsmsg_get_map(tags, "new") || htsmsg_get_map(tags, "premiere"); + save |= epg_broadcast_set_is_new(broadcast, u32); + u32 = htsmsg_get_map(tags, "repeat") ? 1 : 0; + save |= epg_broadcast_set_is_repeat(broadcast, u32); + if (save) stats->broadcasts.modified++; return save; diff --git a/src/epggrab/xmltv.c b/src/epggrab/xmltv.c index fa29e02f..2cfb5298 100644 --- a/src/epggrab/xmltv.c +++ b/src/epggrab/xmltv.c @@ -211,7 +211,7 @@ get_episode_info * job */ static int -parse_vid_quality ( epg_broadcast_t *ebc, htsmsg_t *m ) +parse_vid_quality ( epg_broadcast_t *ebc, epg_episode_t *ee, htsmsg_t *m ) { int save = 0; int hd = 0, lines = 0, aspect = 0; @@ -219,7 +219,7 @@ parse_vid_quality ( epg_broadcast_t *ebc, htsmsg_t *m ) if (!ebc || !m) return 0; if ((str = htsmsg_xml_get_cdata_str(m, "colour"))) - save |= epg_broadcast_set_is_bw(ebc, strcmp(str, "no") ? 0 : 1); + save |= epg_episode_set_is_bw(ee, strcmp(str, "no") ? 0 : 1); if ((str = htsmsg_xml_get_cdata_str(m, "quality"))) { if (strstr(str, "HD")) { hd = 1; @@ -259,8 +259,8 @@ parse_vid_quality ( epg_broadcast_t *ebc, htsmsg_t *m ) /* * Parse accessibility data */ -static int -parse_accessibility ( epg_broadcast_t *ebc, htsmsg_t *m ) +int +xmltv_parse_accessibility ( epg_broadcast_t *ebc, htsmsg_t *m ) { int save = 0; htsmsg_t *tag; @@ -328,16 +328,16 @@ _xmltv_parse_programme_tags(channel_t *ch, htsmsg_t *tags, /* Create/Find broadcast */ ebc = epg_broadcast_find_by_time(ch, start, stop, 1, &save2); - if ( ebc != NULL ) { + if ( ebc ) { stats->broadcasts.total++; if (save2) stats->broadcasts.created++; save2 |= epg_broadcast_set_episode(ebc, ee); /* Quality metadata */ - save2 |= parse_vid_quality(ebc, htsmsg_get_map(tags, "video")); + save2 |= parse_vid_quality(ebc, ee, htsmsg_get_map(tags, "video")); /* Accessibility */ - save2 |= parse_accessibility(ebc, tags); + save2 |= xmltv_parse_accessibility(ebc, tags); /* Misc */ if (htsmsg_get_map(tags, "previously-shown")) diff --git a/src/epggrab/xmltv.h b/src/epggrab/xmltv.h index 7a2d1bee..104842a7 100644 --- a/src/epggrab/xmltv.h +++ b/src/epggrab/xmltv.h @@ -25,4 +25,7 @@ void xmltv_init ( epggrab_module_list_t *list ); void xmltv_load ( void ); +// reused by pyepg +int xmltv_parse_accessibility ( epg_broadcast_t *ebc, htsmsg_t *m ); + #endif