diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 03161405..41bc4014 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -35,9 +35,7 @@ typedef struct dvr_config { int dvr_extra_time_pre; int dvr_extra_time_post; - /* - * Series link support - */ + /* Series link support */ int dvr_sl_brand_lock; int dvr_sl_season_lock; int dvr_sl_channel_lock; @@ -45,6 +43,9 @@ typedef struct dvr_config { int dvr_sl_more_recent; int dvr_sl_quality_lock; + /* Duplicate detect */ + int dvr_dup_detect_episode; + LIST_ENTRY(dvr_config) config_link; } dvr_config_t; @@ -284,6 +285,8 @@ dvr_entry_t *dvr_entry_find_by_event(epg_broadcast_t *e); dvr_entry_t *dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e); +dvr_entry_t *dvr_entry_find_by_episode(epg_broadcast_t *e); + off_t dvr_get_filesize(dvr_entry_t *de); dvr_entry_t *dvr_entry_cancel(dvr_entry_t *de); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index e79fa803..541c29d6 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -263,6 +263,19 @@ static dvr_entry_t *_dvr_entry_create ( if(de->de_start == start && de->de_sched_state != DVR_COMPLETED) return NULL; + /* Reject duplicate episodes (unless earlier) */ + if (e && cfg->dvr_dup_detect_episode) { + de = dvr_entry_find_by_episode(e); + if (de) { + if (de->de_start > start) { + dvr_event_replaced(de->de_bcast, e); + return de; + } else { + return NULL; + } + } + } + de = calloc(1, sizeof(dvr_entry_t)); de->de_id = ++de_tally; @@ -815,6 +828,26 @@ dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e) return NULL; } +/* + * Find DVR entry based on an episode + */ +dvr_entry_t * +dvr_entry_find_by_episode(epg_broadcast_t *e) +{ + // TODO: should be configurable? + if (e->episode) { + dvr_entry_t *de; + epg_broadcast_t *ebc; + LIST_FOREACH(ebc, &e->episode->broadcasts, ep_link) { + de = dvr_entry_find_by_event(ebc); + if (de) return de; + } + return NULL; + } else { + return dvr_entry_find_by_event(e); + } +} + /** * */ @@ -1042,6 +1075,9 @@ dvr_config_create(const char *name) cfg->dvr_sl_time_lock = 0; // time slot (approx) locked cfg->dvr_sl_more_recent = 1; // Only record more reason episodes + /* dup detect */ + cfg->dvr_dup_detect_episode = 1; // detect dup episodes + LIST_INSERT_HEAD(&dvrconfigs, cfg, config_link); return LIST_FIRST(&dvrconfigs);