]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add support for setting default extra times to add before and after a recording....
authorAndreas Öman <andreas@lonelycoder.com>
Wed, 19 Aug 2009 19:44:33 +0000 (19:44 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Wed, 19 Aug 2009 19:44:33 +0000 (19:44 +0000)
debian/changelog
src/dvr/dvr.h
src/dvr/dvr_db.c
src/dvr/dvr_rec.c
src/webui/extjs.c
src/webui/static/app/dvr.js

index 7737bec818273d3455ab3c1c1fa7e54e3df784d3..24b27ab280b04fc2afb5f0e1c77a2634cc2990a8 100644 (file)
@@ -8,7 +8,11 @@ hts-tvheadend (2.5) hts; urgency=low
 
   * The HTSP service is now announced via AVAHI (mDNS service discovery)
 
-  * Support for IPTV has been added.
+  * Support for IPTV has been added. Only RAW TS in UDP is supported 
+    at the moment.
+
+  * Add support for setting default extra times to add before and after
+    a recording. Useful if your TV shows never start on time.
 
 hts-tvheadend (2.4) hts; urgency=low
 
index de46f301cc08164b0ab8781cce82b5fbb9a84319..ba6e60c2326ae9da9cd348ea7b171baec4bbd618 100644 (file)
@@ -30,6 +30,8 @@ extern char *dvr_file_postfix;
 extern uint32_t dvr_retention_days;
 extern int dvr_flags;
 extern char *dvr_postproc;
+extern int dvr_extra_time_pre;
+extern int dvr_extra_time_post;
 
 #define DVR_DIR_PER_DAY      0x1
 #define DVR_DIR_PER_CHANNEL  0x2
@@ -75,6 +77,9 @@ typedef struct dvr_entry {
   time_t de_start;
   time_t de_stop;
 
+  time_t de_start_extra;
+  time_t de_stop_extra;
+
   char *de_creator;
   char *de_filename;   /* Initially null if no filename has been
                          generated yet */
@@ -155,6 +160,10 @@ void dvr_retention_set(int days);
 
 void dvr_flags_set(int flags);
 
+void dvr_extra_time_pre_set(int d);
+
+void dvr_extra_time_post_set(int d);
+
 /**
  * Query interface
  */
index 808b9ef06014ffa88c84651c304e6a24cf1a83ee..0bd7fb87bfd9a5c0c5c1091b67acfbba1cd16b22 100644 (file)
@@ -33,6 +33,8 @@ char *dvr_format;
 char *dvr_file_postfix;
 uint32_t dvr_retention_days;
 int dvr_flags;
+int dvr_extra_time_pre;
+int dvr_extra_time_post;
 char *dvr_postproc;
 
 static int de_tally;
@@ -112,7 +114,7 @@ dvr_entry_link(dvr_entry_t *de)
 
   time(&now);
 
-  preamble = de->de_start - 30;
+  preamble = de->de_start - (60 * de->de_start_extra) - 30;
 
   if(now >= de->de_stop || de->de_dont_reschedule) {
     de->de_sched_state = DVR_COMPLETED;
@@ -137,6 +139,7 @@ dvr_entry_create_by_event(event_t *e, const char *creator)
   dvr_entry_t *de;
   char tbuf[30];
   struct tm tm;
+  time_t t;
 
   if(e->e_channel == NULL || e->e_title == NULL)
     return NULL;
@@ -153,14 +156,16 @@ dvr_entry_create_by_event(event_t *e, const char *creator)
 
   de->de_start   = e->e_start;
   de->de_stop    = e->e_stop;
-
+  de->de_start_extra = dvr_extra_time_pre;
+  de->de_stop_extra  = dvr_extra_time_post;
   de->de_creator = strdup(creator);
   de->de_title   = strdup(e->e_title);
   de->de_desc    = e->e_desc  ? strdup(e->e_desc)  : NULL;
 
   dvr_entry_link(de);
 
-  localtime_r(&de->de_start, &tm);
+  t = de->de_start - de->de_start_extra;
+  localtime_r(&t, &tm);
   strftime(tbuf, sizeof(tbuf), "%c", &tm);
 
   tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\" starting at %s, "
@@ -226,6 +231,7 @@ dvr_db_load_one(htsmsg_t *c, int id)
   const char *s, *title, *creator;
   channel_t *ch;
   uint32_t start, stop;
+  int d;
 
   if(htsmsg_get_u32(c, "start", &start))
     return;
@@ -256,6 +262,18 @@ dvr_db_load_one(htsmsg_t *c, int id)
   de->de_creator = strdup(creator);
   de->de_title   = strdup(title);
   
+
+  
+  if(htsmsg_get_s32(c, "start_extra", &d))
+    de->de_start_extra = dvr_extra_time_pre;
+  else
+    de->de_start_extra = d;
+
+  if(htsmsg_get_s32(c, "stop_extra", &d))
+    de->de_stop_extra = dvr_extra_time_post;
+  else
+    de->de_stop_extra = d;
+
   tvh_str_set(&de->de_desc,     htsmsg_get_str(c, "description"));
   tvh_str_set(&de->de_filename, htsmsg_get_str(c, "filename"));
   tvh_str_set(&de->de_error,    htsmsg_get_str(c, "error"));
@@ -299,6 +317,9 @@ dvr_entry_save(dvr_entry_t *de)
   htsmsg_add_str(m, "channel", de->de_channel->ch_name);
   htsmsg_add_u32(m, "start", de->de_start);
   htsmsg_add_u32(m, "stop", de->de_stop);
+  htsmsg_add_s32(m, "start_extra", de->de_start_extra);
+  htsmsg_add_s32(m, "stop_extra", de->de_stop_extra);
   
   htsmsg_add_str(m, "creator", de->de_creator);
 
@@ -387,7 +408,8 @@ dvr_timer_start_recording(void *aux)
 
   dvr_rec_subscribe(de);
 
-  gtimer_arm_abs(&de->de_timer, dvr_timer_stop_recording, de, de->de_stop);
+  gtimer_arm_abs(&de->de_timer, dvr_timer_stop_recording, de, 
+                de->de_stop + (60 * de->de_stop_extra));
 }
 
 
@@ -491,6 +513,9 @@ dvr_init(void)
   /* Override settings with config */
 
   if((m = hts_settings_load("dvr/config")) != NULL) {
+
+    htsmsg_get_s32(m, "pre-extra-time", &dvr_extra_time_pre);
+    htsmsg_get_s32(m, "post-extra-time", &dvr_extra_time_post);
     htsmsg_get_u32(m, "retention-days", &dvr_retention_days);
     tvh_str_set(&dvr_storage, htsmsg_get_str(m, "storage"));
 
@@ -552,6 +577,8 @@ dvr_save(void)
   htsmsg_t *m = htsmsg_create_map();
   htsmsg_add_str(m, "storage", dvr_storage);
   htsmsg_add_u32(m, "retention-days", dvr_retention_days);
+  htsmsg_add_u32(m, "pre-extra-time", dvr_extra_time_pre);
+  htsmsg_add_u32(m, "post-extra-time", dvr_extra_time_post);
   htsmsg_add_u32(m, "day-dir",          !!(dvr_flags & DVR_DIR_PER_DAY));
   htsmsg_add_u32(m, "channel-dir",      !!(dvr_flags & DVR_DIR_PER_CHANNEL));
   htsmsg_add_u32(m, "channel-in-title", !!(dvr_flags & DVR_CHANNEL_IN_TITLE));
@@ -627,6 +654,32 @@ dvr_flags_set(int flags)
 }
 
 
+/**
+ *
+ */
+void
+dvr_extra_time_pre_set(int d)
+{
+  if(dvr_extra_time_pre == d)
+    return;
+  dvr_extra_time_pre = d;
+  dvr_save();
+}
+
+
+/**
+ *
+ */
+void
+dvr_extra_time_post_set(int d)
+{
+  if(dvr_extra_time_post == d)
+    return;
+  dvr_extra_time_post = d;
+  dvr_save();
+}
+
+
 /**
  *
  */
index ec0e52414f411ede0ebfab7ae46282f64d05e5cf..9eb8bf81226bd4898ff20feba1272af73f02e3f5 100644 (file)
@@ -418,7 +418,7 @@ dvr_thread(void *aux)
 
     switch(sm->sm_type) {
     case SMT_PACKET:
-      if(dispatch_clock > de->de_start)
+      if(dispatch_clock > de->de_start - (60 * de->de_start_extra))
        dvr_thread_new_pkt(de, sm->sm_data);
       pkt_ref_dec(sm->sm_data);
       break;
@@ -649,7 +649,8 @@ dvr_thread_new_pkt(dvr_entry_t *de, th_pkt_t *pkt)
 /**
  *
  */
-static void dvr_spawn_postproc(dvr_entry_t *de)
+static void
+dvr_spawn_postproc(dvr_entry_t *de)
 {
   char *fmap[256];
   char **args;
@@ -666,8 +667,8 @@ static void dvr_spawn_postproc(dvr_entry_t *de)
   }
 
   fbasename = strdup(de->de_filename); 
-  snprintf(start, sizeof(start), "%ld", de->de_start);
-  snprintf(stop, sizeof(stop), "%ld", de->de_stop);
+  snprintf(start, sizeof(start), "%ld", de->de_start - de->de_start_extra);
+  snprintf(stop, sizeof(stop),   "%ld", de->de_stop  + de->de_stop_extra);
 
   memset(fmap, 0, sizeof(fmap));
   fmap['f'] = de->de_filename; /* full path to recoding */
index 518482771bb11dc5f67db4285613c9b4b1fab6d3..9b585f0949daa504ad819629f11761fee46fb0f6 100644 (file)
@@ -765,6 +765,8 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
     if(dvr_postproc != NULL)
       htsmsg_add_str(r, "postproc", dvr_postproc);
     htsmsg_add_u32(r, "retention", dvr_retention_days);
+    htsmsg_add_u32(r, "preExtraTime", dvr_extra_time_pre);
+    htsmsg_add_u32(r, "postExtraTime", dvr_extra_time_post);
     htsmsg_add_u32(r, "dayDirs",        !!(dvr_flags & DVR_DIR_PER_DAY));
     htsmsg_add_u32(r, "channelDirs",    !!(dvr_flags & DVR_DIR_PER_CHANNEL));
     htsmsg_add_u32(r, "channelInTitle", !!(dvr_flags & DVR_CHANNEL_IN_TITLE));
@@ -784,6 +786,12 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
     if((s = http_arg_get(&hc->hc_req_args, "retention")) != NULL)
       dvr_retention_set(atoi(s));
 
+   if((s = http_arg_get(&hc->hc_req_args, "preExtraTime")) != NULL)
+     dvr_extra_time_pre_set(atoi(s));
+
+   if((s = http_arg_get(&hc->hc_req_args, "postExtraTime")) != NULL)
+     dvr_extra_time_post_set(atoi(s));
+
     if(http_arg_get(&hc->hc_req_args, "dayDirs") != NULL)
       flags |= DVR_DIR_PER_DAY;
     if(http_arg_get(&hc->hc_req_args, "channelDirs") != NULL)
index 88466a838c1feedf83ef51e8d8cc955d59f1afe4..ddc103d6b73d6bd5a8a26090ff70056c652205ab 100644 (file)
@@ -334,7 +334,8 @@ tvheadend.dvrsettings = function() {
        root: 'dvrSettings'
     }, ['storage','postproc','retention','dayDirs',
        'channelDirs','channelInTitle',
-       'dateInTitle','timeInTitle']);
+       'dateInTitle','timeInTitle',
+       'preExtraTime', 'postExtraTime']);
 
     var confpanel = new Ext.FormPanel({
        title:'Digital Video Recorder',
@@ -343,7 +344,7 @@ tvheadend.dvrsettings = function() {
        bodyStyle:'padding:15px',
        anchor: '100% 50%',
        labelAlign: 'right',
-       labelWidth: 200,
+       labelWidth: 250,
        waitMsgTarget: true,
        reader: confreader,
        defaultType: 'textfield',
@@ -358,6 +359,14 @@ tvheadend.dvrsettings = function() {
            minValue: 1,
            fieldLabel: 'DVR Log retention time (days)',
            name: 'retention'
+       }), new Ext.form.NumberField({
+           allowDecimals: false,
+           fieldLabel: 'Extra time before recordings (minutes)',
+           name: 'preExtraTime'
+       }), new Ext.form.NumberField({
+           allowDecimals: false,
+           fieldLabel: 'Extra time after recordings (minutes)',
+           name: 'postExtraTime'
        }), new Ext.form.Checkbox({
            fieldLabel: 'Make subdirectories per day',
            name: 'dayDirs'