]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Improved logic when an event is replaced in EPG 39/head
authorChris <thaelim@gmail.com>
Sun, 11 Sep 2011 05:30:24 +0000 (15:30 +1000)
committerChris <thaelim@gmail.com>
Sun, 11 Sep 2011 05:30:24 +0000 (15:30 +1000)
This is needed to avoid removing DVR entries that are not based
on an AutoRec

src/dvr/dvr.h
src/dvr/dvr_db.c
src/epg.c

index 169886ddd126b414b5452da3875ad25bac06be30..b91a1b90bbd855cd1c91e91725033842ad14b237 100644 (file)
@@ -254,7 +254,7 @@ void dvr_rec_subscribe(dvr_entry_t *de);
 
 void dvr_rec_unsubscribe(dvr_entry_t *de, int stopcode);
 
-void dvr_event_cancelled(event_t *e);
+void dvr_event_replaced(event_t *e, event_t *new_e);
 
 dvr_entry_t *dvr_entry_find_by_id(int id);
 
index 84462f5febad75435ea044a0470f512dcededa43..5e5f4373403c4df0daa67e1fea7774a3ad0b1583 100644 (file)
@@ -631,17 +631,20 @@ dvr_entry_update(dvr_entry_t *de, const char* de_title, int de_start, int de_sto
 }
 
 /**
- * Used to notify the DVR that an event has been removed from the EPG
+ * Used to notify the DVR that an event has been replaced in the EPG
  */
 void 
-dvr_event_cancelled(event_t *e)
+dvr_event_replaced(event_t *e, event_t *new_e)
 {
-  dvr_entry_t *de;
+  dvr_entry_t *de, *ude;
 
   de = dvr_entry_find_by_event(e);
   if (de != NULL) {
-    if (de->de_sched_state == DVR_SCHEDULED)
+    ude = dvr_entry_find_by_event_fuzzy(new_e);
+    if (ude == NULL && de->de_sched_state == DVR_SCHEDULED)
       dvr_entry_cancel(de);
+    else
+      dvr_entry_update(de, new_e->e_title, new_e->e_start, new_e->e_stop);
   }
       
     
index 40be000196fc2177e057571a42661ab24ab65726..e15d7003ea4d3ce28e348f534ade41510d19fc5a 100644 (file)
--- a/src/epg.c
+++ b/src/epg.c
@@ -424,13 +424,13 @@ epg_erase_duplicates(event_t *e, channel_t *ch) {
       if(p->e_dvb_id == dvb_id || epg_event_cmp_overlap(p, e)) {
         tvhlog(LOG_DEBUG, "epg",
                "Removing overlapping event instance %s from EPG", p->e_title);
-        dvr_event_cancelled(p);
+        dvr_event_replaced(p, e);
        epg_remove_event_from_channel(ch, p);
       } else if((p = RB_PREV(p, e_channel_link)) != NULL) {
        if(p->e_dvb_id == dvb_id || epg_event_cmp_overlap(p, e)) {
           tvhlog(LOG_DEBUG, "epg",
                  "Removing overlapping event instance %s from EPG", p->e_title);
-          dvr_event_cancelled(p);
+          dvr_event_replaced(p, e);
          epg_remove_event_from_channel(ch, p);
         }
       }
@@ -440,13 +440,13 @@ epg_erase_duplicates(event_t *e, channel_t *ch) {
       if(n->e_dvb_id == dvb_id || epg_event_cmp_overlap(n, e)) {
         tvhlog(LOG_DEBUG, "epg",
                "Removing overlapping event instance %s from EPG", n->e_title);
-        dvr_event_cancelled(n);
+        dvr_event_replaced(n, e);
        epg_remove_event_from_channel(ch, n);
       } else if((n = RB_NEXT(n, e_channel_link)) != NULL) {
        if(n->e_dvb_id == dvb_id || epg_event_cmp_overlap(n, e)) {
           tvhlog(LOG_DEBUG, "epg",
                  "Removing overlapping event instance %s from EPG", n->e_title);
-          dvr_event_cancelled(n);
+          dvr_event_replaced(n, e);
          epg_remove_event_from_channel(ch, n);
         }   
       }