]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: Implement max schedules limit for autorrecordings
authortraxxxto <traxxxto@gmail.com>
Mon, 26 Oct 2015 09:16:55 +0000 (10:16 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 26 Oct 2015 11:09:05 +0000 (12:09 +0100)
src/dvr/dvr.h
src/dvr/dvr_autorec.c
src/dvr/dvr_db.c
src/webui/static/app/dvr.js

index 7e3a58075f90a443830965c2d04827b51d396a1e..90e46bc9b5a629d9d0e0a162c2a399f59b5158f1 100644 (file)
@@ -307,6 +307,7 @@ typedef struct dvr_autorec_entry {
   uint32_t dae_retention;
   uint32_t dae_removal;
   uint32_t dae_max_count;
+  uint32_t dae_max_sched_count;
 
   time_t dae_start_extra;
   time_t dae_stop_extra;
index 2c9ef6c25716a74dfc2c47b6bd8c7dcf4f933abf..6bc54b3625e5f260a7c497cc3e0dba1e690dda0b 100644 (file)
@@ -1112,6 +1112,13 @@ const idclass_t dvr_autorec_entry_class = {
       .off      = offsetof(dvr_autorec_entry_t, dae_max_count),
       .opts     = PO_HIDDEN,
     },
+    {
+      .type     = PT_U32,
+      .id       = "maxsched",
+      .name     = N_("Maximum schedules limit (0=unlimited)"),
+      .off      = offsetof(dvr_autorec_entry_t, dae_max_sched_count),
+      .opts     = PO_HIDDEN,
+    },
     {
       .type     = PT_STR,
       .id       = "config_name",
index f17c24d88c5f318e1fa63eebacb9da964dad926b..809bebaf114f0a99669a9625754f1d3007ca065e 100644 (file)
@@ -370,8 +370,14 @@ dvr_entry_nostate(dvr_entry_t *de, int error_code)
 static void
 dvr_entry_missed_time(dvr_entry_t *de, int error_code)
 {
+  dvr_autorec_entry_t *dae = de->de_autorec;
+
   dvr_entry_set_state(de, DVR_MISSED_TIME, DVR_RS_PENDING, error_code);
   dvr_entry_retention_timer(de);
+
+  // Trigger autorec update in case of max schedules limit
+  if (dae && dae->dae_max_sched_count > 0)
+    dvr_autorec_changed(dae, 0);
 }
 
 /*
@@ -1064,15 +1070,30 @@ dvr_entry_create_by_autorec(int enabled, epg_broadcast_t *e, dvr_autorec_entry_t
 {
   char buf[512];
   char ubuf[UUID_HEX_SIZE];
+  dvr_entry_t *de;
+  uint32_t count = 0;
 
   /* Identical duplicate detection
      NOTE: Semantic duplicate detection is deferred to the start time of recording and then done using _dvr_duplicate_event by dvr_timer_start_recording. */
-  dvr_entry_t* de;
   LIST_FOREACH(de, &dvrentries, de_global_link) {
     if (de->de_bcast == e || (de->de_bcast && de->de_bcast->episode == e->episode))
       return;
   }
 
+  /* Handle max schedules limit for autorrecord */
+  if (dae->dae_max_sched_count > 0){
+    count = 0;
+    LIST_FOREACH(de, &dae->dae_spawns, de_autorec_link)
+      if ((de->de_sched_state == DVR_SCHEDULED) ||
+          (de->de_sched_state == DVR_RECORDING)) count++;
+
+    if (count >= dae->dae_max_sched_count) {
+      tvhlog(LOG_DEBUG, "dvr", "Autorecord \"%s\": Not scheduling \"%s\" because of autorecord max schedules limit reached",
+             dae->dae_name, lang_str_get(e->episode->title, NULL));
+      return;
+    }
+  }
+
   snprintf(buf, sizeof(buf), _("Auto recording%s%s"),
            dae->dae_comment ? ": " : "",
            dae->dae_comment ?: "");
@@ -1499,6 +1520,7 @@ void
 dvr_stop_recording(dvr_entry_t *de, int stopcode, int saveconf, int clone)
 {
   dvr_rs_state_t rec_state = de->de_rec_state;
+  dvr_autorec_entry_t *dae = de->de_autorec;
 
   if (!clone)
     dvr_rec_unsubscribe(de);
@@ -1523,6 +1545,10 @@ dvr_stop_recording(dvr_entry_t *de, int stopcode, int saveconf, int clone)
     dvr_entry_save(de);
 
   dvr_entry_retention_timer(de);
+
+  // Trigger autorecord update in case of schedules limit
+  if (dae && dae->dae_max_sched_count > 0)
+    dvr_autorec_changed(de->de_autorec, 0);
 }
 
 
@@ -2962,6 +2988,7 @@ void
 dvr_entry_cancel_delete(dvr_entry_t *de, int rerecord)
 {
   dvr_entry_t *parent = de->de_parent;
+  dvr_autorec_entry_t *dae = de->de_autorec;
 
   switch(de->de_sched_state) {
   case DVR_RECORDING:
@@ -2988,6 +3015,11 @@ dvr_entry_cancel_delete(dvr_entry_t *de, int rerecord)
     else
       dvr_entry_rerecord(parent);
   }
+
+  // Trigger autorec update in case of max sched count limit
+  if (dae && dae->dae_max_sched_count > 0)
+    dvr_autorec_changed(dae, 0);
+
 }
 
 /**
index 3bc976758717a5fd729c2e66d5e79fe6cd74c762..67757a44bdd208b45e0ad3f387990b9ec42c6f90 100644 (file)
@@ -513,6 +513,7 @@ tvheadend.autorec_editor = function(panel, index) {
             retention:    { width: 80 },
             removal:      { width: 80 },
             maxcount:     { width: 80 },
+            maxsched:     { width: 80 },
             config_name:  { width: 120 },
             owner:        { width: 100 },
             creator:      { width: 200 },
@@ -523,7 +524,7 @@ tvheadend.autorec_editor = function(panel, index) {
             params: {
                list: 'enabled,name,directory,title,fulltext,channel,tag,content_type,minduration,' +
                      'maxduration,weekdays,start,start_window,pri,dedup,retention,removal,' +
-                     'maxcount,config_name,comment'
+                     'maxcount,maxsched,config_name,comment'
             },
             create: { }
         },