e, 0, 0,
perm->aa_username,
perm->aa_representative,
- NULL, DVR_PRIO_NORMAL, 0, comment);
+ NULL, DVR_PRIO_NORMAL, 0, 0, comment);
if (de)
dvr_entry_save(de);
}
char *dvr_storage;
int dvr_clone;
uint32_t dvr_retention_days;
+ uint32_t dvr_removal_days;
char *dvr_charset;
char *dvr_charset_id;
char *dvr_postproc;
int de_pri;
int de_dont_reschedule;
int de_mc;
- int de_retention;
+ uint32_t de_retention;
+ uint32_t de_removal;
/**
* EPG information / links
int dae_minduration;
int dae_maxduration;
- int dae_retention;
+ uint32_t dae_retention;
+ uint32_t dae_removal;
time_t dae_start_extra;
time_t dae_stop_extra;
dvr_entry_t *dte_spawn;
- int dte_retention;
+ uint32_t dte_retention;
+ uint32_t dte_removal;
} dvr_timerec_entry_t;
TAILQ_HEAD(dvr_timerec_entry_queue, dvr_timerec_entry);
void dvr_config_destroy_by_profile(profile_t *pro, int delconf);
+static inline uint32_t dvr_retention_cleanup(uint32_t val)
+{
+ return (val > 0xffffffff - 86400) ? (0xffffffff - 86400) : val;
+}
+
/*
*
*/
int dvr_entry_get_mc(dvr_entry_t *de);
-int dvr_entry_get_retention( dvr_entry_t *de );
+uint32_t dvr_entry_get_retention_days( dvr_entry_t *de );
+
+uint32_t dvr_entry_get_removal_days( dvr_entry_t *de );
int dvr_entry_get_start_time( dvr_entry_t *de );
time_t start_extra, time_t stop_extra,
const char *owner, const char *creator,
dvr_autorec_entry_t *dae,
- dvr_prio_t pri, int retention,
+ dvr_prio_t pri, int retention, int removal,
const char *comment );
dvr_entry_t *
const char *lang, epg_genre_t *content_type,
const char *owner, const char *creator,
dvr_autorec_entry_t *dae,
- dvr_prio_t pri, int retention,
+ dvr_prio_t pri, int retention, int removal,
const char *comment );
dvr_entry_t *
const char *desc, const char *lang,
time_t start, time_t stop,
time_t start_extra, time_t stop_extra,
- dvr_prio_t pri, int retention );
+ dvr_prio_t pri, int retention, int removal );
void dvr_destroy_by_channel(channel_t *ch, int delconf);
void dvr_entry_dec_ref(dvr_entry_t *de);
-void dvr_entry_delete(dvr_entry_t *de);
+void dvr_entry_delete(dvr_entry_t *de, int no_missed_time_resched);
void dvr_entry_cancel_delete(dvr_entry_t *de);
const char *lang, epg_genre_t *content_type,
const char *owner, const char *creator,
dvr_autorec_entry_t *dae, dvr_timerec_entry_t *tae,
- dvr_prio_t pri, int retention, const char *comment);
+ dvr_prio_t pri, int retention, int removal, const char *comment);
dvr_autorec_entry_t *
dvr_autorec_create_htsp(const char *dvr_config_name, const char *title, int fulltext,
channel_t *ch, uint32_t enabled, int32_t start,
int32_t start_window, uint32_t days, time_t start_extra,
- time_t stop_extra, dvr_prio_t pri, int retention,
+ time_t stop_extra, dvr_prio_t pri, int retention, int removal,
int min_duration, int max_duration, dvr_autorec_dedup_t dup_detect,
const char *owner, const char *creator,
const char *comment, const char *name, const char *directory);
return 0;
}
-int dvr_autorec_get_retention( dvr_autorec_entry_t *dae );
+uint32_t dvr_autorec_get_retention_days( dvr_autorec_entry_t *dae );
+
+uint32_t dvr_autorec_get_removal_days( dvr_autorec_entry_t *dae );
int dvr_autorec_get_extra_time_post( dvr_autorec_entry_t *dae );
dvr_timerec_entry_t*
dvr_timerec_create_htsp(const char *dvr_config_name, const char *title,
channel_t *ch, uint32_t enabled, uint32_t start, uint32_t stop,
- uint32_t weekdays, dvr_prio_t pri, int retention,
+ uint32_t weekdays, dvr_prio_t pri, int retention, int removal,
const char *owner, const char *creator, const char *comment,
const char *name, const char *directory);
return 0;
}
-int dvr_timerec_get_retention( dvr_timerec_entry_t *dte );
+uint32_t dvr_timerec_get_retention_days( dvr_timerec_entry_t *dte );
+
+uint32_t dvr_timerec_get_removal_days( dvr_timerec_entry_t *dte );
/**
*
dvr_autorec_create_htsp(const char *dvr_config_name, const char *title, int fulltext,
channel_t *ch, uint32_t enabled, int32_t start, int32_t start_window,
uint32_t weekdays, time_t start_extra, time_t stop_extra,
- dvr_prio_t pri, int retention,
+ dvr_prio_t pri, int retention, int removal,
int min_duration, int max_duration, dvr_autorec_dedup_t dup_detect,
const char *owner, const char *creator, const char *comment,
const char *name, const char *directory)
htsmsg_add_u32(conf, "enabled", enabled > 0 ? 1 : 0);
htsmsg_add_u32(conf, "retention", retention);
+ htsmsg_add_u32(conf, "removal", removal);
htsmsg_add_u32(conf, "pri", pri);
htsmsg_add_u32(conf, "minduration", min_duration);
htsmsg_add_u32(conf, "maxduration", max_duration);
.list = dvr_autorec_entry_class_dedup_list,
},
{
- .type = PT_INT,
+ .type = PT_U32,
.id = "retention",
- .name = N_("Retention"),
+ .name = N_("DVR Log Retention (days)"),
.off = offsetof(dvr_autorec_entry_t, dae_retention),
+ .opts = PO_HIDDEN,
+ },
+ {
+ .type = PT_U32,
+ .id = "removal",
+ .name = N_("File removal (days)"),
+ .off = offsetof(dvr_autorec_entry_t, dae_removal),
+ .opts = PO_HIDDEN,
},
{
.type = PT_STR,
/**
*
*/
-int
-dvr_autorec_get_retention( dvr_autorec_entry_t *dae )
+uint32_t
+dvr_autorec_get_retention_days( dvr_autorec_entry_t *dae )
{
if (dae->dae_retention > 0)
return dae->dae_retention;
- return dae->dae_config->dvr_retention_days;
+ return dvr_retention_cleanup(dae->dae_config->dvr_retention_days);
+}
+
+/**
+ *
+ */
+uint32_t
+dvr_autorec_get_removal_days( dvr_autorec_entry_t *dae )
+{
+ if (dae->dae_removal > 0)
+ return dae->dae_removal;
+ return dvr_retention_cleanup(dae->dae_config->dvr_removal_days);
}
lock_assert(&global_lock);
dvr_config_storage_check(cfg);
+ if (cfg->dvr_removal_days > cfg->dvr_retention_days)
+ cfg->dvr_removal_days = cfg->dvr_retention_days;
idnode_save(&cfg->dvr_id, m);
hts_settings_save(m, "dvr/config/%s", idnode_uuid_as_sstr(&cfg->dvr_id));
htsmsg_destroy(m);
.def.u32 = 31,
.group = 1,
},
+ {
+ .type = PT_U32,
+ .id = "removal-days",
+ .name = N_("DVR File Removal Time (days)"),
+ .off = offsetof(dvr_config_t, dvr_removal_days),
+ .group = 1,
+ },
{
.type = PT_BOOL,
.id = "clone",
static void dvr_entry_destroy(dvr_entry_t *de, int delconf);
static void dvr_timer_expire(void *aux);
+static void dvr_timer_remove_files(void *aux);
static void dvr_entry_start_recording(dvr_entry_t *de, int clone);
static void dvr_timer_start_recording(void *aux);
static void dvr_timer_stop_recording(void *aux);
return profile_get_mc(de->de_config->dvr_profile);
}
-int
-dvr_entry_get_retention( dvr_entry_t *de )
+uint32_t
+dvr_entry_get_retention_days( dvr_entry_t *de )
{
if (de->de_retention > 0)
return de->de_retention;
- return de->de_config->dvr_retention_days;
+ return dvr_retention_cleanup(de->de_config->dvr_retention_days);
+}
+
+uint32_t
+dvr_entry_get_removal_days ( dvr_entry_t *de )
+{
+ if (de->de_removal > 0)
+ return de->de_removal;
+ return dvr_retention_cleanup(de->de_config->dvr_removal_days);
}
/*
static void
dvr_entry_retention_timer(dvr_entry_t *de)
{
- gtimer_arm_abs(&de->de_timer, dvr_timer_expire, de,
- de->de_stop + dvr_entry_get_retention(de) * 86400);
+ time_t stop = de->de_stop;
+ uint32_t removal = dvr_entry_get_removal_days(de);
+ uint32_t retention = dvr_entry_get_retention_days(de);
+ if (removal > retention)
+ removal = retention;
+ stop = de->de_stop + removal * (time_t)86400;
+ if (removal > 0 || retention == 0) {
+ if (stop > dispatch_clock) {
+ gtimer_arm_abs(&de->de_timer, dvr_timer_remove_files, de, stop);
+ return;
+ }
+ if (dvr_get_filename(de))
+ dvr_entry_delete(de, 1);
+ }
+ stop = de->de_stop + retention * (time_t)86400;
+ gtimer_arm_abs(&de->de_timer, dvr_timer_expire, de, stop);
}
/*
static void
dvr_entry_nostate(dvr_entry_t *de, int error_code)
{
- dvr_entry_set_state(de, DVR_NOSTATE, DVR_RS_PENDING, de->de_last_error);
+ dvr_entry_set_state(de, DVR_NOSTATE, DVR_RS_PENDING, error_code);
dvr_entry_retention_timer(de);
}
const char *owner,
const char *creator, dvr_autorec_entry_t *dae,
dvr_timerec_entry_t *dte,
- dvr_prio_t pri, int retention,
+ dvr_prio_t pri, int retention, int removal,
const char *comment)
{
dvr_entry_t *de;
htsmsg_add_str(conf, "channel", idnode_uuid_as_sstr(&ch->ch_id));
htsmsg_add_u32(conf, "pri", pri);
htsmsg_add_u32(conf, "retention", retention);
+ htsmsg_add_u32(conf, "removal", removal);
htsmsg_add_str(conf, "config_name", config_uuid ?: "");
htsmsg_add_s64(conf, "start_extra", start_extra);
htsmsg_add_s64(conf, "stop_extra", stop_extra);
epg_genre_t *content_type,
const char *owner,
const char *creator, dvr_autorec_entry_t *dae,
- dvr_prio_t pri, int retention,
+ dvr_prio_t pri, int retention, int removal,
const char *comment)
{
char ubuf[UUID_HEX_SIZE];
NULL,
ch, start, stop, start_extra, stop_extra,
title, subtitle, description, lang, content_type,
- owner, creator, dae, NULL, pri, retention,
+ owner, creator, dae, NULL, pri, retention, removal,
comment);
}
time_t start_extra, time_t stop_extra,
const char *owner,
const char *creator, dvr_autorec_entry_t *dae,
- dvr_prio_t pri, int retention,
+ dvr_prio_t pri, int retention, int removal,
const char *comment)
{
if(!e->channel || !e->episode || !e->episode->title)
start_extra, stop_extra,
NULL, NULL, NULL, NULL,
LIST_FIRST(&e->episode->genre),
- owner, creator, dae, NULL, pri, retention,
- comment);
+ owner, creator, dae, NULL, pri,
+ retention, removal, comment);
}
/**
dvr_entry_create_by_event(enabled, idnode_uuid_as_str(&dae->dae_config->dvr_id, ubuf),
e, dae->dae_start_extra, dae->dae_stop_extra,
- dae->dae_owner, dae->dae_creator,
- dae, dae->dae_pri, dae->dae_retention, buf);
+ dae->dae_owner, dae->dae_creator, dae, dae->dae_pri,
+ dae->dae_retention, dae->dae_removal, buf);
}
/**
{
dvr_entry_t *de = aux;
dvr_entry_destroy(de, 1);
-
}
+
+/**
+ *
+ */
+static void
+dvr_timer_remove_files(void *aux)
+{
+ dvr_entry_t *de = aux;
+ dvr_entry_retention_timer(de);
+}
+
+
+/**
+ *
+ */
static dvr_entry_t *_dvr_entry_update
( dvr_entry_t *de, int enabled, epg_broadcast_t *e, channel_t *ch,
const char *title, const char *subtitle, const char *desc,
const char *lang, time_t start, time_t stop,
time_t start_extra, time_t stop_extra,
- dvr_prio_t pri, int retention )
+ dvr_prio_t pri, int retention, int removal )
{
char buf[40];
int save = 0, updated = 0;
de->de_retention = retention;
save = 1;
}
+ if (removal && (removal != de->de_removal)) {
+ de->de_removal = removal;
+ save = 1;
+ }
if (save) {
updated = 1;
dvr_entry_set_timer(de);
const char *desc, const char *lang,
time_t start, time_t stop,
time_t start_extra, time_t stop_extra,
- dvr_prio_t pri, int retention )
+ dvr_prio_t pri, int retention, int removal )
{
return _dvr_entry_update(de, enabled, NULL, ch, title, subtitle, desc, lang,
start, stop, start_extra, stop_extra,
- pri, retention);
+ pri, retention, removal);
}
/**
channel_get_name(e->channel),
e->start, e->stop);
dvr_entry_assign_broadcast(de, e);
- _dvr_entry_update(de, -1, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0);
+ _dvr_entry_update(de, -1, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0, 0);
return;
}
}
dvr_entry_t *de;
de = dvr_entry_find_by_event(e);
if (de)
- _dvr_entry_update(de, -1, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0);
+ _dvr_entry_update(de, -1, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0, 0);
else {
LIST_FOREACH(de, &dvrentries, de_global_link) {
if (de->de_sched_state != DVR_SCHEDULED) continue;
channel_get_name(e->channel),
e->start, e->stop);
dvr_entry_assign_broadcast(de, e);
- _dvr_entry_update(de, -1, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0);
+ _dvr_entry_update(de, -1, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0, 0);
break;
}
}
if (saveconf)
dvr_entry_save(de);
- gtimer_arm_abs(&de->de_timer, dvr_timer_expire, de,
- de->de_stop + dvr_entry_get_retention(de) * 86400);
+ dvr_entry_retention_timer(de);
}
dvr_entry_class_retention_set(void *o, const void *v)
{
dvr_entry_t *de = (dvr_entry_t *)o;
- return dvr_entry_class_int_set(de, &de->de_retention, *(int *)v);
+ return dvr_entry_class_int_set(de, (int *)&de->de_retention, *(int *)v);
+}
+
+static int
+dvr_entry_class_removal_set(void *o, const void *v)
+{
+ dvr_entry_t *de = (dvr_entry_t *)o;
+ return dvr_entry_class_int_set(de, (int *)&de->de_removal, *(int *)v);
}
static int
.opts = PO_SORTKEY,
},
{
- .type = PT_INT,
+ .type = PT_U32,
.id = "retention",
- .name = N_("Retention"),
+ .name = N_("DVR Log Retention (days)"),
.off = offsetof(dvr_entry_t, de_retention),
.set = dvr_entry_class_retention_set,
+ .opts = PO_HIDDEN
+ },
+ {
+ .type = PT_U32,
+ .id = "removal",
+ .name = N_("File removal (days)"),
+ .off = offsetof(dvr_entry_t, de_removal),
+ .set = dvr_entry_class_removal_set,
+ .opts = PO_HIDDEN
},
{
.type = PT_INT,
*
*/
void
-dvr_entry_delete(dvr_entry_t *de)
+dvr_entry_delete(dvr_entry_t *de, int no_missed_time_resched)
{
dvr_config_t *cfg = de->de_config;
htsmsg_t *m;
*tbuf = 0;
tvhlog(LOG_INFO, "dvr", "delete entry %s \"%s\" on \"%s\" start time %s, "
- "scheduled for recording by \"%s\", retention %d days",
+ "scheduled for recording by \"%s\", retention %d days, removal %d days",
idnode_uuid_as_sstr(&de->de_id),
lang_str_get(de->de_title, NULL), DVR_CH_NAME(de), tbuf,
de->de_creator ?: "",
- dvr_entry_get_retention(de));
+ dvr_entry_get_retention_days(de),
+ dvr_entry_get_removal_days(de));
if(!htsmsg_is_empty(de->de_files)) {
#if ENABLE_INOTIFY
m = htsmsg_field_get_map(f);
if (m == NULL) continue;
filename = htsmsg_get_str(m, "filename");
+ if (filename == NULL) continue;
r = deferred_unlink(filename, rdir);
if(r && r != -ENOENT)
tvhlog(LOG_WARNING, "dvr", "Unable to remove file '%s' from disk -- %s",
filename, strerror(-errno));
+ htsmsg_delete_field(m, "filename");
}
}
- dvr_entry_destroy(de, 1);
+ if (no_missed_time_resched)
+ dvr_entry_set_state(de, DVR_MISSED_TIME, DVR_RS_PENDING, de->de_last_error);
+ else
+ dvr_entry_missed_time(de, de->de_last_error);
}
/**
dvr_entry_stop(dvr_entry_t *de)
{
if(de->de_sched_state == DVR_RECORDING) {
+ de->de_dont_reschedule = 1;
dvr_stop_recording(de, SM_CODE_OK, 1, 0);
return de;
}
de->de_dont_reschedule = 1;
dvr_stop_recording(de, SM_CODE_ABORTED, 1, 0);
case DVR_COMPLETED:
- dvr_entry_delete(de);
+ dvr_entry_delete(de, 1);
+ dvr_entry_destroy(de, 1);
break;
case DVR_MISSED_TIME:
start, stop, 0, 0, title, NULL,
NULL, NULL, NULL, dte->dte_owner, dte->dte_creator,
NULL, dte, dte->dte_pri, dte->dte_retention,
- buf);
+ dte->dte_removal, buf);
return;
dvr_timerec_entry_t*
dvr_timerec_create_htsp(const char *dvr_config_name, const char *title,
channel_t *ch, uint32_t enabled, uint32_t start, uint32_t stop,
- uint32_t weekdays, dvr_prio_t pri, int retention,
+ uint32_t weekdays, dvr_prio_t pri, int retention, int removal,
const char *owner, const char *creator, const char *comment,
const char *name, const char *directory)
{
htsmsg_add_u32(conf, "enabled", enabled > 0 ? 1 : 0);
htsmsg_add_u32(conf, "retention", retention);
+ htsmsg_add_u32(conf, "removal", removal);
htsmsg_add_u32(conf, "pri", pri);
htsmsg_add_str(conf, "title", title);
htsmsg_add_str(conf, "config_name", dvr_config_name ?: "");
.opts = PO_SORTKEY,
},
{
- .type = PT_INT,
+ .type = PT_U32,
.id = "retention",
- .name = N_("Retention"),
+ .name = N_("DVR Log Retention (days)"),
.off = offsetof(dvr_timerec_entry_t, dte_retention),
},
+ {
+ .type = PT_U32,
+ .id = "removal",
+ .name = N_("File removal (days)"),
+ .off = offsetof(dvr_timerec_entry_t, dte_removal),
+ },
{
.type = PT_STR,
.id = "config_name",
/**
*
*/
-int
-dvr_timerec_get_retention( dvr_timerec_entry_t *dte )
+uint32_t
+dvr_timerec_get_retention_days( dvr_timerec_entry_t *dte )
{
if (dte->dte_retention > 0)
return dte->dte_retention;
- return dte->dte_config->dvr_retention_days;
+ return dvr_retention_cleanup(dte->dte_config->dvr_retention_days);
+}
+
+/**
+ *
+ */
+uint32_t
+dvr_timerec_get_removal_days( dvr_timerec_entry_t *dte )
+{
+ if (dte->dte_removal > 0)
+ return dte->dte_removal;
+ return dvr_retention_cleanup(dte->dte_config->dvr_removal_days);
}
htsmsg_add_s64(out, "stop", de->de_stop);
htsmsg_add_s64(out, "startExtra", dvr_entry_get_extra_time_pre(de));
htsmsg_add_s64(out, "stopExtra", dvr_entry_get_extra_time_post(de));
- htsmsg_add_u32(out, "retention", dvr_entry_get_retention(de));
+ htsmsg_add_u32(out, "retention", dvr_entry_get_retention_days(de));
+ htsmsg_add_u32(out, "removal", dvr_entry_get_removal_days(de));
htsmsg_add_u32(out, "priority", de->de_pri);
htsmsg_add_u32(out, "contentType", de->de_content_type);
htsmsg_add_u32(out, "enabled", dae->dae_enabled);
htsmsg_add_u32(out, "maxDuration", dae->dae_maxduration);
htsmsg_add_u32(out, "minDuration", dae->dae_minduration);
- htsmsg_add_u32(out, "retention", dvr_autorec_get_retention(dae));
+ htsmsg_add_u32(out, "retention", dvr_autorec_get_retention_days(dae));
+ htsmsg_add_u32(out, "removal", dvr_autorec_get_removal_days(dae));
htsmsg_add_u32(out, "daysOfWeek", dae->dae_weekdays);
if (dae->dae_start >= 0 && dae->dae_start_window >= 0) {
if (dae->dae_start > dae->dae_start_window)
htsmsg_add_str(out, "id", idnode_uuid_as_sstr(&dte->dte_id));
htsmsg_add_u32(out, "enabled", dte->dte_enabled);
htsmsg_add_u32(out, "daysOfWeek", dte->dte_weekdays);
- htsmsg_add_u32(out, "retention", dvr_timerec_get_retention(dte));
+ htsmsg_add_u32(out, "retention", dvr_timerec_get_retention_days(dte));
+ htsmsg_add_u32(out, "removal", dvr_timerec_get_removal_days(dte));
htsmsg_add_u32(out, "priority", dte->dte_pri);
htsmsg_add_s32(out, "start", dte->dte_start);
htsmsg_add_s32(out, "stop", dte->dte_stop);
dvr_entry_sched_state_t dvr_status;
const char *dvr_config_name, *title, *desc, *subtitle, *lang, *comment;
int64_t start, stop, start_extra, stop_extra;
- uint32_t u32, priority, retention;
+ uint32_t u32, priority, retention, removal;
channel_t *ch = NULL;
int enabled;
priority = DVR_PRIO_NORMAL;
if(htsmsg_get_u32(in, "retention", &retention))
retention = 0;
+ if(htsmsg_get_u32(in, "removal", &removal))
+ removal = 0;
comment = htsmsg_get_str(in, "comment");
if (!(lang = htsmsg_get_str(in, "language")))
lang = htsp->htsp_language;
title, subtitle, desc, lang, 0,
htsp->htsp_granted_access->aa_username,
htsp->htsp_granted_access->aa_representative,
- NULL, priority, retention, comment);
+ NULL, priority, retention, removal, comment);
/* Event timer */
} else {
start_extra, stop_extra,
htsp->htsp_granted_access->aa_username,
htsp->htsp_granted_access->aa_representative,
- NULL, priority, retention, comment);
+ NULL, priority, retention, removal, comment);
}
dvr_status = de != NULL ? de->de_sched_state : DVR_NOSTATE;
htsmsg_t *out;
uint32_t dvrEntryId, u32;
dvr_entry_t *de;
- time_t start, stop, start_extra, stop_extra, priority, retention;
+ time_t start, stop, start_extra, stop_extra, priority, retention, removal;
const char *title, *subtitle, *desc, *lang;
channel_t *channel = NULL;
int enabled;
start_extra = htsmsg_get_s64_or_default(in, "startExtra", 0);
stop_extra = htsmsg_get_s64_or_default(in, "stopExtra", 0);
retention = htsmsg_get_u32_or_default(in, "retention", 0);
+ removal = htsmsg_get_u32_or_default(in, "removal", 0);
priority = htsmsg_get_u32_or_default(in, "priority", DVR_PRIO_NORMAL);
title = htsmsg_get_str(in, "title");
subtitle = htsmsg_get_str(in, "subtitle");
lang = htsmsg_get_str(in, "language") ?: htsp->htsp_language;
de = dvr_entry_update(de, enabled, channel, title, subtitle, desc, lang, start, stop,
- start_extra, stop_extra, priority, retention);
+ start_extra, stop_extra, priority, retention, removal);
//create response
out = htsmsg_create_map();
const char *dvr_config_name, *title, *comment, *name, *directory;
int64_t start_extra, stop_extra;
uint32_t u32, days_of_week, priority, min_duration, max_duration, dup_detect;
- uint32_t retention, enabled, fulltext;
+ uint32_t retention, removal, enabled, fulltext;
int32_t approx_time, start, start_window;
channel_t *ch = NULL;
min_duration = 0; // 0 = any
if(htsmsg_get_u32(in, "retention", &retention))
retention = 0; // 0 = dvr config
+ if(htsmsg_get_u32(in, "removal", &retention))
+ removal = 0; // 0 = dvr config
if(htsmsg_get_u32(in, "daysOfWeek", &days_of_week))
days_of_week = 0x7f; // all days
if(htsmsg_get_u32(in, "priority", &priority))
dae = dvr_autorec_create_htsp(dvr_config_name, title, fulltext,
ch, enabled, start, start_window, days_of_week,
- start_extra, stop_extra, priority, retention, min_duration, max_duration, dup_detect,
+ start_extra, stop_extra, priority, retention, removal,
+ min_duration, max_duration, dup_detect,
htsp->htsp_granted_access->aa_username, htsp->htsp_granted_access->aa_representative,
comment, name, directory);
htsmsg_t *out;
dvr_timerec_entry_t *dte;
const char *dvr_config_name, *title, *comment, *name, *directory;
- uint32_t u32, days_of_week, priority, retention, start = 0, stop = 0, enabled;
+ uint32_t u32, days_of_week, priority, retention, removal, start = 0, stop = 0, enabled;
channel_t *ch = NULL;
/* Options */
if(htsmsg_get_u32(in, "retention", &retention))
retention = 0; // 0 = dvr config
+ if(htsmsg_get_u32(in, "removal", &removal))
+ removal = 0; // 0 = dvr config
if(htsmsg_get_u32(in, "daysOfWeek", &days_of_week))
days_of_week = 0x7f; // all days
if(htsmsg_get_u32(in, "priority", &priority))
/* Add actual timerec */
dte = dvr_timerec_create_htsp(dvr_config_name, title, ch, enabled, start, stop, days_of_week,
- priority, retention, htsp->htsp_granted_access->aa_username,
+ priority, retention, removal, htsp->htsp_granted_access->aa_username,
htsp->htsp_granted_access->aa_representative, comment, name, directory);
/* create response */
if((http_arg_get(&hc->hc_req_args, "rec")) != NULL) {
de = dvr_entry_create_by_event(1, NULL, e, 0, 0, hc->hc_username ?: NULL,
hc->hc_representative ?: NULL, NULL,
- DVR_PRIO_NORMAL, 0, "simpleui");
+ DVR_PRIO_NORMAL, 0, 0, "simpleui");
} else if(de != NULL && (http_arg_get(&hc->hc_req_args, "cancel")) != NULL) {
de = dvr_entry_cancel(de);
}
var list = 'disp_title,start,start_extra,stop,stop_extra,' +
'channel,config_name,comment';
var elist = 'enabled,' +
- (tvheadend.accessUpdate.admin ? list + ',owner,creator' : list);
+ (tvheadend.accessUpdate.admin ?
+ list + ',retention,removal,owner,creator' : list);
var stopButton = {
name: 'stop',
titleP: _('Finished Recordings'),
iconCls: 'finishedRec',
tabIndex: index,
- edit: { params: { list: tvheadend.admin ? "owner,comment" : "comment" } },
+ edit: { params: { list: tvheadend.admin ? "owner,retention,removal,comment" : "comment" } },
del: true,
delquestion: _('Do you really want to delete the selected recordings?') + '<br/><br/>' +
_('The associated file will be removed from storage.'),
pri: { width: 80 },
dedup: { width: 160 },
retention: { width: 80 },
+ removal: { width: 80 },
config_name: { width: 120 },
owner: { width: 100 },
creator: { width: 200 },
start: { width: 120 },
stop: { width: 120 },
pri: { width: 80 },
+ retention: { width: 80 },
+ removal: { width: 80 },
config_name: { width: 120 },
owner: { width: 100 },
creator: { width: 200 },