]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Try to avoid rescheduling DVR entries
authorAndreas Öman <andreas@lonelycoder.com>
Tue, 30 Aug 2011 21:29:29 +0000 (23:29 +0200)
committerAndreas Öman <andreas@lonelycoder.com>
Tue, 30 Aug 2011 21:29:29 +0000 (23:29 +0200)
Patch by  Chris Dekter

Fixes #179

src/dvr/dvr.h
src/dvr/dvr_autorec.c
src/dvr/dvr_db.c

index e8ebee9e8d9062aaf8f5b1d53d7fd02a3c71eed7..d2d6d476d69f815ea91357a66c1cd1407c344cc2 100644 (file)
@@ -258,6 +258,8 @@ dvr_entry_t *dvr_entry_find_by_id(int id);
 
 dvr_entry_t *dvr_entry_find_by_event(event_t *e);
 
+dvr_entry_t *dvr_entry_find_by_event_fuzzy(event_t *e);
+
 off_t dvr_get_filesize(dvr_entry_t *de);
 
 dvr_entry_t *dvr_entry_cancel(dvr_entry_t *de);
index bd3e148bc21b77b3abdd83dc470c5da936121449..60829d88e311a16fc4c0a87eb30d3aac1b80371d 100644 (file)
@@ -479,10 +479,17 @@ void
 dvr_autorec_check_event(event_t *e)
 {
   dvr_autorec_entry_t *dae;
+  dvr_entry_t *existingde;
 
   TAILQ_FOREACH(dae, &autorec_entries, dae_link)
-    if(autorec_cmp(dae, e))
-      dvr_entry_create_by_autorec(e, dae);
+    if(autorec_cmp(dae, e)) {
+      existingde = dvr_entry_find_by_event_fuzzy(e);
+      if (existingde != NULL) {
+        tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->e_title);
+        dvr_entry_update(existingde, e->e_title, e->e_start, e->e_stop);
+      } else
+        dvr_entry_create_by_autorec(e, dae);
+    }
 }
 
 /**
index efbc6c178a4ffd387c985e42723862c924fc2d2a..6a31b2d42037db37d5dc260ed7038f3fccff8057 100644 (file)
@@ -625,7 +625,6 @@ dvr_entry_update(dvr_entry_t *de, const char* de_title, int de_start, int de_sto
   htsp_dvr_entry_update(de);
   dvr_entry_notify(de);
 
-
   tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\": Updated Timer", de->de_title, de->de_channel->ch_name);
 
   return de;
@@ -721,6 +720,23 @@ dvr_entry_find_by_event(event_t *e)
   return NULL;
 }
 
+/**
+ * Find event with same title starting and ending around same time
+ * on same channel
+ */
+dvr_entry_t *
+dvr_entry_find_by_event_fuzzy(event_t *e)
+{
+  dvr_entry_t *de;
+
+  LIST_FOREACH(de, &e->e_channel->ch_dvrs, de_channel_link)
+    if(strcmp(de->de_title, e->e_title) == 0) {
+        if ((abs(de->de_start - e->e_start) < 600) && (abs(de->de_stop - e->e_stop) < 600))
+           return de;
+    }
+  return NULL;
+}
+
 /**
  *
  */