From: Andreas Ă–man Date: Wed, 19 Aug 2009 19:44:33 +0000 (+0000) Subject: Add support for setting default extra times to add before and after a recording.... X-Git-Tag: 2.12~527 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5dfdbc7a9bce048a52cfc71bde57544d28cb514b;p=thirdparty%2Ftvheadend.git Add support for setting default extra times to add before and after a recording. Useful if your TV shows never start on time. --- diff --git a/debian/changelog b/debian/changelog index 7737bec81..24b27ab28 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index de46f301c..ba6e60c23 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -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 */ diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 808b9ef06..0bd7fb87b 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -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(); +} + + /** * */ diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index ec0e52414..9eb8bf812 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -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 */ diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 518482771..9b585f094 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -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) diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js index 88466a838..ddc103d6b 100644 --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -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'