From ba9edf7287de7f138c06eb609ee6399a18971ad5 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Thu, 31 May 2012 15:58:41 +0100 Subject: [PATCH] Add some initial code to load/save grab module channel mappings. --- src/epggrab.c | 64 +++++++++++++++++++++++++++++++++++++++------ src/epggrab.h | 10 ++++--- src/epggrab/pyepg.c | 54 +++++++++++++++++++++++++++++--------- 3 files changed, 104 insertions(+), 24 deletions(-) diff --git a/src/epggrab.c b/src/epggrab.c index 8762f3cb..b1107b0c 100644 --- a/src/epggrab.c +++ b/src/epggrab.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "htsmsg.h" #include "settings.h" #include "tvheadend.h" @@ -41,6 +42,8 @@ static void _epggrab_set_schedule ( int, epggrab_sched_t* ); */ void epggrab_init ( void ) { + epggrab_module_t *m; + /* Defaults */ epggrab_advanced = 0; epggrab_eit = 1; // on air grab enabled @@ -48,11 +51,14 @@ void epggrab_init ( void ) epggrab_module = NULL; // disabled /* Initialise modules */ - LIST_INSERT_HEAD(&epggrab_modules, eit_init(), glink); + m = eit_init(); + LIST_INSERT_HEAD(&epggrab_modules, m, glink); #if TODO_XMLTV_SUPPORT - LIST_INSERT_HEAD(&epggrab_modules, xmltv_init(), glink); + m = xmltv_init(); + LIST_INSERT_HEAD(&epggrab_modules, m, glink); #endif - LIST_INSERT_HEAD(&epggrab_modules, pyepg_init(), glink); + m = pyepg_init(); + LIST_INSERT_HEAD(&epggrab_modules, m, glink); /* Start thread */ pthread_t tid; @@ -261,8 +267,43 @@ void epggrab_channel_mod ( channel_t *ch ) } } +void epggrab_module_channels_load + ( const char *path, epggrab_channel_tree_t *tree ) +{ + uint32_t chid; + htsmsg_t *m; + htsmsg_field_t *f; + epggrab_channel_t *ec; + channel_t *ch; + + if ((m = hts_settings_load(path))) { + HTSMSG_FOREACH(f, m) { + if ( !htsmsg_get_u32(m, f->hmf_name, &chid) ) { + ch = channel_find_by_identifier(chid); + if (ch) { + ec = calloc(1, sizeof(epggrab_channel_t)); + ec->id = strdup(f->hmf_name); + ec->channel = ch; + assert(RB_INSERT_SORTED(tree, ec, glink, _ch_id_cmp) == NULL); + } + } + } + } +} + +void epggrab_module_channels_save + ( const char *path, epggrab_channel_tree_t *tree ) +{ + epggrab_channel_t *c; + htsmsg_t *m = htsmsg_create_map(); + RB_FOREACH(c, tree, glink) { + if (c->channel) htsmsg_add_u32(m, c->id, c->channel->ch_id); + } + hts_settings_save(m, path); +} + epggrab_channel_t *epggrab_module_channel_create - ( epggrab_channel_tree_t *tree, epggrab_channel_t *iskel ) + ( epggrab_channel_tree_t *tree, epggrab_channel_t *iskel, int *save ) { epggrab_channel_t *egc; static epggrab_channel_t *skel = NULL; @@ -274,6 +315,7 @@ epggrab_channel_t *epggrab_module_channel_create skel->id = strdup(skel->id); skel->name = strdup(skel->name); skel->channel = _channel_find(skel); + if ( skel->channel ) *save |= 1; egc = skel; skel = NULL; } @@ -288,31 +330,37 @@ epggrab_channel_t *epggrab_module_channel_find return RB_FIND(tree, &skel, glink, _ch_id_cmp); } -void epggrab_module_channel_add ( epggrab_channel_tree_t *tree, channel_t *ch ) +int epggrab_module_channel_add ( epggrab_channel_tree_t *tree, channel_t *ch ) { + int save = 0; epggrab_channel_t *egc; RB_FOREACH(egc, tree, glink) { if (_channel_match(egc, ch) ) { + save = 1; egc->channel = ch; break; } } + return save; } -void epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, channel_t *ch ) +int epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, channel_t *ch ) { + int save = 0; epggrab_channel_t *egc; RB_FOREACH(egc, tree, glink) { if (egc->channel == ch) { + save = 1; egc->channel = NULL; break; } } + return save; } -void epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, channel_t *ch ) +int epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, channel_t *ch ) { - epggrab_module_channel_add(tree, ch); + return epggrab_module_channel_add(tree, ch); } /* ************************************************************************** diff --git a/src/epggrab.h b/src/epggrab.h index dbf961b3..a06080fe 100644 --- a/src/epggrab.h +++ b/src/epggrab.h @@ -117,11 +117,13 @@ void epggrab_channel_mod ( struct channel *ch ); /* * Module specific channel handling */ -void epggrab_module_channel_add ( epggrab_channel_tree_t *tree, struct channel *ch ); -void epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, struct channel *ch ); -void epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, struct channel *ch ); +void epggrab_module_channels_load ( const char *path, epggrab_channel_tree_t *tree ); +void epggrab_module_channels_save ( const char *path, epggrab_channel_tree_t *tree ); +int epggrab_module_channel_add ( epggrab_channel_tree_t *tree, struct channel *ch ); +int epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, struct channel *ch ); +int epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, struct channel *ch ); -epggrab_channel_t *epggrab_module_channel_create ( epggrab_channel_tree_t *tree, epggrab_channel_t *ch ); +epggrab_channel_t *epggrab_module_channel_create ( epggrab_channel_tree_t *tree, epggrab_channel_t *ch, int *save ); epggrab_channel_t *epggrab_module_channel_find ( epggrab_channel_tree_t *tree, const char *id ); #endif /* __EPGGRAB_H__ */ diff --git a/src/epggrab/pyepg.c b/src/epggrab/pyepg.c index 6c52a911..538b4a26 100644 --- a/src/epggrab/pyepg.c +++ b/src/epggrab/pyepg.c @@ -28,16 +28,31 @@ #include "epggrab/pyepg.h" #include "channels.h" +epggrab_channel_tree_t _pyepg_channels; + +/* ************************************************************************** + * Config/Load save + * *************************************************************************/ + +static void _pyepg_load ( void ) +{ + epggrab_module_channels_load("epggrab/pyepg/channels", &_pyepg_channels); +} + +static void _pyepg_save ( void ) +{ + epggrab_module_channels_save("epggrab/pyepg/channels", &_pyepg_channels); +} + /* ************************************************************************** * Channels * *************************************************************************/ -epggrab_channel_tree_t _pyepg_channels; -static channel_t *_pyepg_channel_create ( epggrab_channel_t *skel ) +static channel_t *_pyepg_channel_create ( epggrab_channel_t *skel, int *save ) { epggrab_channel_t *ch - = epggrab_module_channel_create(&_pyepg_channels, skel); + = epggrab_module_channel_create(&_pyepg_channels, skel, save); if (ch) return ch->channel; return NULL; } @@ -52,17 +67,20 @@ static channel_t *_pyepg_channel_find ( const char *id ) static void _pyepg_channel_add ( channel_t *ch ) { - epggrab_module_channel_add(&_pyepg_channels, ch); + if ( epggrab_module_channel_add(&_pyepg_channels, ch) ) + _pyepg_save(); } static void _pyepg_channel_rem ( channel_t *ch ) { - epggrab_module_channel_rem(&_pyepg_channels, ch); + if ( epggrab_module_channel_rem(&_pyepg_channels, ch) ) + _pyepg_save(); } static void _pyepg_channel_mod ( channel_t *ch ) { - epggrab_module_channel_mod(&_pyepg_channels, ch); + if ( epggrab_module_channel_mod(&_pyepg_channels, ch) ) + _pyepg_save(); } /* ************************************************************************** @@ -83,7 +101,7 @@ static int _pyepg_parse_time ( const char *str, time_t *out ) static int _pyepg_parse_channel ( htsmsg_t *data, epggrab_stats_t *stats ) { - int save = 0; + int save = 0, save2 = 0; htsmsg_t *attr, *tags; const char *icon; channel_t *ch; @@ -97,14 +115,23 @@ static int _pyepg_parse_channel ( htsmsg_t *data, epggrab_stats_t *stats ) skel.name = (char*)htsmsg_xml_get_cdata_str(tags, "name"); icon = htsmsg_xml_get_cdata_str(tags, "image"); - ch = _pyepg_channel_create(&skel); + ch = _pyepg_channel_create(&skel, &save2); + stats->channels.total++; + if (save2) { + stats->channels.created++; + save |= 1; + } /* Update values */ if (ch) { - // TODO: set the name - //if (skel.name) save |= channel_rename(ch, skel.name); + if (skel.name) { + if(!ch->ch_name || strcmp(ch->ch_name, skel.name)) { + save |= channel_rename(ch, skel.name); + } + } if (icon) channel_set_icon(ch, icon); } + if (save) stats->channels.modified++; return save; } @@ -351,7 +378,7 @@ static int _pyepg_parse_schedule ( htsmsg_t *data, epggrab_stats_t *stats ) static int _pyepg_parse_epg ( htsmsg_t *data, epggrab_stats_t *stats ) { - int save = 0; + int save = 0, chsave = 0; htsmsg_t *tags; htsmsg_field_t *f; @@ -359,7 +386,7 @@ static int _pyepg_parse_epg ( htsmsg_t *data, epggrab_stats_t *stats ) HTSMSG_FOREACH(f, tags) { if (strcmp(f->hmf_name, "channel") == 0 ) { - save |= _pyepg_parse_channel(htsmsg_get_map_by_field(f), stats); + chsave |= _pyepg_parse_channel(htsmsg_get_map_by_field(f), stats); } else if (strcmp(f->hmf_name, "brand") == 0 ) { save |= _pyepg_parse_brand(htsmsg_get_map_by_field(f), stats); } else if (strcmp(f->hmf_name, "series") == 0 ) { @@ -370,6 +397,8 @@ static int _pyepg_parse_epg ( htsmsg_t *data, epggrab_stats_t *stats ) save |= _pyepg_parse_schedule(htsmsg_get_map_by_field(f), stats); } } + save |= chsave; + if (chsave) _pyepg_save(); return save; } @@ -460,6 +489,7 @@ epggrab_module_t* pyepg_init ( void ) pyepg_module.ch_add = _pyepg_channel_add; pyepg_module.ch_rem = _pyepg_channel_rem; pyepg_module.ch_mod = _pyepg_channel_mod; + _pyepg_load(); return &pyepg_module; }