]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
epggrab: allow updating channel name/number/icon Allow epg grabber to update channel...
authorBen Fennema <fennema@google.com>
Sat, 14 Mar 2015 18:19:39 +0000 (11:19 -0700)
committerJaroslav Kysela <perex@perex.cz>
Sun, 22 Mar 2015 14:51:25 +0000 (15:51 +0100)
src/channels.c
src/channels.h
src/epggrab.h
src/epggrab/channel.c
src/epggrab/module.c
src/epggrab/module/opentv.c
src/epggrab/module/pyepg.c

index 615046a2cf1d5b31ef77550aace5dea398247454..4a8fc3faf01d29b74ae9591fddc01b7f58a45f26 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  tvheadend, channel functions
- *  Copyright (C) 2007 Andreas Öman
+ *  Copyright (C) 2007 Andreas Öman
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -587,6 +587,19 @@ channel_get_name ( channel_t *ch )
   return blank;
 }
 
+int
+channel_set_name ( channel_t *ch, const char *name )
+{
+  int save = 0;
+  if (!ch || !name) return 0;
+  if (!ch->ch_name || strcmp(ch->ch_name, name) ) {
+    if (ch->ch_name) free(ch->ch_name);
+    ch->ch_name = strdup(name);
+    save = 1;
+  }
+  return save;
+}
+
 int64_t
 channel_get_number ( channel_t *ch )
 {
@@ -611,6 +624,19 @@ channel_get_number ( channel_t *ch )
   return 0;
 }
 
+int
+channel_set_number ( channel_t *ch, uint32_t major, uint32_t minor )
+{
+  int save = 0;
+  int64_t chnum = (uint64_t)major * CHANNEL_SPLIT + (uint64_t)minor;
+  if (!ch || !chnum) return 0;
+  if (!ch->ch_number || ch->ch_number != chnum) {
+    ch->ch_number = chnum;
+    save = 1;
+  }
+  return save;
+}
+
 static int
 check_file( const char *url )
 {
@@ -738,6 +764,18 @@ channel_get_icon ( channel_t *ch )
   return buf;
 }
 
+int channel_set_icon ( channel_t *ch, const char *icon )
+{
+  int save = 0;
+  if (!ch || !icon) return 0;
+  if (!ch->ch_icon || strcmp(ch->ch_icon, icon) ) {
+    if (ch->ch_icon) free(ch->ch_icon);
+    ch->ch_icon = strdup(icon);
+    save = 1;
+  }
+  return save;
+}
+
 /* **************************************************************************
  * Creation/Deletion
  * *************************************************************************/
index 0fcaf9b9800cc7717a2bca3655edb50806f6bdde..92f51eab404151145a86484183a9d350d8eefe87 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  tvheadend, channel functions
- *  Copyright (C) 2007 Andreas Öman
+ *  Copyright (C) 2007 Andreas Öman
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -190,7 +190,7 @@ int channel_tag_access(channel_tag_t *ct, struct access *a, int disabled);
 void channel_save(channel_t *ch);
 
 const char *channel_get_name ( channel_t *ch );
-int channel_set_name ( channel_t *ch, const char *s );
+int channel_set_name ( channel_t *ch, const char *name );
 
 #define CHANNEL_SPLIT 1000000
 
@@ -198,6 +198,7 @@ static inline uint32_t channel_get_major ( int64_t chnum ) { return chnum / CHAN
 static inline uint32_t channel_get_minor ( int64_t chnum ) { return chnum % CHANNEL_SPLIT; }
 
 int64_t channel_get_number ( channel_t *ch );
+int channel_set_number ( channel_t *ch, uint32_t major, uint32_t minor );
 
 const char *channel_get_icon ( channel_t *ch );
 int channel_set_icon ( channel_t *ch, const char *icon );
index 3617ba19e2b42f43d008f527770381a73db531ee..a85d9b226698eb52cbd4c0a30353f685eadb0379 100644 (file)
@@ -83,8 +83,9 @@ typedef struct epggrab_channel
 
   char                      *name;    ///< Channel name
   char                      *icon;    ///< Channel icon
-  int                       number;   ///< Channel number
-  
+  int                       major;    ///< Channel major number
+  int                       minor;    ///< Channel minor number
+
   LIST_HEAD(,epggrab_channel_link) channels; ///< Mapped channels
 } epggrab_channel_t;
 
@@ -107,7 +108,7 @@ htsmsg_t*         epggrab_channel_list      ( int ota );
  */
 int epggrab_channel_set_name     ( epggrab_channel_t *ch, const char *name );
 int epggrab_channel_set_icon     ( epggrab_channel_t *ch, const char *icon );
-int epggrab_channel_set_number   ( epggrab_channel_t *ch, int number );
+int epggrab_channel_set_number   ( epggrab_channel_t *ch, int major, int minor );
 
 /*
  * Updated/link
index 237967d71e70e9af441e88a67662aae64147fb62..afc23c047a1c3a6ff843c97c709477ef57f09687 100644 (file)
@@ -59,6 +59,7 @@ epggrab_channel_link_delete
 int
 epggrab_channel_link ( epggrab_channel_t *ec, channel_t *ch )
 {
+  int save = 0;
   epggrab_channel_link_t *ecl;
 
   /* No change */
@@ -80,14 +81,14 @@ epggrab_channel_link ( epggrab_channel_t *ec, channel_t *ch )
   ecl->ecl_epggrab = ec;
   LIST_INSERT_HEAD(&ec->channels, ecl, ecl_epg_link);
   LIST_INSERT_HEAD(&ch->ch_epggrab, ecl, ecl_chn_link);
-#if TODO_CHAN_UPDATE
   if (ec->name && epggrab_channel_rename)
-    channel_rename(ch, ec->name);
-  if (ec->number>0 && epggrab_channel_renumber)
-    channel_set_number(ch, ec->number);
+    save |= channel_set_name(ch, ec->name);
+  if ((ec->major > 0 || ec->minor > 0) && epggrab_channel_renumber)
+    save |= channel_set_number(ch, ec->major, ec->minor);
   if (ec->icon && epggrab_channel_reicon)
-    channel_set_icon(ch, ec->icon);
-#endif
+    save |= channel_set_icon(ch, ec->icon);
+  if (save)
+    channel_save(ch);
 
   /* Save */
   if (ec->mod->ch_save) ec->mod->ch_save(ec->mod, ec);
@@ -111,13 +112,13 @@ int epggrab_channel_set_name ( epggrab_channel_t *ec, const char *name )
   if (!ec->name || strcmp(ec->name, name)) {
     if (ec->name) free(ec->name);
     ec->name = strdup(name);
-#if TODO_CHAN_UPDATE
     if (epggrab_channel_rename) {
       epggrab_channel_link_t *ecl;
-      LIST_FOREACH(ecl, &ec->channels, link)
-        channel_rename(ecl->channel, name);
+      LIST_FOREACH(ecl, &ec->channels, ecl_epg_link) {
+        if (channel_set_name(ecl->ecl_channel, name))
+          channel_save(ecl->ecl_channel);
+      }
     }
-#endif
     save = 1;
   }
   return save;
@@ -131,32 +132,33 @@ int epggrab_channel_set_icon ( epggrab_channel_t *ec, const char *icon )
   if (!ec->icon || strcmp(ec->icon, icon) ) {
     if (ec->icon) free(ec->icon);
     ec->icon = strdup(icon);
-#if TODO_CHAN_UPDATE
     if (epggrab_channel_reicon) {
       epggrab_channel_link_t *ecl;
-      LIST_FOREACH(ecl, &ec->channels, link)
-        channel_set_icon(ecl->channel, icon);
+      LIST_FOREACH(ecl, &ec->channels, ecl_epg_link) {
+        if (channel_set_icon(ecl->ecl_channel, icon))
+          channel_save(ecl->ecl_channel);
+      }
     }
-#endif
     save = 1;
   }
   return save;
 }
 
 /* Set channel number */
-int epggrab_channel_set_number ( epggrab_channel_t *ec, int number )
+int epggrab_channel_set_number ( epggrab_channel_t *ec, int major, int minor )
 {
   int save = 0;
-  if (!ec || (number <= 0)) return 0;
-  if (ec->number != number) {
-    ec->number = number;
-#if TODO_CHAN_UPDATE
+  if (!ec || (major <= 0 && minor <= 0)) return 0;
+  if (ec->major != major || ec->minor != minor) {
+    ec->major = major;
+    ec->minor = minor;
     if (epggrab_channel_renumber) {
       epggrab_channel_link_t *ecl;
-      LIST_FOREACH(ecl, &ec->channels, link)
-        channel_set_number(ecl->channel, number);
+      LIST_FOREACH(ecl, &ec->channels, ecl_epg_link) {
+        if (channel_set_number(ecl->ecl_channel, major, minor))
+          channel_save(ecl->ecl_channel);
+      }
     }
-#endif
     save = 1;
   }
   return save;
index e039423987dc0fcbc603f5a54d4f7635a774aa2b..ac739ed9fee511bbc793413fa4014134b4a91fcd 100644 (file)
@@ -163,8 +163,10 @@ void epggrab_module_ch_save ( void *_m, epggrab_channel_t *ch )
     htsmsg_add_str(a, NULL, channel_get_uuid(ecl->ecl_channel));
   }
   if (a) htsmsg_add_msg(m, "channels", a);
-  if (ch->number)
-    htsmsg_add_u32(m, "number", ch->number);
+  if (ch->major)
+    htsmsg_add_u32(m, "major", ch->major);
+  if (ch->minor)
+    htsmsg_add_u32(m, "major", ch->minor);
 
   hts_settings_save(m, "epggrab/%s/channels/%s", mod->id, ch->id);
   htsmsg_destroy(m);
@@ -208,8 +210,10 @@ static void _epggrab_module_channel_load
     egc->name = strdup(str);
   if ((str = htsmsg_get_str(m, "icon")))
     egc->icon = strdup(str);
-  if(!htsmsg_get_u32(m, "number", &u32))
-    egc->number = u32;
+  if(!htsmsg_get_u32(m, "major", &u32))
+    egc->major = u32;
+  if(!htsmsg_get_u32(m, "minor", &u32))
+    egc->minor = u32;
   if ((a = htsmsg_get_list(m, "channels"))) {
     HTSMSG_FOREACH(f, a) {
       if ((str = htsmsg_field_get_str(f))) {
index c0fd28a8290c0566c4d3c146d38dd85e2e2f43cb..24ded208c8dc4d322f4e3d1e407feeeb268bd8d1 100644 (file)
@@ -498,7 +498,7 @@ skip_chnum:
       
       if (!ecl)
         epggrab_channel_link(ec, ch);
-      save |= epggrab_channel_set_number(ec, cnum);
+      save |= epggrab_channel_set_number(ec, cnum, 0);
     }
     i += 9;
   }
index 0aeb3902b11f330342f68d60c13d28ab902cf866..b94dd11c752089e219e396d602b18bd5735700ef 100644 (file)
@@ -94,7 +94,7 @@ static int _pyepg_parse_channel
   if ((str = htsmsg_xml_get_cdata_str(tags, "image")))
     save |= epggrab_channel_set_icon(ch, str);
   if ((!htsmsg_xml_get_cdata_u32(tags, "number", &u32)))
-    save |= epggrab_channel_set_number(ch, u32);
+    save |= epggrab_channel_set_number(ch, u32, 0);
   
   /* Update */
   if (save) {