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.

This commit is contained in:
Adam Sutton 2012-06-14 17:11:03 +01:00
parent 20fcdff51e
commit 27540607ec
2 changed files with 42 additions and 3 deletions

View file

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

View file

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