From 27540607ecf74b8b7fc048dff6b25dc350c85922 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Thu, 14 Jun 2012 17:11:03 +0100 Subject: [PATCH] Some very early attempts at duplicate detection. Really not sure if this is the best way to go and definitley needs more thought but it does at least stop series links from creating lots of duplicates. --- src/dvr/dvr.h | 9 ++++++--- src/dvr/dvr_db.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) 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);