]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Issue #1459 - fix removal of all autorec recordings on startup
authorAdam Sutton <dev@adamsutton.me.uk>
Thu, 27 Dec 2012 00:48:14 +0000 (00:48 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Thu, 27 Dec 2012 00:48:14 +0000 (00:48 +0000)
There were 2 issues here:
- recent changes meant that recordings were purged on every startup
- long standing issue meant complete recordings were removed on
  removal of an autorec rule (which I don't think was intended).

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

index 7046362b13a609341cdc20d575af8143fa387754..9cbfacf6ab512e07457c03169ba026bc93a31e93 100644 (file)
@@ -247,6 +247,8 @@ void dvr_config_delete(const char *name);
 
 void dvr_entry_notify(dvr_entry_t *de);
 
+void dvr_entry_save(dvr_entry_t *de);
+
 const char *dvr_entry_status(dvr_entry_t *de);
 
 const char *dvr_entry_schedstatus(dvr_entry_t *de);
index defb0e392f5f20ead1ccb3f8d5dd5f0fc88b62c8..0b6a5c915d208c1622c6522e89907cb46529ea6e 100644 (file)
@@ -42,10 +42,10 @@ static int dvr_autorec_in_init = 0;
 
 struct dvr_autorec_entry_queue autorec_entries;
 
-static void dvr_autorec_changed(dvr_autorec_entry_t *dae);
+static void dvr_autorec_changed(dvr_autorec_entry_t *dae, int purge);
 
 /**
- *
+ * Unlink - and remove any unstarted
  */
 static void
 dvr_autorec_purge_spawns(dvr_autorec_entry_t *dae)
@@ -55,7 +55,10 @@ dvr_autorec_purge_spawns(dvr_autorec_entry_t *dae)
   while((de = LIST_FIRST(&dae->dae_spawns)) != NULL) {
     LIST_REMOVE(de, de_autorec_link);
     de->de_autorec = NULL;
-    dvr_entry_cancel(de);
+    if (de->de_sched_state == DVR_SCHEDULED)
+      dvr_entry_cancel(de);
+    else
+      dvr_entry_save(de);
   }
 }
 
@@ -425,7 +428,7 @@ autorec_record_update(void *opaque, const char *id, htsmsg_t *values,
       dae->dae_serieslink->getref(dae->dae_serieslink);
   }
   if (!dvr_autorec_in_init)
-    dvr_autorec_changed(dae);
+    dvr_autorec_changed(dae, 1);
 
   return autorec_record_build(dae);
 }
@@ -478,7 +481,7 @@ dvr_autorec_update(void)
 {
   dvr_autorec_entry_t *dae;
   TAILQ_FOREACH(dae, &autorec_entries, dae_link) {
-    dvr_autorec_changed(dae);
+    dvr_autorec_changed(dae, 0);
   }
 }
 
@@ -537,7 +540,7 @@ _dvr_autorec_add(const char *config_name,
 
   notify_reload("autorec");
 
-  dvr_autorec_changed(dae);
+  dvr_autorec_changed(dae, 1);
 }
 
 void
@@ -606,12 +609,13 @@ void dvr_autorec_check_serieslink(epg_serieslink_t *s)
  *
  */
 static void
-dvr_autorec_changed(dvr_autorec_entry_t *dae)
+dvr_autorec_changed(dvr_autorec_entry_t *dae, int purge)
 {
   channel_t *ch;
   epg_broadcast_t *e;
 
-  dvr_autorec_purge_spawns(dae);
+  if (purge)
+    dvr_autorec_purge_spawns(dae);
 
   RB_FOREACH(ch, &channel_name_tree, ch_name_link) {
     RB_FOREACH(e, &ch->ch_epg_schedule, sched_link) {
index 70bdabcc162044096143d4a27243a10417512079..627ef426dfe443b115d84095e5e885b2d92055cd 100644 (file)
@@ -37,8 +37,6 @@ int dvr_iov_max;
 struct dvr_config_list dvrconfigs;
 struct dvr_entry_list dvrentries;
 
-static void dvr_entry_save(dvr_entry_t *de);
-
 static void dvr_timer_expire(void *aux);
 static void dvr_timer_start_recording(void *aux);
 
@@ -573,7 +571,7 @@ dvr_db_load(void)
 /**
  *
  */
-static void
+void
 dvr_entry_save(dvr_entry_t *de)
 {
   htsmsg_t *m = htsmsg_create_map();