]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add some initial code to load/save grab module channel mappings.
authorAdam Sutton <dev@adamsutton.me.uk>
Thu, 31 May 2012 14:58:41 +0000 (15:58 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Thu, 31 May 2012 14:58:41 +0000 (15:58 +0100)
src/epggrab.c
src/epggrab.h
src/epggrab/pyepg.c

index 8762f3cbe571b0b8bbc60466af5b3fbfa3e82163..b1107b0c17cca22e1b8b6315eecbaceb410029f2 100644 (file)
@@ -1,6 +1,7 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 #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);
 }
 
 /* **************************************************************************
index dbf961b36b7861237bde511b4135a9779f657d01..a06080fecb25fd5853a639de09067cd0c371eb6d 100644 (file)
@@ -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__ */
index 6c52a911e593773dbc64fc14106c8fb7c157aac2..538b4a2696da5f844d50ac5ac723b6d9dfd12ffd 100644 (file)
 #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;
 }