Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
DVR: Implement automatic file removal, fixes #3141
  • Loading branch information
perexg committed Oct 8, 2015
1 parent 15bd982 commit 8a3a07f
Show file tree
Hide file tree
Showing 9 changed files with 215 additions and 73 deletions.
2 changes: 1 addition & 1 deletion src/api/api_dvr.c
Expand Up @@ -240,7 +240,7 @@ api_dvr_entry_create_by_event
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);
}
Expand Down
41 changes: 28 additions & 13 deletions src/dvr/dvr.h
Expand Up @@ -41,6 +41,7 @@ typedef struct dvr_config {
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;
Expand Down Expand Up @@ -164,7 +165,8 @@ typedef struct dvr_entry {
int de_pri;
int de_dont_reschedule;
int de_mc;
int de_retention;
uint32_t de_retention;
uint32_t de_removal;

/**
* EPG information / links
Expand Down Expand Up @@ -294,7 +296,8 @@ typedef struct dvr_autorec_entry {

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;
Expand Down Expand Up @@ -339,7 +342,8 @@ typedef struct dvr_timerec_entry {

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);
Expand Down Expand Up @@ -382,6 +386,11 @@ void dvr_config_save(dvr_config_t *cfg);

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;
}

/*
*
*/
Expand All @@ -396,7 +405,9 @@ static inline int dvr_entry_is_valid(dvr_entry_t *de)

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 );

Expand Down Expand Up @@ -439,7 +450,7 @@ dvr_entry_create_by_event( int enabled,
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 *
Expand All @@ -451,7 +462,7 @@ dvr_entry_create_htsp( int enabled, const char *dvr_config_uuid,
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 *
Expand All @@ -460,7 +471,7 @@ dvr_entry_update( dvr_entry_t *de, int enabled, channel_t *ch,
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);

Expand Down Expand Up @@ -497,7 +508,7 @@ dvr_entry_t *dvr_entry_cancel(dvr_entry_t *de);

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);

Expand Down Expand Up @@ -527,13 +538,13 @@ dvr_entry_create_(int enabled, const char *config_uuid, epg_broadcast_t *e,
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);
Expand Down Expand Up @@ -589,7 +600,9 @@ static inline int
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 );

Expand All @@ -605,7 +618,7 @@ dvr_timerec_create(const char *uuid, htsmsg_t *conf);
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);

Expand Down Expand Up @@ -642,7 +655,9 @@ static inline int dvr_timerec_entry_verify
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 );

/**
*
Expand Down
32 changes: 26 additions & 6 deletions src/dvr/dvr_autorec.c
Expand Up @@ -242,7 +242,7 @@ 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 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)
Expand All @@ -255,6 +255,7 @@ dvr_autorec_create_htsp(const char *dvr_config_name, const char *title, int full

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);
Expand Down Expand Up @@ -1057,10 +1058,18 @@ const idclass_t dvr_autorec_entry_class = {
.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,
Expand Down Expand Up @@ -1332,10 +1341,21 @@ dvr_autorec_get_extra_time_post( dvr_autorec_entry_t *dae )
/**
*
*/
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);
}
9 changes: 9 additions & 0 deletions src/dvr/dvr_config.c
Expand Up @@ -512,6 +512,8 @@ dvr_config_save(dvr_config_t *cfg)
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);
Expand Down Expand Up @@ -813,6 +815,13 @@ const idclass_t dvr_config_class = {
.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",
Expand Down

0 comments on commit 8a3a07f

Please sign in to comment.